B059-权限管理系统01

news2025/1/12 3:06:03

目录

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

知识点介绍

在这里插入图片描述

项目演示

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

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

项目搭建

一:SSM整合
  1.导包									tips:lombok在编译时生成get,setter ,构造器,toString等方法
  2.准备目录结构
  3.核心配置文件  yml
  4.启动类  加上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

    @Override
    public 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

    @Override
    public 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分页关键字是rownum
  helper-dialect: mysql
  #分页容错  传的当前页码小于1时定位第一页,传的当前页码大于最末页时定位到末页
  reasonable: true
  #支持在参数传递分页参数  支持在mapper接口层传分页参数
  support-methods-arguments: true
高级查询

RoleQuery

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

RoleServiceImpl

    @Override
    public 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")
    @ResponseBody
    public 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")
    @ResponseBody
    public 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
    @Transactional
    public void save(Role role) {
        roleMapper.save(role);
    }

    @Override
    @Transactional
    public 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")
    @ResponseBody
    public 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
    @Transactional
    public 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

    @Override
    public 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">
        SELECT
            p.id pid,
            p. NAME pname,
            p.url purl,
            c.*
        FROM
            permission p
        JOIN permission c ON p.id = c.parent_id
        WHERE
            p.parent_id IS NULL
    </select>

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

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

相关文章

Java中请求生成唯一追溯TraceId

Java中请求生成唯一追溯TraceId 一&#xff1a;背景 因为是微服务架构,平常日志太多,看日志不太好查,所以想要从一整个链路当中获取一个唯一标识,比较好定位问题&#xff0c; 原理就是从gateway网关将标识传递到下游,下游服务拿到这个标识,响应结束后将traceId反向写入响应体…

Python中的有序字典是什么

有序字典 一、简介 Python中的字典的特性&#xff1a;无序性。 有序字典和通常字典类似&#xff0c;只是它可以记录元素插入其中的顺序&#xff0c;而一般字典是会以任意的顺序迭代的。 二、普通字典 #! /usr/bin/env python3 # -*- coding:utf-8 -*- d1 {} d1[a] A d1[b…

十种编程语言的对比分析

在当今的软件开发领域&#xff0c;编程语言扮演着至关重要的角色。不同的编程语言各有其特点和适用场景&#xff0c;选择合适的编程语言能够提高开发效率和软件质量。本文将对十种常见的编程语言进行对比分析&#xff0c;帮助读者了解它们的优缺点和适用场景。 一、Python Pyt…

微服务实战系列之API加密

前言 随着一阵阵凛冽寒风的呼啸&#xff0c;新的年轮不知不觉滚滚而来。故事随着2023的远去&#xff0c;尘封于案底&#xff1b;希望迎着新年&#xff0c;绽放于枝头。在2024新岁启航&#xff0c;扬帆破浪之时&#xff0c;让烦恼抛洒于九霄&#xff0c;让生机蓬勃于朝朝暮暮。 …

Java 将Excel转换为TXT文本格式

TXT文件是一种非常简单、通用且易于处理的文本格式。在处理大规模数据时&#xff0c;将Excel转为TXT纯文本文件可以提高处理效率。此外&#xff0c;许多编程语言和数据处理工具都有内置的函数和库来读取和处理TXT文件&#xff0c;因此将Excel文件转换为TXT还可以简化数据导入过…

继续理解Nacos的CP和AP架构模型!

本篇文章延续文章“如何理解Nacos册CP和AP架构模型”&#xff0c;大家可以配套一起学习。 Nacos注册中心处理HTTP注册请求 在文章“如何理解Nacos册CP和AP架构模型”中已经提到过&#xff0c;Nacos注册中心用Restful API InstanceController的方法register()处理HTTP类型的注…

瑞数4——MmEwMD逆向分析

瑞数4——MmEwMD逆向分析 提示简介定位入口MmEwMD生成所需参数分析MmEwMD生成的大致流程第一部分生成(所需三个参数)第一部分生成的值赋值给另一个变量第二部分生成并与第一部分拼接最终的结果与MmEwMD拼接 第一部分生成的逆向分析&#xff08;所需参数&#xff1a;数组a、数字…

Linux第17步_安装SSH服务

secure shell protocol简称SSH。 目的&#xff1a;在进行数据传输之前&#xff0c;SSH先对联级数据包通过加密技术进行加密处理&#xff0c;然后再进行数据传输&#xff0c;确保数据传输安全。 1、在安装前&#xff0c;要检查虚拟机可以上网&#xff0c;否则可能会导致安装失…

C++内容补充--面向对象篇

