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

RBAC三级树状菜单实现(从前端到后端)未完待续

1、表格设计

RBAC 

2、前端路由

根据不同的用户id显示不同的菜单。

根据路由 

3、多级菜单 

展示所有权限,并且根据当前用户id展示它所属的角色的所有菜单。

前端树状展示

思路:

后端:传给前端map,map里1个是所有菜单,1个是它有的菜单。

前端代码:

树形图:

 <div v-if="menuData.length > 0"><el-treeref="tree":data="menuData"show-checkbox:default-checked-keys="getMenuByRoleId"node-key="id"default-expand-all@check-change="handleCheckChange":props="defaultProps"></el-tree>
</div>

 data区域

 data() {return {roleOptions: [], //角色分类selectedRole: 2, // 选中的角色分类menuData: [], //根据角色分类查所有的菜单selectedPermissions: [], // 选中的权限defaultProps: {children: "childrenList",label: "name",},getMenuByRoleId: [],};},

method:

 methods: {//选的所有的权限handleCheckChange() {const checkedKeys = this.$refs.tree.getCheckedKeys();console.log("已勾选的节点:", checkedKeys);},savePermissions() {// 执行保存权限的逻辑,可以将选中的权限发送到后端进行处理console.log(this.selectedPermissions);// 发送请求或者执行其他操作...},handleRoleChange() {// 角色分类变化时,清空选中的权限this.findAllRole();this.selectedPermissions = [];},findAllRole() {console.log(this.selectedRole);this.$axios.get("/api/pc-zdy-sys/role?roleId=" + this.selectedRole).then((res) => {if (res.data.code === 200) {this.menuData = res.data.data.allMenu; //所有菜单数组const roleList = res.data.data.getMenuByRoleId; // 角色拥有的菜单对象数组this.getMenuByRoleId = roleList.map((e) => e.id); //变成菜单id}});},findRoleType() {this.$axios.get("/api/pc-zdy-sys/role/roleType").then((res) => {if (res.data.code == 200) {this.roleOptions = res.data.data;}});},},created() {this.findRoleType();this.findAllRole();},

 4、菜单递归处理

4.1 父菜单找子菜单

 public List<MenuVO> queryMenuByUserId() {String userId = Application.getUserId();//根据用户查角色,查角色拥有的所有菜单List<Menu> menus = menuMapper.queryMenyByUserId(userId);//把子菜单弄给父菜单List<MenuVO> menuVOList = new ArrayList<>();for (Menu menu : menus) {MenuVO menuVO = new MenuVO();BeanUtils.copyProperties(menu,menuVO);menuVOList.add(menuVO);}//针对List<MenuVO>,先过滤一遍,留下有父id 的菜单List<MenuVO> collect = menuVOList.stream().filter(menu -> menu.getParentId() == null)//有父id的菜单 放到对应的id的菜单下.map(menu -> {menu.setChildrenList(getMenus(menuVOList, menu));return menu;}).collect(Collectors.toList());return collect;}

4.2 为子菜单找子菜单

private List<MenuVO> getMenus(List<MenuVO> list, MenuVO menu) {List<MenuVO> menuVOList = new ArrayList<>();for (MenuVO son : list) {// 判断 son 的 parentId 是否等于传入的一级菜单的 idif (son.getParentId() != null && son.getParentId().equals(menu.getId())) {if (son.getChildrenList() == null) {son.setChildrenList(new ArrayList<>());}// 为子菜单找孙菜单son.setChildrenList(getMenus(list, son));menuVOList.add(son);}}return menuVOList;}

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

相关文章:

  • 牛客网Verilog刷题——VL41
  • 大整数截取解决方法(java代码)
  • Spring Boot使用@Async实现异步调用:自定义线程池
  • GFS 分布式文件系统
  • PHP-mysql学习笔记
  • AI技术快讯:清华开源ChatGLM2双语对话语言模型
  • 网络基础知识
  • 【应用层】HTTPS协议详细介绍
  • 【Tensorboard+Pytorch】使用注意事项
  • 设计模式行为型——命令模式
  • 13-2_Qt 5.9 C++开发指南_线程同步_QMutex+QMutexLocker(目前较为常用)
  • 金融行业选择哪种SSL证书才安全可靠
  • 面试总结(三)
  • 青大数据结构【2016】
  • 聊聊拉长LLaMA的一些经验
  • 线程池的使用详解
  • 刷题笔记 day4
  • Python 2.x 中如何使用flask模块进行Web开发
  • spring websocket 调用受权限保护的方法失败
  • Vue.js2+Cesium 四、模型对比
  • Linux 之 Vi 编辑器
  • Python超实用!批量重命名文件/文件夹,只需1行代码
  • sqoop
  • PySpark 数据操作(综合案例)
  • 产品经理如何平衡用户体验与商业价值?
  • 【PostgreSQL】系列之 一 CentOS 7安装PGSQL15版本(一)
  • Nginx解决文件服务器文件名显示不全的问题
  • IO进程线程第四天(8.1)
  • WAF绕过-权限控制篇-后门免杀
  • LED灯的驱动,GPIO子系统,添加按键的中断处理