java实现菜单树的示例代码

 更新时间:2023年12月27日 16:39:45   作者:LonesomeRoad  
这篇文章主要为大家详细介绍了java实现菜单树的相关知识,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下

使用ruoyi的菜单表结构

实体类增加注解

实体类增加子菜单数组

    @TableField(exist = false)
    private List<Menu> children;

实现逻辑

    public List<Menu> selectMenuList(String menuName, Long userId) {
        //树结构
        List<Menu> menuList = null;
        LoginUser principal = (LoginUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
        if(checkIsAdmin.checkIsAdmin(principal.getUser().getId())){
            LambdaQueryWrapper<Menu> queryWrapper = new LambdaQueryWrapper<>();
            queryWrapper.like(StringUtils.isNotBlank(menuName),Menu::getMenuName, menuName);
            menuList = this.menuMapper.selectList(queryWrapper);
        }else{
            menuList = this.menuMapper.selectMenuListByUserId(menuName,userId);
        }
        List<Menu> finalMenuList = menuList;
        return menuList.stream()
                .filter(item -> Objects.equals(item.getParentId().toString(),"0"))
                .map(item -> item.setChildren(getChild(item.getId(), finalMenuList)))
                .sorted(Comparator.comparingInt(menu -> (menu.getShowSort() == null ? 0 : menu.getShowSort())))
                .collect(Collectors.toList());
    }
 
    private List<Menu> getChild(Long id, List<Menu> menuList){
        return menuList.stream()
                .filter(item -> Objects.equals(item.getParentId().toString(), id.toString()))
                .map(item -> item.setChildren(getChild(item.getId(), menuList)))
                .sorted(Comparator.comparingInt(menu -> (menu.getShowSort() == null ? 0 : menu.getShowSort())))
                .collect(Collectors.toList());
    }

结果展示

{
  "code": 200,
  "msg": "操作成功",
  "data": [
    {
      "id": "1731872513806221314",
      "menuName": "系统管理",
      "parentId": 0,
      "showSort": 1,
      "url": null,
      "reqPath": null,
      "isCache": "1",
      "target": null,
      "menuType": "M",
      "visible": "0",
      "isRefresh": null,
      "perms": null,
      "icon": "ep:add-location",
      "createTime": "2023-12-05 11:05:58",
      "updateTime": null,
      "operater": "qinyi",
      "componentName": null,
      "children": [
        {
          "id": "1731936951137632258",
          "menuName": "角色管理",
          "parentId": "1731872513806221314",
          "showSort": 1,
          "url": null,
          "reqPath": null,
          "isCache": "1",
          "target": null,
          "menuType": "C",
          "visible": "0",
          "isRefresh": null,
          "perms": null,
          "icon": "ep:alarm-clock",
          "createTime": "2023-12-05 15:22:01",
          "updateTime": null,
          "operater": "qinyi",
          "componentName": null,
          "children": []
        },
        {
          "id": "1734381007881097218",
          "menuName": "角色管理222",
          "parentId": "1731872513806221314",
          "showSort": 2,
          "url": null,
          "reqPath": null,
          "isCache": "1",
          "target": null,
          "menuType": "C",
          "visible": "0",
          "isRefresh": null,
          "perms": null,
          "icon": "ep:apple",
          "createTime": "2023-12-12 09:13:50",
          "updateTime": null,
          "operater": "qinyi",
          "componentName": null,
          "children": [
            {
              "id": "1734768479693627394",
              "menuName": "新增按钮",
              "parentId": "1734381007881097218",
              "showSort": 1,
              "url": "",
              "reqPath": "",
              "isCache": "1",
              "target": null,
              "menuType": "F",
              "visible": "0",
              "isRefresh": null,
              "perms": null,
              "icon": "",
              "createTime": "2023-12-13 10:53:30",
              "updateTime": null,
              "operater": "qinyi",
              "componentName": null,
              "children": []
            }
          ]
        }
      ]
    },
    {
      "id": "1732203279467573249",
      "menuName": "菜单管理哦",
      "parentId": 0,
      "showSort": 2,
      "url": null,
      "reqPath": null,
      "isCache": "1",
      "target": null,
      "menuType": "C",
      "visible": "0",
      "isRefresh": null,
      "perms": null,
      "icon": "ep:camera-filled",
      "createTime": "2023-12-06 09:00:19",
      "updateTime": null,
      "operater": "qinyi",
      "componentName": null,
      "children": []
    }
  ]
}

这样写有点问题,就是模糊查询的时候,查不到数据,也就是过滤数据的时候子节点加载不到完整的树结构,做以下改动

    /**
     * 在树结构上做模糊查询(剪枝操作)
     */
    private List<Menu> getMenuByName(List<Menu> menuList,String selectName){
        Iterator<Menu> iterator = menuList.iterator();
        while(iterator.hasNext()){
            Menu menu = iterator.next();
            if(!menu.getMenuName().contains(selectName)){
                List<Menu> childrenList = menu.getChildren();
                if(!CollectionUtils.isEmpty(childrenList)){
                    getMenuByName(childrenList, selectName);
                }
                if(CollectionUtils.isEmpty(childrenList)){
                    iterator.remove();
                }
            }
        }
        return menuList;
    }

以上就是java实现菜单树的示例代码的详细内容,更多关于java菜单树的资料请关注脚本之家其它相关文章!

相关文章

  • SpringBoot工程启动顺序与自定义监听超详细讲解

    SpringBoot工程启动顺序与自定义监听超详细讲解

    这篇文章主要介绍了SpringBoot工程启动顺序与自定义监听,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-11-11
  • java map的key值转驼峰命名的方法

    java map的key值转驼峰命名的方法

    这篇文章主要介绍了java map的key值转驼峰,通过实例代码介绍了Map把“_”形式的key转化为驼峰形式,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2023-12-12
  • java 如何读取properties文件

    java 如何读取properties文件

    这篇文章主要介绍了java 如何读取properties文件,帮助大家更好的理解和使用Java,感兴趣的朋友可以了解下
    2020-11-11
  • Java实现简单的聊天室功能

    Java实现简单的聊天室功能

    这篇文章主要为大家详细介绍了Java实现简单的聊天室功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • Spring中的SpringApplicationRunListener详细解析

    Spring中的SpringApplicationRunListener详细解析

    这篇文章主要介绍了Spring中的SpringApplicationRunListener详细解析,SpringApplicationRunListener是一个监听SpringApplication中run方法的接口,在项目启动过程的各个阶段进行事件的发布,需要的朋友可以参考下
    2023-11-11
  • JavaWeb实现打印功能

    JavaWeb实现打印功能

    这篇文章主要介绍了JavaWeb实现打印功能的相关资料,非常不错具有参考借鉴价值,需要的朋友可以参考下
    2016-05-05
  • Springmvc请求参数类型转换器及原生api代码实例

    Springmvc请求参数类型转换器及原生api代码实例

    这篇文章主要介绍了Springmvc请求参数类型转换器及原生api代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • 详解基于Mybatis-plus多租户实现方案

    详解基于Mybatis-plus多租户实现方案

    这篇文章主要介绍了详解基于Mybatis-plus多租户实现方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • Java中的CAS和自旋锁详解

    Java中的CAS和自旋锁详解

    这篇文章主要介绍了Java中的CAS和自旋锁详解,CAS算法(Compare And Swap),即比较并替换,是一种实现并发编程时常用到的算法,Java并发包中的很多类都使用了CAS算法,需要的朋友可以参考下
    2023-10-10
  • 浅谈Java线程并发知识点

    浅谈Java线程并发知识点

    本文主要对Java线程并发的知识点进行简单介绍。具有很好的参考价值,需要的朋友一起来看下吧
    2016-12-12

最新评论