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

news2025/1/19 22:29:30

1、菜单设计

2、前端路由

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

一个是找

一个是路由 

3、多级菜单 

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

前端树状展示

太牛逼了!

思路:

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

 

前端代码:

树形图:

 <div v-if="menuData.length > 0">
      <el-tree
        ref="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 是否等于传入的一级菜单的 id
            if (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.coloradmin.cn/o/808969.html

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

相关文章

Android AIDL 使用

工程目录图 请点击下面工程名称&#xff0c;跳转到代码的仓库页面&#xff0c;将工程 下载下来 Demo Code 里有详细的注释 代码&#xff1a;LearnAIDL代码&#xff1a;AIDLClient. 参考文献 安卓开发学习之AIDL的使用android进阶-AIDL的基本使用Android AIDL 使用使用 AIDL …

Matlab Image Processing toolbox 下载安装方法

当安装好Matlab之后&#xff0c;发现没有Image Processing toolbox这个图像处理工具箱 从新安装一遍&#xff0c; 选上 Image Processing toolbox 但是不用选matlab即可 1.找到之前安装时的Setup安装程序包&#xff0c;按照之前安装Matlab步骤&#xff0c;到选择需要安装的Ma…

基于FasterRCNN深度学习网络的车辆检测算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2022A 3.部分核心程序 ....................................................................... % 训练Faster R-…

儿童居家健身好伙伴,小莫计数摸高训练器

现在的孩子们的越来越不喜欢运动了&#xff0c;总是爱玩手机游戏&#xff0c;对他们的身体健康非常不好&#xff0c;作为家长&#xff0c;我们希望能够给孩子提供更多的运动机会&#xff0c;有必要每天准备一些能让他们活动活动手脚的小游戏&#xff0c;让他们每天有足够的运动…

初阶C语言-函数(上)

“追光的人&#xff0c;终会光芒万丈&#xff01;” 今天我们一起来学习一下函数的相关知识点。 函数 1.函数是什么&#xff1f;2.C语言中函数的分类2.1库函数2.2自定义函数 3.函数的参数3.1实际参数&#xff08;实参&#xff09;3.2形式参数&#xff08;形参&#xff09; 4.函…

网络层中一些零碎且易忘的知识点

异构网络&#xff1a;指传输介质、数据编码方式、链路控制协议以及数据单元格式和转发机制不同&#xff0c;异构即物理层和数据链路层均不同RIP、OSPF、BGP分别是哪一层的协议&#xff1a; -RIPOSPFBGP所属层次应用层网络层应用层封装在什么协议中UDPIPTCP 一个主机可以有多个I…

element时间选择器的默认值

概览&#xff1a;vue使用element组件&#xff0c;需要给时间选择器设置默认值&#xff0c;场景一&#xff1a;默认时间选择器&#xff0c;场景二&#xff1a;时间范围选择器&#xff0c;开始时间和结束时间。 一、默认时间选择器 实现思路&#xff1a; element组件的v-model绑…

ELK + Fliebeat + Kafka日志系统

参考&#xff1a; ELKFilebeatKafka分布式日志管理平台搭建_51CTO博客_elk 搭建 ELK 日志分析系统概述及部署&#xff08;上&#xff09;-阿里云开发者社区 ELK是三个开源软件的缩写&#xff0c;分别表示&#xff1a;Elasticsearch , Logstash, Kibana , 它们都是开源软件。…

【1.1】Java微服务:初识微服务

✅作者简介&#xff1a;大家好&#xff0c;我是 Meteors., 向往着更加简洁高效的代码写法与编程方式&#xff0c;持续分享Java技术内容。 &#x1f34e;个人主页&#xff1a;Meteors.的博客 &#x1f49e;当前专栏&#xff1a; 微服务 ✨特色专栏&#xff1a; 知识分享 &#x…

IntelliJ IDEA 2023.2 主要更新了什么?(纯文本介绍版)

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

Python 进阶(五):os 模块

❤️ 博客主页&#xff1a;水滴技术 &#x1f338; 订阅专栏&#xff1a;Python 入门核心技术 &#x1f680; 支持水滴&#xff1a;点赞&#x1f44d; 收藏⭐ 留言&#x1f4ac; 文章目录 1. 文件和目录的基本操作1.1 获取当前工作目录1.2 更改当前工作目录1.3 获取目录下所有…

【Linux进程篇】冯诺依曼体系

【Linux进程篇】冯诺依曼体系 目录 【Linux进程篇】冯诺依曼体系冯诺依曼体系结构&#xff08;1/3内容 &#xff09;操作系统(Operator System)概念设计OS的目的定位如何理解“管理”总结系统调用和库函数的概念 作者&#xff1a;爱写代码的刚子 时间&#xff1a;2023.7.28 前言…

EMO:重新思考高效的基于注意力的移动块模型

文章目录 摘要1、介绍2、方法论:归纳法和演绎法2.1、通用效率模型标准2.2、元移动块2.3、微设计:倒置残余移动块2.4、面向密集预测的EMO宏观设计 3、实验3.1、图像分类3.2、下游任务3.3、额外的消融和解释分析 4、相关工作5、结束语及未来工作 摘要 论文链接&#xff1a;https…

【ray】 分布式计算的搭建和调用以及项目实践

目录 0 RAY相关资料1 ray的简要介绍2 ray的搭建3 ray的调用4 实践代码分析4.1 ray的配置4.2 代码中使用ray 0 RAY相关资料 ray 官网&#xff1a;https://docs.ray.io/en/latest/index.html Ray分布式计算框架详解&#xff1a;https://zhuanlan.zhihu.com/p/460600694 b站视频…

OpenLayers入门,地图全图显示经纬度网格标记线

专栏目录: OpenLayers入门教程汇总目录 前言 使用OpenLayers实现地图全图显示经纬度网格标记线。方便查看可视区域所处的经纬度区间。 二、依赖和使用 "ol": "^6.15.1"使用npm安装依赖npm install ol@6.15.1使用Yarn安装依赖yarn add olvue中如何使用…

MODBUS-TCP转Ethernet IP 网关连接空压机 配置案例

本案例是工业现场应用捷米特JM-EIP-TCP的Ethernet/IP转Modbus-TCP网关连接欧姆龙PLC与空压机的配置案例。使用设备&#xff1a;欧姆龙PLC&#xff0c;捷米特JM-EIP-TCP网关&#xff0c; ETHERNET/IP 的电气连接 ETHERNET/IP 采用标准的 T568B 接法&#xff0c;支持直连和交叉接…

github Recv failure: Connection reset by peer

Recv failure: Connection reset by peer 背景处理ping一下github网页访问一下github项目git配置git ssh配置再次尝试拉取 疑惑点待研究参考 背景 晚上敲着代码准备提交&#xff0c;执行git pull&#xff0c;报错Recv failure: Connection reset by peer。看着这报错我陷入了沉…

Spring Cloud Eureka 服务注册和服务发现超详细(附加--源码实现案例--及实现逻辑图)

文章目录 EurekaEureka组件可以实现哪些功能什么是CAP原则&#xff1f;服务注册代码实战搭建注册中心服务A搭建服务B搭建启动服务启动注册中心启动服务A启动服务B 结束语 Eureka 这篇文章先讲述一下Eureka的应用场景、代码实现案例&#xff0c;多个服务模块注册到Euraka中&…

QT多线程的示例

想象现在有一个场景&#xff0c;一共有三个线程线程A需要产生1000以内的随机数&#xff0c;线程B需要对这些随机数进行冒泡排序&#xff0c;线程C需要对这些随机数进行快速排序&#xff0c;主线程用来显示线程A的随机数&#xff0c;并且显示线程A和线程B的处理结果&#xff0c;…

机器学习 | Python实现NARX模型预测控制

机器学习 | Python实现NARX模型预测控制 目录 机器学习 | Python实现NARX模型预测控制效果一览基本介绍研究内容程序设计参考资料效果一览 基本介绍 机器学习 | Python实现NARX模型预测控制 研究内容 贝叶斯黑盒模型预测控制,基于具有外源输入的非线性自回归模型的预期自由能最…