http://www.voidcn.com/article/p-vcsdgavf-bmd.html
@Data @TableName("sys_menu") public class SysMenuEntity { private static final long serialVersionUID = 1L; /** * 菜单ID */ @TableId private Long menuId; /** * 父菜单ID,一级菜单为0 */ private Long parentId; /** * 菜单名称 */ private String name; /** * 菜单URL */ private String url; /** * 授权(多个用逗号分隔,如:user:list,user:create) */ private String perms; /** * 类型 0:目录 1:菜单 2:按钮 */ private Integer type; /** * 菜单图标 */ private String icon; /** * 排序 */ private Integer orderNum; /** * ztree属性 */ @TableField(exist=false) private Boolean open; @TableField(exist=false) private List<?> list; }
public List<SysMenuEntity> findall(){ //原始数据 List<SysMenuEntity> rootMenu =sysMenuDao.findAll(); //log.info("原始数据:"+JSON.toJSONString(rootMenu)); // 最后的结果 List<SysMenuEntity> menuList = new ArrayList<>(); // 先找到所有的一级菜单 for (int i = 0; i < rootMenu.size(); i++) { //一级菜单parentId=0; long firstId=0; if(rootMenu.get(i).getParentId()==firstId){ menuList.add(rootMenu.get(i)); } } //log.info("一级菜单数量:"+menuList.size()+"==="+ JSON.toJSONString(menuList)); // 为一级菜单设置子菜单,getChild是递归调用的 for (SysMenuEntity menu : menuList) { List<SysMenuEntity> childlist=getChild(menu.getMenuId(), rootMenu); menu.setList(childlist); } return menuList; }
/** * 递归查找子菜单 * * menuId* 当前菜单id * rootMenu* 要查找的列表 * @return */ private List<SysMenuEntity> getChild(long menuId, List<SysMenuEntity> rootMenu) { // 子菜单 List<SysMenuEntity> childList = new ArrayList<>(); for (SysMenuEntity menu : rootMenu) { // 遍历所有节点,将父菜单id与传过来的id比较 if (menu.getParentId().equals(menuId)) { childList.add(menu); } } // 把子菜单的子菜单再循环一遍 for (SysMenuEntity menu : childList) { // 没有url子菜单还有子菜单 List<SysMenuEntity> lastliast=getChild(menu.getMenuId(), rootMenu); menu.setList(lastliast); } // 递归退出条件 if (childList.size() == 0) { return null; } return childList; }