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

动态路由菜单:根据用户角色动态生成菜单栏的实践(包含子菜单)

前言

在现代后台管理系统中,不同角色的用户通常需要访问不同的功能模块。动态路由菜单技术正是解决这一需求的关键方案。本文将介绍如何基于用户角色实现动态菜单路由,让每个用户登录后只能看到自己权限范围内的菜单项。

核心思路

实现动态路由菜单的核心流程如下:

  1. 用户登录认证:验证用户身份并获取用户角色信息

  2. 角色权限关联:查询该角色对应的菜单权限

  3. 菜单树构建:将扁平化的菜单数据转换为树形结构

  4. 前端渲染:将菜单树传递给前端进行动态渲染

代码实现解析

下面是一个基于Spring Boot的实现示例:

接口返回样例:

{
"msg": "操作成功",
"code": 200,
"data": {
"userId": 1,
"username": "admin", 
"password": "8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92",
"realName": "管理员", 
"contact": "", 
"mobile": "15679711120", 
"status": 1
},
"roles": "超级管理员",
"routers": [
{
"name": "系统管理",
"path": "/sys",
"hidden": "false",
"redirect": "noRedirect",
"component": "Layout",
"alwaysShow": true,
"meta": {
"title": "系统管理",
"icon": "system"
},
"children": [
{
"name": "管理员管理",
"path": "/user",
"hidden": "false",
"component": "sys/user/index",
"meta": {
"title": "管理员管理",
"icon": "user"
}
}
]
}
]
}

 @Autowiredprivate UserMapper userMapper;@Overridepublic List<MenuRouterVO> GetMenuByID(Integer userId) {//1.根据用户的id查询该用所对应的角色以及该角色所对应的菜单List<Menu> menuList=userMapper.GetMenuByID(userId);//2.创建一个集合List<MenuRouterVO> 最终的集合List<MenuRouterVO> list=new ArrayList<MenuRouterVO>();//3.遍历该用户所能查看的所有菜单找到一级菜单封装进MenuRouterVOfor (Menu menu : menuList) {//前提prentId=0才可以if(menu.getParentId()==0){//创建一个新的父级菜单对象MenuRouterVO menuRouterVO = new MenuRouterVO();//给父级菜单对象赋值 bean实体类的封装工具类 框架提供的//将指定对象中的相同属性赋值给新对象(目标对象)BeanUtils.copyProperties(menu,menuRouterVO);//再将没有的属性进行赋值MenuMetaVO metaVO = new MenuMetaVO();metaVO.setTitle(menu.getName());metaVO.setIcon(menu.getIcon());menuRouterVO.setMeta(metaVO);//父级菜单的最后一个属性children 赋值List<MenuChildrenVO> children = new ArrayList<>();//生成childrenInteger menuId = menu.getMenuId();//二次遍历 找子菜单//4.不是一级菜单的继续遍历找到属于哪个一级菜单下挂在该菜单下for (Menu child : menuList) {if(child.getParentId() == menuId){//5.封装子菜单ChildMenuRouterVO  在放进集合List<ChildMenuRouterVO>MenuChildrenVO childVO = new MenuChildrenVO();BeanUtils.copyProperties(child, childVO);MenuMetaVO childMetaVO = new MenuMetaVO();childMetaVO.setTitle(child.getName());childMetaVO.setIcon(child.getIcon());childVO.setMeta(childMetaVO);children.add(childVO);}}//6.将子菜单集合挂在MenuRouterVO的children的集合属性下menuRouterVO.setChildren(children);//7.将每一个MenuRouterVO放进大集合list.add(menuRouterVO);}}//8.返回外层大集合List<MenuRouterVO>return list;}

博主这里有三个表,人员表(包含角色ID),人员角色中间表(人员id,角色id),角色表

本方法适用于二级菜单大家可以根据上面的思路和自己系统的需要设计自己需要的接口

http://www.lryc.cn/news/615088.html

相关文章:

  • 【Python 语法糖小火锅 · 第 5 涮 · 完结】
  • java练习题:数字位数
  • 【Java基础】字符串不可变性、string的intern原理
  • C++11 ---- 线程库
  • 3.2Vue Router路由导航
  • B.10.01.3-性能优化实战:从JVM到数据库的全链路优化
  • 区块链密码学简介
  • (LeetCode 每日一题) 231. 2 的幂 (位运算)
  • 基于clodop和Chrome原生打印的标签实现方法与性能对比
  • 通过 SCP 和 LXD 配置迁移 CUDA 环境至共享(笔记)
  • 数据标准化与归一化的区别与应用场景
  • FAN5622SX 四通道六通道电流吸收线性LED驱动器,单线数字接口 数字式调光, 2.7 → 5.5 V 直流直流输入, 30mA输出FAN5622S
  • C++ unordered_map 和 unordered_set 的使用
  • 新手向:Python开发简易待办事项应用
  • 【JS-8-Json】深入理解JSON语法及Java中的JSON操作
  • Visual Studio Code (v1.103) 中 GitHub Copilot 最新更新!
  • [TryHackMe]Challenges---Game Zone游戏区
  • 避不开的数据拷贝(2)
  • 第二十天:数论度量
  • 【面试场景题】通过LinkedHashMap来实现LRU与LFU
  • C++隐式转换的魔法与陷阱:explicit关键字的救赎
  • 软件工程总体设计:从抽象到具体的系统构建之道
  • Python基础教程(六)条件判断:引爆思维Python条件判断的九层境界
  • 轻量化阅读应用实践:21MB无广告电子书阅读器测评
  • MySQL(188)如何使用MySQL的慢查询工具?
  • Spring Boot 2 集成 Redis 集群详解
  • 聊聊经常用的微服务
  • MBR分区nvme固态硬盘安装win7--非UEFI启动和GPT分区
  • day30-HTTP
  • 大语言模型提示工程与应用:LLMs文本生成与数据标注实践