类和对象 类中静态成员不占用类的大小 也就不占用类的对象的大小 只有一个类壳子的时候 类和对象的大小都是1 当类中只有一个int数据的时候 类和对象的大小都是4 当类中有int数据以及一个静态变量的时候 类和对象的大小还是4 变量存储类以及对象的存储类 所有的局部变量默认…

Linux上传、下载、rz、sz命令

一、上传下载 我们可以通过finalshell工具方便地和虚拟机进行数据交换 在finalshell软件的下方窗体中&#xff0c;提供了Linux的文件系统视图 点击下载就可以下载了 如果想通过root权限&#xff0c;那么需要在编辑器中更换用户名&#xff1a; 上传&#xff1a;直接把windows…

C#,入门教程(08)——基本数据类型及使用的基础知识

上一篇&#xff1a; C#&#xff0c;入门教程(07)——软件项目的源文件与目录结构https://blog.csdn.net/beijinghorn/article/details/124139947 数据类型用于指定数据体&#xff08;DataEntity&#xff0c;包括但不限于类或结构体的属性、变量、常量、函数返回值&#xff09;…

架构的本质是什么?

最近总是有小伙伴问我&#xff0c;如何成长为一名优秀的架构师&#xff0c;我也不知道该如何去回答&#xff0c;但是我想聊一下架构的本质。 架构不是互联网行业独有的 架构及对应的架构师职位并不是互联网行业独有的&#xff0c;只要存在组织的地方就存在架构。 比如一个木…

企业出海数据合规:GDPR中的个人数据与非个人数据之区分

GDPR仅适用于个人数据&#xff0c;这意味着非个人数据不在其适用范围内。因此&#xff0c;个人数据的定义是一个至关重要的因素&#xff0c;因为它决定了处理数据的实体是否要遵守该法规对数据控制者规定的各种义务。尽管如此&#xff0c;什么是个人数据仍然是当前数据保护制度…

用通俗易懂的方式讲解:LSTM原理及生成藏头诗(Python)

一、基础介绍 1.1 神经网络模型 常见的神经网络模型结构有前馈神经网络(DNN)、RNN&#xff08;常用于文本 / 时间系列任务&#xff09;、CNN&#xff08;常用于图像任务&#xff09;等等。 前馈神经网络是神经网络模型中最为常见的&#xff0c;信息从输入层开始输入&#xf…

SpringBoot 调用mybatis报错:Invalid bound statement (not found):

启动SpringBoot报错&#xff1a;Invalid bound statement (not found): 参考此文排查 命中了第6条 记录一手坑爹的Invalid bound statement (not found)&#xff08;六个方面&#xff09; mapper文件路径配置错误 订正以后 问题解决

项目从npm迁移到pnpm

场景如下&#xff1a;在安装Vue3时默认为使用Npm安装&#xff0c;如图所示&#xff1a; 安装完后项目就包含了基于NPM的node_modules、package.json&#xff0c;以及package-lock.json 如果想使用pnpm去安装依赖项的话&#xff0c;可以通过如下几个步骤实现&#xff1a; ①删…

基于R语言(SEM)结构方程模型教程

详情点击链接&#xff1a;基于R语言&#xff08;SEM&#xff09;结构方程模型教程 01、R/Rstudio (2)R语言基本操作&#xff0c;包括向量、矩阵、数据框及数据列表等生成和数据提取等 (3)R语言数据文件读取、整理&#xff08;清洗&#xff09;、结果存储等&#xff08;含tidve…

JAVA中小型医院信息管理系统源码 医院系统源码

开发框架&#xff1a;SpringBootJpathymeleaf 搭建环境&#xff1a;jdk1.8idea/eclipsemaven3mysql5.6 基于SpringBoot的中小型医院信息管理系统&#xff0c;做的比较粗糙&#xff0c;但也实现了部分核心功能。 就诊卡提供了手动和读卡两种方式录入&#xff0c;其中IC读卡器使用…

跟随chatgpt从零开始安装git(Windows系统)

为什么我们要安装Git&#xff1f;Git有什么用&#xff1f; 1. 版本控制&#xff1a;Git 可以追踪代码的所有变化&#xff0c;记录每个提交的差异&#xff0c;使您能够轻松地回溯到任何历史版本或比较不同版本之间的差异。 2. 分支管理&#xff1a;通过 Git 的分支功能&#xff…

【C语言:可变参数列表】

文章目录 1.什么是可变参数列表2.可变参数列表的分析与使用2.1使用2.2分析原理2.3分析原码 1.什么是可变参数列表 对于一般的函数而言&#xff0c;参数列表都是固定的&#xff0c;而且各个参数之间用逗号进行分开。这种函数在调用的时候&#xff0c;必须严格按照参数列表中参数…