当前位置: 首页 > 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.dtcms.com/a/322407.html

相关文章:

  • 使用加密技术实现个人密码本保护
  • try/catch/throw 简明指南
  • orcad的操作(1)
  • 写 SPSS文件系统
  • Docker容器
  • 多级缓存详解
  • RAG-大模型课程《李宏毅 2025》作业1笔记
  • 从“人拉肩扛”到“智能协同”——AGV重构消防智能仓储价值链
  • 我用C++和零拷贝重构了文件服务器,性能飙升3倍,CPU占用降低80%
  • 202506 电子学会青少年等级考试机器人二级理论综合真题
  • Spark02 - SparkContext介绍
  • 304 引发的 SEO 难题:缓存策略与内容更新如何两全?
  • 【ref、toRef、toRefs、reactive】ai
  • 比较useCallback、useMemo 和 React.memo
  • kafka架构原理快速入门
  • Opencv[七]——补充
  • 基于HTML的政策问答
  • java组件安全vulhub靶场
  • HTML金色流星雨
  • 服务器硬件电路设计之I2C问答(二):I2C总线的传输速率与上拉电阻有什么关系?
  • ELK常见的问题
  • 华为实验:DHCP 典型配置
  • 《汇编语言:基于X86处理器》第12章 复习题和练习
  • Openlayers基础教程|从前端框架到GIS开发系列课程(19)地图控件和矢量图形绘制
  • Elasticsearch `_search` API Query DSL、性能开关与实战范式
  • 如何优雅的使用进行参数校验
  • Nginx 功能扩展与二次开发实践
  • 黑马SpringAI项目-聊天机器人
  • axios 发请求
  • 束搜索(Beam Search):原理、演进与挑战