Java中实现多级菜单的列表(递归排序)

java构建树形菜单(多级菜单) 通过简短的文章,让读者快速掌握树形菜单的原理和制作 阅读详情

一、项目背景

由于最近项目中需要实现展示菜单功能,菜单是需要多级,并且级数不固定。像这种需求,一般就是用递归实现了,可以从第一级一直往下查,一直查询到为空为止。

二、数据库实体类字段

  1. 两个实体类,一个是对应数据库的实体类,VO是返回给前端的实体类
public class RcMenu {
	
	private Integer menuId; //菜单ID
	
	private String menuName;//菜单名称
	
	private Boolean status; //菜单状态
	
	private String level; 	//菜单级别
	
	private Integer parentId; //父类ID
	
	private Integer sortOrder; //排序
	
}
public class RcMenuVO {
	
	private Integer menuId; //菜单ID
	
	private String menuName;//菜单名称
	
	private Boolean status; //菜单状态
	
	private String level; 	//菜单级别
	
	private Integer parentId; //父类ID
	
	private Integer sortOrder; //排序
	
	//存放子菜单目录
	private List<RcMenuVO> children;

}

三、项目中代码实现

	/**
	 * 对象实体类转换
	 * @param rcMenu
	 * @return
	 */
	private RcMenuVO rcMenuTORcMenuVO(RcMenu rcMenu) {
		RcMenuVO rcMenuVO = new RcMenuVO();
		BeanUtils.copyProperties(rcMenu, rcMenuVO);
		return rcMenuVO;
	}


	/**
     * 根据一级递归调用子级
     *	reversed方法 表示数字越大靠前
     * @param menuList
     * @param rootMenuList
     * @return
     */
    private void findSubCategory(List<RcMenu> menuList, List<RcMenuVO> rootMenuList) {
        // 遍历一级
        for (RcMenuVO rcMenuVO : rootMenuList) {
            List<RcMenuVO> rcMenuVOList = new ArrayList<>();
            // 查找子级
            for (RcMenu rcMenu : menuList) {
                // 判断当前目录是否是子父级关系
                if (rcMenuVO.getMenuId().equals(rcMenu.getParentId())) {
                	rcMenuVOList.add(rcMenuTORcMenuVO(rcMenu));
                }
                // 递归调用,不管有几级菜单,都能够适用
                findSubCategory(menuList, rcMenuVOList);
                // 类目显示排序,
                rcMenuVOList.sort(Comparator.comparing(RcMenuVO::getSortOrder));
            }
            // 最后把查到的子级保存到一级目录中
            rcMenuVO.setChildren(rcMenuVOList);
        }
    }

	/**
	 * 	各级菜单列表展示
	 * @param menu
	 * @param pageObject
	 * @return
	 */
	public List<RcMenuVO> queryMenuList(RcMenu menu, PageObject pageObject) {
		List<RcMenu> menuList = null;
		Page<RcMenu> page = PageHelper.startPage(pageObject.getPageNum(), pageObject.getPageSize());
		// 将用户页面提交的参数拷贝到查询条件去
		SpringBeanUtils.copyPropertiesIgnoreNull(pageObject, page);
		//先查出全部菜单
		menuList = menuMapper.queryMenuList(menu);
		
		//获取一级菜单	0代表一级菜单 .reversed()
		List<RcMenuVO> rootMenuList = menuList.stream()
				.filter(e -> e.getParentId().equals(0))
				.map(this::rcMenuTORcMenuVO)
				.sorted(Comparator.comparing(RcMenuVO::getSortOrder))
				.collect(Collectors.toList());
		//查找字节点
		findSubCategory(menuList,rootMenuList);
		
		// 将真实分页信息拷贝到用户页面
		SpringBeanUtils.copyPropertiesIgnoreNull(page, pageObject);
		//返回值		
		return rootMenuList;
	}

	
	/**
	 * 	根据菜单id 查找子菜单
	 * @param menuId
	 * @return
	 */
	public List<RcMenuVO> queryMenuById(RcMenu menu) {
		//先查出菜单
		List<RcMenu> menuList = menuMapper.queryMenuList(menu);
		//获取一级菜单	0代表一级菜单 .reversed()
		List<RcMenuVO> rootMenuList = menuList.stream()
				.filter(e -> e.getParentId().equals(0))
				.map(this::rcMenuTORcMenuVO)
				.sorted(Comparator.comparing(RcMenuVO::getSortOrder))
				.collect(Collectors.toList());
		//查找字节点
		findSubCategory(menuList,rootMenuList);
		//返回值		
		List<RcMenuVO> rootMenu = new ArrayList<RcMenuVO>();
		for (int i = 0; i < rootMenuList.size(); i++) {
			if (rootMenuList.get(i).getMenuId().equals(menu.getMenuId())) {
				RcMenuVO rcMenuVO = rootMenuList.get(i);
				rootMenu.add(rcMenuVO);
			}
		}
		return rootMenu;
	}
	

