前言

基于上篇博客 springboot 整合 Mybatis-plus 连接数据库的基础上,再增加 Vue 和 Axios 技术实现数据库的增删改查。

一、技术栈

1. Vue 

 Vue 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建,并提供了一套声明式的、组件化的编程模型,帮助你高效地开发用户界面。无论是简单还是复杂的界面,Vue 都可以胜任。

特点:

  • 声明式渲染:Vue 基于标准 HTML 拓展了一套模板语法,使得我们可以声明式地描述最终输出的 HTML 和 JavaScript 状态之间的关系。

  • 响应性:Vue 会自动跟踪 JavaScript 状态并在其发生变化时响应式地更新 DOM。

  • 渐进式框架:功能覆盖了大部分前端开发常见的需求

引用 Vue.js 文件有很多种方法,我这里推荐使用以下方法:

直接官网下载,然后通过路径引用。链接:安装 — Vue.js

然后选择安装路径即可。直接下载并用 <script> 标签引入,Vue 会被注册为一个全局变量

2. Axios

Axios 是一个基于 promise 网络请求库,作用于node.js 和浏览器中。 它是 isomorphic 的(即同一套代码可以运行在浏览器和node.js中)。在服务端它使用原生 node.js http 模块, 而在客户端 (浏览端) 则使用 XMLHttpRequests

特性:

  • 从浏览器创建 XMLHttpRequests
  • 从 node.js 创建 http 请求
  • 支持 Promise API
  • 拦截请求和响应
  • 转换请求和响应数据
  • 取消请求
  • 超时处理
  • 查询参数序列化支持嵌套项处理
  • 自动将请求体序列化为:
    • JSON (application/json)
    • Multipart / FormData (multipart/form-data)
    • URL encoded form (application/x-www-form-urlencoded)
  • 将 HTML Form 转换成 JSON 进行请求
  • 自动转换JSON数据
  • 获取浏览器和 node.js 的请求进度,并提供额外的信息(速度、剩余时间)
  • 为 node.js 设置带宽限制
  • 兼容符合规范的 FormData 和 Blob(包括 node.js)
  • 客户端支持防御XSRF
  • axios 通常和 Vue 一起使用,实现 Ajax 操作

安装 Axios 并使用 axios.min.js 文件

使用 npm 命令本地安装,确保自己已经安装了node 工具。在想要安装的文件目录下面使用终端打开,输入如下命令:

npm install axios

即可安装成功

可以看到生成了 node_modules 文件,node_modules\axios\dist 目录下可以看到如上的 axios 文件,( axios.min.js 文件是 axios.js 的压缩版,随便引用其中一种即可)

也可以直接在 <script> 标签中直接引用

<script src="https://unpkg.com/axios/dist/axios.min.js"></script>

3.iView 

iView 是一套基于 Vue.js 的开源 UI 组件库,主要服务于 PC 界面的中后台产品。

安装。在想要安装的文件目录下终端打开,(确保已经安装了nodejs工具)输入如下命令

npm install iview --save

就可以在本地文件看到 node_modules 文件,在 node_modules\iview\dist 目录下可以看到如下要引用的文件

styles 文件下有要引用 css 文件 

二、发送Axios请求

2.1 新建文件用来保存外部引用的文件

新建一个文件夹 web ,index.html 是我们要编写的前端页面代码

2.2 编写 index.html 文件

在头文件中引用完框架之后,在<body>中添加<div id="app"></div> 用来绑定根元素,然后在script中编写js代码。

