SpringBoot + Vue前后端分离项目实战 || 四:用户管理功能实现

系列文章:
SpringBoot + Vue前后端分离项目实战 || 一:Vue前端设计
SpringBoot + Vue前后端分离项目实战 || 二:Spring Boot后端与数据库连接
SpringBoot + Vue前后端分离项目实战 || 三:Spring Boot后端与Vue前端连接
SpringBoot + Vue前后端分离项目实战 || 四:用户管理功能实现
SpringBoot + Vue前后端分离项目实战 || 五:用户管理功能后续

文章目录

    • 前端实现
    • 编写user.vue(整个`user.vue`代码已经放在文章最后)
      • 第一部分——搜索框
      • 第二部分——data表格
      • 第三部分——分页插件
    • 配置后端接口
    • 后端编写代码
    • user.vue

前端实现

之前自定义的user.vue页面为空白,现来实现其功能
在这里插入图片描述

先去element官网浏览需要的组件
官网链接: https://element.eleme.cn/2.13/#/zh-CN/component/dialog
版本:2.13.2
在这里插入图片描述

需要用到的组件:

  1. 卡片
    在这里插入图片描述
  2. 表格
    在这里插入图片描述
  3. 分页——完整功能
    在这里插入图片描述
  4. 输入框
    在这里插入图片描述
  5. 按钮
    在这里插入图片描述
  6. 打开表单的对话框
    在这里插入图片描述

编写user.vue(整个user.vue代码已经放在文章最后)

整体的页面分为3个部分,搜索——显示——分页插件
在这里插入图片描述

第一部分——搜索框

前端组件代码如下:
在这里插入图片描述

红色:绑定数据
黄色:绑定函数
白色:element自带的icon图标
在这里插入图片描述

  • 红色:
    在这里插入图片描述

  • 橙色:
    在这里插入图片描述
    在这里插入图片描述

  • 白色
    在这里插入图片描述

第二部分——data表格

在这里插入图片描述

  • 红色:绑定的数据列表变量
    在这里插入图片描述

  • 橙色,显示表格数据的序号,涉及到searchModel.pageNosearchModel.pageSize两个变量
    在这里插入图片描述

  • 白色:与后端的实体变量名保持一致
    在这里插入图片描述

第三部分——分页插件

在这里插入图片描述

  • 红色:更改插件的显示页数会再次查询数据库显示数据
    在这里插入图片描述
  • 橙色:分页插件的一些变量
    在这里插入图片描述
    至此,三个部分的前端介绍完毕

写上前端的钩子函数(页面加载自动取查询数据库然后显示)
在这里插入图片描述

配置后端接口

src\api新建一个userManage.js写上代码
在这里插入图片描述

