1.菜單類:
1 public class Menu { 2 // 菜單id 3 private String id; 4 // 菜單名稱 5 private String name; 6 // 父菜單id 7 private String parentId; 8 // 菜單url 9 private String url; 10 // 菜單圖標 11 private String icon; 12 // 菜單順序 13 private int order; 14 // 子菜單 15 private List<Menu> childMenus; 16 // ... 省去getter和setter方法以及toString方法 17 18 }
2.遞歸主題方法:
1 /** 2 * 模塊名稱 3 */ 4 public Map<String,Object> testQueryMenuList() { 5 // 原始的數據 6 List<Menu> rootMenu = menuDao.queryMenuList(null); 7 // 查看結果 8 for (Menu menu : rootMenu) { 9 System.out.println(menu); 10 } 11 // 最后的結果 12 List<Menu> menuList = new ArrayList<Menu>(); 13 // 先找到所有的一級菜單 14 for (int i = 0; i < rootMenu.size(); i++) { 15 // 一級菜單沒有parentId 16 if (StringUtils.isBlank(rootMenu.get(i).getParentId())) { 17 menuList.add(rootMenu.get(i)); 18 } 19 } 20 // 為一級菜單設置子菜單,getChild是遞歸調用的 21 for (Menu menu : menuList) { 22 menu.setChildMenus(getChild(menu.getId(), rootMenu)); 23 } 24 Map<String, Object> jsonMap = new HashMap<>(); 25 jsonMap.put("menu", menuList); 26 //System.out.println(gson.toJson(jsonMap));//使用gson需要在pom.xml引入gson依賴見 2.1步驟 27 //return gson.toJson(jsonMap);//返回類型為String 28 return jsonMap; 29 } 30 31 /** 32 * 子方法 33 **/ 34 private List<Menu> getChild(String id, List<Menu> rootMenu) { 35 // 子菜單 36 List<Menu> childList = new ArrayList<>(); 37 for (Menu menu : rootMenu) { 38 // 遍歷所有節點,將父菜單id與傳過來的id比較 39 if (StringUtils.isNotBlank(menu.getParentId())) { 40 if (menu.getParentId().equals(id)) { 41 childList.add(menu); 42 } 43 } 44 } 45 // 把子菜單的子菜單再循環一遍 46 for (Menu menu : childList) {// 沒有url子菜單還有子菜單 47 //該節點不含子節點 具體見2.2解釋 48 if (StringUtils.isBlank(menu.getUrl())) { 49 // 遞歸 50 menu.setChildMenus(getChild(menu.getId(), rootMenu)); 51 } 52 } // 遞歸退出條件 53 if (childList.size() == 0) { 54 return null; 55 } 56 return childList; 57 } 58
2.1.引入依賴pom.xml
<dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.2.8</version> </dependency>
2.2 StringUtils.isBlank(menu.getUrl())
這里根據需求可做改動,我這里如果一個菜單有子菜單的話該菜單是沒有url的,子菜單才有具體的url跳轉,父菜單不用綁定url點擊后只展示子菜單並不進行請求接口,
所以沒有url的菜單肯定是有子菜單的,有了url的菜單肯定是最終級別分支的菜單,所以對url進行判空決定是否再去查詢子菜單