SpringCould+vue3项目的后台用户管理的CURD【Taurus教育平台】
文章目录
- 一.SpringCould+vue3项目的后台用户管理的CURD【Taurus教育平台】
-
- 1.1 背景
- 二.用户列表(分页查询)
-
- 2.1 前端Vue3 (Vue3-Element-Admin)
- 2.2 后端SpringCould 处理
- 三. 用户信息删除
-
- 3.1 前端Vue3 (Vue3-Element-Admin)
- 3.2 后端SpringCould 处理
- 四.用户信息新增和修改
-
- 4.1 前端Vue3 (Vue3-Element-Admin)
- 4.2 后端SpringCould 处理
一.SpringCould+vue3项目的后台用户管理的CURD【Taurus教育平台】
1.1 背景
前文已经写了SpringCould+Vue3-Element-Admin 登录接口,用户信息接口以及Token验证的实现。
本项目为重构:行知在线综合教育平台。本项目更名为:Taurus教育平台
关键字:SpringBoot、SpringCould、Vue3、Uni-app
前端后台管理系统采用开源项目:Vue3-Element-Admin。
本文主要实现了后台用户管理的CURD功能。
二.用户列表(分页查询)
这里的查询包括,分页的全部查询,根据username查询,根据学生id查询,根据角色查询。
2.1 前端Vue3 (Vue3-Element-Admin)
1.在router里新建user.js,在user路径下注册映射增删改查的url。
export default [{path: '/user',component: Layout,name: 'user-manage',meta: {title: '用户管理',},icon: 'icon-home',children: [{path: 'list',name: 'userlist',component: List,meta: {title: '用户列表',// affix: true,},},{path: 'add',name: 'useradd',component: Add,meta: {title: '添加用户',// affix: true,},hidden:true},{path: 'edit/:id',name: 'userEdit',component: edit,meta: {title: '编辑用户',// affix: true,},hidden:true},],},
]
2.在router里的index.js将新建的user加入固定菜单中。
export const fixedRoutes = [...home,...user]
3.在views里新建文件夹user,并且在index作为用户类别展示页面。
用户列表采用Element,十分简单:

这里记一些相对重要的东西:
因为我的数据库设计的role的值规则为:
role: 0 管理员 1 教师 2 学生
所以后端传值为int,在前端显示我们需要使用插值。
<template #role="{row}">
{{ seitrole(row.role) }}
</template>const seitrole = (roleId) => {if(roleId ==0)return "管理员"if(roleId ==1)return "教师"if(roleId !=0 && roleId !=1)return "学生"
};

请求函数:这块是异步的,我们在渲染表单,就会向后端请求数据库里的数据。
请求函数如下:
// 请求函数
const getUserList = async (params) => {// params是从组件接收的,包含分页和搜索字段。console.log("执行请求函数");const {data,total} =await API.getUserList(params);state.falgdate=data// 必须要返回一个对象,包含data数组和total总数return {data,total,};
};
API接口如下:
// 获取用户列表
export const getUserList = data => {const token = localStorage.getItem('token'); // 获取存储在本地浏览器中的tokenreturn request({url: 'http://localhost:8001/user/list',method: 'get',params: data,headers: {'Authorization': 'Bearer ' + token,}})
}
根据username查询,根据学生id查询,根据角色查询。
规定三者互斥,只能根据应该主要的索引查询。
:search="search" search:{fields:[{label:'账号',type:'text',name:"username"},{label:"学号",type:"text",name:'studentID'},{label:"角色",type:"select",name:'role',options:[{name:'管理员',value:'0'},{name:'老师',value:'1'},{name:'学生',value:'2'}]}]
}
效果图:




2.2 后端SpringCould 处理
这里的查询包括,分页的全部查询,根据username查询,根据学生id查询,根据角色查询。后端需要考虑这写情况。
用户列表功能(查询):
需要获取到token,和一些主要的关键的字段。对与username和studentid和role需要设置为可为空值。
@GetMapping("/user/list")
public Message getUserList(@RequestHeader("Authorization") String token,@RequestHeader("User-Agent") String userAgent,@RequestParam("current") int currentPage,@RequestParam("size") int pageSize,@RequestParam(value = "username", required = false) String username,@RequestParam(value ="studentID", required = false) String studentID,@RequestParam(value ="role", required = false) String role) {
排除前端传空值报错,直接赋值为null
if (username==""){username=null;
}
if (studentID==""){studentID=null;
}
if (role==""){role=null;
}
token检查:
String tokenlast = token.replace("Bearer ", "");
Message msg=new Message();
String Ctoken = sysUserService.tokenCheck(tokenlast);
如果Ctoken不为空说明,token效验通过,有效。
if(Ctoken!=null){//查询所有if (username==null && studentID == null &&role == null){msg = sysUserService.userlist(currentPage,pageSize);return msg;}//查询用户的用户名else if(username!=null && studentID == null &&role == null){msg = sysUserService.userbyname(currentPage,pageSize,username);return msg;}//查询用户的学号else if(username==null && studentID != null &&role == null){msg = sysUserService.userbystudentID(currentPage,pageSize,studentID);return msg;}//查询用户的角色else if(username==null && studentID == null &&role != null){msg = sysUserService.userbyrole(currentPage,pageSize,role);return msg;}else {System.out.println("错误");}
}
else {msg.setMessage("Token状态异常");msg.setStatus(401);Map<String, String> map = new HashMap<>();msg.setData(map);return msg;
}
token检查工具类:
public static Claims parseToken(String token) {try {SecretKey secretKey = new SecretKeySpec(key.getBytes(), SignatureAlgorithm.HS256.getJcaName());Claims claims = Jwts.parser().setSigningKey(secretKey).parseClaimsJws(token).getBody();return claims;} catch (ExpiredJwtException e) {// Token已过期System.out.println("Token已过期");return null;} catch (JwtException e) {// Token解析失败System.out.println("Token解析失败");return null;}
}
查询所有:查询所有用户信息
public Message userlist(int currentPage, int pageSize) {Message msg=new Message();int startIndex = (currentPage-1) * pageSize; //起始位置List<User> userList = sysUserDao.Userquery(startIndex,pageSize);Integer total = sysUserDao.Usertotal();msg.setTotal(total);Map<String, String> map = new HashMap<>();msg.setData(userList);msg.setMessage("查询所有人成功");msg.setStatus(200);return msg;
}
这块需要对sql进行俩次查询,第一次传入起始位置,和该页的条数进行分页查询,第二次对满足条件的sql总数进行查询。
对应的sql语句为:
SELECT * FROM user ORDER BY id LIMIT #{pageSize} OFFSET #{startIndex}SELECT COUNT(*) FROM user;
对于用户名、学生学号、用户角色,分别进行三次判断。

然后对其进行处理即可。三个条件互斥。
三. 用户信息删除
3.1 前端Vue3 (Vue3-Element-Admin)
用户信息删除包含单项信息删除和多选信息删除。
批量删除:批量删除是把目标值的id进行拼接,单词分割符为,
<el-button :disabled="selectedIds.length<=0"type="danger"@click="deleteUserByid(selectedIds.join(','))">批量删除
</el-button>
单项信息删除:单项信息删除
<el-button size="mini" type="danger" @click="deleteUserByid(row.id)">删除</el-button>
根据id删除用户
const deleteUserByid = id => {ElMessageBox.confirm('是否确定删除?','Warning',{confirmButtonText: '确定',cancelButtonText: '取消',type: 'warning',}).then(async () => {const {status}= await API.deleteUserByid(id)if (+status === 200){ElMessage({type: 'success',message: '删除成功',})table.value.refresh()}else{ElMessage({type: 'NOsuccess',message: '删除失败',})}}).catch(() => {ElMessage({type: 'info',message: '取消',})})
}
批量删除用户
const handleChange = arr =>{state.selectedIds = arr.map(item=>item.id)console.log(arr);
}
根据id删除用户API:
export const deleteUserByid = id => {const token = localStorage.getItem('token'); // 获取存储在本地浏览器中的tokenreturn request({url: `http://localhost:8001/user/deleteUserByid?id=${id}`,method: 'get',headers: {'Authorization': 'Bearer ' + token,}})
}
3.2 后端SpringCould 处理
按照用户id删除
获取到token和id。
@GetMapping("/user/deleteUserByid")
public Message deleteUserByid(@RequestHeader("Authorization") String token,@RequestHeader("User-Agent") String userAgent,@RequestParam("id") String userid
) {
对前端传值的字符串拼接进行一个处理。
long[] idsArr = Arrays.stream(userid.split(",")).mapToLong(Long::parseLong).toArray();
删除对应的id用户信息的sql语句如下:
<delete id="deleteByIds" parameterType="long">DELETE FROM user WHERE id IN<foreach collection="array" item="id" open="(" separator="," close=")">#{id}</foreach>
</delete>
四.用户信息新增和修改
4.1 前端Vue3 (Vue3-Element-Admin)
用户信息新增和修改较为简单。
模板层:
<template>
<el-formref="ruleFormRef":model="ruleForm":rules="rules"label-width="120px"class="demo-ruleForm":size="formSize"status-icon><el-form-item label="用户名" prop="username" ><el-input v-model="ruleForm.username" placeholder="请输入用户名"/></el-form-item><el-form-item label="姓名" prop="name" ><el-input v-model="ruleForm.name" placeholder="请输入姓名"/></el-form-item><el-form-item label="密码" prop="password" ><el-input v-model="ruleForm.password" placeholder="请输入密码"/></el-form-item><el-form-item label="手机号" prop="phone" ><el-input v-model="ruleForm.phone" placeholder="请输入手机号"/></el-form-item><el-form-item label="邮箱" prop="email" ><el-input v-model="ruleForm.email" placeholder="请输入邮箱"/></el-form-item><el-form-item label="学号" prop="studentID" ><el-input v-model="ruleForm.studentID" placeholder="请输入学号"/></el-form-item><el-form-item label="角色" prop="role"><el-select v-model="ruleForm.role" placeholder="请选择"><el-option label="管理员" value="0" /><el-option label="老师" value="1" /><el-option label="学生" value="2" /></el-select></el-form-item><el-form-item><el-button type="primary" @click="submitForm(ruleFormRef)">Create</el-button><el-button @click="resetForm(ruleFormRef)">Reset</el-button></el-form-item></el-form>
</template>
然后调用api请求后端接口即可,和上面流程相同:
const { status } = await API.craeteuser(ruleForm);
PS:这里涉及到在回调函数里进行页面跳转
if (+status === 200) {console.log('Success');router.push('/user/list'); // 在成功回调中进行页面跳转ElMessage({message: '添加成功!',type: 'success',})// resetForm} else {console.error(`ERROR`);
}
修改和他几乎相同,我们可以在url后加一个id=X,然后根据id的值来获取到对应的用户信息,再修改完,提交即可。
4.2 后端SpringCould 处理

SQL处理如下:
<insert id="craeteuser" parameterType="User"><!-- 将用户信息插入到 user 表中,并返回插入结果的行数 -->INSERT INTO user (uuid, username, name, password, phone, email, studentID, role, type, CreatTime, imgurl)VALUES (#{uuid}, #{username}, #{name}, #{password}, #{phone}, #{email}, #{studentID}, #{role}, #{type}, #{CreatTime,jdbcType=TIMESTAMP}, #{imgurl})
</insert>
根据指定用户的id进行修改的SQL语句如下:
<update id="edituser" parameterType="User">UPDATE user SET username=#{username},name=#{name},password=#{password},phone=#{phone},email=#{email},studentID=#{studentID},role=#{role},type=#{type},CreatTime=#{CreatTime},imgurl=#{imgurl}WHERE id=#{id}
</update>
到这,已经完成了后台管理系统用户的增删改查。
相关文章:
SpringCould+vue3项目的后台用户管理的CURD【Taurus教育平台】
文章目录 一.SpringCouldvue3项目的后台用户管理的CURD【Taurus教育平台】 1.1 背景 二.用户列表(分页查询) 2.1 前端Vue3 (Vue3-Element-Admin)2.2 后端SpringCould 处理 三. 用户信息删除 3.1 前端Vue3 (Vue3-Eleme…...
ROS-相机话题-获取图像-颜色目标识别与定位-目标跟随-人脸检测
文章目录 相机话题获取图像颜色目标识别与定位目标跟随人脸检测 相机话题 启动仿真 roslaunch wpr_simulation wpb_stage_robocup.launch rostopic hz /kinect2/qhd/image_color_rect/camera/image_raw:原始的、未经处理的图像数据。 /camera/image_rectÿ…...
破解Docker镜像拉取难题:为Docker配置代理加速镜像拉取
为Docker配置代理加速镜像拉取 概述守护进程配置(推荐长期使用)Systemd环境变量配置(适合临时调整)其他 概述 为什么需要配置代理与镜像加速? 跨国网络限制:境外镜像仓库拉取速度慢或无法访问企业安全策略ÿ…...
细分数字货币钱包的不同种类
文章目录 一、中心化钱包1.1 中心化钱包架构1.2 中心化钱包业务细节流程 二、去中心化钱包(HD 钱包)2.1 去中心化钱包架构2.2 去中心化钱包细节业务流程 三、硬件钱包3.1 硬件钱包架构3.2 硬件钱包细节业务流程 四、MPC 托管钱包五、多签钱包 中心化钱包 :钱包私钥一…...
推理模型时代:大语言模型如何从对话走向深度思考?
一、对话模型和推理模型的区别概述 对话模型是专门用于问答交互的语言模型,符合人类的聊天方式,返回的内容可能仅仅只是一个简短的答案,一般模型名称后面会带有「chat」字样。 推理模型是比较新的产物,没有明确的定义,一般是指输出过程中带有<think>和</think&…...
调用click.getchar()时Windows PyCharm无法模拟键盘输入
文章目录 问题描述解决方案参考文献 问题描述 调用 click.getchar() 时,Windows PyCharm 无法模拟键盘输入 解决方案 Run → Edit Configurations… → Modify options → Emulate terminal in output console 参考文献 Terminal emulator | PyCharm Documentati…...
关于ES中text类型时间字段范围查询的结构化解决方案
前言 有关es中text类型的时间字段范围查询的问题,比如: {"query": {"range": {"insertTime": {"gte": "2025-02-01T00:00:00","lte": "2025-11-30T23:59:59","format&quo…...
易基因: ChIP-seq+DRIP-seq揭示AMPK通过调控H3K4me3沉积和R-loop形成以维持基因组稳定性和生殖细胞完整性|NAR
原文:ChIP-seqDRIP-seq揭示AMPK通过调控H3K4me3沉积和R-loop形成以维持基因组稳定性和生殖细胞完整性|NAR 大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。 在饥饿等能量胁迫条件下,生物体会通过调整…...
Web 自动化测试提速利器:Aqua 的 Web Inspector (检查器)使用详解
Web 自动化测试提速利器:Aqua 的 Web Inspector (检查器)使用详解 前言简介一、安装二、Web Inspector 的使用2.1 获取元素定位器(Locators)2.2 将定位器添加到代码2.3 验证定位器2.4 处理 Frames (框架)总结前言 JetBrains 的 Aqua IDE 提供强大的 Web Inspector 工具,帮…...
数据中心储能蓄电池状态监测管理系统 组成架构介绍
安科瑞刘鸿鹏 摘要 随着数据中心对供电可靠性要求的提高,蓄电池储能系统成为关键的后备电源。本文探讨了蓄电池监测系统在数据中心储能系统中的重要性,分析了ABAT系列蓄电池在线监测系统的功能、技术特点及其应用优势。通过蓄电池监测系统的实施&#…...
01数据准备 抓取图片 通过爬虫方式获取bing的关键词搜索图片
为了获取训练所需的图片,我们最常用的手段就是自己去写一个爬虫去获取相关图片。本文将重点围绕如何采用爬虫的方式获取训练所需的图片素材进行讲解,为了大家能够够直观的掌握相关技术,参考本文的相关过程和代码获取自己的数据图片素材,笔者将详细介绍实现过程。 1、确定图…...
【UCB CS 61B SP24】Lecture 5 - Lists 3: DLLists and Arrays学习笔记
本文内容为构建双向循环链表、使用 Java 的泛型将其优化为通用类型的链表以及数组的基本语法介绍。 1. 双向链表 回顾上一节课写的代码,当执行 addLast() 与 getLast() 方法时需要遍历链表,效率不高,因此可以添加一个指向链表末尾的索引&am…...
Git 工作流程
1、Git 工作流程 http://www.ruanyifeng.com/blog/2015/12/git-workflow.html git push -f origin HEAD^:master 删除服务器上最近的一次提交git push -f origin HEAD^:master 2、Git分支管理 动画形式演示分支效果: http://onlywei.github.io/explain-git-with-…...
DeepSeek接入Siri(已升级支持苹果手表)完整版硅基流动DeepSeek-R1部署
DeepSeek接入Siri(已升级支持苹果手表)完整版硅基流动DeepSeek-R1部署 **DeepSeek** 是一款专注于深度学习和人工智能的工具或平台,通常与人工智能、机器学习、自动化分析等领域有关。它的主要功能可能包括:深度学习模型搜索&…...
【后端】gitHub访问速度太慢解决办法
问题描述 浏览器无法打开GitHub,加载非常慢 解决方法 1、修改本地hosts文件,增加到 http://github.global.ssl.fastly.net 和 http://github.com 的映射 本机hosts 文件位置: C:\Windows\System32\drivers\etc配置如下: # g…...
Hutool - Extra:功能丰富的扩展模块
一、简介 Hutool - Extra 作为 Hutool 工具包的扩展模块,对众多第三方库和功能进行了封装,极大地丰富了 Hutool 的功能体系。它涵盖了模板引擎、邮件发送、Servlet 处理、二维码生成、Emoji 处理、FTP 操作以及分词等多个方面,为开发者在不同…...
opencv实时二维码识别的一种实现与思路分享
在嵌入式平台上比如 rk3568 这种弱鸡的平台,要做到实时视频处理就非常鸡肋,不像英伟达那种 deepstrem 什么的。 开始的时候,我们使用python 下的 pyzbar + opencv opencv 读取摄像头的数据然后每帧送到 pyzbar 二维码识别函数里面进行处理,然后打印出识别的数字。结果,非常…...
深入剖析Linux C中线程未释放问题
深入剖析 Linux C 中线程未释放问题 在 Linux C 编程中,线程的正确使用对于程序的性能和稳定性至关重要。其中,线程资源的释放是一个容易被忽视但又极为关键的环节。本文将通过具体代码示例,深入探讨线程未释放的问题,并结合进程…...
个人博客5年回顾
https://huangtao01.github.io/ 五年前,看程序羊的b站视频做的blog,受限于网络,只能单向学习,没有人指导与监督,从来没有想过,有没有什么问题? 一、为什么要做个人博客? 二、我是怎么…...
nacos编写瀚高数据库插件
1、下载nacos源码 git clone gitgithub.com:alibaba/nacos.git 2、引入瀚高驱动 <dependency><groupId>com.highgo</groupId><artifactId>jdbc</artifactId><version>${highgo.version}</version></dependency> 3、DataSource…...
bboss v7.3.5来袭!新增异地灾备机制和Kerberos认证机制,助力企业数据安全
ETL & 流批一体化框架 bboss v7.3.5 发布,多源输出插件增加为特定输出插件设置记录过滤功能;Elasticsearch 客户端新增异地双中心灾备机制,提升框架高可用性;Elasticsearch client 和 http 微服务框架增加对 Kerberos 认证支持…...
【编程语言】委托与函数指针
委托与函数指针的相似之处: 指向方法:C# 的委托和 C 的函数指针都可以用来指向一个方法或函数。调用方法:它们都可以通过引用(委托或函数指针)来调用指向的方法。 委托与函数指针的主要区别: 类型安全&am…...
《Python实战进阶》专栏 No2: Flask 中间件与请求钩子的应用
专栏简介 《Python实战进阶》专栏共68集,分为 模块1:Web开发与API设计(共10集);模块2:数据处理与分析(共10集);模块3:自动化与脚本开发(共8集&am…...
Redis三剑客解决方案
文章目录 缓存穿透缓存穿透的概念两种解决方案: 缓存雪崩缓存击穿 缓存穿透 缓存穿透的概念 每一次查询的 key 都不在 redis 中,数据库中也没有。 一般都是属于非法的请求,比如 id<0,比如可以在 API 入口做一些参数校验。 大量访问不存…...
OpenCV机器学习(8)随机森林(Random Forests)算法cv::ml::RTrees类
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::ml::RTrees 是 OpenCV 机器学习模块中的一部分,用于实现随机森林(Random Forests)算法。随机森林是一种集…...
C++:线程当中的锁专题
在 C 多线程编程中,线程同步是确保程序正确运行的关键环节,而锁机制则是实现线程同步的重要手段。 一、线程的同步之互斥锁 1.1 互斥锁的概念 互斥锁(Mutex,即 Mutual Exclusion 的缩写)是一种最基本的线程同步工具…...
vue3 文件类型传Form Data数据格式给后端
在 Vue 3 中,如果你想将文件(例如上传的 Excel 文件)以 FormData 格式发送到后端,可以通过以下步骤实现。这种方式通常用于处理文件上传,因为它可以将文件和其他数据一起发送到服务器。 首先,创建一个 Vue…...
Frp部署文档
Frp部署文档 开源项目地址:https://github.com/fatedier/frp项目中文文档地址:https://github.com/fatedier/frp/blob/dev/README_zh.md官网文档地址: https://gofrp.org/zh-cn/docs/发布包地址:https://github.com/fatedier/frp/releases 要注意对应的…...
创建一个简单的spring boot+vue前后端分离项目
一、环境准备 此次实验需要的环境: jdk、maven、nvm和node.js 开发工具:idea或者Spring Tool Suite 4,前端可使用HBuilder X,数据库Mysql 下面提供maven安装与配置步骤和nvm安装与配置步骤: 1、maven安装与配置 1…...
Spring Boot项目@Cacheable注解的使用
Cacheable 是 Spring 框架中用于缓存的注解之一,它可以帮助你轻松地将方法的结果缓存起来,从而提高应用的性能。下面详细介绍如何使用 Cacheable 注解以及相关的配置和注意事项。 1. 基本用法 1.1 添加依赖 首先,确保你的项目中包含了 Spr…...
