java实现递归菜单树
作者:男人要霸气 发布时间:2023-02-01 00:03:06
标签:java,递归,菜单树
本文实例为大家分享了java实现递归菜单树的具体代码,供大家参考,具体内容如下
1.表结构
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for menu
-- ----------------------------
DROP TABLE IF EXISTS `menu`;
CREATE TABLE `menu` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`menu_name` varchar(64) NOT NULL COMMENT '菜单名称',
`order_num` int(11) DEFAULT NULL COMMENT '菜单顺序',
`url` varchar(64) DEFAULT NULL COMMENT '菜单路径',
`pid` varchar(11) DEFAULT NULL COMMENT '上级Id',
`icon` varchar(255) DEFAULT NULL COMMENT '菜单图标',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of menu
-- ----------------------------
INSERT INTO `menu` VALUES ('1', '系统管理', '1', '', '0', null);
INSERT INTO `menu` VALUES ('2', '轨迹查询', '2', '', '0', null);
INSERT INTO `menu` VALUES ('3', '设备信息', '3', '', '0', null);
INSERT INTO `menu` VALUES ('4', '用户信息', '1', '', '1', null);
INSERT INTO `menu` VALUES ('5', '客户信息', '2', null, '1', null);
INSERT INTO `menu` VALUES ('6', '用户资料', '1', null, '4', null);
INSERT INTO `menu` VALUES ('7', '客户资料', '1', null, '5', null);
INSERT INTO `menu` VALUES ('8', '切割机', '1', null, '3', null);
INSERT INTO `menu` VALUES ('9', '铲车', '2', null, '3', null);
INSERT INTO `menu` VALUES ('10', '割片', '1', null, '8', null);
2.菜单实体类
import lombok.Data;
import java.io.Serializable;
import java.util.List;
import javax.persistence.*;
/**
*
* @author m
* @email 123456789@qq.com
* @date 2019-12-13 16:54:59
*/
@Data
@Table(name = "menu")
public class Menu implements Serializable {
private static final long serialVersionUID = 1L;
//
@Id
private Integer id;
//菜单名称
@Column(name = "menu_name")
private String menuName;
//菜单顺序
@Column(name = "order_num")
private Integer orderNum;
//菜单路径
@Column(name = "url")
private String url;
//上级Id
@Column(name = "pid")
private String pid;
//菜单图标
@Column(name = "icon")
private String icon;
//子菜单
@Transient
private List<Menu> children;
}
3.菜单树
/**
* 获取菜单树
* @return
*/
public List<Menu> menuTree() {
//查询所有菜单
List<Menu> menus = mapper.selectAll();
//返回的菜单树
List<Menu> rootMenus = new ArrayList<>();
for (Menu menu : menus) {
//pid(上级Id)为0的是根菜单
if ("0".equals(menu.getPid())) {
rootMenus.add(menu);
}
}
//遍历,找到二级菜单(根菜单的id和所有菜单中的pid比较)
for (Menu rootMenu : rootMenus) {
List<Menu> child = getChild(String.valueOf(rootMenu.getId()), menus);
rootMenu.setChildren(child);
}
return rootMenus;
}
/**
* 递归获取下级菜单
* @param pid 上级Id
* @param menus 所有菜单
* @return
*/
public List<Menu> getChild(String pid, List<Menu> menus) {
//子菜单列表
List<Menu> childList = new ArrayList<>();
for (Menu menu : menus) {
if (pid.equals(menu.getPid())) {
childList.add(menu);
}
}
//遍历 获取子菜单的子菜单
for (Menu menu : childList) {
List<Menu> child = getChild(String.valueOf(menu.getId()), menus);
menu.setChildren(child);
}
//递归出口 childList长度为0
if (childList.size() == 0) {
return new ArrayList<>();
}
return childList;
}
4.测试
{
"status": 200,
"message": "操作成功",
"data": [
{
"id": 1,
"menuName": "系统管理",
"orderNum": 1,
"url": "",
"pid": "0",
"icon": null,
"children": [
{
"id": 4,
"menuName": "用户信息",
"orderNum": 1,
"url": "",
"pid": "1",
"icon": null,
"children": [
{
"id": 6,
"menuName": "用户资料",
"orderNum": 1,
"url": null,
"pid": "4",
"icon": null,
"children": []
}
]
},
{
"id": 5,
"menuName": "客户信息",
"orderNum": 2,
"url": null,
"pid": "1",
"icon": null,
"children": [
{
"id": 7,
"menuName": "客户资料",
"orderNum": 1,
"url": null,
"pid": "5",
"icon": null,
"children": []
}
]
}
]
},
{
"id": 2,
"menuName": "轨迹查询",
"orderNum": 2,
"url": "",
"pid": "0",
"icon": null,
"children": []
},
{
"id": 3,
"menuName": "设备信息",
"orderNum": 3,
"url": "",
"pid": "0",
"icon": null,
"children": [
{
"id": 8,
"menuName": "切割机",
"orderNum": 1,
"url": null,
"pid": "3",
"icon": null,
"children": [
{
"id": 10,
"menuName": "割片",
"orderNum": 1,
"url": null,
"pid": "8",
"icon": null,
"children": []
}
]
},
{
"id": 9,
"menuName": "铲车",
"orderNum": 2,
"url": null,
"pid": "3",
"icon": null,
"children": []
}
]
}
]
}
5.菜单树工具类
菜单树工具类
来源:https://blog.csdn.net/weixin_42740530/article/details/103564528


