java實(shí)現(xiàn)遞歸菜單樹
本文實(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)文章
SpringBoot工程下Lombok的應(yīng)用教程詳解
這篇文章主要給大家介紹了關(guān)于SpringBoot工程下Lombok應(yīng)用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
mybatis調(diào)用mysql存儲(chǔ)過程并獲取返回值方式
這篇文章主要介紹了mybatis調(diào)用mysql存儲(chǔ)過程并獲取返回值方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08
springboot使用spring-data-jpa操作MySQL數(shù)據(jù)庫
這篇文章主要介紹了springboot使用spring-data-jpa操作MySQL數(shù)據(jù)庫,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-07-07
Java基礎(chǔ)之List內(nèi)元素的排序性能對(duì)比
這篇文章主要介紹了Java基礎(chǔ)之List內(nèi)元素的排序性能對(duì)比,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-04-04
java中將一個(gè)List等分成n個(gè)list的工具方法(推薦)
下面小編就為大家?guī)硪黄猨ava中將一個(gè)List等分成n個(gè)list的工具方法(推薦)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-03-03
JPA中@JoinColumn的name和referencedColumnName屬性的區(qū)別及說明
這篇文章主要介紹了JPA中@JoinColumn的name和referencedColumnName屬性的區(qū)別及說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05
Java:DocumentBuilderFactory調(diào)用XML的方法實(shí)例
Java:DocumentBuilderFactory調(diào)用XML的方法實(shí)例,需要的朋友可以參考一下2013-04-04
Java并發(fā)編程之顯示鎖ReentrantLock和ReadWriteLock讀寫鎖
這篇文章主要介紹了Java并發(fā)編程之顯示鎖ReentrantLock和ReadWriteLock讀寫鎖,本文講解了ReentrantLock概況、Lock接口、Lock使用、輪詢鎖的和定時(shí)鎖、公平性、可中斷獲鎖獲取操作等內(nèi)容,需要的朋友可以參考下2015-04-04

