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

经典权限五张表功能实现

文章目录

  • 用户模块(未使用框架)
    • 查询功能
      • 实现步骤
      • 代码
    • 新增功能
      • 实现步骤
      • 代码
    • 修改功能
      • 实现步骤
      • 代码实现
    • 删除功能
      • 实现步骤
      • 代码实现
  • 用户模块会了,其他两个模块与其类似

用户模块(未使用框架)

查询功能

这里将模糊查询和分页查询写在一起
image.png

实现步骤

前端:发起请求
从userList.html中getUserList函数中书写代码
发起异步请求

  1. 请求地址:/user/query
  2. 请求参数:当前页,每页条数,用户名(模糊查询)

后端:接收请求,处理业务,响应

  1. web层接收前端传过来的数据并封装到实体类中,传给业务层,调用业务层中的方法实现,然后封装到result中,并响应给前端
  2. service层是具体写实现处理的逻辑,其中调用数据层的方法
  3. dao层就是对数据库进行查询等

模糊查询的话可以判断前端传过来的用户名是否存在,存在就是模糊查询,不存在就是分页查询
web可以分别书写俩个查询的代码

代码

前端

 //写路径let url="/user/findAll";//写参数 {currentPage:"this.pagination.pageNum",pageSize:"this.pagination.pageSize"}let params=`{currentPage:${this.pagination.pageNum},pageSize:${this.pagination.pageSize},"username":"${this.queryParams.username}"}`;//发送请求axios.post(url,params).then(resp=>{// console.log(resp.data);//定义变量接收后端响应的数据let obj=resp.data;//判断是否查询成功if(obj.flag){//查询成功//提示信息this.$message({message: obj.message,type: 'success'});//将查询的用户和角色信息赋值给数据模型中的userList:[]this.userList=obj.result.rows;//将查询的用户表的总记录数赋值给数据模型中的pagination中的total即可以显示分页栏this.pagination.total=obj.result.total;}else{//查询失败this.$message({showClose: true,message: obj.message,type: 'error'});}})

