医药采购系统平台第4天03:实现根据用户的角色显示不同用户的权限菜单编写拦截器实现权限拦截模块的开发流程和测试流程小节

如果想要获取相关的源码,笔记,和相关工具,对项目需求的二次开发,可以关注我并私信!!!


四 权限管理(用户授权)的应用:根据用户的角色显示不同用户的权限菜单

经过上面的与第三方系统的成功的接入,而且在“角色管理”菜单中也对需要授权的角色进行了授权--->给一级菜单和二级菜单授权给了卫生室,那么,接下来就需使用卫生室登录系统,看看页面中的导航菜单中是否显示了添加的一级菜单和二级菜单导航菜单!

简单说,本节中所要实现的功能是:验证用户的权限菜单!就是使用不同的用户登录系统,并根据用户的角色获取他的权限菜单,并在左侧页面中的导航栏中显示!

即:根据不同用户的登录来显示不同用户的菜单!

举例来说:使用卫生局和卫生室两个角色分别登录系统,在导航栏中的权限菜单的显示也是不同的!

因此,first.jsp页面中发送的请求中的Menu.json文件可以不需要了!同时,本节的内容需要和第7节的内容分步来实现权限管理的应用的

该节内容总结就是:

用户登录成功后,根据用户所属的角色来从数据库中查出用户的菜单权限,然后将菜单权限存储至session中,从而实现不同的用户登录,显示出不同的菜单

因此,也可以说菜单权限属于粗颗粒度的权限管理范畴!

1 DAO

