java實現遞迴選單樹
阿新 • • 發佈:2020-08-26
本文例項為大家分享了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.選單樹工具類
選單樹工具類
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。