使用 Vue + LayUI 做后台管理、RESTful 交互

源码技巧4年前 (2021-02-24)7530

一、前言

1、之前使用了 React/Angular,使用起来显然是比 jQuery 好多了,但时隔半年,最近再次深入研究了 vue,很惊喜。

故以后选择 MVC/MVVM 框架的话,建议首选 vue,主要是其代码结构,清晰简单。

2、使用 vue + layui 了,但 layui 里边的 layui.js 模块 vue.js 冲突,
因此放弃使用 layui.js,导致很多高级功能用不了,如日期 laydate 模块,
只使用了 layui 的 css样式,这时显得 layui 鸡肋了好多。

故以后使用 UI 配合 vue 的话,建议选择 ElementUI/MintUI,毕竟是基于 vue 的,无缝对接。

1.index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>ITAEM</title>
    <link href="lib/layui.css" type="text/css" rel="stylesheet">
    <script src="lib/vue-2.4.0.js" type="text/javascript"></script>
    <script src="lib/vue-resource-1.3.4.js"></script></head><body><div id="app" class="layui-container">

    <div className="layui-row layui-col-space2">
        <div class="layui-col-md1">
            <input type="text" v-model="searchId" required lay-verify="required" placeholder="id" class="layui-input" autocomplete="off"/>
        </div>
        <div class="layui-col-md1">
            <button id="btn2"  class="layui-btn" @click.prevent="search()">搜索</button>
        </div>
    </div>

    <table class="layui-table">
        <colgroup>
            <col width="150">
            <col width="200">
            <col>
        </colgroup>
        <thead>
        <tr>
            <th>博客id</th>
            <th>标题</th>
            <th>文章链接</th>
            <th>作者</th>
            <th>是否展示</th>
            <th>修改</th>
            <th>删除</th>
        </tr>
        </thead>
        <tbody>
        <tr v-for="item in list" :key="item.id">
            <td>{{item.id}}</td>
            <td>{{item.title}}</td>
            <td>{{item.link}}</td>
            <td>{{item.author}}</td>
            <td>{{item.tag}}</td>
            <th>
                <a class="layui-btn layui-btn-normal" @click.prevent="upd(item.id)">修改</a>
            </th>
            <th>
                <button class="layui-btn layui-btn-danger" @click.prevent="del(item.id)">删除</button>
            </th>
        </tr>
        </tbody>
    </table>
    <a href="add.html" class="layui-btn layui-btn-warm">添加</a></div><script>

    // 如果我们通过全局配置了,请求的数据接口 根域名,则 ,在每次单独发起 http 请求的时候,请求的 url 路径,应该以相对路径开头,前面不能带 /  ,否则 不会启用根路径做拼接;
    Vue.http.options.root = 'http://120.79.197.130:8080/';

    // 全局启用 emulateJSON 选项:如果Web服务器无法处理编码为application/json的请求,你可以启用emulateJSON选项。
    Vue.http.options.emulateJSON = true;

    var vm = new Vue({
        el: '#app',
        data: {
            searchId: '',// 搜索用的
            list: [] // 存放列表数据
        },
        created() { // 当 vm 实例 的 data 和 methods 初始化完毕后,vm实例会自动执行created 这个生命周期函数
            this.getAllList()
        },
        methods: {
            getAllList() {
                // 由于已经导入了 Vue-resource这个包,所以 ,可以直接通过  this.$http 来发起数据请求
                this.$http.get('getAllBlogs').then(result => {
                    // 注意: 通过 $http 获取到的数据,都在 result.body 中放着
                    var result = result.body                    if (result.code === 200) {
                        // 成功了
                        this.list = result.data
                        console.log(result.data)
                    } else {
                        // 失败了
                        alert('获取数据失败!')
                    }
                })
            },
            del(id) {
                this.$http.delete('deleteBlogById/' + id).then(result => {
                    if (result.body.code === 200) {
                        // 删除成功
                        this.getAllList()
                    } else {
                        alert('删除失败!')
                    }
                })
            },
            search() {
                this.$http.get('getBlogById/'+this.searchId).then(result => {
                    var result = result.body                    if (result.code === 200) {
                        this.list=[]
                        this.list.push(result.data)
                    } else {
                        alert('查找失败!')
                    }
                })
            },
            upd(updateId){
                window.location.href="http://localhost:63343/forVue/VueCRUD/update.html?#"+updateId            }
        }
    })</script></body></html>

2.add.html