new Vue({
        el: "#app",
        data() {
            return {
            msg:"测试"

}

在上边的div标签中写入{{msg}}然后运行代码,在网页中打印测试这两个字说明框架引用是没有问题的。

定义methods,methods在vue2中是存放方法的地方;再定义一个生命周期创建的方法created,用来调用methods中的方法。在methods中编写getList发法来发送一个Axios请求,在created中调用

 created() {
            // 调用
            this.getList()
        },
methods:{
     getList(){
        axios.get('http://localhost:8080/user/page')  // page 是之前写的接口
  .then(function (response) {
    // 处理成功情况
    console.log(response);
  })
  .catch(function (error) {
    // 处理错误情况
    console.log(error);
  })
  .finally(function () {
    // 总是会执行
   });
  }
}

在controller层下的UserController中添加@CrossOrigin注解,解决跨域问题

三、iView UI框架

官网链接:https://v2.iviewui.com/docs/guide/introduce

在index.html 文件中引用,上文已经讲述就不再赘述了

在iView组件中找到表格的组件,找一款适合自己设计数据库列表的组件,我选择的是这个,表头是可以修改的

复制一下代码到div标签中

<i-Table border ref="selection" :columns="title" :data="tableData" @on-selection-change="select"></i-Table>

title是定义的字段名称,tableData是表格数据, @on-selection-change 当选中时,触发自定义的方法select

在data中定义tableData方法,是一个空数组,再定义分页pageInfo,其中有三个参数。

current:1   表示当前页

size:6  表示展示的条数

name:""  表示查询的结果,为空是实现模糊查询

继续在data中定义title变量

          title: [
                    {
                        type: 'selection',
                        width: 60,
                        align: 'center'
                    },
                    {
                        title: 'ID',
                        key: 'id'
                    },
                    {
                        title: '用户名',
                        key: 'name'
                    },
                    {
                        title: '年龄',
                        key: 'age'
                    },
                    {
                        title: '来源',
                        key: 'source'
                    },
                    {
                        title: '操作',
                        key: 'text',
                        width: 250,
                        align: 'center',
                        render: (h, params) => {
                            return h('div', [
                                h('Button', {
                                    props: {
                                        type: 'primary',
                                        size: 'small'
                                    },
                                    style: {
                                        marginRight: '5px'
                                    },
                                    on: {
                                        click: () => {
                                            this.isShowModal = true
                                            this.ruleForm = Object.assign({}, params.row)
                                            this.titleModal = "编辑用户"
                                        }
                                    }
                                }, '编辑'),
                                h('Button', {
                                    props: {
                                        type: 'error',
                                        size: 'small'
                                    },
                                    on: {
                                        click: () => {
                                            console.log(params.row)
                                            this.delIds = [params.row.id]

                                            this.isConfirmDelete = true
                                        }
                                    }
                                }, '删除')
                            ]);
                        }
                    }
                ]

该代码是实现表头的字段的创建,和绑定字段的编辑和删除操作。

获取后端的数据:,在get Axios请求中修改和添加如下代码,从数据库中获取数据打印到前端页面中,在script开始的位置增加代码,设置自动获取当前的域名进行请求

//全局声明,网址请求
    axios.defaults.baseURL = "http://localhost:8080"
axios.get('/user/page', {
                    params: this.pageInfo       // 后面实现分页的传参
                })
                    .then((response) => {
                        // 处理成功情况
                        console.log(response);
                        let data = response.data
                        this.tableData = data.records
                        this.pageInfo.current = data.current
                        this.pageInfo.size = data.size
                        this.pageInfo.total = data.total
                    })
                    .catch(function (error) {
                        // 处理错误情况
                        console.log(error);
                    })
                    .finally(function () {
                        // 总是会执行
                    });

分页插件。在iView UI 组件中找到 page 分页组件

选择一款引入即可

<Page :total="pageInfo.total" :page-size="pageInfo.size" :current="pageInfo.current" 
show-total @on-change="currentPage"></Page>

注意位置是在<i-Table>标签之下

  • :current="pageInfo.current"   当前页的数字
  • show-total     总页数
  • :page-size="pageInfo.size"  每页条数

然后在methods中写分页的代码

currentPage(e) {
                this.pageInfo.current = e
                this.getList()
},

在 IDEA 中运行 index.html 文件即可看到实现分页的操作

如果分页失效,则在config层中的MybatisPlusConfig类中添加如下代码即可

四、增删改查

4.1 模糊查询

添加输入框

<i-input v-model="pageInfo.name" @input="getList" placeholder="请输入用户名" style="width: 200px"></i-input>
  • v-model="pageInfo.name"  绑定用户名
  •  @input="getList"   输入的时候进行查询

4.2 新增和编辑功能

添加增加用户的按钮

<i-Button @click="save('insert')">添加用户</i-Button>

添加点击事件,后面编写save方法

点击添加用户按钮弹出对话框

 <Modal v-model="isShowModal" :title="titleModal" :footer-hide="true">
        <i-form ref="ruleForm" :model="ruleForm" :rules="rule" :label-width="80">
            <form-item label="用户昵称" prop="name">
                <i-input style="width:200px" v-model="ruleForm.name" placeholder="用户昵称"></i-input>
            </form-item>
            <form-item label="年龄" prop="age">
                <i-input style="width:200px" v-model="ruleForm.age" placeholder="输入年龄"></i-input>
            </form-item>
            <form-item label="城市" prop="source">
                <i-input style="width:200px" v-model="ruleForm.source" placeholder="来源城市"></i-input>
            </form-item>
            <form-item label="密码" prop="password">
                <i-input style="width:200px" v-model="ruleForm.password" placeholder="请输入密码"></i-input>
            </form-item>
            <form-item>
                <i-button type="primary" @click="save()">提交</i-button>
                <i-button @click="handleReset('ruleForm')" style="margin-left: 38px">重置</i-button>
            </form-item>
        </i-form>
    </Modal>

isShowModal模块框设置为不展示

定义 titleModal 不然会报错

在data() 中编写 ruleForm方法

ruleForm: {
                    name: "",
                    age: "",
                    source: "",
                    password: ""
                },

在data() 中编写rule 验证规则

rule: {
                    name: [
                        {required: true, message: '请输入用户昵称', trigger: 'blur'}
                    ],
                    age: [
                        {required: true, message: '请输入用户年龄', trigger: 'blur'}
                    ],
                    source: [
                        {required: true, message: '请输入用户地址', trigger: 'blur'}
                    ],
                    password: [
                        {required: true, message: '请输入用户密码', trigger: 'blur'}
                    ],
                },

data() 方法

4.2.1 降序排列,新增的数据在第一页,在Service层中编写代码

在methods中定义handleReset方法

4.3 删除功能

添加按钮

<i-Button @click="handleSelectAll(true)">选择全部</i-Button>
<i-Button @click="handleSelectAll(false)">取消全选</i-Button>
<i-Button @click="isConfirmDelete=true" :disabled="delIds.length<=0 ? true:false">批量删除</i-Button>

:disabled="delIds.length<=0 ? true:false"   表示选中的行数,当选中的行大于0时则显示批量删除的按键

创建提示框

<MOdal v-model="isConfirmDelete" width="360">
        <p slot="header" style="color: #f60;text-align: center">
            <Icon type="ios-information-circle"></Icon>
            <span>数据删除</span>
        </p>
        <div style="text-align: center">
            <p>你确定要删除id为{{delIds}}的数据吗</p>
        </div>
        <div slot="footer">
            <i-button type="error" size="large" long @click="delList">确定删除</i-button>
        </div>
    </MOdal>

在data() 中定义变量

isConfirmDelete:false

在methods中编写delList方法和select方法

delList() {
                this.isConfirmDelete = false
                axios.post('/user/delete', this.delIds)
                    .then(response => {
                        console.log(response);
                        if (!response.data) {
                            this.$Message.error("删除失败")
                        } else {
                            // 重置分页到第一页
                            this.pageInfo.current = 1
                            this.getList()
                        }
                    })
                    .catch(function (error) {
                        console.log(error);
                    });
            },
            select(selection, row) {
                this.delIds = []
                selection.forEach(item => {
                    this.delIds.push(item.id)
                })
                console.log(this.delIds)
            },

在data() 中定义delIds 变量

在当前页中若删除了当前页中的所有数据,则应该页数减一并且回到上一页,就是删除后重置当前页到第一页;同理,当前页若已经满,即刚好数量到达展示的行数,则再增加用户就应该到另一页页中

在删除后的操作中添加如下代码:

this.pageInfo.current = 1

在添加用户中添加如下代码

this.pageInfo.current = 1

功能展示:

单选删除

批量删除

至此,整个增删改查的功能就结束了

总结

该案例作者也是跟着b站的博主一步一步操作的,其中有很多代码的含义我也没能彻底理解

博主视频链接:SpringBoot+Vue前后端分离实现数据增删改查教学(mybatis-plus版)_哔哩哔哩_bilibili

案例涉及的技术 SpringBoot+Mybatis-Plus+Vue+Axios,需要提前学习前端的基础知识,node、js、dom编程等才能深入理解该案例的各代码的具体含义

最后每篇分享:遇见你,就像跋山涉水遇见一轮明月,以后天黑心伤,就问那天借一点月光——《天堂旅行团》 

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