栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java/web/springboot中构建菜单权限的完整路径

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java/web/springboot中构建菜单权限的完整路径

前言

首先这不是一个常规的单单生成菜单权限树,网上找遍了,也没有我这种需求。大多数都是在构建一颗权限树,按照id进行分级。然而,这次的需求,不是需要id树这么简单。

需求问题

本次需求是,构建权限菜单的完整路径,并非id组成,而是名称组成。

大概需要得到的效果如下:

说明:

  • sys_permission 是一张菜单权限表,其他字段可以不管,有如图3个字段即可。
  • permission_id 是某个菜单的主键id。
  • parent_Id 是该菜单对应的上级权限id,即父级菜单的id。
  • 上下级菜单,通过parent_Id 进行关联。
  • 默认顶级权限是parent_Id = -1 。

我们需要,构建的是 各个父级路径+ 本级路径。如icon选择中所示。

由于,存储的时候,各级菜单都仅仅是按照一个parent_Id 进行上下级关联,因此,要构建上下级完整路径,就比较麻烦了。

实现方案

实现原理,采用java的递归算法思想。

//全局Map存放最终结果,也可以考虑redis替代
private Map permissionsPathMap= new HashMap();


    private Map queryChildPermissionsPath(Long parentId){
        LambdaQueryWrapper wrapper = new LambdaQueryWrapper()
                .select(SysPermission::getPermissionId, SysPermission::getPermissionName,SysPermission::getParentId)
                .eq(SysPermission::getParentId,parentId)
                .orderByAsc(SysPermission::getParentId);
        List treeList = sysPermissionMapper.selectList(wrapper);
        //如果没有查询到数据,证明是最后一级菜单,有数据则表示拥有子节点
        if (CollectionUtils.isNotEmpty(treeList)) {
            for (SysPermission entity : treeList) {
                // 放入顶级菜单
                if (ROOT_ID == entity.getParentId()){
                    permissionsPathMap.put(entity.getPermissionId(),entity.getPermissionName());
                }
            }
            System.out.println("顶级菜单:"+permissionsPathMap);
            for (SysPermission entity : treeList) {
                String parentName = permissionsPathMap.get(entity.getParentId());
                String fullpath = "";
                if (StringUtils.isBlank(parentName)) {
                    fullpath = entity.getPermissionName();
                }else {
                    fullpath = parentName+"/"+entity.getPermissionName();
                }
                // 26-用户中心/部门管理
                permissionsPathMap.put(entity.getPermissionId(),fullpath);
                queryChildPermissionsPath(entity.getPermissionId());
            }
        }
        System.out.println("递归后的map"+permissionsPathMap);
        return permissionsPathMap;
    }

在Impl或者其他地方,发起调用,先构建顶级 ROOT_ID = -1 :

Map permissionsPathMap = queryChildPermissionsPath(ROOT_ID);

当你的全局Map没有人用了,系统才会回收,假如map还有人用,里面的对象如果不清除,都会被map持有,永远得不到回收,所以在map中数据不需要时,记得及时clear。

if (MapUtils.isNotEmpty(permissionsPathMap)) {
    permissionsPathMap.clear();
}

放在合适的地方即可。

控制台输出:

