当前位置: 首页 > 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);
    }
}

相关文章:

java实现多级菜单

/** * 查询所有菜单 */ public BaseWebResponse<Object> getAllMenus() { List<SystemMenuInfo> systemMenuInfoList menuInfoMapper.getAllMenus(); List<SystemMenuInfo> menuTree buildMenuTree(systemMenuInfoList); return setResultSuccess(&q…...

HTML中元素和标签有什么区别?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 标签&#xff08;Tag&#xff09;⭐元素&#xff08;Element&#xff09;⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&a…...

android 如何分析应用的内存(十三)——perfetto

android 如何分析应用的内存&#xff08;十三&#xff09; 本篇文章是native内存的最后一篇文章——perfetto perfetto简介 从2018年始&#xff0c;android开发者峰会正式推出perfetto工具。从此perfetto成为安卓最重要的工具之一。在2018年以前&#xff0c;android使用syst…...

Chapter20 音乐

目录 音乐 琴键 哆来咪 振动与调式 利萨如曲线 和声与音调与和弦 音乐 在音乐理论中&#xff0c;一个八音度&#xff08;octave&#xff09;是一个频率范围相差二倍的区间。在大多数西洋乐器中&#xff0c;一个八音度被分为12个频率比相等的半音程&#xff08;semitone&a…...

详解Nodejs中的模块化

Nodejs是一个基于Chrome V8引擎的JavaScript运行时环境&#xff0c;它允许开发者使用JavaScript在服务器端运行代码。在Nodejs中&#xff0c;模块化是一种组织和重用代码的重要方式。模块化允许我们将代码拆分成小块&#xff0c;使得代码结构更清晰、易于维护&#xff0c;并促进…...

debug思路 - maven构建报错

问题&#xff1a;maven面板中&#xff0c;进行compile、deploy操作时报错。 debug步骤&#xff1a; 1、鼠标右键选择“修改运行配置”。在运行命令中添加参数-X&#xff0c;用于产生执行调试输出。例如&#xff1a;compile -f -X pom.xml。 2、再次进行compile、deploy操作&…...

DSP学习笔记

间接寻址&#xff08;通过放在辅助寄存器里面&#xff0c;可以对地址包括很多操作&#xff0c;1&#xff0c;-1&#xff0c;/-平移量&#xff0c;辅助寄存器内容的修改是在ARAU0和ARAU1中完成的。分为单操作数和双操作数&#xff0c;有很多模式在ARAU。单操作数间接寻址&#x…...

Java中的Apache Commons Math是什么?

Java中的Apache Commons Math是一个开源的数学库&#xff0c;它提供了许多常用的数学函数和算法&#xff0c;例如线性代数、微积分、统计、插值、拟合等。这个库对于需要处理大量数据的开发者来说非常有用&#xff0c;因为它可以大大简化代码并提高效率。 让我们从新手的角度来…...

规划路线(微信小程序、H5)

//地图getLocationDian(e1, e2) {console.log(e1, e2);let self this;self.xx1 [];self.xx2 [];self.points [];// self.markers[]console.log(self.markers, >marks);// self.$jsonp(url, data).then(re > {// var coors re.result.routes[0].polyline;// for (v…...

【CSS】视频文字特效

效果展示 index.html <!DOCTYPE html> <html><head><title> Document </title><link type"text/css" rel"styleSheet" href"index.css" /></head><body><div class"container"&g…...

linux-MySQL的数据目录

总结&#xff1a; window中的my.ini linux 中 /etc/my.cnfwindow中的D:\soft\mysql-5.7.35-winx64\data linux 中 /var/lib/mysql 1.查找与mysql有关的目录 find / -name mysql [rootVM-4-6-centos etc]# find / -name mysql /opt/mysql /etc/selinux/targeted/tmp/modul…...

AI绘图实战(十二):让AI设计LOGO/图标/标识 | Stable Diffusion成为设计师生产力工具

S&#xff1a;AI能取代设计师么&#xff1f; I &#xff1a;至少在设计行业&#xff0c;目前AI扮演的主要角色还是超级工具&#xff0c;要顶替&#xff1f;除非甲方对设计效果无所畏惧~~ 预先学习&#xff1a; 安装及其问题解决参考&#xff1a;《Windows安装Stable Diffusion …...

机器视觉系统设计:基础知识

机器视觉系统的设计 机器视觉系统集成是将各种不同的组件和子系统组合在一起并使它们充当单个统一系统的过程。 视觉系统集成包括光源&#xff0c;镜头&#xff0c;相机&#xff0c;相机接口和图像处理软件等等。您可能想知道如何设计和实现一个完整&#xff0c;成功的机器视…...

C# Blazor 学习笔记(11):路由跳转和信息传值

文章目录 前言路由跳转测试用例路由传参/路由约束想法更新&#xff1a;2023年8月4日 前言 Blazor对路由跳转进行了封装。 ASP.NET Core Blazor 路由和导航 NavigationManager 类 本文的主要内容就是全局的跳转 路由跳转 路由跳转就要用到NavigationManager 类。 其实最常用…...

Centos 7 安装 Python 时 zlib not available 错误解决

Centos 7 安装 Python 时 zlib not available 错误解决 报错信息&#xff0c; zipimport.ZipImportError: cant decompress data; zlib not available解决方法&#xff0c; sudo yum install -y zlib zlib-devel完结&#xff01;...

python sqllite基本操作

以下是一些基本的SQLite3操作&#xff1a; 连接到数据库&#xff1a;使用sqlite3.connect()函数连接到数据库&#xff0c;返回一个Connection对象&#xff0c;我们就是通过这个对象与数据库进行交互。例如&#xff1a; import sqlite3 conn sqlite3.connect(example.db)创建…...

记录--基于css3写出的流光登录(注释超详细!)

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 完整效果 对基本的表单样式进行设置 这里设置了基本的表单样式&#xff0c;外层用了div进行包裹&#xff0c;重点是运用了两个i元素在后期通过css样式勾画出一条线没在聚焦文本框的时候线会过度成一个…...

【测试设计】性能测试工具选择:wrk?jmeter?locust?还是LR?

目录 前言 wrk 优点 缺点 jmeter 优点 缺点 locust 优点 缺点 总结 资料获取方法 前言 当你想做性能测试的时候&#xff0c;你会选择什么样的测试工具呢&#xff1f;是会选择wrk&#xff1f;jmeter&#xff1f;locust&#xff1f;还是loadrunner呢&#xff1f; 今…...

为什么升级JDK 11后堆外内存使用增长了?

文章首发地址 JDK 11堆外使用增长的原因 JDK 11堆外使用增长的原因可能有以下几个&#xff1a; G1垃圾回收器的默认设置更改&#xff1a; JDK 11中的G1垃圾回收器默认开启了堆外内存分配&#xff0c;以减少Full GC时的STW时间。因此&#xff0c;如果应用程序使用了G1垃圾回收…...

Vue自定义防重复点击指令(v-repeatClick)

&#xff01;&#xff01;&#xff01;Vue防抖节流方法&#xff1a;VUE使用节流和防抖_vue防抖节流_停留的章小鱼的博客-CSDN博客 新建js文件directive.js: // directive.js // 防重复点击(指令实现) //使用&#xff1a; 在需要的按钮中加 v-repeatClick 指令即可 <el-but…...

SecGPT-14B入门必看:安全研究员如何定制system prompt提升漏洞分析深度

SecGPT-14B入门必看&#xff1a;安全研究员如何定制system prompt提升漏洞分析深度 作为一名在安全领域摸爬滚打多年的老兵&#xff0c;我深知漏洞分析工作的痛点&#xff1a;面对海量的日志、复杂的攻击链和模糊的威胁情报&#xff0c;如何快速、准确地定位问题核心&#xff…...

Go 内存逃逸与逃逸分析

Go 内存逃逸与逃逸分析&#xff1a;高效内存管理的关键 在Go语言中&#xff0c;内存管理是性能优化的核心之一&#xff0c;而内存逃逸与逃逸分析则是理解其底层机制的重要概念。简单来说&#xff0c;内存逃逸是指本应在栈上分配的变量&#xff0c;由于某些原因被分配到了堆上&…...

OpenClaw技能开发入门:为千问3.5-35B-A3B-FP8定制多模态处理模块

OpenClaw技能开发入门&#xff1a;为千问3.5-35B-A3B-FP8定制多模态处理模块 1. 为什么需要自定义OpenClaw技能&#xff1f; 去年夏天&#xff0c;我负责一个数据分析项目时&#xff0c;每天要手动从上百张图表中提取关键数据点。当我发现OpenClaw可以通过技能扩展实现自动化…...

游戏音频格式解密工具acbDecrypter:打破加密壁垒的专业解决方案

游戏音频格式解密工具acbDecrypter&#xff1a;打破加密壁垒的专业解决方案 【免费下载链接】acbDecrypter 项目地址: https://gitcode.com/gh_mirrors/ac/acbDecrypter 在游戏开发与逆向工程领域&#xff0c;加密音频文件常常成为技术探索的障碍。acbDecrypter作为一款…...

NVIDIA Profile Inspector完整指南:释放显卡隐藏性能的终极教程

NVIDIA Profile Inspector完整指南&#xff1a;释放显卡隐藏性能的终极教程 【免费下载链接】nvidiaProfileInspector 项目地址: https://gitcode.com/gh_mirrors/nv/nvidiaProfileInspector 如果你正在寻找一款能够深度挖掘NVIDIA显卡潜能的神器&#xff0c;那么NVIDI…...

30、DOM常见的操作有哪些?

这个问题在前端面试里非常常见。 如果你只回答“增删改查”&#xff0c;会显得太浅&#xff1b;如果能按模块、有条理地讲清楚&#xff0c;面试官会觉得你基础扎实、实践经验也不错。一、DOM 常见操作可以分为哪些类&#xff1f;一般可以从这几个方面回答&#xff1a;查找节点创…...

基于Qt框架的桌面应用开发:集成nli-distilroberta-base实现本地文本分析工具

基于Qt框架的桌面应用开发&#xff1a;集成nli-distilroberta-base实现本地文本分析工具 1. 引言&#xff1a;当桌面应用遇上NLP模型 最近在开发一个跨平台的文本分析工具时&#xff0c;遇到了一个有趣的需求&#xff1a;如何让传统桌面应用具备自然语言理解能力&#xff1f;…...

跨平台兼容秘诀:OpenClaw在Linux对接百川2-13B-4bits模型全记录

跨平台兼容秘诀&#xff1a;OpenClaw在Linux对接百川2-13B-4bits模型全记录 1. 为什么选择Linux环境部署OpenClaw 去年夏天&#xff0c;当我第一次尝试在Ubuntu服务器上部署OpenClaw时&#xff0c;完全没料到这会成为我最折腾也最有成就感的开源项目实践。作为长期使用macOS的…...

基于ip-iq变换的谐波检测算法,并联型APF/有源电力滤波器/谐波电流检测 matlab/

基于ip-iq变换的谐波检测算法&#xff0c;并联型APF/有源电力滤波器/谐波电流检测 matlab/ simulink仿真学习模型&#xff0c;其他检测方法也做了&#xff0c;有参考文献&#xff0c;适合自学。车间里变频器嗡嗡作响&#xff0c;流水线上的机械臂突然抽搐了两下。老师傅老张叼着…...

GLM-OCR辅助Anaconda环境下的数据分析:自动识别图表中的数据标签

GLM-OCR辅助Anaconda环境下的数据分析&#xff1a;自动识别图表中的数据标签 你是不是也遇到过这种情况&#xff1f;从一份PDF报告或者一篇学术论文里&#xff0c;看到一张特别有价值的图表&#xff0c;上面有你想分析的数据趋势。但问题是&#xff0c;这些数据都“锁”在图片…...