当前位置: 首页 > news >正文

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,十分简单:

image-20230427103651325

这里记一些相对重要的东西:
因为我的数据库设计的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 "学生"
};

image-20230427104005283

请求函数:这块是异步的,我们在渲染表单,就会向后端请求数据库里的数据。

请求函数如下:

// 请求函数
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'}]}]
}

效果图:

image-20230427104832597

image-20230427104842141

image-20230427104911235

image-20230427104927759

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;

对于用户名、学生学号、用户角色,分别进行三次判断。

image-20230427110833691

然后对其进行处理即可。三个条件互斥。

三. 用户信息删除

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 处理

image-20230427114346843

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 背景 二.用户列表&#xff08;分页查询&#xff09; 2.1 前端Vue3 &#xff08;Vue3-Element-Admin&#xff09;2.2 后端SpringCould 处理 三. 用户信息删除 3.1 前端Vue3 &#xff08;Vue3-Eleme…...

功能说明并准备静态结构

功能说明并准备静态结构 <template><div class"card-container"><!-- 搜索区域 --><div class"search-container"><span class"search-label">车牌号码&#xff1a;</span><el-input clearable placeho…...

solidity之Foundry安装配置(一)

一门面向合约的高级编程语言&#xff0c;主要用来编写以太坊只能合约。 Solidity受C语言&#xff0c;Python和js影响&#xff0c;但为编译成为以太坊虚拟机字节码在EVM上执行&#xff0c;很多特性和限制都和EVM相关。 Solidity 是静态类型语言&#xff0c;支持继承、库、自定义…...

请解释 Vue 中的生命周期钩子,不同阶段触发的钩子函数及其用途是什么?

vue生命周期钩子详解&#xff08;Vue 3版本&#xff09; 一、生命周期阶段划分 Vue组件的生命周期可分为四大阶段&#xff0c;每个阶段对应特定钩子函数&#xff1a; 创建阶段&#xff1a;初始化实例并准备数据挂载阶段&#xff1a;将虚拟DOM渲染为真实DOM更新阶段&#xff…...

C#上位机--选择语句(switch)

在 C# 上位机开发的广阔领域中&#xff0c;流程控制语句如同程序的 “交通枢纽”&#xff0c;精准地引导着程序的执行路径。继深入探讨if语句后&#xff0c;我们将目光聚焦于另一个重要的流程控制语句 ——switch语句。switch语句以其独特的多路分支结构&#xff0c;为处理多条…...

Hadoop初体验

一、HDFS初体验 1. shell命令操作 hadoop fs -mkdir /itcast hadoop fs -put zookeeper.out /itcast hadoop fs -ls / 2. Web UI页面操作 结论&#xff1a; HDFS本质就是一个文件系统有目录树结构 和Linux类似&#xff0c;分文件、文件夹为什么上传一个小文件也这…...

在vue2中操作数组,如何保证其视图的响应式

在 Vue 2 中&#xff0c;操作数组时需要注意一些方法不会触发视图的响应式更新。为了确保数组的操作是响应式的&#xff0c;可以使用 Vue 提供的响应式方法。以下是一些常见的操作及其替代方法&#xff1a; 使用 Vue.set 方法&#xff1a; 当你需要通过索引直接修改数组中的某个…...

CentOS的ssh复制文件

1.前提 首先要已经连接上了对方的ssh 2.命令 scp [文件] 目标IP:目标路径 例如&#xff1a; $PWD是一个环境变量&#xff0c;可以获取当前绝对目录&#xff0c;ssh上传的时候一定要确保对方有这个目录才行&#xff0c;不然会报错 3.递归上传 scp -r 目录 目标IP:路径 可以…...

Spring Cloud — Hystrix 服务隔离、请求缓存及合并

Hystrix 的核心是提供服务容错保护&#xff0c;防止任何单一依赖耗尽整个容器的全部用户线程。使用舱壁隔离模式&#xff0c;对资源或失败单元进行隔离&#xff0c;避免一个服务的失效导致整个系统垮掉&#xff08;雪崩效应&#xff09;。 1 Hystrix监控 Hystrix 提供了对服务…...

Vmware虚拟机Ubantu安装Docker、k8s、kuboard

准备工作: 切换用户&#xff1a;su root关闭防火墙: sudo ufw diasble关闭swap: systemctl stop swap.target systemctl status swap.target systemctl disable swap.target #开机禁用 systemctl stop swap.img.swap systemctl status swap.img.swap关闭虚拟交换分区 vim /…...

