1. 程式人生 > 程式設計 >java實現遞迴選單樹

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',null);
INSERT INTO `menu` VALUES ('3','裝置資訊','3',null);
INSERT INTO `menu` VALUES ('4','使用者資訊',null);
INSERT INTO `menu` VALUES ('5','客戶資訊',null,null);
INSERT INTO `menu` VALUES ('6','使用者資料','4',null);
INSERT INTO `menu` VALUES ('7','客戶資料','5',null);
INSERT INTO `menu` VALUES ('8','切割機',null);
INSERT INTO `menu` VALUES ('9','剷車',null);
INSERT INTO `menu` VALUES ('10','割片','8',null);

2.選單實體類

import lombok.Data;
import java.io.Serializable;
import java.util.List;
import javax.persistence.*;


/**
 *
 * @author m
 * @email [email protected]
 * @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": "使用者資訊","pid": "1","children": [
      {
       "id": 6,"menuName": "使用者資料","url": null,"pid": "4","children": []
      }
     ]
    },{
     "id": 5,"menuName": "客戶資訊","orderNum": 2,"children": [
      {
       "id": 7,"menuName": "客戶資料","pid": "5","children": []
      }
     ]
    }
   ]
  },{
   "id": 2,"menuName": "軌跡查詢","children": []
  },{
   "id": 3,"menuName": "裝置資訊","orderNum": 3,"children": [
    {
     "id": 8,"menuName": "切割機","pid": "3","children": [
      {
       "id": 10,"menuName": "割片","pid": "8",{
     "id": 9,"menuName": "剷車","children": []
    }
   ]
  }
 ]
}

5.選單樹工具類

選單樹工具類

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。