SpringCould+vue3项目的后台用户管理的CURD【VegePig教育平台】

news2024/12/27 17:35:20

文章目录

  • 一.SpringCould+vue3项目的后台用户管理的CURD【VegePig教育平台】
    • 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【VegePig教育平台】

1.1 背景

前文已经写了SpringCould+Vue3-Element-Admin 登录接口,用户信息接口以及Token验证的实现。

本项目为重构:行知在线综合教育平台。本项目更名为:VegePig教育平台

关键字: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'); // 获取存储在本地浏览器中的token
  return 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'); // 获取存储在本地浏览器中的token
  return 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-form
         ref="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>

到这,已经完成了后台管理系统用户的增删改查。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

斐波那契数列、卡特兰数

一、斐波那契数列&#xff08;兔子序列&#xff09; 1, 1, 2, 3, 5, 8, 13, 21, ... 递推公式&#xff1a;f(1)f(2)1; f(n)f(n-1)f(n-2) (n>3) 快速求f(n)&#xff1a;矩阵快速幂&#xff08;logn&#xff09; 二、卡特兰数 1, 2, 5, 14, 42, 132, 429, 1430, 4862, ...…

selenium自动化环境搭建(Windows)

一、selenium介绍 selenium主要用于web应用程序的自动化测试&#xff0c;还支持所有基于web的管理任务自动化。 selenium经历了2个版本&#xff0c;selenium1.0和selenium2.0&#xff1b;selenium不是一个单独的工具&#xff0c;而是由一些插件、类库构成&#xff0c;每个组成…

__pycache__文件夹是什么,是缓存文件吗,可以删除吗

1.什么是__pycache__文件 用python编写好一个工程&#xff0c;在第一次运行后&#xff0c;总会发现工程根目录下生成了一个__pycache__文件夹&#xff0c;里面是和py文件同名的各种*.pyc或者*.pyo文件。名字上看应该是相应的缓存文件。 那为什么会出现__pycache__文件&#x…

go chan基本使用

1、有缓冲的chan 与无缓冲的chan 怎么理解这个缓冲&#xff0c;我个人的理解是是执行这个chan 操作的时候是否发送阻塞。 操作&#xff1a;读和写。 读取的时候&#xff0c;我们都应该要是阻塞的&#xff0c;例如我们的socket、的recv函数。当然取决于你设置的是阻塞的套接字还…

在安装docker配置端口时 centos7 防火墙规则失效

一、问题 1、做端口映射管理的时候&#xff0c;自己关闭了防火墙&#xff0c;或者开启防火墙&#xff0c;或者指定开关端口&#xff0c;但是都不影响端口的使用&#xff0c;这就很奇怪&#xff0c;也就是本文的内容&#xff01; 2、思路&#xff0c;确认是请求到了防火墙的那…

MySQL: 自动添加约束、更改(删除)表名和字段、删除表

目录 自动添加表的属性&#xff1a; 向表内插入数据&#xff1a; 查看表中的数据&#xff1a; 查看表结构&#xff1a; 查看表的详细结构&#xff1a; 更改表名和字段&#xff1a; 更改表名&#xff1a; 更改字段数据类型&#xff1a; 修改字段名&#xff1a; 添加字段…

约瑟夫环+考勤刷卡(蓝桥杯JAVA解法)

约瑟夫环&#xff1a;用户登录 题目描述 设有 n 个人围坐在圆桌周围&#xff0c;现从某个位置 k 上的人开始报数&#xff0c;报数到 m 的人就站出来。下一个人&#xff0c;即原来的第 m1 个位置上的人&#xff0c;又从 1 开始报数&#xff0c;再报数到 m 的人站出来。依次重复…

上传ipa到appstore详细步骤

使用hbuilderx或apicloud云打包后&#xff0c;会生成一个ipa文件&#xff0c;而iphone是无法直接安装这个ipa文件的&#xff0c;需要将这个ipa文件上架&#xff0c;才能安装使用。那么如何上架呢&#xff1f; hbuilderx和apicloud并没有上架的教程&#xff0c;而苹果官方是推荐…

基于Jenkins,docker实现自动化部署(持续交互)【转】

前言 随着业务的增长&#xff0c;需求也开始增多&#xff0c;每个需求的大小&#xff0c;开发周期&#xff0c;发布时间都不一致。基于微服务的系统架构&#xff0c;功能的叠加&#xff0c;对应的服务的数量也在增加&#xff0c;大小功能的快速迭代&#xff0c;更加要求部署的…

在 Apple 设备(包括 iPad、iOS 和 MacBook)上为用户提供完整的 SAP GUI

