B059-权限管理系统01

目录

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

知识点介绍

在这里插入图片描述

项目演示

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

tips:
基于springboot的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.rhkb.cn/news/236466.html

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

相关文章

Android Studio打包有哪些优势

大家好&#xff0c;现在移动应用程序的快速发展&#xff0c;开发者需要一个强大又可靠的开发环境来创建和打包高质量的 Android 应用程序。Android Studio 是一款由 Google 官方开发的 Android 应用程序开发环境&#xff0c;提供了许多的优势和便利&#xff0c;那究竟都有哪些优…

使用Linux防火墙管理HTTP流量

在Linux系统中&#xff0c;防火墙是用于控制网络流量的重要工具。通过防火墙&#xff0c;你可以根据需要限制、过滤或允许特定的网络流量&#xff0c;从而提高系统的安全性。在处理HTTP流量时&#xff0c;防火墙可以帮助你实施访问控制、流量监控和其他安全策略。 iptables i…

持续赋能波卡生态创新,OneBlock+ 社区 2023 年度回顾

OneBlock 开发者社区成立于 2018 年&#xff0c;历经五年的积累与沉淀&#xff0c;已经成长为行业内领先的 Substrate 开发者社区。我们以成熟的社区生态&#xff0c;通过 Substrate 技术与波卡生态的相关优质文章、项目方与开发者专访、线上线下技术热点对谈、多阶段开发者课程…

C语言—数据类型

变量和基本数据类型 变量类型的概念 变量是在程序中可以发生变化的量&#xff0c;变量是有类型的&#xff0c;变量的类型决定了变量存储空间的大小以及如何解释存储的位模式。 1字节&#xff08;Byte&#xff09;8位&#xff08;bit&#xff09; 定义格式 存储类型 数据…

java JDBC 连接数据库(增删查改)