猜你喜欢
- 本文实例为大家分享了Android自定义View实现滑动回弹的具体代码,供大家参考,具体内容如下前言Android 页面滑动的时候的回弹效果
- 有时候,我们的程序需要启动一些子进程,如嵌入的图形程序。当启动一个进程后,获得这个进程信息Process,然后其内部在某个时刻启动了一个子进
- 安卓系统本身可以很简便的实现分享功能,因为我们只需向startActivity传递一个ACTION_SEND的Intent,系统就为我们弹出
- 整理文档,搜刮出一个Spring 实现excel及pdf导出表格的代码,稍微整理精简一下做下分享。excel 导出:package ligh
- Android 注解Annotation相关文章:Android AOP注解Annotation详解(一)Android AOP之注解处理解
- 本文实例为大家分享了java使用HashMap实现斗地主的具体代码,供大家参考,具体内容如下案例介绍按照斗地主的规则,完成洗牌发牌的动作。
- 1. broker 清理文件介绍本系列RocketMQ4.8注释github地址,希望对大家有所帮助,要是觉得可以的话麻烦给点一下Star哈
- 分组类控件主要包括容器控件(Panel),分组框控件(groupBox)和选项卡控件(TabControl)等控件。一、Panel控件Pan
- 目录什么是角点?为什么要检测角点?Harris角点检测API操作效果源码什么是角点?角点就是极值点,即在某方面属性特别突出的点。当然,你可以
- 首先:看问题图,如下可以激活ide的网址很多,估计是个团队或者个人,直接买了全部产品的一年的有效期。而且还是会一直更新下去的。因为,后来我自
- 1.先在build.gradle(Module)下添加引用viewPager2的库implementation 'androidx.
- 本文实例讲述了Android编程设计模式之访问者模式。分享给大家供大家参考,具体如下:一、介绍访问者模式是一种将数据操作与数据结构分离的设计
- 一个图片识别小工具,原先主要是识别以前公司的软件注册码截图里的数字和字母(每次要一个一个框复制出来粘贴到注册器里,很麻烦!),因为注册码出现
- 在编程过程中一定要注意代码命名的规范性,否则在使用和维护过程中将造成很大的麻烦,这也是一种良好的编码习惯。看下面代码,除了userPass命
- 本文实例为大家分享了java查找图中两点之间所有路径的具体代码,基于邻接表,供大家参考,具体内容如下图类:package graph1;im
- Qt窗体中默认会附加一个QstatusBar组件,状态栏组件位于主窗体的最下方,其作用是提供一个工具提示功能,当程序中有提示信息是可以动态的
- 对这种懒加载问题,最后的做法是利用Spring提供的一个针对Hibernate的一个支持类,其主要意思是在发起一个页面请求时打开Hibern
- 本文实例为大家分享了Unity Shader实现3D翻页效果的具体代码,供大家参考,具体内容如下参考文章:UnityShader使用Plan
- 假如是在同一台机器上开发,前后端分离的工程中出现跨域问题的原因是,前端工程和后端工程运行在不同的端口上。只要协议、域名、端口有一个不同就会产
- 本文简单分析了C/C++中常用函数的易错点,包括memset、sizeof、getchar等函数。分享给大家供大家参考之用。具体分析如下:1