四、返回的result值 如下:

	{
    "successful": true,
    "data": [
        {
            "menuId": 1,
            "menuName": "菜单",
            "createTime": "2020-05-22",
            "status": "启用",
            "level": "一级菜单",
            "parentId": 0,
            "sortOrder": 0,
            "children": [
                {
                    "menuId": 2,
                    "menuName": "菜单111",
                    "createTime": "2020-05-22",
                    "level": "二级菜单",
                    "parentId": 1,
                    "sortOrder": 1,
                    "status": "停用"
                },
                {
                    "menuId": 3,
                    "menuName": "菜单222",
                    "createTime": "2020-05-22",
                    "level": "二级菜单",
                    "parentId": 1,
                    "sortOrder": 2,
                    "status": "启用"
                }
            ]
        }
    ],
    "page": null,
    "resultHint": "{\"message\":\"数据查询成功\"}",
    "errorPage": "",
    "draw": 0,
    "recordsTotal": 0,
    "recordsFiltered": 0,
    "type": "info"
}
Java递归实现菜单树 上述示例创建了一个菜单树,其中包含根菜单项"Root",以及一级菜单项"Menu 1"和"Menu 2"。“Menu 1"下有二级菜单项"Submenu 1-1"和"Submenu 1-2”,“Menu 2"下有二级菜单项"Submenu 2-1"和"Submenu 2-2”。“Submenu 1-1"下有三级菜单项"Subsubmenu 1-1-1"和"Subsubmenu 1-1-2”,“Submenu 1-2"下有三级菜单项"Subsubmenu 1-2-1”。的类,用于表示菜单树。 阅读详情

相关推荐

Java 根据角色权限查询菜单列表(递归)

今天遇到一个新的需求,要求后台可以根据用户的角色来配置前端的菜单权限列表。其实就是很常见的需求,后台根据用户的权限来展示对应的导航菜单。 设计了2个表。DDL如下。 菜单地址表 CREATE TABLE `t_app_bar_url` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键', `url` varchar(255) DEFAULT NULL COMMENT '地址', `name` varc...

阿鹏的博客 6416

Java实现多级菜单编写

最近换了一家公司,不在是外包公司。由于是做自己产品的,发现开发流程和业务和之前的完全不一样。第一个任务是多级菜单的编写,对于大多数Java开发来讲,这都是一个再平常不过的功能了,由于原来业务性质原因,并没有做过,为此自己也通过查阅博客,完成了该功能,慢慢进步学习。记录一下,方便日后查阅,如果有博友发现有更好的功能,欢迎留言给我,我也学学。 编写的多级分类的主要功能有: 树状结构查询所有 查询单极分类 批量操作(只写了批量显示,其它的同理) 同级目录中上下移动操作 新增分类 说明一下,由于不是单.

华安小书童的博客 3499

Java小技能:多级兄弟节点交换顺序-----分类排序(文章、菜单、组织机构、应用列表)

下移时,获取最近的一个记录的排序字段。上移时,获取最近一个的排序字段。查询最近的兄弟节点进行交换。

专注于计算机研发知识和资讯分享 1183

Java实现多级菜单(递归)