苹果应用功能 高效且直观的用户界面。 访问 VA01、MI31、MI04、IW21 等。– 无编程 自动化和简化您的 SAP 流程&#xff0c;如库存盘点 在 Apple 设备&#xff08;包括 iPad、iOS 和 MacBook&#xff09;上为用户提供完整的 SAP GUI&#xff0c;利用他们已经了解的 UI 丰富性并…

持续集成——web自动化测试集成实战

文章目录 一、Web自动化测试持续集成的好处二、环境准备三、Jenkins节点挂载四、节点环境的配置1、JDK2、Chrome 浏览器3、chromedriver4、Python3环境5、allure-commandline工具6、allure插件 五、本地运行待测代码(保证代码没有问题)六、库文件的导出七、Jenkins上运行代码配…

高功率激光切割中不良现象的排除技巧

高功率切割市场现状 随着激光行业的发展和下游产业需求的变化&#xff0c;高功率的激光切割设备已逐渐成为市场关注的热点。高功率激光切割凭着速度和厚度上无可比拟的优势&#xff0c;目前已获得了市场的广泛认可。 但由于高功率激光切割技术尚处于普及的初级阶段&#xff0c;…

栈溢出的原理

目录 缓冲区 我们先以解决这个题目为准 然后通过这个题目去做透 gdb 代码段 栈中 当前时刻寄存器存储的内容 1 寻找漏洞函数 输入 输出 字符串 2 确定填充长度 覆盖函数返回地址 覆盖栈上变量的内容 覆盖bss段 栈溢出是在堆栈中 对某一个变量无限制的输入 超出了…

【三十天精通Vue 3】第十九天 Vue 3的渐进式Web应用程序详解

✅创作者&#xff1a;陈书予 &#x1f389;个人主页&#xff1a;陈书予的个人主页 &#x1f341;陈书予的个人社区&#xff0c;欢迎你的加入: 陈书予的社区 &#x1f31f;专栏地址: 三十天精通 Vue 3 文章目录 引言一、什么是渐进式 Web 应用程序1.1 渐进式 Web 应用程序的定义…

市场预测美联储加息的有效性几何

美联储加息已狂飙一年&#xff0c;很多相关预测美联储加息降息的文章都会提到“一年内加息多少次的概率是多少多少”这种表述&#xff0c;那么这个数据是怎样计算的&#xff1f;本期笔者将简单讨论美国联邦利率的运作机制&#xff0c;介绍用于预测联储加/降息概率的方式&#x…

vue批量生成二维码,打印生成的二维码,并批量下载生成的二维码,qrcode

通过使用 qrcode 生成二维码&#xff0c; 使用 jszip 打包批量二维码文件&#xff0c; 使用 file-saver 下载打包好的zip文件&#xff0c; 使用 vue-print-nb 打印生成的二维码 生成二维码&#xff1a; 打印二维码 下载二维码 1. 批量生成二维码—安装依赖 ![请添加图片描述]…

CH32F203RCT6 pin2pin兼容STM32F103RCT6

32位大容量通用型Cortex-M3单片机 CH32F203是基于Cortex-M3内核设计的工业级大容量通用微控制器&#xff0c;此系列主频高达144MHz&#xff0c;独立了GPIO电压&#xff08;与系统供电分离&#xff09;。资源同比增加了随机数单元&#xff0c;4组运放比较器&#xff1b;提高串口…

硅烷PEG马来酰亚胺,Silane-PEG-Mal,马来酰亚胺聚乙二醇硅烷

中文名称&#xff1a;马来酰亚胺聚乙二醇硅烷 英文名称&#xff1a;Silane-PEG-Maleimide&#xff0c;Silane-PEG-MAL 性状&#xff1a;液体或者固体&#xff0c;取决于分子量 溶剂&#xff1a;溶于水、DMSO、DMF、DCM等常规性有机溶剂 活性基团&#xff1a;MAL 分子量&am…

【spring事务】源码分析

项目启动时&#xff0c;创建代理过程 initializeBean.applyBeanPostProcessorsAfterInitialization 由AnnotationAwareAspectJAutoProxyCreator来处理 AnnotationAwareAspectJAutoProxyCreator wrapIfNecessary 通过getAdvicesAndAdvisorsForBean获取bean满足的Advisor&…

DHCP 服务器监控

网络中使用了数千个 IP 地址&#xff0c;当今大多数组织中的 IP 地址都由 DHCP 服务器提供服务。必须发现可用的 IP 地址、了解如何预配 IP 并了解 IP 池利用率。使用 DHCP 服务器进行 IP 预配可以更轻松地获得这些重要见解&#xff0c;并根据组织的不同需求分配不同的范围。这…