PHP建立MySQL持久化连接(长连接)及mysql与mysqli扩展的区别

如果在 PHP 5.3 的版本以前想要创建MySQL的持久化连接(长连接)&#xff0c;需要显式调用 pconnect 创建&#xff1a; $con mysql_pconnect($server[host], $server[username], $server[password]); if (!($con false)) { if (mysql_select_db($server[database], $con) fals…...

python爬虫系列课程2:如何下载Xpath Helper

python爬虫系列课程2:如何下载Xpath Helper 一、访问极简插件官网二、点击搜索按钮三、输入xpath并点击搜索四、点击推荐下载五、将下载下来的文件解压缩六、打开扩展程序界面七、将xpath.crx文件拖入扩展程序界面一、访问极简插件官网 极简插件官网地址:https://chrome.zzz…...

【Python项目】基于Python的Web漏洞挖掘系统

【Python项目】基于Python的Web漏洞挖掘系统 技术简介&#xff1a; 采用Python技术、MySQL数据库、Django框架、Scrapy爬虫等技术实现。 系统简介&#xff1a; Web漏洞挖掘系统是一个基于B/S架构的漏洞扫描平台&#xff0c;旨在通过自动化的方式对网站进行漏洞检测。系统主要功…...

多环境日志管理:使用Logback与Logstash集成实现高效日志处理

多环境日志管理&#xff1a;使用Logback与Logstash集成实现高效日志处理 在现代软件开发中&#xff0c;有效的日志管理是至关重要的。无论是调试问题、监控应用性能还是审计用户活动&#xff0c;良好的日志策略都能大大提高工作效率。本文将详细介绍如何配置Spring Boot项目以…...

idea连接gitee(使用idea远程兼容gitee)

文章目录 先登录你的gitee拿到你的邮箱找到idea的设置选择密码方式登录填写你的邮箱和密码登录成功 先登录你的gitee拿到你的邮箱 具体位置在gitee–>设置–>邮箱管理 找到idea的设置 选择密码方式登录 填写你的邮箱和密码 登录成功...

STM32 看门狗

目录 背景 独立看门狗&#xff08;IWDG&#xff09; 寄存器访问保护 窗口看门狗&#xff08;WWDG&#xff09; 程序 独立看门狗 设置独立看门狗程序 第一步、使能对独立看门狗寄存器的写操作 第二步、设置预分频和重装载值 第三步、喂狗 第四步、使能独立看门狗 喂狗…...

飞书API

extend目录下,API <?php // ---------------------------------------------------------------------- // | 飞书API // ---------------------------------------------------------------------- // | COPYRIGHT (C) 2021 http://www.jeoshi.com All rights reserved. …...

深入解析 Hydra 库:灵活强大的 Python 配置管理框架

深入解析 Hydra 库&#xff1a;灵活强大的 Python 配置管理框架 在机器学习、深度学习和复杂软件开发项目中&#xff0c;管理和维护大量的配置参数是一项具有挑战性的任务。传统的 argparse、json 或 yaml 方式虽然能管理部分配置&#xff0c;但随着项目规模的增长&#xff0c…...

【开源免费】基于Vue和SpringBoot的失物招领平台(附论文)

本文项目编号 T 243 &#xff0c;文末自助获取源码 \color{red}{T243&#xff0c;文末自助获取源码} T243&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…...

科普:你的笔记本电脑中有三个IP:127.0.0.1、无线网 IP 和局域网 IP;两个域名:localhost和host.docker.internal

三个IP 你的笔记本电脑中有三个IP&#xff1a;127.0.0.1、无线网 IP 和局域网 IP。 在不同的场景下&#xff0c;需要选用不同的 IP 地址&#xff0c;如下为各自的特点及适用场景&#xff1a; 127.0.0.1&#xff08;回环地址&#xff09; 特点 127.0.0.1 是一个特殊的 IP 地…...

nli-MiniLM2-L6-H768镜像免配置实战:无需pip install,7860端口直连即用

nli-MiniLM2-L6-H768镜像免配置实战&#xff1a;无需pip install&#xff0c;7860端口直连即用 1. 镜像介绍与核心能力 nli-MiniLM2-L6-H768 是一个专为自然语言推理&#xff08;NLI&#xff09;任务优化的轻量级模型。与常见的生成式AI不同&#xff0c;它的核心能力是分析两…...