1.1 sql语句的编写(有难度

再次强调:在写sql语句之前,必须要对这9张表之间的关系烂熟于心

这9张表之间的关系可以参考“第三方用户授权系统表关系.xlsx”文件,或者参考“本系统的权限管理模型”一节中的内容和视频!!

需求:根据用户角色获取该角色下所有的一级和二级菜单。注意:是所有的一级和二级菜单,而不是某个一级菜单下的二级菜单!这样做是为了节省性能。

主查询表:权限菜单表bss_sys_module表可以查看所有的一级菜单和二级菜单,它是一个树形结构。其中parentid字段值为0表示一级菜单,而parentid的值中不为0的都是二级菜单,并且,所有的二级菜单中都有url链接地址.

如下图:

关联查询表:角色表、角色系统关系表、角色节点关系表、角色菜单关系表、角色操作关系表。

--查询某个卫生室的所有一级和二级菜单

select m1.moduleid menuid,

       m1.name menuname,

       m2.moduleid menuid_two, 

--之所以别名是menuid_two,而不是menuid.是因为mybatis对于结果集中两个相同的menuid字段是无法实现映射的,虽然这两个字段的内容相同,但是字段名称绝对不可以相同。

       m2.name menuname_two,

       m2.url

  --这里设定m1中存放的是所有的一级菜单,m2中存放的是所有的二级菜单

from bss_sys_module m1, bss_sys_module m2

--自连接条件

 where m2.parentid = m1.moduleid

   and m1.parentid = '0'   --表示所有的一级菜单

   and m2.parentid != '0'  --表示所有的二级菜单

 --该条件用来限定某个角色下所有的二级菜单,因此,范围在m2.moduleid之内     

   and m2.moduleid in  

       (

        

        ---限定某个角色范围内的菜单

        select bss_sys_rolemodule.moduleid

          from bss_sys_role,

                bss_sys_rolesys,

                bss_sys_rolenode,

                bss_sys_rolemodule,

                bss_sys_roleoperate

                --角色表和角色系统表的关联

         where bss_sys_role.roleid = bss_sys_rolesys.roleid

                 

           and bss_sys_rolenode.rsid = bss_sys_rolesys.rsid

           and bss_sys_rolemodule.rnid = bss_sys_rolenode.rnid

           and bss_sys_roleoperate.rmid = bss_sys_rolemodule.rmid

           ---假设角色id是卫生室

           and bss_sys_role.roleid = '511A6F41419949C38122A94310DADD14')

 order by m1.showorder, m2.showorder  ---排序,showorder字段是排序字段  

1.2 VO类的定义

VO的定义--->Menu.java

其中定义的:List<Menu>  meus属性中存储的是二级菜单。

这Menu类中属性的定义就是一对多的结构定义。(牢记)!

之所以单独定义一个Menu类,是为了方便直接转换成json格式的数据,因为页面中的权限菜单需要使用JSON格式的数量来显示(这是该系统的开发规范之一)!

(可以参考下面的FirstAction类中的获取菜单方法usermenu()方法会使用到).

1.3 mapper映射文件的定义(一对多查询)

因为是一对多的映射,即:一个用户(角色)对应多个权限菜单,所以必须使用resultMap实现映射

关于该映射文件中各个属性的含义,请参考“mybatis的高级知识.doc”文档!!!!

在SysuserMapperCustom.xml映射文件中添加如下内容:颜色加深加粗的都是添加的内容。

<!-- 一对多映射 -->

<resultMap id="findMenuByroleidResultMap" type="yycg.base.pojo.vo.Menu">

<!-- column=menuid表示唯一的数据库查询语句中的主键。因为在sql语句的结果集中,mybatis会自动把结果集中的menuid主键字段相同的记录进行合并 -->

<id column=

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

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

相关文章

#2 物联网组成要素

从下至上&#xff0c;则包括了5个要素&#xff0c;包括 设备 / 传感器 / 网络 / 物联网服务 / 数据分析 这五个要素。为了便于理解&#xff0c;我们用思维导图展示 物联网构成架构 设备 能够感测和反馈并连到网络进行物联网服务的装置 传感器 传感器和网关的融合实现了物…

< 自用文 Project-30.6 Crawl4AI > 为AI模型优化的网络爬虫工具 帮助收集和处理网络数据的工具

官方链接&#xff1a; Github &#xff1a;https://github.com/unclecode/crawl4ai 文档主页&#xff1a;https://docs.crawl4ai.com/ 当前版本&#xff1a;Crawl4AI v0.5.0 主要新功能&#xff1a; 可配置策略&#xff08;广度优先、深度优先、最佳优先&#xff09;探索整…

【Kafka基础】监控与维护:动态配置管理,灵活调整集群行为

1 基础配置操作 1.1 修改主题保留时间 /export/home/kafka_zk/kafka_2.13-2.7.1/bin/kafka-configs.sh --alter \--bootstrap-server 192.168.10.33:9092 \--entity-type topics \--entity-name yourtopic \--add-config retention.ms86400000 参数说明&#xff1a; retention…

04-微服务 面试题-mk

文章目录 1.Spring Cloud 常见的组件有哪些?2.服务注册和发现是什么意思?(Spring Cloud 如何实现服务注册发现)3.Nacos配置中心热加载实现原理及关键技术4.OpenFeign在微服务中的远程服务调用工作流程5.你们项目负载均衡如何实现的 ?6.什么是服务雪崩,怎么解决这个问题?…

Redis最佳实践——秒杀系统设计详解

基于Redis的高并发秒杀系统设计&#xff08;十万级QPS&#xff09; 一、秒杀系统核心挑战 瞬时流量洪峰&#xff1a;100万 QPS请求冲击库存超卖风险&#xff1a;精准扣减防止超卖系统高可用性&#xff1a;99.99%服务可用性要求数据强一致性&#xff1a;库存/订单/支付状态同步…

AI大模型从0到1记录学习 数据结构和算法 day18

3.3.1 栈的概述 栈&#xff08;Stack&#xff09;是一个线性结构&#xff0c;其维护了一个有序的数据列表&#xff0c;列表的一端称为栈顶&#xff08;top&#xff09;&#xff0c;另一端称为栈底&#xff08;bottom&#xff09;。栈对数据的操作有明确限定&#xff0c;插入元素…

粘性定位(position:sticky)——微信小程序学习笔记

1. 简介 CSS 中的粘性定位&#xff08;Sticky positioning&#xff09;是一种特殊的定位方式&#xff0c;它可以使元素在滚动时保持在视窗的特定位置&#xff0c;类似于相对定位&#xff08;relative&#xff09;&#xff0c;但当页面滚动到元素的位置时&#xff0c;它会表现得…

通过使用 include 语句加载并执行一个CMake脚本来引入第三方库

通过使用 include 语句加载并执行一个CMake脚本来引入第三方库 当项目中使用到第三方库时&#xff0c;可以通过使用 include 语句来加载并执行一个CMake脚本&#xff0c;在引入的CMake脚本中进行第三方库的下载、构建和库查找路径的设置等操作&#xff0c;以这种方式简化项目中…

DNS正反向解析复习,DNS主从服务,转发服务及DNS和nginx联合案例

正向解析 1、配置主机名 [rootlocalhost ~]# dnf install bash-completion -y #一个按tap键补全的软件 [rootlocalhost ~]# hostnamectl hostname dns #改主机名为dns [rootlocalhost ~]# exit ssh root你的IP地址 要重启才会生效2、安装bind [rootdns ~]# dnf install b…

网络安全·第一天·IP协议安全分析

本篇博客讲述的是网络安全中一些协议缺陷以及相应的理论知识&#xff0c;本博主尽可能讲明白其中的一些原理以及对应的防卫措施。 学习考研408的同学也能进来看看&#xff0c;或许对考研有些许帮助&#xff08;按照考研现在的趋势&#xff0c;年年都有新题目&#xff0c;本文当…

【详解】Nginx配置WebSocket

目录 Nginx配置WebSocket 简介 准备工作 检查 Nginx 版本 配置 Nginx 支持 WebSocket 修改 Nginx 配置文件 解释配置项 测试配置 测试 WebSocket 连接 WebSocket 服务端 (Node.js) WebSocket 客户端 (HTML JavaScript) 运行测试 Nginx 配置文件示例 解释 测试配…

《轨道力学讲义》——第八讲:行星际轨道设计

第八讲&#xff1a;行星际轨道设计 引言 行星际轨道设计是探索太阳系的核心技术&#xff0c;它涉及如何规划和优化航天器从一个天体到另一个天体的飞行路径。随着人类探索太阳系的雄心不断扩大&#xff0c;从最初的月球探测到火星探测&#xff0c;再到更遥远的外太阳系探测&a…

操作系统学习笔记——[特殊字符]超详细 | 如何唤醒被阻塞的 socket 线程?线程阻塞原理、线程池、fork/vfork彻底讲明白!

&#x1f4a1;超详细 | 如何唤醒被阻塞的 socket 线程&#xff1f;线程阻塞原理、线程池、fork/vfork彻底讲明白&#xff01; 一、什么是阻塞&#xff1f;为什么线程会阻塞&#xff1f;二、socket线程被阻塞的典型场景&#x1f9e0; 解法思路&#xff1a; 三、线程的几种阻塞状…

第十六届蓝桥杯大赛软件赛省赛 Python 大学 B 组 满分题解

题面链接Htlang/2025lqb_python_b 个人觉得今年这套题整体比往年要简单许多&#xff0c;但是G题想简单了出大问题&#xff0c;预估50101015120860&#xff0c;道阻且长&#xff0c;再接再厉 代码仅供学习参考&#xff0c;满分为赛后洛谷中的测评&#xff0c;蓝桥杯官方测评待…

若依代码生成器原理velocity模板引擎(自用)

1.源码分析 代码生成器:导入表结构(预览、编辑、删除、同步)、生成前后端代码 代码生成器表结构说明&#xff1a; 若依提供了两张核心表来存储导入的业务表信息&#xff1a; gen_table&#xff1a;存储业务表的基本信息 &#xff0c;它对应于配置代码基本信息和生成信息的页…

如何制定有效的风险应对计划

制定有效的风险应对计划的核心在于&#xff1a; 识别潜在风险、评估风险的影响与概率、选择合适的应对策略、建立动态监控和反馈机制。 其中&#xff0c;识别潜在风险是最为关键的第一步。只有准确识别出可能的风险&#xff0c;才能在后续的评估、应对、监控等环节中做到有的放…

A2A协议实现详解及示例

A2A协议概述 A2A (Agent2Agent) 是Google推出的一个开放协议&#xff0c;旨在使AI智能体能够安全地相互通信和协作。该协议打破了孤立智能体系统之间的壁垒&#xff0c;实现了复杂的跨应用自动化。[1] A2A协议的核心目标是让不同的AI代理能够相互通信、安全地交换信息以及在各…

【中级软件设计师】前趋图 (附软考真题)

【中级软件设计师】前趋图 (附软考真题) 目录 【中级软件设计师】前趋图 (附软考真题)一、历年真题三、真题的答案与解析答案解析 复习技巧&#xff1a; 若已掌握【前趋图】相关知识&#xff0c;可直接刷以下真题&#xff1b; 若对知识一知半解&#xff0c;建议略读题目&#x…

调节磁盘和CPU的矛盾——InnoDB的Buffer Pool

缓存的重要性 无论是用于存储用户数据的索引【聚簇索引、二级索引】还是各种系统数据&#xff0c;都是以页的形式存放在表空间中【对一个/几个实际文件的抽象&#xff0c;存储在磁盘上】如果需要访问某页的数据&#xff0c;就会把完整的页数据加载到内存中【即使只访问页中的一…

springboot和springcloud的区别

1. ‌目的与功能‌ ‌1)Spring Boot‌: 主要用于快速构建独立的、生产级的 Spring 应用程序。它通过自动配置和嵌入式服务器等特性,简化了微服务的开发、启动和部署,使开发者能够专注于业务逻辑而非繁琐的配置。‌Spring Boot是一个快速开发的框架,旨在简化Java应用程序的开…