B059-权限管理系统01

目录

      • 知识点介绍
      • 项目演示
      • 项目搭建
      • 动态菜单查询分析(权限表分析)
      • 权限系统表分析
      • 角色模块
        • pageInfo
        • pageHelper
        • 实现前端动态分页
        • 高级查询
        • 新增与修改
        • 删除角色
      • 分配权限-表分析
      • 角色授权数据-一级和二级权限查询

知识点介绍

在这里插入图片描述

项目演示

准备数据库
在这里插入图片描述
准备工程auth_new

tips:
基于sspringboot的ssm架构
角色是权限系统的核心

项目搭建

一:SSM整合1.导包									tips:lombok在编译时生成get,setter ,构造器,toString等方法2.准备目录结构3.核心配置文件  yml4.启动类  加上mapper接口的扫描5.测试(SpringBoot测试)

动态菜单查询分析(权限表分析)

在这里插入图片描述

权限系统表分析

在这里插入图片描述

角色模块

见代码

tips:
lombok只在编译时生成get set方法等,写代码时不提示有对应方法,可通过lombok插件来解决此问题
类名右键go to- test,快速在测试包生成对应测试方法

pageInfo

在pageHelper里mybatis提供了pageInfo类
role_list.html

<th:block th:if="${pageInfo.list != null}">......</th:block><th:block th:if="${!pageInfo.isFirstPage}"><li><a href="javascript:void(0);" aria-label="Previous"  th:href="@{/role/index(number=${pageInfo.prePage})}" ><span aria-hidden="true">&laquo;</span></a></li>
</th:block>
<th:block  th:each="nums:${pageInfo.navigatepageNums}"><li th:class="${nums==pageInfo.pageNum? 'active' : ''}"><a href="javascript:void(0);"  th:href="@{/role/index(number=${nums})}"  th:text="${nums}"  >1</a></li>
</th:block><th:block th:if="${!pageInfo.isLastPage}"><li><a href="javascript:void(0);" aria-label="Next"   th:href="@{/role/index(number=${pageInfo.nextPage})}" ><span aria-hidden="true">&raquo;</span></a></li>
</th:block>

RoleController

    @RequestMapping("/index")public String toRoleList(Model model){model.addAttribute("pageInfo", roleService.loadAllByQuery());return "views/role/role_list";}

RoleServiceImpl

    @Overridepublic PageInfo<Role> loadAllByQuery() {return new PageInfo<>(roleMapper.loadAll());}

RoleMapper

    <!--List<Role> loadAll();--><select id="loadAll" resultType="Role">SELECT * FROM role</select>
pageHelper

是mybatis提供的分页插件,这里是基于springboot的pageHelper,底层用aop实现分页,自己算出来
导包

<!-- pagehelper分页插件依赖 -->
<dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.2.5</version>
</dependency>

RoleController

    @RequestMapping("/index")public String toRoleList(Model model){model.addAttribute("pageInfo", roleService.loadAllByQuery(new RoleQuery()));return "views/role/role_list";}

