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

java实现多级菜单

/**
 * 查询所有菜单
 */
public BaseWebResponse<Object> getAllMenus() {

    List<SystemMenuInfo> systemMenuInfoList = menuInfoMapper.getAllMenus();

    List<SystemMenuInfo> menuTree = buildMenuTree(systemMenuInfoList);
    return setResultSuccess("信息查询成功", menuTree);
}

/**
 * 构建菜单树
 */
private List<SystemMenuInfo> buildMenuTree(List<SystemMenuInfo> allMenus) {
    //用于存放根菜单
    List<SystemMenuInfo> rootMenus = new ArrayList<>();
    Map<Integer, List<SystemMenuInfo>> menuMap = new HashMap<>();

    // 将菜单按照父菜单ID分组,放在menuMap中
    for (SystemMenuInfo menu : allMenus) {
        int parentId = menu.getPid() != null ? menu.getPid() : 0;
        if (!menuMap.containsKey(parentId)) {
            menuMap.put(parentId, new ArrayList<>());
        }
        menuMap.get(parentId).add(menu);
    }

    // 从根菜单开始,构建菜单树
    rootMenus.addAll(menuMap.getOrDefault(0, new ArrayList<>()));
    for (SystemMenuInfo rootMenu : rootMenus) {
        buildSubMenuTree(rootMenu, menuMap);
    }

    return rootMenus;
}

/**
 * 根据父菜单节点逐级构建子树,按顺序排列
 */
private void buildSubMenuTree(SystemMenuInfo parentMenu, Map<Integer, List<SystemMenuInfo>> menuMap) {
    //获取根菜单的子节点列表
    List<SystemMenuInfo> children = menuMap.getOrDefault(parentMenu.getMenuId(), new ArrayList<>());
    Collections.sort(children);
    parentMenu.setChildren(children);
    for (SystemMenuInfo childMenu : children) {
        buildSubMenuTree(childMenu, menuMap);
    }
}

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

相关文章:

  • HTML中元素和标签有什么区别?
  • android 如何分析应用的内存(十三)——perfetto
  • Chapter20 音乐
  • 详解Nodejs中的模块化
  • debug思路 - maven构建报错
  • DSP学习笔记
  • Java中的Apache Commons Math是什么?
  • 规划路线(微信小程序、H5)
  • 【CSS】视频文字特效
  • linux-MySQL的数据目录
  • AI绘图实战(十二):让AI设计LOGO/图标/标识 | Stable Diffusion成为设计师生产力工具
  • 机器视觉系统设计:基础知识
  • C# Blazor 学习笔记(11):路由跳转和信息传值
  • Centos 7 安装 Python 时 zlib not available 错误解决
  • python sqllite基本操作
  • 记录--基于css3写出的流光登录(注释超详细!)
  • 【测试设计】性能测试工具选择:wrk?jmeter?locust?还是LR?
  • 为什么升级JDK 11后堆外内存使用增长了?
  • Vue自定义防重复点击指令(v-repeatClick)
  • 高频高速板行业现状及市场前景
  • 【练手】自定义注解+AOP
  • QComboBox添加样式后,编辑栏背景一直白色问题解决方法。
  • vue动态绑定多个class以及带上三元运算或其他条件
  • Rpc原理
  • yapi容器化docker部署以及mongodb容器的持久化挂载异常问题
  • MyBatis-XML映射文件
  • C++类和对象入门(下)
  • 安卓:实现复制粘贴功能
  • jenkins pipeline项目
  • 机器学习笔记 - YOLO-NAS 最高效的目标检测算法之一