必须先插入工具包 代码 public static void main(String[] args) {DataSource ds JdbcHelper.getDs();System.out.println(ds);JdbcTemplate jdbcTemplatenew JdbcTemplate(ds);System.out.println(jdbcTemplate);//新增String sql1"insert into biao values(null,?,?,…

【Web】forward 和 redirect 的区别

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;Web ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 Forward&#xff08;转发&#xff09;&#xff1a; Redirect&#xff08;重定向&#xff09;&#xff1a; 区别总结&#xff1a; …

主题-----读微信公众号

1.SOA 面向服务的架构&#xff08;Service-Oriented Architecture&#xff0c;SOA&#xff09;还没有一个公认的定义。许多组织从不同的角度和不同的侧面对 SOA 进行了描述&#xff0c;较为典型的有以下三个&#xff1a; &#xff08;1&#xff09;W3C 的定义&#xff1a;SOA 是…

Python基础知识:整理11 模块的导入、自定义模块和安装第三方包

1 模块的导入 1.1 使用import 导入time模块&#xff0c;使用sleep功能&#xff08;函数&#xff09; import time print("start") time.sleep(3) print("end")1.2 使用from 导入time的sleep功能 from time import sleep print("start") slee…

SpringMVC ResponseEntity常见使用场景

ResponseEntity 作为 Spring MVC controller层 的 HTTP response&#xff0c;包含 status code, headers, body 这三部分。 正常场景 RestController Slf4j public class SearchController {AutowiredUserService userService;RequestMapping(value "/getAllStudents4&…

ROS2学习笔记三:话题Topic

目录 前言 1 话题简介 2 常用指令 3 RCLCPP实现实现话题 3.1 创建工作空间 3.2 代码编写 3.2.1 发布端编写 3.2.2 发布端编写 前言 ROS2中的一个重要概念是话题&#xff08;Topic&#xff09;。话题是一种通过发布者和订阅者之间进行异步通信的机制。发布者&#xff0…

归并排序例题——逆序对的数量

做道简单一点的题巩固一下 归并排序实现步骤 将整个区间 [l, r] 划分为 [l, mid] 和 [mid1, r]。 递归排序 [l, mid] 和 [mid1, r]。 将左右两个有序序列合并为一个有序序列。 题目描述 给定一个长度为 n 的整数数列&#xff0c;请计算数列中的逆序对的数量。 逆序对的定义…

Java面试题(java高级面试题)

线程池的核心线程数设置为多大比较合理&#xff1f; Worker线程在执行的过程中&#xff0c;有一部计算时间需要占用CPU&#xff0c;另一部分等待时间不需要占用CPU&#xff0c;通过量化分析&#xff0c;例如打日志进行统计&#xff0c;可以统计出整个Worker线程执行过程中这两…

微信小程序开发学习笔记《8》tabBar

微信小程序开发学习笔记《8》tabBar 博主正在学习微信小程序开发&#xff0c;希望记录自己学习过程同时与广大网友共同学习讨论。tabBar官方文档 tabBar这一节还是相当重要的。 一、什么是tabBar tabBar是移动端应用常见的页面效果&#xff0c;用于实现多页面的快速切换。小…

GC2003七通道NPN 达林顿管,专为符合标准 TTL 而制造

GC2003 内部集成了 7 个 NPN 达林顿晶体管&#xff0c;连接的阵列&#xff0c;非常适合逻辑接口电平数字电路&#xff08;例 如 TTL&#xff0c;CMOS 或PMOS 上/NMOS&#xff09;和较高的电流/电压&#xff0c;如电灯电磁阀&#xff0c;继电器&#xff0c;打印机或其他类似的负…

NAND Separate Command Address (SCA) 接口数据传输解读

在采用Separate Command Address (SCA) 接口的存储产品中&#xff0c;DQ input burst和DQ output burst又是什么样的策略呢&#xff1f; DQ Input Burst: 在读取操作期间&#xff0c;数据以一种快速并行的方式通过DQ总线传送到控制器。在SCA接口下&#xff0c;虽然命令和地址信…

设计一个简易版的数据库路由

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring原理、JUC原理、Kafka原理、分布式技术原理、数据库技术&#x1f525;如果感觉博主的文章还不错的…

黑马苍穹外卖学习Day5

文章目录 Redis学习Redis简介准备工作Redis常用数据类型介绍各数据类型的特点Redis常用命令字符串操作命令哈希操作命令列表操作命令集合操作命令有序集合操作命令通用操作命令 在Java中操作Redis导入Spring Data Redis坐标配置Redis数据源编写配置类&#xff0c;创建RedisTemp…

从事铁路工作保护足部,穿什么劳保鞋更安全

铁路运输在我国交通运输业中起着骨干作用&#xff0c;为国民经济的可持续发展和人口流动做出了巨大贡献。安全是铁路运输不可忽视的问题&#xff0c;在作业场地随处能见到“安全就是生命&#xff0c;责任重于泰山”的安全标语&#xff0c;由此可见安全问题是放在首位的。 铁路施…

开源游戏引擎:创造无限可能 | 开源专题 No.56

godotengine/godot Stars: 62.6k License: MIT Godot Engine 是一个功能强大的跨平台游戏引擎&#xff0c;可用于创建 2D 和 3D 游戏。它提供了一套全面的常见工具&#xff0c;让用户可以专注于制作游戏而不必重复造轮子。该引擎支持将游戏一键导出到多个平台上&#xff0c;包…

代码随想录Day.31 | 455. 分发饼干、376. 摆动序列、53. 最大子序和

455. 分发饼干 1. LeetCode链接 455. 分发饼干 - 力扣&#xff08;LeetCode&#xff09; 2. 题目描述 3. 解法 贪心法&#xff0c;首先想到的是&#xff0c;局部最优&#xff1a;让每个孩子尽可能拿能拿到的最小饼干尺寸。为了方便查找&#xff0c;这就要求至少饼干尺寸是从…