递归后的map{24=用户中心, 1049=用户中心/租户管理, 26=用户中心/部门管理, 1051=用户中心/客户端管理, 1053=用户中心/自定义表字段, 1055=用户中心/审计策略, 3123=用户中心/角色互斥设置, 3125=用户中心/角色互斥设置/角色互斥新增, 3126=工作票管理, 56=用户中心/部门管理/新增/新增Api, 3128=工作票管理/电气第一种工作票, 3130=工作票管理/电气第二种工作票, 59=用户中心/部门管理/修改/修改Api, 3132=工作流测试, 60=用户中心/部门管理/删除/删除Api, 3134=工作流测试/sss, 63=用户中心/部门管理/查询/查询部门树Api, 3136=工作流测试/ddd, 65=用户中心/部门管理/查询/查询下级部门Api, 3138=用户中心/数据集分类, 68=用户中心/部门管理/修改/根据Id查询部门详情Api, 3140=用户中心/数据集管理, 69=用户中心/用户管理, 3142=用户中心/数据源管理, 2125=用户中心/系统参数设置, 80=用户中心/用户管理/新增/新增用户Api, 81=用户中心/用户管理/修改/修改用户Api, 82=用户中心/用户管理/删除/删除用户Api, 83=用户中心/用户管理/查询/分页查询用户列表Api, 90=用户中心/用户组管理, 3164=app图形工具, 100=用户中心/用户组管理/新增/新增用户组Api, 102=用户中心/用户组管理/修改/修改用户组Api, 104=用户中心/用户组管理/删除/删除用户组Api, 3176=图形工具/图形管理, 105=用户中心/用户组管理/查询/分页查询用户组列表Api, 3178=图形工具/图形管理/版本管理, 108=用户中心/角色管理, 3180=图形工具/图形管理/版本管理/增加项目, 109=用户中心/角色管理/新增/新增角色Api, 110=用户中心/角色管理/修改/修改角色Api, 3182=图形工具/图形管理/版本管理/增加项目/api, 111=用户中心/角色管理/删除/删除角色Api, 112=用户中心/角色管理/查询/分页角色列表Api, 3184=图形工具/图形管理/版本管理/增加文件夹, 3186=图形工具/图形管理/版本管理/增加文件, 3188=图形工具/图形管理/版本管理/提交审批, 3190=图形工具/图形管理/版本管理/提交发布, 3192=图形工具/图形管理/版本管理/固化红图, 3194=图形工具/图形管理/版本管理/增加文件夹/api, 123=用户中心/用户管理/分配角色/用户分配角色Api, 3196=图形工具/图形管理/版本管理/增加文件/api, 3198=图形工具/图形管理/版本管理/提交审批/api, 3200=图形工具/图形管理/版本管理/提交发布/api, 130=用户中心/角色管理/分配用户/角色分配用户Api, 3202=图形工具/图形管理/版本管理/固化红图/api, 133=用户中心/角色管理/分配用户/分页查询角色用户列表Api, 134=用户中心/用户管理/分配角色/查询用户角色列表Api, 136=用户中心/用户管理/分配用户组/用户分配用户组Api, 3209=app图形工具/图形管理, 139=用户中心/用户组管理/分配用户/用户组分配用户Api, 3213=app图形工具/未审批图形, 3215=app图形工具/已审批图形, 3217=app图形工具/已送审图形, 3219=app图形工具/已发布流程, 148=用户中心/用户管理/分配用户组/查询用户用户组列表Api, 3229=配网工具, 169=用户中心/权限分类管理, 170=用户中心/权限分类管理/新增/新增权限类型Api, 171=用户中心/权限分类管理/修改/修改权限类型Api, 172=用户中心/权限分类管理/删除/删除权限类型Api, 173=用户中心/权限分类管理/查询/分页查询权限类型Api, 174=用户中心/权限管理, 175=用户中心/权限管理/新增/新增权限Api, 176=用户中心/权限管理/修改/修改权限Api, 177=用户中心/权限管理/删除/删除权限Api, 178=用户中心/权限管理/查询/查询权限树Api, 181=用户中心/权限管理/查询/查询下级权限Api, 183=用户中心/角色管理/分配权限/角色分配权限Api, 184=用户中心/字典管理, 185=用户中心/字典管理/新增/新增数据字典Api, 186=用户中心/字典管理/修改/修改数据字典Api, 187=用户中心/字典管理/删除/删除数据字典Api, 188=用户中心/字典管理/查询/分页查询数据字典Api, 191=用户中心/用户管理/分配字典/用户分配数据字典Api, 192=用户中心/用户管理/分配字典/查询用户数据字典Api, 2779=用户中心/部门管理/新增, 2780=用户中心/部门管理/修改, 2781=用户中心/部门管理/删除, 2782=用户中心/部门管理/查询, 2783=用户中心/用户管理/新增, 2784=用户中心/用户管理/修改, 2785=用户中心/用户管理/删除, 2786=用户中心/用户管理/查询, 2787=用户中心/用户管理/分配用户组, 2788=用户中心/用户管理/分配角色, 2789=用户中心/用户管理/分配字典, 2790=用户中心/用户管理/分配应用, 2791=用户中心/用户管理/采集指纹, 2792=用户中心/用户管理/绑定Ip, 2793=用户中心/用户管理/解锁用户, 2794=用户中心/用户管理/重置密码, 2795=用户中心/用户管理/新增/查询部门树Api, 2796=用户中心/用户管理/查询/查询部门树Api, 2797=用户中心/用户管理/查询/查询自定义字段Api, 2798=用户中心/用户管理/修改/查询部门树Api, 2799=用户中心/用户管理/分配字典/查询字典分类Api, 2800=用户中心/用户管理/分配应用/查询模型应用Api, 2801=用户中心/用户管理/分配应用/用户分配应用Api, 2802=用户中心/用户管理/绑定Ip/用户绑定Ip Api, 2803=用户中心/用户管理/采集指纹/发送指纹操作指令Api, 2804=用户中心/用户管理/删除/发送指纹操作指令Api, 2805=用户中心/用户管理/解锁用户/解锁用户Api, 2807=用户中心/用户组管理/新增, 2808=用户中心/用户组管理/修改, 2809=用户中心/用户组管理/删除, 2810=用户中心/用户组管理/查询, 2811=用户中心/用户组管理/分配用户, 2812=用户中心/用户组管理/分配角色, 2813=用户中心/用户组管理/分配用户/查询部门树Api, 2814=用户中心/用户组管理/分配用户/查询用户组用户Api, 2815=用户中心/用户组管理/分配角色/查询用户组角色Api, 2816=用户中心/用户组管理/分配角色/用户组分配角色Api, 2817=用户中心/角色管理/新增, 2818=用户中心/角色管理/修改, 2819=用户中心/角色管理/删除, 2820=用户中心/角色管理/查询, 2821=用户中心/角色管理/分配用户, 2822=用户中心/角色管理/分配用户组, 2823=用户中心/角色管理/分配权限, 2824=用户中心/角色管理/分配数据权限, 2825=用户中心/角色管理/分配用户/查询部门树Api, 2826=用户中心/角色管理/分配用户组/查询角色用户组Api, 2827=用户中心/角色管理/分配用户组/角色分配用户组Api, 2828=用户中心/角色管理/分配权限/查询角色权限Api, 2829=用户中心/角色管理/分配数据权限/查询数据权限类型Api, 2830=用户中心/权限分类管理/新增, 2831=用户中心/权限分类管理/修改, 2832=用户中心/权限分类管理/删除, 2833=用户中心/权限分类管理/查询, 2834=用户中心/权限管理/新增, 2835=用户中心/权限管理/修改, 2836=用户中心/权限管理/删除, 2837=用户中心/权限管理/新增下级, 278=用户中心/用户管理/重置密码/重置密码Api, 2838=用户中心/权限管理/查询, 2839=用户中心/权限管理/新增/查询权限类型Api, 2840=用户中心/权限管理/新增/查询权限树Api, 2841=用户中心/权限管理/新增下级/新增权限Api, 2842=用户中心/权限管理/新增下级/查询权限类型Api, 2843=用户中心/权限管理/新增下级/查询权限树Api, 2844=用户中心/权限管理/修改/查询权限类型Api, 2845=用户中心/权限管理/修改/查询权限树Api, 2846=用户中心/审计策略/新增, 2847=用户中心/审计策略/修改, 2848=用户中心/审计策略/查询, 2849=用户中心/审计策略/删除, 2850=用户中心/审计策略/新增/增加审计策略Api, 2851=用户中心/审计策略/修改/更新审计策略Api, 2852=用户中心/审计策略/查询/查询审计策略Api, 2853=用户中心/审计策略/删除/删除审计策略Api, 2854=用户中心/审计日志/查询, 2855=用户中心/审计日志/导入日志, 2856=用户中心/审计日志/导出日志, 2857=用户中心/审计日志/日志备份列表, 2858=用户中心/审计日志/下载备份, 2859=用户中心/审计日志/导入日志/导入日志Api, 2860=用户中心/审计日志/导出日志/导出日志Api, 2861=用户中心/审计日志/日志备份列表/查询日志备份列表Api, 2862=用户中心/审计日志/下载备份/下载日志备份Api, 2863=用户中心/字典管理/新增, 2864=用户中心/字典管理/修改, 2865=用户中心/字典管理/删除, 2866=用户中心/字典管理/查询, 2867=用户中心/客户端管理/新增, 2868=用户中心/客户端管理/修改, 2869=用户中心/客户端管理/删除, 2870=用户中心/客户端管理/分配权限, 2871=用户中心/客户端管理/新增/新增客户端Api, 1847=用户中心/厂区管理, 2872=用户中心/客户端管理/修改/修改客户端Api, 2873=用户中心/客户端管理/删除/删除客户端Api, 2874=用户中心/客户端管理/查询, 2875=用户中心/客户端管理/查询/查询客户端Api, 2876=用户中心/客户端管理/分配权限/查询客户端权限Api, 2877=用户中心/客户端管理/分配权限/客户端分配权限Api, 2878=用户中心/部门管理/新增下级, 2367=系统首页, 2879=用户中心/部门管理/新增下级/新增Api, 2880=用户中心/自定义表字段/新增, 2369=模型工具, 2881=用户中心/自定义表字段/修改, 2882=用户中心/自定义表字段/删除, 2371=图形工具, 2883=用户中心/自定义表字段/查询, 2373=流程工具, 2889=用户中心/自定义表字段/查询/查询自定义表Api, 2890=用户中心/自定义表字段/新增/增加自定义表Api, 2891=用户中心/自定义表字段/修改/更新自定义表Api, 2892=用户中心/自定义表字段/删除/删除自定义表Api, 2897=用户中心/应用管理/新增, 2898=用户中心/应用管理/修改, 2899=用户中心/应用管理/删除, 2900=用户中心/应用管理/查询, 2901=用户中心/租户管理/新增, 2902=用户中心/租户管理/修改, 2903=用户中心/租户管理/删除, 2904=用户中心/租户管理/查询, 2905=用户中心/租户管理/新增/新增租户Api, 2906=用户中心/租户管理/删除/删除租户Api, 2907=用户中心/租户管理/修改/更新租户Api, 2908=用户中心/租户管理/查询/查询租户Api, 2909=用户中心/系统参数设置/保存, 2910=用户中心/系统参数设置/保存/保存Api, 2911=用户中心/厂区管理/新增, 2923=用户中心/审核设置, 2925=用户中心/系统审核, 2927=用户中心/审核设置/新增, 2929=用户中心/系统审核/新增, 990=用户中心/审计日志, 992=用户中心/审计日志/查询/审计日志查询Api, 994=用户中心/角色管理/分配数据权限/查询数据权限树Api, 996=用户中心/角色管理/分配数据权限/角色分配数据权限Api, 998=用户中心/应用管理, 1000=用户中心/应用管理/新增/新增应用Api, 1001=用户中心/应用管理/修改/修改应用Api, 1003=用户中心/应用管理/删除/删除应用Api, 1005=用户中心/应用管理/查询/查询应用Api, 1010=用户中心/客户端管理/开发者权限管理, 1012=用户中心/客户端管理/开发者权限管理/获取AccessTokenApi, 1013=用户中心/客户端管理/开发者权限管理/刷新AccessTokenApi, 1015=用户中心/客户端管理/开发者权限管理/根据AccessToken获取应用权限Api, 1017=用户中心/客户端管理/开发者权限管理/根据AccessToken校验URL是否有权限访问Api}

组装后的完整路径图,permission_id = 本菜单的完整父子级路径

挑选最深一层来说明:

可以看见 【1017=用户中心/客户端管理/开发者权限管理/根据AccessToken校验URL是否有权限访问Api】这一句。

表示:

  • 当前菜单主键为 [permission_id =1017]。
  • 当前菜单名称是 [根据AccessToken校验URL是否有权限访问Api]。
  • 当前菜单的父级分别是 [用户中心/客户端管理/开发者权限管理]。

验证结果:

SELECT * FROM sys_permission where tenant_id = 2 and valid_flag = 1 and permission_id = 1017;

查询结果:

路径组装正确!

这样就得到了,权限各级菜单中,主键id和其完整的父子级路径。便于后续操作。


再见~

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/601548.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号