java实现多级菜单

这篇具有很好参考价值的文章主要介绍了java实现多级菜单。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

/**
 * 查询所有菜单
 * @return
 */
@Override
public BaseWebResponse<Object> getAllMenus() {
    List<SystemMenuInfo> systemMenuInfoList = menuInfoMapper.getAllMenus();

    List<SystemMenuInfo> menuTree = buildMenuTree(systemMenuInfoList);
    System.out.println("menuTree:   "+menuTree);
    return setResultSuccess("信息查询成功", menuTree);
}

/**
 * 构建菜单树
 * @param allMenus
 * @return
 */
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<>()));
    System.out.println("rootMenus:   "+rootMenus);
    for (SystemMenuInfo rootMenu : rootMenus) {
        buildSubMenuTree(rootMenu, menuMap);
    }

    return rootMenus;
}

/**
 * 根据父菜单节点逐级构建子树,按顺序排列
 * @param parentMenu
 * @param menuMap
 */
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);
    }
}
/**
 * 找出给定子菜单的所有父菜单并添加到 menuInfoList 中
 * @param subMenu
 * @param menuInfoList
 */
public void addParentMenusToMenuInfoList(SystemMenuInfo subMenu, List<SystemMenuInfo> menuInfoList) {
    if (subMenu == null || subMenu.getPid() == null) {
        return;
    }

    // 获取系统内所有菜单
    List<SystemMenuInfo> allMenus = menuInfoMapper.getAllMenus();
    //存放所有菜单,用于查找父菜单
    Map<Integer, SystemMenuInfo> map = new HashMap<>();

    for(int i=0;i<allMenus.size();i++){
        SystemMenuInfo menu = allMenus.get(i);
        map.put(menu.getMenuId(), menu);
    }

    // 递归查找父菜单并添加到 menuInfoList 中
    addParentMenusRecursively(map, subMenu, menuInfoList);
}

/**
 * 递归地查找父菜单并添加到 menuInfoList中
 */
private void addParentMenusRecursively(Map<Integer, SystemMenuInfo> map, SystemMenuInfo menu, List<SystemMenuInfo> menuInfoList) {
    if (menu.getPid() == 0) {
        // 如果父菜单的 pid 为 0,说明已经到达根菜单,递归结束
        return;
    }

    //根据当前菜单的 pid 查找父菜单
    SystemMenuInfo parentMenu = findParentMenu(map, menu.getPid());

    if (parentMenu != null) {
        // 如果父菜单存在且没有被添加过,就添加到 menuInfoList 中
        if (!menuInfoList.contains(parentMenu)) {
            menuInfoList.add(parentMenu);
        }
        // 继续递归查找当前父菜单的父菜单
        addParentMenusRecursively(map, parentMenu, menuInfoList);
    }
}

/**
 * 根据 pid 查找父菜单
 */
private SystemMenuInfo findParentMenu(Map<Integer, SystemMenuInfo> map, Integer parentId) {
    if(map.containsKey(parentId)) {
        return map.get(parentId);
    }
    return null;
}

文章来源地址https://www.toymoban.com/news/detail-629402.html

到了这里,关于java实现多级菜单的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • el-menu使用递归组件实现多级菜单组件

    vue3+element plus版:点击此处 创建外层菜单 AsideMenu.vue 组件和子菜单项 AsideSubMenu.vue 组件,在 AsideSubMenu 中进行递归操作。 AsideMenu.vue文件内容如下: 判断高亮状态的activeMenu方法中的判断matchPath属性可以让多个路由不同的页面匹配同一个菜单高亮状态,因为菜单高亮状态是根据

    2023年04月12日
    浏览(32)
  • 基于STM32的OLED多级菜单GUI实现(简化版智能手表)

             前言: 本文的 OLED多级菜单UI 为一个 综合性 的STM32 小项目 ,使用 多传感器 与 OLED显示屏 实现 智能终端 的效果。项目中的多级菜单UI使用了较为常见的 结构体索引法 去实现功能与功能之间的来回切换,搭配 DHT11,RTC,LED,KEY 等器件实现高度智能化一体化操作

    2024年02月03日
    浏览(33)
  • OLED多级菜单记录

    作为一个成熟的项目,就必然不会只有一个方面的特点了,这里一般我们可能需要系统来进行调度,然后给一些可视化的UI,当然我前面有讲到HMI串口屏的使用,串口屏确实是非常不错的UI工具,但是一些比较小的项目就用不太到了,因此这里如果是一些低成本的DIY的项目,一

    2024年02月02日
    浏览(34)
  • 基于gin关于多级菜单的处理

    多级菜单是很多业务场景需要的。下面是一种处理方式 下面是model

    2024年02月12日
    浏览(25)
  • 如何查询多级菜单(采用递归的方法)

    应用场景 1.京东 京东的页面就是这么显示的在家用电器下面有电视.空调.洗衣机然后再电视下面又有全面屏电视.教育电视等等 2.我们的后端管理系统 我们后端在页面上显示的很多也是通过层级目录的显示出来。 如何实现 我们这里parent_id为0的为我们的一级菜单 注意我们需要

    2024年02月14日
    浏览(36)
  • STM32_OLED多级菜单

    程序实现 多级菜单显示实则是多个界面的跳转,这个版本更加适合初学者。我使用了两个按键,一个用来选择下一项,另一个用来确定选项。所以我们暂时叫他next键和enter键。先定义一个结构体,结构体里面有四个变量,分别代表当前索引号,next键,enter键和当前执行函数。

    2024年02月11日
    浏览(35)
  • QT使用QTreeWidget控件制作多级折叠菜单

    记录项目中实际用到的多级折叠菜单实现方式:项目代码简化版( 亲测可用 ) 开发环境:VS2015+QT5.9.1 多级菜单(左右共两个图标,中间为文字,左图标为固定静态图标,右图标为折叠/展开动态图标),格式如下: 图片 菜单标题      图片            系统配置       

    2024年02月09日
    浏览(32)
  • 【Python】Selenium多级悬浮菜单定位方法分享

    举例图: 以下菜单选择需逐级鼠标悬浮显示才可选择 注明: 示例代码: 本文均为本人编写,本文如有侵权请告知删除。

    2024年02月12日
    浏览(29)
  • STM32简易多级菜单(数组查表法)

    单片机开发中,有时会用到屏幕来显示内容,当需要逐级显示内容时,就需要使用多级菜单的形式了。 多级菜单的实现,大体分为两种设计思路: 通过双向链表实现 通过数组查表实现 总体思路都是把菜单的各个界面联系起来,可以从上级菜单跳到下级菜单,也可从下级菜单

    2024年02月02日
    浏览(48)
  • STM32+OLED屏多级菜单显示(三)

            前面两章实现了OLED屏幕显示的基本功能,这一章就做一个多级菜单显示功能         单片机选择STM32F103C8T6最小系统板,OLED屏选择0.96寸OLED显示器,除了单片机和OLED屏之外,还需要三个按键(下一位键、确认键和返回键),当然一个按键也可以(单击、双击和长击

    2024年02月03日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包