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进行判空决定是否再去查询子菜单