后端web层

 public void findAll(HttpServletRequest request, HttpServletResponse response) {//System.out.println("查询所有用户");try {//1.先根据前端传过来的数据即当前页码和每页条数封装到实体类QueryPageBean对象中QueryPageBean pb = BaseController.parseJSON2Object(request, QueryPageBean.class);if(pb.getUsername() != null && pb.getUsername() != ""){findByName(pb,response);}else{//调用工厂类来创建对象UserService userService = BeansFactory.getInstance("userService");//3.使用对象调用方法PageResult pr = userService.findAll(pb);//4.创建result对象Result result = new Result(true, "查询成功", pr);//5.将result对象转化成json响应给前端BaseController.printResult(response, result);}} catch (Exception e) {//打印到控制台e.printStackTrace();//6.创建result对象Result result = new Result(false, "查询失败");//7.将result对象转化成json响应给前端try {BaseController.printResult(response, result);} catch (IOException ex) {e.printStackTrace();}}}public void findByName(QueryPageBean pb, HttpServletResponse response) {try {//2.创建业务层对象UserService userService = BeansFactory.getInstance("userService");//3.调用业务层对象执行方法PageResult pr = userService.findByUserName(pb);//4.封装到result对象中Result result = new Result(true, "根据用户名查询成功", pr);//5.返回给前端BaseController.printResult(response, result);} catch (Exception e) {e.printStackTrace();try {//6.封装到result对象中Result result = new Result(false, "根据用户名查询失败");//7.返回给前端BaseController.printResult(response, result);} catch (Exception ex) {ex.printStackTrace();}}}

后端service

 public PageResult findAll(QueryPageBean pageBean) {//1.获取mybatis会话对象SqlSession session = SqlSessionUtil.getSession();//2.获取接口代理对象UserMapper mapper = session.getMapper(UserMapper.class);//3.使用接口代理对象调用接口中分页查询的用户方法//select * from 表名 limit 起始索引,每页条数//调用方法获取起始索引Integer startIndex = pageBean.getOffset();//调用方法获取每页条数Integer pageSize = pageBean.getPageSize();List<User> list = mapper.findAll(startIndex,pageSize);//4.使用接口代理对象调用接口方法获取总记录数Long total = mapper.findCount();//5.对获取到的总记录数和用户封装到pageresult中PageResult pageResult = new PageResult(total, list);//6.关闭会话session.close();//7.将pageresult对象返回给web层return pageResult;}public PageResult findByUserName(QueryPageBean pageBean) {//1.创建会话层对象SqlSession session = SqlSessionUtil.getSession();//2.创建会话层代理对象UserMapper mapper = session.getMapper(UserMapper.class);//获取参数Integer startIndex = pageBean.getOffset();Integer pageSize = pageBean.getPageSize();String username = pageBean.getUsername();//3.调用会话层代理对象执行方法List<User> list = mapper.findByName(username,startIndex,pageSize);//4.调用会话层代理对象执行方法Long total = mapper.findCountName(username);//5.创建pageResult对象PageResult pr = new PageResult(total,list);//4.关闭会话session.close();//5.返回给web层return pr;}

新增功能

image.png

实现步骤

前端
在handleCreateConfirm函数中书写代码
发起请求,请求地址:/user/add,请求参数:addUser
后端

  1. web层先进行接收前端的数据,然后分装到实体类中,传给业务层,调用业务层的方法
  2. service层书写实现逻辑,先对用户进行新增,然后在用户中间表中进行新增(用户id利用主键回填)。这其中都是调用数据层的方法
  3. dao层就是利用方法来对数据库进行访问,书写对于的sql语句

先对用户进行新增,然后再增加中间表的数据

代码

前端

 let url = "/user/add";//发送请求axios.post(url,this.addUser).then(resp=>{//console.log(resp.data);//定义一个变量let obj = resp.data;//判断是否成功if(obj.flag){this.$message({message: obj.message,type: 'success'});}else{this.$message.error(obj.message);}})//设置弹窗关闭this.dialogUptFormVisible = false;this.getUserList();}});

后端service

   //1.创建会话层对象SqlSession session = SqlSessionUtil.getSession();//2.创建会话层代理对象UserMapper mapper = session.getMapper(UserMapper.class);//3.调用mapper层中的方法新增用户mapper.add(addUser);//4.调用mapper层的方法在用户角色中间表mapper.addUserRole(addUser.getId(), addUser.getRoleIds());//4.关闭会话session.close();

修改功能

image.png

实现步骤

前端
发送异步请求,请求地址:/user/update 请求参数:updateUser
后端

  1. web接收数据分装到对于的类中,传到业务层,调用业务层方法来实现,封装到result中返回给前端
  2. service层就是先修改用户表中的数据,然后删除修改用户对应的中间表的内容,然后再添加修改后的角色到中间表中
  3. dao层就是执行上述service层的代码

代码实现

前端

  //定义urllet url = "/user/update";//发送请求axios.post(url,this.updateUser).then(resp=>{//console.log(resp.data);//定义变量接收数据let obj = resp.data;//判断是否修改成功if(obj.flag){//修改成功//提示信息this.$message({message: obj.message,type: 'success'});this.updateUser=obj.result;}else{//修改失败this.$message.error(obj.message);}}).finally(()=>{this.getUserList()})}});

后端service

 public void updateUser(UpdateUser updateUser) {//1.获取会话层SqlSession session = SqlSessionUtil.getSession();//2.获取会话层代理对象UserMapper mapper = session.getMapper(UserMapper.class);//3.调用方法来更新用户mapper.update(updateUser);//4.删除用户角色中间表中用户对应的idmapper.deleteUserRole(updateUser.getId());//5.新增用户修改后的用户角色中间表的角色mapper.addUserRole(updateUser.getId(), updateUser.getRoleIds());//6.释放资源session.close();}

删除功能

实现步骤

前端
发送异步请求 请求地址:/user/delete 请求参数:id
后端

  1. web层固定套路:接收参数,调用业务层方法,将参数传给业务层,将调用方法的结果封装到result中,返回给前端
  2. sercive层主要写实现逻辑:先删除中间表的对于用户的数据,然后再删除用户;根据逻辑调用dao层的方法
  3. dao层书写对象的sql语句进行实现

代码实现

前端

  let url = "/user/delete";//书写参数let params = `id=${row.id}`;//发送请求axios.post(url,params).then(resp=>{let obj = resp.data;if(obj.flag){this.$message({message: obj.message,type: 'success'});}else{this.$message.error(obj.message);}}).finally(()=>{this.getUserList();})}).catch(() => {this.$message.info('已取消操作!')});

后端service层

//1.创建会话层对象SqlSession session = SqlSessionUtil.getSession();//2.创建会话层代理对象UserMapper mapper = session.getMapper(UserMapper.class);//3.调用代理对象执行方法删除从表中的数据mapper.deleteUserRole(id);//4.调用代理对象执行方法删除主表的数据mapper.delete(id);//5.释放资源session.close();

先书写sql代码,然后根据sql代码和产品原型确定前端的请求参数、还有后端的实体类的书写,然后前端书写发送请求代码,后端web层接收,service层书写逻辑,dao层进行数据的访问等

用户模块会了,其他两个模块与其类似

相关文章:

经典权限五张表功能实现

文章目录 用户模块(未使用框架)查询功能实现步骤代码 新增功能实现步骤代码 修改功能实现步骤代码实现 删除功能实现步骤代码实现 用户模块会了&#xff0c;其他两个模块与其类似 用户模块(未使用框架) 查询功能 这里将模糊查询和分页查询写在一起 实现步骤 前端&#xff1…...

实验八 Linux虚拟内存 实验9.1:统计系统缺页次数成功案例

运行环境&#xff1a; VMware17.5.1 build-23298084Ubuntu 16.04LTS ubuntu版本下载地址Linux-4.16.10 linux历史版本下载地址虚拟机配置&#xff1a;硬盘一般不少于40G就行 内核版本不同内核文件代码也有出入&#xff0c;版本差异性令c文件要修改&#xff0c;如若要在linux6.7…...

SD-WAN提升Microsoft 365用户体验

随着数字化时代的到来&#xff0c;SaaS应用如Microsoft 365已经成为各类企业的主流选择。在这一趋势下&#xff0c;企业需要以更加灵活、高效的方式使用Microsoft 365&#xff0c;以满足日益增长的业务需求。而传统的网络基础设施可能无法满足这一需求&#xff0c;因此&#xf…...

C#中的异步编程模型

在C#中&#xff0c;async和await关键字是用于异步编程的重要部分&#xff0c;它们允许你以同步代码的方式编写异步代码&#xff0c;从而提高应用程序的响应性和吞吐量。这种异步编程模型在I/O密集型操作&#xff08;如文件读写、网络请求等&#xff09;中特别有用&#xff0c;因…...

博通Broadcom (VMware VCP)注册约考下载证书操作手册

博通Broadcom(VMware) CertMetrics 注册约考下载证书等操作指导手册&#xff08;发布日期&#xff1a;2024-5-11&#xff09; 目录 一、原 Mylearn 账号在新平台的激活… 1 二、在新平台查看并下载证书… 5 三、在新平台注册博通账号… 6 四、在新平台下注册考试… 10 一、原…...

Xilinx FPGA底层逻辑资源简介(1):关于LC,CLB,SLICE,LUT,FF的概念

LC&#xff1a;Logic Cell 逻辑单元 Logic Cell是Xilinx定义的一种标准&#xff0c;用于定义不同系列器件的大小。对于7系列芯片&#xff0c;通常在名字中就已经体现了LC的大小&#xff0c;在UG474中原话为&#xff1a; 对于7a75t芯片&#xff0c;LC的大小为75K&#xff0c;6输…...

SSH(安全外壳协议)简介

一、引言 SSH&#xff08;Secure Shell&#xff09;是一种加密的网络传输协议&#xff0c;用于在不安全的网络中提供安全的远程登录和其他安全网络服务。SSH最初由芬兰程序员Tatu Ylnen开发&#xff0c;用于替代不安全的telnet、rlogin和rsh等远程登录协议。通过SSH&#xff0…...

JavaScript异步编程——08-Promise的链式调用【万字长文,感谢支持】

前言 实际开发中&#xff0c;我们经常需要先后请求多个接口&#xff1a;发送第一次网络请求后&#xff0c;等待请求结果&#xff1b;有结果后&#xff0c;然后发送第二次网络请求&#xff0c;等待请求结果&#xff1b;有结果后&#xff0c;然后发送第三次网络请求。以此类推。…...

现代制造之数控机床篇

现代制造 有现代技术支撑的制造业&#xff0c;即无论是制造还是服务行业&#xff0c;添了现代两个字不过是因为有了现代科学技术的支撑&#xff0c;如发达的通信方式&#xff0c;不断发展的互联网&#xff0c;信息化程度加强了&#xff0c;因此可以为这两个行业增加了不少优势…...

Rust的协程机制:原理与简单示例

在现代编程中&#xff0c;协程&#xff08;Coroutine&#xff09;已经成为实现高效并发的重要工具。Rust&#xff0c;作为一种内存安全的系统编程语言&#xff0c;也采用了协程作为其并发模型的一部分。本文将深入探讨Rust协程机制的实现原理&#xff0c;并通过一个简单的示例来…...

学习成长分享-以近红外光谱分析学习为例

随着国家研究生招生规模的扩大&#xff0c;参与或接触光谱分析方向的研究生日益增多&#xff0c;甚至有部分本科生的毕业设计也包含以近红外光谱分析内容。基于对近红外光谱分析的兴趣&#xff0c;从2018年开始在CSDN博客&#xff08;陆续更新自己学习的浅显认识&#xff0c;到…...

Linux makefile进度条

语法 在依赖方法前面加上就不会显示这一行的命令 注意 1.make 会在当前目录下找名为“makefile” 或者 “Makefile” 的文件 2.为了生成第一依赖文件&#xff0c;如果依赖文件列表有文件不存在&#xff0c;则会到下面的依赖关系中查找 3..PHONY修饰的依赖文件总是被执行的 …...

Ollama 可以设置的环境变量

Ollama 可以设置的环境变量 0. 引言1. Ollama 可以设置的环境变量 0. 引言 在Ollama的世界里&#xff0c;环境变量如同神秘的符文&#xff0c;它们是控制和定制这个强大工具的关键。通过精心设置这些环境变量&#xff0c;我们可以让Ollama更好地适应我们的需求&#xff0c;就像…...

基于Python+Django+MySQL实现Web版的增删改查

Python Web框架Django连接和操作MySQL数据库学生信息管理系统(SMS),主要包含对学生信息增删改查功能&#xff0c;旨在快速入门Python Web。 开发环境 开发工具&#xff1a;Pycharm 2020.1开发语言&#xff1a;Python 3.8.0Web框架&#xff1a;Django 3.0.6数据库&#xff1a;…...

Map、Set和Object的区别

Set ES6提供了新的数据结构Set&#xff0c;类似于数组&#xff0c;但成员值是唯一的&#xff0c;没有重复的值 Set本身是一个构造函数(要 new)&#xff0c;用来生成Set数据结构 Set 对象允许你储存任何类型的唯一值&#xff0c;无论是原始值或者是对象引用 每个值在 Set 中…...

Web 安全之盗链(Hotlinking)攻击详解

目录 什么是盗链 盗链原理 盗链类型 盗链的危害 如何发现盗链 盗链防范措施 法律法规与应对策略 小结 盗链&#xff08;Hotlinking&#xff09;攻击&#xff0c;作为互联网安全领域的一个重要话题&#xff0c;涉及到侵犯版权、滥用资源和网络安全等多个层面。盗链现象普…...

leetcode算法笔记-算法复杂度

对于时间复杂度&#xff0c;主要包括三种情况&#xff1a; 渐进紧确界&#xff1a; O渐进上界&#xff1a; 渐进下界&#xff1a; 加法原则&#xff1a;不同的时间复杂度相加取阶数最高的 乘法原则&#xff1a;不同的时间复杂度相乘&#xff0c;结果为时间复杂度的乘积 阶乘…...

推荐算法详解

文章目录 推荐算法引言基于内容的推荐原理算法步骤注意点可以优化的地方示例代码讲解 协同过滤推荐原理算法步骤注意点可以优化的地方示例代码讲解 混合推荐系统原理算法步骤注意点可以优化的地方示例1代码讲解1示例2代码讲解2 基于知识的推荐原理算法步骤注意点可以优化的地方…...

Java找不到包解决方案

在跟着教程写Spingboot后端项目时&#xff0c;为了加快效率&#xff0c;有时候有的实体文件可以直接粘贴到目录中&#xff0c;此时运行项目会出现Java找不到包的情况&#xff0c;即无法找到导入的实体文件&#xff0c;这是项目没有更新的原因。解决方法&#xff1a; 刷新Maven:…...

vue的css深度选择器 deep /deep/

作用及概念 当 <style> 标签有 scoped 属性时&#xff0c;它的 CSS 只作用于当前组件中的元素&#xff0c;父组件的样式将不会渗透到子组件。在vue中是这样描述的&#xff1a; 处于 scoped 样式中的选择器如果想要做更“深度”的选择&#xff0c;也即&#xff1a;影响到子…...

Java 加密常用的各种算法及其选择

在数字化时代&#xff0c;数据安全至关重要&#xff0c;Java 作为广泛应用的编程语言&#xff0c;提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景&#xff0c;有助于开发者在不同的业务需求中做出正确的选择。​ 一、对称加密算法…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...

OD 算法题 B卷【正整数到Excel编号之间的转换】

文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的&#xff1a;a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...

实战三:开发网页端界面完成黑白视频转为彩色视频

​一、需求描述 设计一个简单的视频上色应用&#xff0c;用户可以通过网页界面上传黑白视频&#xff0c;系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观&#xff0c;不需要了解技术细节。 效果图 ​二、实现思路 总体思路&#xff1a; 用户通过Gradio界面上…...

Java 与 MySQL 性能优化:MySQL 慢 SQL 诊断与分析方法详解

文章目录 一、开启慢查询日志&#xff0c;定位耗时SQL1.1 查看慢查询日志是否开启1.2 临时开启慢查询日志1.3 永久开启慢查询日志1.4 分析慢查询日志 二、使用EXPLAIN分析SQL执行计划2.1 EXPLAIN的基本使用2.2 EXPLAIN分析案例2.3 根据EXPLAIN结果优化SQL 三、使用SHOW PROFILE…...

Java后端检查空条件查询

通过抛出运行异常&#xff1a;throw new RuntimeException("请输入查询条件&#xff01;");BranchWarehouseServiceImpl.java // 查询试剂交易&#xff08;入库/出库&#xff09;记录Overridepublic List<BranchWarehouseTransactions> queryForReagent(Branch…...

Java数组Arrays操作全攻略

Arrays类的概述 Java中的Arrays类位于java.util包中&#xff0c;提供了一系列静态方法用于操作数组&#xff08;如排序、搜索、填充、比较等&#xff09;。这些方法适用于基本类型数组和对象数组。 常用成员方法及代码示例 排序&#xff08;sort&#xff09; 对数组进行升序…...

英国云服务器上安装宝塔面板(BT Panel)

在英国云服务器上安装宝塔面板&#xff08;BT Panel&#xff09; 是完全可行的&#xff0c;尤其适合需要远程管理Linux服务器、快速部署网站、数据库、FTP、SSL证书等服务的用户。宝塔面板以其可视化操作界面和强大的功能广受国内用户欢迎&#xff0c;虽然官方主要面向中国大陆…...

PLC入门【4】基本指令2(SET RST)

04 基本指令2 PLC编程第四课基本指令(2) 1、运用上接课所学的基本指令完成个简单的实例编程。 2、学习SET--置位指令 3、RST--复位指令 打开软件(FX-TRN-BEG-C)&#xff0c;从 文件 - 主画面&#xff0c;“B: 让我们学习基本的”- “B-3.控制优先程序”。 点击“梯形图编辑”…...

基于Python的气象数据分析及可视化研究

目录 一.&#x1f981;前言二.&#x1f981;开源代码与组件使用情况说明三.&#x1f981;核心功能1. ✅算法设计2. ✅PyEcharts库3. ✅Flask框架4. ✅爬虫5. ✅部署项目 四.&#x1f981;演示效果1. 管理员模块1.1 用户管理 2. 用户模块2.1 登录系统2.2 查看实时数据2.3 查看天…...