Java实现多级菜单 菜单管理数据库设计 CREATE TABLE `pms_category` ( `cat_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '分类id', `name` char(50) DEFAULT NULL COMMENT '分类名称', `parent_cid` bigint(20) DEFAULT NULL COMMENT '父分类id', `cat_level` int(11) DEFAULT NULL COMME

XieStrong 6864

java小技能:Stream流操作【foreach、filter、map、collect】(根据分类ID穿透查询文章、返回树结构菜单列表)

终端操作,每个流只能进行一次终端操作,终端操作结束后流无法再次使用。终端操作会产生一个新的集合或值。(遍历foreach、匹配find–match、规约reduce、聚合max–min–count、收集collect)中间操作,每次返回一个新的流,可以有多个。(筛选filter、映射map、排序sorted、去重组合skip—limit)需求:根据分类ID穿透查询文章,默认淘学院分类文章。生成树形结构菜单列表:递归获取子节点。

专注于计算机研发知识和资讯分享 896

k8s学习笔记(3)--- kubernetes核心技术概念

kubernetes核心技术概念 1.API对象         API对象是K8s集群中的管理操作单元。K8s集群系统每支持一项新功能,引入一项新技术,一定会新引入对应的API对象,支持对该功能的管理操作。例如副本集Replica Set对应的API对象是RS。 2.集群(Cluster)         集群是指由...

梦谜的博客 1291

多级菜单 递归 Java

采用递归实现多级菜单 1.菜单对象 @Data public class SysMenuEntity { /**菜单id*/ private Long id; /**父菜单id,一级菜单为0*/ private Long parentId; /**菜单名称*/ private String menuName; /** 菜单URL*/ private String menuUrl; /**类型 0:目录 1:菜单 2:按

smartideazt的博客 553

用yolov8训练自己的模型并调取摄像头实时检测,新手小白超友好教程!逻辑梳理,从0开始逐步实操❤

帮新手小白学会用yolov8,包含多篇高质量博客整理

Lhhhhds的博客 2941

java多级菜单列表怎么做_【转载】Java实现多级菜单(递归)

();for (Menu nav : allMenu) {// 遍历所有节点,将所有菜单的父id与传过来的根节点的id比较//相等说明:为该根节点的子节点。if(nav.ParentId().equals(id)){childList.add(nav);}}//递归for (Menu nav : childList) {nav.setChildren(getChild(nav.getId(), a...

weixin_39572288的博客 536

Android双目摄像头(RGB+IR)实时预览与人脸活体检测实战指南

本文详细介绍了Android双目摄像头(RGB+IR)实时预览与人脸活体检测的实战指南。通过双摄同步预览、人脸检测与活体判断等技术实现,提升安全认证的准确性和鲁棒性。文章还提供了开发环境搭建、常见问题解决方案及性能优化建议,帮助开发者快速掌握双目摄像头在Android平台的应用。

vulkan6gpu的博客 691

Labview及NI-USRP驱动安装教程

软件下载 安装使用的LabVIEW2018及NI-USRP驱动程序已上传,下载地址: 天翼云盘链接 (访问码:oc33) 百度网盘链接 (提取码:88mi) (注:天翼云盘下载不限速) LabVIEW2018安装步骤 右键软件压缩包选择解压至LabVIEW2018 选中文件,鼠标右击选择以管理员身份打开2018LV-WinChn.exe文件。 点击确定。 点击Unzip解压。 点击确定。 点击下一步。 填写任意信息后,点击下一步。 点击下一步。 点击浏览更改安装路径建议安装到除C盘以

dadapongi6的博客 2万+

java多级菜单列表怎么做_Java构建网站多级菜单功能解决方案

packagecom.sys.menutree;importcom.sys.dao.MenuMapper;importcom.sys.domain.Menu;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Controller;importorg.sp...

weixin_39732991的博客 215

Oracle OCP 19c 认证1Z0-083考试大纲(Oracle官方版)

Oracle Database: Managing Multitenant Architecture Ed 1 course

#真题在线# 1588

开发笔记:服务端返回三/多级菜单数据的几种不同实现

阅前须知: 本文是我个人的学习笔记,由于本人水平有限,所以代码仅供参考,如有错误,还望指出!(^▽^) 环境:Jdk1.8 数据库字段和Stream实现方法主要参考自某谷的谷粒商城,此商城教程B站可搜 本文主要讲解了以下三种实现方法: 循环实现(for语句) 递归实现(广度优先搜索) Stream实现(Jdk8的) 实现效果: 数据库的字段: 主要关注以下字段: cat_id:分类的id,主键 parent_cid:父分类的id(即cat_id) cat_level:层级,如:第一级菜单为1

weixin_44836808的博客 717

AutoJs调用DeepSeek大模型接口实战教程 AutoJs接入DeepSeek、 DeepSeek API调用 、 手机脚本接入大模型

通过这篇文章,我们用 AutoJs 成功接入了 DeepSeek Chat API。使用发送请求在 Header 里正确携带 API Key从里拿到最终返回结果这样一来,你就可以在 AutoJs 里实现一个智能助手脚本,甚至做更复杂的 AI 自动化工具。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 468

YOLOv11目标检测模型性能评价指标详解,涉及混淆矩阵、F1-Score、IoU、mAP、参数量、计算量等,一文打尽所有评价指标

本文主要讲解的是计算机视觉网络模型的性能评价指标,这是每一篇论文中都需要展示的内容。熟悉每一个评价指标也能够帮助我们在训练和改进模型过程中,更好的观察模型的变化效果。

Limiiiing的博客 8412

java实现多级菜单(递归)

菜单实体类:1234567891011121314151617public class Menu {  // 菜单id  private String id;  // 菜单名称  private String name;  // 父菜单id  private String parentId;  // 菜单url  private String url;  // 菜单图标  private Stri...

Cruise的博客 3万+

手把手教你完成基于matlab的路面裂缝检测系统设计

裂缝是路面病害最早的形态之一,只有在裂缝出现的早期进行维护,才能有效地提高公路的使用寿命。因此,路面裂缝的检测识别系统对于提升公路质量有着重大的意义。首先,对路面裂缝图像进行相应的预处理,目的是减小环境因素的影响,消除无用的噪点。然后提取目标图像特征,判断路面裂缝类型,标记出路面裂缝的位置。最后通过设计的 GUI 界面来集成各个关键步骤,显示所得到的试验结果。仿真结果表明,设计的路面裂缝检测识别系统是高效可行的。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1216

Java实现多级菜单(递归实现)

Java实现多级菜单 菜单管理数据库设计 pgsql表 CREATE TABLE "ads"."sys_menu_permission" ( "menu_id" int4 DEFAULT nextval('"ads".sys_menu_permission_menu_id_seq'::regclass) NOT NULL, "menu_pid" int4 DEFAULT 0, "menu_name" varchar(100) COLLATE "default", "menu_type" varchar(20

Guizy 7474

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Java多级菜单排序并返回树结构菜单列表

SpringBoot+MybatisPlus 对数据表中的菜单进行排序并返回树形Json格式的菜单列表

TheTsing的博客 5676

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

【面试题】 Java 实现多级菜单查询

Java实现多级递归 声明: 此答案是百度的,纯属记录今天面试的时候遇到的问题,和面试官磕了半天,当然实际题目没有这么简单! 实体类 public class Menu { // 菜单id private String id; // 菜单名称 private String name; // 父菜单id private String parentId; // 菜单url private String url; // 菜单图标 private String icon

lmy 2217

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Java递归实现多级菜单

数据库设计 我们在设计数据库的时候仅仅使用一张表就可以把上面的关系给捋清楚,就是通过一个parentid字段,让我们开看一下这张表的表结构 看一下建表语句 DROP TABLE IF EXISTS menu; CREATE TABLE menu ( id int(11) NOT NULL AUTO_INCREMENT COMMENT ‘主键递增’, name varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT

柳落青 2358

java实现多级菜单(树状图)

实体类: public class Menu { // 菜单id private String id; // 菜单名称 private String name; // 父菜单id private String parentId; // 菜单url private String url; // 菜单图标 private String icon; // 菜单顺序 private int order; // 子菜单 private List<Men

笙箫的博客 1817

java递归实现多级菜单栏_Java构建树形菜单以及支持多级菜单的实例代码

这篇文章主要介绍了Java构建树形菜单的实例代码(支持多级菜单),非常不错,具有参考借鉴价值,需要的朋友可以参考下效果图:支持多级菜单。菜单实体类:public class Menu {// 菜单idprivate String id;// 菜单名称private String name;// 父菜单idprivate String parentId;// 菜单urlprivate String ...

weixin_35626308的博客 388

java递归生成树形结构菜单

一、mysql表,数据自行准备 CREATE TABLE `sys_menu` ( `id` int(11) NOT NULL AUTO_INCREMENT, `pid` bigint(20) DEFAULT NULL, `title` varchar(255) CHARACTER SET utf8 DEFAULT NULL, `path` varchar(255) CHARA...

记录点滴 1万+
上一篇: 【Java】获取不同List集合中不相同的数据 ( 效率可以,已亲测过 )
下一篇: 【Mybatis】中使用IN语句查询sql的方法
Monika、
博客等级 码龄7年 16粉丝 67原创
评论 11
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Monika、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值