RoleServiceImpl

    @Overridepublic PageInfo<Role> loadAllByQuery(RoleQuery roleQuery) {//使用PageHelper来做分页//1.分页参数准备Integer currentPage = roleQuery.getCurrentPage();Integer pageSize = roleQuery.getPageSize();//2.开启分页PageHelper.startPage(currentPage,pageSize);return new PageInfo<Role>(roleMapper.loadAll());}

RoleMapper

    <!--List<Role> loadAll();--><select id="loadAll" resultType="Role">SELECT * FROM role</select>

application.yml

#cn.ming包下所有操作打印详细日志
logging:level:cn:ming: trace
实现前端动态分页

BaseQuery

@Data
public class BaseQuery {private Integer currentPage = 1;private Integer pageSize = 5;// SpringMVC  通过使用set+参数名称作为方法,绑定前端传过来的参数public void setNumber(Integer currentPage) {this.currentPage = currentPage;}
}

RoleController

    @RequestMapping("/index")public String toRoleList(RoleQuery roleQuery,Model model){model.addAttribute("pageInfo", roleService.loadAllByQuery(roleQuery));return "views/role/role_list";}

application.yml

#pagehelper分页插件
pagehelper:#分页方言  因为不同数据库拼接分页sql的关键字不同,如mysql分页关键字是limit   oracle分页关键字是rownumhelper-dialect: mysql#分页容错  传的当前页码小于1时定位第一页,传的当前页码大于最末页时定位到末页reasonable: true#支持在参数传递分页参数  支持在mapper接口层传分页参数support-methods-arguments: true
高级查询

RoleQuery

@Data
public class RoleQuery extends BaseQuery{private String roleName;
}

RoleServiceImpl

    @Overridepublic PageInfo<Role> loadAllByQuery(RoleQuery roleQuery) {//使用PageHelper来做分页//1.分页参数准备Integer currentPage = roleQuery.getCurrentPage();Integer pageSize = roleQuery.getPageSize();//2.开启分页PageHelper.startPage(currentPage,pageSize);return new PageInfo<Role>(roleMapper.loadAll(roleQuery));}

RoleMapper.xml

    <!--List<Role> loadAll(RoleQuery roleQuery);--><select id="loadAll" resultType="Role">SELECT * FROM role<where><if test="roleName != null and roleName != ''">AND name like concat("%",#{roleName},"%")</if></where></select>

tips:去除空格一般交给前端或controller处理,避免放到数据层处理,那会引起性能下降

新增与修改

tips:
先看好前端页面请求过来的路径,参数,返回值
查询用只读事务,增删改用默认的需要事务

RoleController

    // 添加角色@RequestMapping("/save")@ResponseBodypublic Map<String,Object> save(Role role){Map<String,Object> map = new HashMap<>();try {roleService.save(role);map.put("success", true);map.put("msg","操作成功!");} catch (Exception e) {e.printStackTrace();map.put("success", false);map.put("msg","系统繁忙,稍后重试!!!");}return map;}// 修改角色@RequestMapping("/update")@ResponseBodypublic Map<String,Object> update(Role role){Map<String,Object> map = new HashMap<>();try {roleService.update(role);map.put("success", true);map.put("msg","操作成功!");} catch (Exception e) {e.printStackTrace();map.put("success", false);map.put("msg","系统繁忙,稍后重试!!!");}return map;}

RoleServiceImpl

    @Override@Transactionalpublic void save(Role role) {roleMapper.save(role);}@Override@Transactionalpublic void update(Role role) {roleMapper.update(role);}

RoleMapper.xml

    <!--void save(Role role);--><insert id="save">INSERT INTO role(name,sn) VALUES (#{name},#{sn})</insert><!--void update(Role role);--><update id="update">UPDATE role SET name = #{name},sn=#{sn}WHERE id = #{id}</update>
删除角色

tips:中间表不应该有实体类或Mapper
RoleController

    // 删除角色@RequestMapping("/delete")@ResponseBodypublic Map<String,Object> delete(Long id){Map<String,Object> map = new HashMap<>();try {roleService.delete(id);map.put("success", true);map.put("msg","操作成功!");} catch (Exception e) {e.printStackTrace();map.put("success", false);map.put("msg","系统繁忙,稍后重试!!!");}return map;}

RoleServiceImpl

    /*** 删除角色*   1.删除角色权限中间表数据*   2.删除角色表数据*/@Override@Transactionalpublic void delete(Long roleId) {roleMapper.deleteRolePermission(roleId);roleMapper.delete(roleId);}

RoleMapper.xml

    <!--void deleteRolePermission(Long roleId);--><delete id="deleteRolePermission" parameterType="long">DELETE FROM role_permission WHERE role_id = #{roleId}</delete><!--void delete(Long roleId);--><delete id="delete" parameterType="long">DELETE FROM role WHERE id = #{id}</delete>

分配权限-表分析

在这里插入图片描述

角色授权数据-一级和二级权限查询

RoleController

    // 查询一级和二级权限,并返回页面@RequestMapping("/toPermission")public String toRoleList(Long roleId, Model model){model.addAttribute("map", roleService.loadOneAndTwoLevel(roleId));return "views/role/role_permission";}

domain

@Data
public class Permission {private Long id;private String name;private String url;private Long menu_id;private Permission parent;private List<Permission> children = new ArrayList<>();
}

RoleServiceImpl

    @Overridepublic Map<String, Object> loadOneAndTwoLevel(Long roleId) {Map<String, Object> map = new HashMap<>();map.put("permissions", roleMapper.loadOneAndTwoLevel());//角色回显map.put("rid", roleId);return map;}

RoleMapper.xml

    <!--自定义结果集映射--><resultMap id="xx" type="Permission"><id column="pid" property="id"/><result column="pname" property="name"/><result column="purl" property="url"/><collection property="children" ofType="Permission"><id column="id" property="id"/><result column="name" property="name"/><result column="url" property="url"/></collection></resultMap><!--List<Permission> loadOneAndTwoLevel();--><select id="loadOneAndTwoLevel" resultMap="xx">SELECTp.id pid,p. NAME pname,p.url purl,c.*FROMpermission pJOIN permission c ON p.id = c.parent_idWHEREp.parent_id IS NULL</select>

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

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

相关文章

解决“SQLServer 添加数据库,报Error 5118“错误

当将把一个SQLServer的数据库文件*.MDF和日志文件*.LDF&#xff0c;从电脑A拷贝到电脑B&#xff0c;然后在电脑B上&#xff0c;使用Microsoft SQL Server Management Studio添加该*.MDF文件&#xff0c;有时报"Error 5118"错误&#xff0c;如图(1)所示&#xff1a; 图…

mysql视图和sql语句

mysql视图和sql语句 一.mysql视图1.数据的虚拟表示&#xff1a;2.简化复杂查询&#xff1a;3.安全性和权限控制&#xff1a;4.逻辑数据组织&#xff1a;5.更新限制&#xff1a;6.视图的创建&#xff1a; 二.mysq语句使用案列 MySQL的视图&#xff08;View&#xff09;是一个虚拟…

Docker安装WebRTC下TURN服务

详细实现方式以及代码下载请前往 https://www.passerma.com/article/90 实现效果 一、手动构建镜像 1.新建Dockerfile文件 文件用于编译镜像 以alpine为基础镜像 添加coturn需要的依赖库 获取coturn并进行编译 通过start.sh启动turnserver服务 Dockerfile FROM alpineRUN ap…

HarmonyOS 开发基础(六)Slider

HarmonyOS 开发基础&#xff08;六&#xff09;Slider Entry Component struct Index {build() {Row() {Column() {// Slider&#xff1a;ArkUI 的基础组件 滑动条组件// options 参数&#xff1a;Slider 基础设置Slider({// 最小值min: 20,// 最大值max: 200,// 当前值value: …

深入剖析pcap中的网络异常:TTL过期攻击、ARP中毒、TCP重传与重叠碎片等

网络流量数据包捕获是网络安全领域的重要部分&#xff0c;而pcap文件则是这一过程的常见载体。为了深入解析pcap文件中潜在的可疑网络流量&#xff0c;我们需要运用强大的网络安全威胁评估与审计工具。这些工具能够帮助我们捕捉、记录、检测和诊断网络中的数据传输问题&#xf…

鸟类分类、鸟类声音相关深度学习数据集大合集

最近收集了一大波和鸟类相关的图片、声音数据集&#xff0c;包含&#xff1a;鸟类分类、鸟类声音识别、鸟类和无人机分类、鸟类状态、鸟类行为等相关数据集。现在分享给大家&#xff01;&#xff01; 1、英国20大园林鸟类的图像数据集 20英国花园鸟类数据集提供了20个类别的3…

开源网络安全工具

开源工具代表了技术领域的一股动态力量&#xff0c;体现了创新、协作和可访问性。这些工具以透明度和社区驱动的原则开发&#xff0c;允许用户根据自己的独特需求仔细检查、修改和调整解决方案。 在网络安全领域&#xff0c;开源工具是无价的资产&#xff0c;使组织能够增强防…

探索 2024 年:未来可能带来的新奇事物

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

MATLAB插值函数

一、MATLAB插值函数概览 1&#xff09;本节重点介绍的插值函数 MATLAB插值函数适用情况基础句式interp1 函数interp1 主要用于一维数据的插值interp1(x, y, x_interp, ‘linear’); 其中 x 和 y 是已知数据点&#xff0c;x_interp 是要插值的目标点。interp2 函数interp2 用于…

C++可变参数模板(展开参数包)

C版本 C11 - C14 例子&#xff1a; #include "X:\Work\Share\CCode\CPlatform\Base\global_c_all.h" using namespace lf; using namespace std;//递归终止函数 void Print() {_cout << _t("\n"); }template <typename T, typename ...Args>…

【LMM 015】LAMM:多模态指令微调数据集,框架和基准

论文标题&#xff1a;LAMM: Language-Assisted Multi-Modal Instruction-Tuning Dataset, Framework, and Benchmark 论文作者&#xff1a;Zhenfei Yin, Jiong Wang, Jianjian Cao, Zhelun Shi, Dingning Liu, Mukai Li, Lu Sheng, Lei Bai, Xiaoshui Huang, Zhiyong Wang, Jin…

Linux第12步_磁盘重新分区

解决“挂载后的U盘出现中文乱码”后&#xff0c;我们接着学习“磁盘重新分区”&#xff0c;熟悉fdisk命令。 1、删除磁盘的分区 输入“cd /回车”&#xff0c;进入根目录 输入“ls /dev/sd*回车”&#xff0c;显示dev以sd所有文件。 输入“sudo fdisk /dev/sdb1回车” 输入…

IPv6有状态地址自动配置(DHCPv6)

IPv6有状态地址自动配置 IPv6实现了对无状态地址自动配置的支持。这种不需要特殊服务器的地址自动配置方式有着极大的好处。使用起来也很方便,而在IPv4时代曾经是地址自动分配的首选方式的DHCP好像显得有些没落了。但是,DHCP作为有状态地址自动配置的方式之一,依旧有着无状…

BMS电池管理系统带充放电控制过流过压保护

2.4G无线采集BMS开发板&#xff08;主从一体&#xff09; 全新升级 &#xff08;赠送上位机源码TTL 上位机&#xff0c;可以改成自己想要的界面&#xff09; 12串电池TTL上位机 CAN通信上位机源码有偿开源&#xff0c;供项目二次开发。 增加STM32平台 USB转TTL通信 CAN通信 增加…

互联网分布式应用之SpringSecurity

SpringSecurity Java 是第一大编程语言和开发平台。它有助于企业降低成本、缩短开发周期、推动创新以及改善应用服务。如今全球有数百万开发人员运行着超过 51 亿个 Java 虚拟机&#xff0c;Java 仍是企业和开发人员的首选开发平台。 课程内容的介绍 1. SpringSecurity基本应用…

【算法每日一练]-图论(保姆级教程篇14 )#会议(模板题) #医院设置 #虫洞 #无序字母对 #旅行计划 #最优贸易

目录 今日知识点&#xff1a; 求数的重心先dfs出d[1]和cnt[i]&#xff0c;然后从1进行dp求解所有d[i] 两两点配对的建图方式&#xff0c;检查是否有环 无向图欧拉路径路径输出 topodp求以i为终点的游览城市数 建立分层图转化盈利问题成求最长路 会议&#xff08;模板题&a…

MidJourney笔记(10)-faq-fast-help-imagine-info-public-stealth

/faq 在官方 Midjourney Discord 服务器中使用可快速生成流行提示工艺频道常见问题解答的链接。 不过这个命令,我也是没有找到入口,之前还能在MidJourney的频道里使用,然后最近发现没有权限,有点奇怪。不知道系统又做了什么升级。 /fast 切换到快速模式。

Cannot resolve property ‘driverClassName‘

已解决 Cannot resolve property 错误 最近在学习spring时遇到了下面的问题&#xff1a; spring读取不到property的name属性&#xff0c;报红&#xff0c;编译不通过&#xff0c;上网查到了两种解决方案&#xff0c;如下&#xff1a; 1、重新加载spring文件就可以解决问题了&a…

TypeScript 从入门到进阶之基础篇(三) 元组类型篇

系列文章目录 TypeScript 从入门到进阶系列 TypeScript 从入门到进阶之基础篇(一) ts基础类型篇TypeScript 从入门到进阶之基础篇(二) ts进阶类型篇TypeScript 从入门到进阶之基础篇(三) 元组类型篇TypeScript 从入门到进阶之基础篇(四) symbol类型篇 持续更新中… 文章目录 …

VMware Workstation——修改虚拟机配置和设置网络

目录 一、修改配置 1、点击需要修改配置的虚拟机&#xff0c;然后点击编辑虚拟机配置 2、修改内存、CPU、硬盘配置 二、设置网络 1、从虚拟机配置中进入到网络适配器设置 2、选择网络连接模式 一、修改配置 1、点击需要修改配置的虚拟机&#xff0c;然后点击编辑虚拟机配…