java實(shí)現(xiàn)遞歸菜單樹
更新時(shí)間:2020年08月26日 09:16:53 作者:男人要霸氣
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)遞歸菜單樹,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
本文實(shí)例為大家分享了java實(shí)現(xiàn)遞歸菜單樹的具體代碼,供大家參考,具體內(nèi)容如下
1.表結(jié)構(gòu)
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 '上級(jí)Id',
`icon` varchar(255) DEFAULT NULL COMMENT '菜單圖標(biāo)',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of menu
-- ----------------------------
INSERT INTO `menu` VALUES ('1', '系統(tǒng)管理', '1', '', '0', null);
INSERT INTO `menu` VALUES ('2', '軌跡查詢', '2', '', '0', null);
INSERT INTO `menu` VALUES ('3', '設(shè)備信息', '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', '切割機(jī)', '1', null, '3', null);
INSERT INTO `menu` VALUES ('9', '鏟車', '2', null, '3', null);
INSERT INTO `menu` VALUES ('10', '割片', '1', null, '8', null);
2.菜單實(shí)體類
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;
//上級(jí)Id
@Column(name = "pid")
private String pid;
//菜單圖標(biāo)
@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(上級(jí)Id)為0的是根菜單
if ("0".equals(menu.getPid())) {
rootMenus.add(menu);
}
}
//遍歷,找到二級(jí)菜單(根菜單的id和所有菜單中的pid比較)
for (Menu rootMenu : rootMenus) {
List<Menu> child = getChild(String.valueOf(rootMenu.getId()), menus);
rootMenu.setChildren(child);
}
return rootMenus;
}
/**
* 遞歸獲取下級(jí)菜單
* @param pid 上級(jí)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長(zhǎng)度為0
if (childList.size() == 0) {
return new ArrayList<>();
}
return childList;
}
4.測(cè)試
{
"status": 200,
"message": "操作成功",
"data": [
{
"id": 1,
"menuName": "系統(tǒng)管理",
"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": "設(shè)備信息",
"orderNum": 3,
"url": "",
"pid": "0",
"icon": null,
"children": [
{
"id": 8,
"menuName": "切割機(jī)",
"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.菜單樹工具類
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
詳解Java分布式系統(tǒng)中session一致性問題
這篇文章主要介紹了Java分布式系統(tǒng)中session一致性問題,對(duì)分布式系統(tǒng)感興趣的同學(xué),要仔細(xì)看一下2021-04-04
Java實(shí)現(xiàn)日志文件監(jiān)聽并讀取相關(guān)數(shù)據(jù)的方法實(shí)踐
本文主要介紹了Java實(shí)現(xiàn)日志文件監(jiān)聽并讀取相關(guān)數(shù)據(jù)的方法實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05
SpringBoot整合XxlJob分布式任務(wù)調(diào)度平臺(tái)
xxl-job是一個(gè)開源的分布式定時(shí)任務(wù)框架,它可以與其他微服務(wù)組件一起構(gòu)成微服務(wù)集群。它的調(diào)度中心(xxl-job)和執(zhí)行器(自己的springboot項(xiàng)目中有@XxlJob("定時(shí)任務(wù)名稱")的方法)是相互分離,分開部署的,兩者通過HTTP協(xié)議進(jìn)行通信2023-02-02