YC 总裁开源了自己亲手写的 AI Agent 大脑,1 周就 1 万点赞。

还记得之前那个特别火的 GStack 吗?我前几天也发过文章介绍过。就是 Y Combinator 现任总裁兼 CEO Garry Tan 开源的那套专门给 AI 写代码用的 Skill 工作流&#xff0c;目前 7 万 Star。每天有 3 万开发者在用&#xff0c;在 Claude Code 圈子里基本算是贼火模板了。就在前几…...

CircuitGuard防御LLM在RTL代码生成中的记忆风险

1. 项目概述&#xff1a;CircuitGuard防御LLM在RTL代码生成中的记忆风险在硬件设计自动化领域&#xff0c;大型语言模型&#xff08;LLMs&#xff09;正逐渐成为RTL代码生成的重要工具。然而&#xff0c;这些模型在训练过程中会不可避免地记忆部分训练数据&#xff0c;当这些数…...

5分钟快速上手AFFiNE Webhook:让你的工作流自动响应一切变化

5分钟快速上手AFFiNE Webhook&#xff1a;让你的工作流自动响应一切变化 【免费下载链接】AFFiNE There can be more than Notion and Miro. AFFiNE(pronounced [ə‘fain]) is a next-gen knowledge base that brings planning, sorting and creating all together. Privacy f…...

医学图像三维重建避坑指南:为什么你的VTK模型总是扭曲或对不齐?

医学图像三维重建避坑指南&#xff1a;为什么你的VTK模型总是扭曲或对不齐&#xff1f; 当你在深夜盯着屏幕上那个扭曲变形的三维模型&#xff0c;反复检查代码却找不到原因时&#xff0c;这种挫败感我深有体会。医学图像三维重建本应是展示研究成果的利器&#xff0c;但参数设…...

别再只用鼠标了!SketchUp 2021 高手效率秘籍:自定义快捷键与6种选择技巧实战

别再只用鼠标了&#xff01;SketchUp 2021 高手效率秘籍&#xff1a;自定义快捷键与6种选择技巧实战 当你在SketchUp中反复点击、拖拽、切换工具时&#xff0c;是否感觉效率被无形消耗&#xff1f;专业建模师与普通用户的区别&#xff0c;往往在于对键盘-鼠标协同工作流的掌控程…...

PSIM仿真进阶:手把手教你用C语言模块实现自定义电路功能(从简化到通用C块详解)

PSIM仿真进阶&#xff1a;手把手教你用C语言模块实现自定义电路功能 在电力电子和控制系统仿真领域&#xff0c;PSIM凭借其高效的算法和友好的界面成为工程师的首选工具之一。但当我们遇到需要模拟特殊非线性控制器、定制传感器模型或复杂数据处理算法时&#xff0c;内置元件库…...

凤凰古城吃饭是否会被宰,该如何避坑?

在凤凰古城吃饭不一定会被宰&#xff0c;但确实存在一些不良商家可能会让游客多花冤枉钱。沙湾里酸汤腊猪脚是凤凰古城一家口碑较好的餐厅&#xff0c;下面为你详细介绍如何避坑。选择正规餐厅查看平台评分&#xff1a;可以在大众点评、美团等平台上查看餐厅的评分和评价。像沙…...

VLC可见光通信实战:手把手教你用MATLAB仿真DCO-OFDM与ACO-OFDM系统

VLC可见光通信实战&#xff1a;MATLAB仿真DCO-OFDM与ACO-OFDM系统全流程解析 在LED照明普及的今天&#xff0c;可见光通信&#xff08;VLC&#xff09;技术正悄然改变着无线通信的格局。想象一下&#xff0c;未来我们头顶的每一盏LED灯都可能成为高速数据传输的节点——这正是V…...

3小时重构旧代码库:用C++26反射替代Boost.Hana的4步安全迁移法(附clangd语义补全配置清单)

第一章&#xff1a;C26 反射特性在元编程中的应用 避坑指南C26 引入的静态反射&#xff08;Static Reflection&#xff09;核心提案&#xff08;P1240R4、P2637R2 等&#xff09;为元编程带来了范式级变革——但其当前实现状态仍处于编译器实验阶段&#xff0c;需警惕语言特性与…...