<!DOCTYPE html><html lang="en"><head>
    <meta charset="UTF-8">
    <title>ITAEM</title>
    <link href="lib/layui.css" type="text/css" rel="stylesheet">
    <script src="lib/vue-2.4.0.js" type="text/javascript"></script>
    <script src="lib/vue-resource-1.3.4.js"></script></head><body><div id="app" class="layui-container">
    <form class="layui-form" action="">
        <div class="layui-form-item">
            <label class="layui-form-label">标题</label>
            <div class="layui-input-block">
                <input v-model="title" type="text" placeholder="title" class="layui-input" autocomplete="off">
            </div>
        </div>
        <div class="layui-form-item">
            <label class="layui-form-label">链接</label>
            <div class="layui-input-block">
                <input v-model="link" type="text" placeholder="https://www.baidu.com/" class="layui-input"
                       autocomplete="off">
            </div>
        </div>
        <div class="layui-form-item">
            <label class="layui-form-label">作者</label>
            <div class="layui-input-block">
                <input v-model="author" type="text" placeholder="author" class="layui-input" autocomplete="off">
            </div>
        </div>
        <div class="layui-form-item">
            <label class="layui-form-label">是否展示</label>
            <div class="layui-input-block">
                <input v-model="tag" type="text" placeholder="0/1" class="layui-input" autocomplete="off">
            </div>
        </div>
        <div class="layui-form-item">
            <div class="layui-input-block">
                <button class="layui-btn" @click="add">添加</button>
            </div>
        </div>
    </form>
    <a href="index.html" class="layui-btn layui-btn-primary">返回</a></div><script>
    // 如果我们通过全局配置了,请求的数据接口 根域名,则 ,在每次单独发起 http 请求的时候,请求的 url 路径,应该以相对路径开头,前面不能带 /  ,否则 不会启用根路径做拼接;
    Vue.http.options.root = 'http://120.79.197.130:8080/';

    // 全局启用 emulateJSON 选项:如果Web服务器无法处理编码为application/json的请求,你可以启用emulateJSON选项。
    Vue.http.options.emulateJSON = true;

    var vm = new Vue({
        el: '#app',
        data: {
            title: '',
            link: '',
            author: '',
            tag: ''
        },
        methods: {
            add() {
                this.$http.post('insertBlog',
                    {
                        title: this.title,
                        link: this.link,
                        author: this.author,
                        tag: this.tag,
                    })
                    .then(result => {
                        var result = result.body                        if (result.code === 200) {
                            alert('添加成功!')
                        } else {
                            // 失败了
                            alert('添加失败!')
                        }
                    })
            }
        }
    })</script></body></html>

3.update.html

<!DOCTYPE html><html lang="en"><head>
    <meta charset="UTF-8">
    <title>ITAEM</title>
    <link href="lib/layui.css" type="text/css" rel="stylesheet">
    <script src="lib/vue-2.4.0.js" type="text/javascript"></script>
    <script src="lib/vue-resource-1.3.4.js"></script></head><body><div id="app" class="layui-container">
    <form class="layui-form" action="">
        <div class="layui-form-item">
            <label class="layui-form-label">id</label>
            <div class="layui-input-block">
                <input v-model="id" type="text" placeholder="title" class="layui-input" autocomplete="off" disabled>
            </div>
        </div>
        <div class="layui-form-item">
            <label class="layui-form-label">标题</label>
            <div class="layui-input-block">
                <input v-model="title" type="text" placeholder="title" class="layui-input" autocomplete="off">
            </div>
        </div>
        <div class="layui-form-item">
            <label class="layui-form-label">链接</label>
            <div class="layui-input-block">
                <input v-model="link" type="text" placeholder="https://www.baidu.com/" class="layui-input"
                       autocomplete="off">
            </div>
        </div>
        <div class="layui-form-item">
            <label class="layui-form-label">作者</label>
            <div class="layui-input-block">
                <input v-model="author" type="text" placeholder="author" class="layui-input" autocomplete="off">
            </div>
        </div>
        <div class="layui-form-item">
            <label class="layui-form-label">是否展示</label>
            <div class="layui-input-block">
                <input v-model="tag" type="text" placeholder="0/1" class="layui-input" autocomplete="off">
            </div>
        </div>
        <div class="layui-form-item">
            <div class="layui-input-block">
                <button class="layui-btn" @click="upd()">修改</button>
            </div>
        </div>
    </form>
    <a href="index.html" class="layui-btn layui-btn-primary">返回</a></div><script>
    // 如果我们通过全局配置了,请求的数据接口 根域名,则 ,在每次单独发起 http 请求的时候,请求的 url 路径,应该以相对路径开头,前面不能带 /  ,否则 不会启用根路径做拼接;
    Vue.http.options.root = 'http://120.79.197.130:8080/';

    // 全局启用 emulateJSON 选项:如果Web服务器无法处理编码为application/json的请求,你可以启用emulateJSON选项。
    Vue.http.options.emulateJSON = true;

    var vm = new Vue({
        el: '#app',
        data: {
            id: '',
            title: '',
            link: '',
            author: '',
            tag: ''
        },
        created() { // 当 vm 实例 的 data 和 methods 初始化完毕后,vm实例会自动执行created 这个生命周期函数
            var userId = location.hash.substring(1) // 去掉 #
            this.$http.get('getBlogById/' + userId).then(result => {
                // 注意: 通过 $http 获取到的数据,都在 result.body 中放着
                var result = result.body                if (result.code === 200) {
                    // 成功了
                    this.id = result.data.id                    this.title = result.data.title                    this.link = result.data.link                    this.author = result.data.author                    this.tag = result.data.tag                } else {
                    // 失败了
                    alert('获取数据失败!')
                }
            })
        },
        methods: {
            upd() { // 注意方法名不能为 update
                this.$http.put('updateBlog',
                    {
                        'id': this.id,
                        'title': this.title,
                        'link': this.link,
                        'author': this.author,
                        'tag': this.tag                    })
                    .then(result => {
                        var result = result.body                        if (result.code === 200) {
                            alert('修改成功!')
                        } else {
                            // 失败了
                            alert('修改失败!')
                        }
                    })
            }
        }
    })</script></body></html>

四、小结

本文使用的框架 VueLayUI,以及推荐的 UI 框架 ElementUI(pc端)/MintUI(移动端),都是国产的,值得支持。

解决本文前言的痛点(没有使用 webpack,代码冗余)

“使用 Vue + LayUI 做后台管理、RESTful 交互” 的相关文章

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。