import request from '@/utils/request'export default{getUserList(searchModel){return request({url:'/user/list',method:'get',params:{    // 传给后端的参数pageNo: searchModel.pageNo,pageSize: searchModel.pageSize,username: searchModel.username,phone: searchModel.phone,}});},}

然后去user.vue注册该文件
在这里插入图片描述

// 前后端对接的配置
import userApi from '@/api/userManage'

后端编写代码

UserController里面写对接前端的代码
在这里插入图片描述

// 增删改查,增:post请求,查:get请求,修改:put请求,删除:delete请求
@GetMapping("/list")
public Result<Map<String,Object>> getUserList(@RequestParam(value = "username",required = false) String username,@RequestParam(value = "phone",required = false) String phone,@RequestParam(value = "pageNo") Long pageNo,@RequestParam(value = "pageSize") Long pageSize){LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();// 第一个参数是对username进行判空条件,第三个username是传过来进行比较的值wrapper.eq(StringUtils.hasLength(username),User::getUsername,username);wrapper.eq(StringUtils.hasLength(phone),User::getPhone,phone);// 苞米豆 里的Page包,不是Spring的,传入当前页数和每页大小Page<User> page = new Page<>(pageNo, pageSize);// 分页查找,用 .page()方法userService.page(page,wrapper);Map<String,Object> data = new HashMap<>();data.put("total",page.getTotal());data.put("rows",page.getRecords());return Result.success(data);
}

注意下图中红色部分与前端的userManage.js中红色部分需保持一致
在这里插入图片描述在这里插入图片描述


此处后端返回的数据名也需和前端保持一致
在这里插入图片描述
在这里插入图片描述

借助postman验证
在这里插入图片描述
此处返回一个json对象,里面有codemessagedata字段,而且data中有totalrows字段

前端user.vue中代码 this.total = response.data.total;就是获取该data中的total数据

新增Mybatis-Plus的分页配置代码:在config\下新增MpConfig文件
在这里插入图片描述

package com.ums.config;import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;// 官网地址 https://baomidou.com/pages/2976a3/#spring
@Configuration
public class MpConfig {//配置 mybatis plus的分页插件,死代码@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));return interceptor;}
}

user.vue

<template><div><!-- 搜索栏 --><el-card id="search"><el-row><el-col :span="20"><el-input v-model="searchModel.username" placeholder="用户名" clearable></el-input><el-input v-model="searchModel.phone" placeholder="电话" clearable></el-input><el-button @click="getUserList" type="primary" round icon="el-icon-search">查询</el-button></el-col><el-col :span="4" align="right"><el-button @click="openEditUI" type="primary" icon="el-icon-plus" circle></el-button></el-col></el-row></el-card><!-- 结果列表 --><el-card><el-table :data="userList" stripe style="width: 100%"><el-table-column  label="#" width="80"><template slot-scope="scope"><!-- (pageNo-1) * pageSize + index + 1 -->{{(searchModel.pageNo-1) * searchModel.pageSize + scope.$index + 1}}</template></el-table-column><el-table-column prop="id" label="用户ID" width="180"></el-table-column><el-table-column prop="username" label="用户名" width="180"></el-table-column><el-table-column prop="phone" label="电话" width="180"></el-table-column><el-table-column prop="email" label="电子邮件"></el-table-column><el-table-column label="操作" width="180"></el-table-column></el-table></el-card><!-- 分页插件 --><el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange":current-page="searchModel.pageNo" :page-sizes="[5, 10, 20, 30, 40]" :page-size="searchModel.pageSize"layout="total, sizes, prev, pager, next, jumper" :total="total"></el-pagination><!-- 用户信息编辑对话框 --><!-- :title 加了冒号就变成一个变量,属性绑定了,后面的东西需要在data中说明 --><el-dialog @close="clearForm" :title="title" :visible.sync="dialogFormVisible"><el-form :model="userForm"><el-form-item label="用户名" :label-width="formLabelWidth"><el-input v-model="userForm.username" autocomplete="off"></el-input></el-form-item><el-form-item label="登录密码" :label-width="formLabelWidth"><el-input type="password" v-model="userForm.password" autocomplete="off"></el-input></el-form-item><el-form-item label="联系电话" :label-width="formLabelWidth"><el-input v-model="userForm.phone" autocomplete="off"></el-input></el-form-item><el-form-item label="用户状态" :label-width="formLabelWidth"><el-switch v-model="userForm.status" :active-value="1":inactive-value="0"active-color="#13ce66" inactive-color="#ff4949"></el-switch></el-form-item><el-form-item label="电子邮件" :label-width="formLabelWidth"><el-input v-model="userForm.email" autocomplete="off"></el-input></el-form-item></el-form><div slot="footer" class="dialog-footer"><el-button @click="dialogFormVisible = false">取 消</el-button><el-button type="primary" @click="dialogFormVisible = false">确 定</el-button></div></el-dialog></div>
</template><!-- 定义查询对象 -->
<script>// 前后端对接的配置import userApi from '@/api/userManage'// 页面变量export default {data () {return {formLabelWidth: '130px',userForm: {},dialogFormVisible: false,title: "",total: 0,searchModel: {    // 当前页面参数,会调用方法传给后端pageNo: 1,pageSize: 5},userList: [],}},methods: {clearForm(){// 清空表单this.userForm={}},openEditUI(){this.title = '新增用户';this.dialogFormVisible = true;},// 此处对应pageSize和pageNo改变时更改前端的显示handleSizeChange(pageSize){// 更新数据,完毕后重新调用函数this.searchModel.pageSize = pageSize;this.getUserList(); },handleCurrentChange(pageNo){// 更新数据,完毕后重新调用函数this.searchModel.pageNo = pageNo;this.getUserList(); },getUserList(){// userApi.getUserList 开始调用后端,并传递参数searchModel// then表示后端查询后返回的数据userApi.getUserList(this.searchModel).then(response=>{this.userList = response.data.rows;   // 后端返回的 json中的字段this.total = response.data.total;});}},// 钩子函数定义处created(){// 定义了一个钩子函数,即加载页面后就自动执行getUserList函数,显示数据this.getUserList();},}
</script><style>#search .el-input {width: 200px;margin-right: 10px;}.el-dialog .el-input{width: 85%;}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/20080.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【调峰】储能辅助电力系统调峰的容量需求研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【数据挖掘】时间序列教程【十】

5.4 通用卡尔曼滤波 上一节中描述的状态空间模型作为观测方程的更一般的公式 和状态方程 这里是一个p1 向量是一个k1 向量, 是一个pk 矩阵, 是kk 矩阵。我们可以想到的和 给定初始状态 和 &#xff0c;预测方程为&#xff08;类似于上面&#xff09; 并且更新方程是&#x…

038、TiDB特性_聚簇索引和非聚簇索引

聚簇表 表中的行数据才能出顺序与主键存储的顺序一致表的主键即为KV映射中Key的一部分通过主键访问行记录时&#xff0c;可以直接获取行记录 create table t( a biging primary key clustered ,b varchar(255)); # a列为主键列&#xff0c;聚簇列聚簇表&#xff08;且ID为主键…

【MySQL】根据MVCC和Read View分析事务的四种隔离级别在读写场景分别是如何体现其隔离性的

目录 一、数据库并发的三种场景 二、读写场景的MVCC 1、3个&#xff08;4个&#xff09;记录隐藏列字段 2、undo log&#xff08;撤销日志&#xff09; 3、模拟MVCC场景 3.1update场景 3.2delete场景 3.3insert 3.4select场景 4、Read View 5、RR和RC的区别 5.1当…

云开发校园微社区-二手交易兼职交友微信小程序

云开发校园微社区微信小程序开源源码&#xff0c;这是一款云开发校园微社区-二手交易_兼职_交友_项目微信小程序开源源码&#xff0c;可以给你提供快捷方便的校园生活&#xff0c;有很多有趣实用的板块和功能&#xff0c;如&#xff1a;闲置交易、表白交友、疑问互答、任务兼职…

数据结构【二叉树】

数据结构之二叉树 二叉树的定义二叉树的5种基本形态二叉树的抽象类型定义二叉树的特殊类型二叉树的性质二叉树的存储结构1、顺序存储2、链式存储 遍历二叉树前序遍历中序遍历后序遍历遍历算法的分析 线索二叉树 二叉树的定义 在数据结构中&#xff0c;二叉树是n&#xff08;n&…

Databend 开源周报第 101 期

Databend 是一款现代云数仓。专为弹性和高效设计&#xff0c;为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务&#xff1a;https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend 。 教程 | 使用 AW…

H5 与AI对话聊天框

一&#xff1a;最终实现效果展示 二&#xff1a;具体实现 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"renderer" content"webkit"><meta http-equiv"X-UA-Compa…

etcd的使用

什么是etcd ETCD是一个分布式、可靠的key-value存储的分布式系统&#xff0c;用于存储分布式系统中的关键数据&#xff1b;当然&#xff0c;它不仅仅用于存储&#xff0c;还提供配置共享及服务发现&#xff1b;基于Go语言实现 。 etcd的特点 完全复制&#xff1a;集群中的每…

opencv-图像处理基础-二值图像

opencv学习01_图像处理基础_二值图像 1&#xff0e;二值图像 二值图像是指仅仅包含黑色和白色两种颜色的图像。 在计算机中&#xff0c;通过一个栅格状排列的数据集&#xff08;矩阵&#xff09;来表示和处理图像。例如&#xff0c;图 2-1 是 一个字母 A 的图像&#xff0c;计算…

Git学习与使用

目录 版本控制、GIT以及SVN常见的版本控制方法本地版本控制集中式版本控制分布式版本控制 SVN与Git的区别 下载与安装Git安装&#xff1a; Git环境配置Git必要的配置 Git的基本理论&#xff08;核心&#xff09;Git项目搭建创建目录 git文件操作忽略文件 使用码云(gitee)辅助学…

RabbitMQ【笔记整理+代码案例】

1. 消息队列 1.1. MQ 的相关概念 1.1.1. 什么是 MQ MQ(message queue)&#xff0c;从字面意思上看&#xff0c;本质是个队列&#xff0c;FIFO 先入先出&#xff0c;只不过队列中存放的内容是message 而已&#xff0c;还是一种跨进程的通信机制&#xff0c;用于上下游传递消息…