多级菜单存在同一张表,一次性把所有关系取出来

这两天遇到一个问题,一般来说下一级菜单都是点击了上一级菜单后再请求出来,但是这边项目有一个需求就是要把所有的菜单全部一次性拿出来,那么就出现了一个问题,怎样给前端返回数据,于是想了一个办法,那就是菜单类嵌套菜单类,这样的话不管有多少级菜单都可以一次性取出来,前端也能直接清楚当前数据是的关系,不需要太多的辅助条件来判断

首先写一个辅助类

public class MenuDto implements Serializable{
    /** */
    private static final long serialVersionUID = 7365890239552237558L;
    //每一行自增id
    private Integer id;
    //菜单名字
    private String  menuName;
    //子菜单,为0则为顶级菜单,为字菜单则为父级菜单ID
    private Integer submenu;
    
    private List<MenuDto>  menulist;
   //更多属性省略
    //set get方法省略      
}

原始类

public class Menu {
    //每一行自增id
    private Integer id;
    //菜单uri
    private String  menuUri;
    //菜单名字
    private String  menuName;
    //子菜单
    private Integer submenu;
    //更多属性省略   
    //set get省略
}

接下来就是重点了,首先需要把菜单的数据全部查出来,以list数组存放

/**
     * 顶级
     * 
     * @param allMenu
     * @return
     */
    public List<MenuDto> menuDtoList(List<Menu> allMenu) {
        List<MenuDto> dtos = new ArrayList<>();
        for (int i = 0; i < allMenu.size(); i++) {
            MenuDto menuDto = new MenuDto();
            if (allMenu.get(i).getSubmenu() == 0) {
                menuDto.setId(allMenu.get(i).getId());
                menuDto.setMenuName(allMenu.get(i).getMenuName());
                menuDto.setSubmenu(allMenu.get(i).getSubmenu());
                menuDto.setMenulist(SunMenuDtoList(allMenu, allMenu.get(i).getId(), allMenu.size()));
                dtos.add(menuDto);
                allMenu.remove(i);
                i--;
            }
        }
        return dtos;
    }

接下来子集的需要开始一个递归的方法来操作,这样就可以把所有的子级菜单都按顺序插入进去

 /**
     * 子集
     * 
     * @param allMenu 需要遍历的Menu
     * @param id 父级菜单ID
     * @param menuSize 传入的Menu长度
     * @return
     */
    public List<MenuDto> SunMenuDtoList(List<Menu> allMenu, Integer id, Integer menuSize) {
        List<MenuDto> dtos = new ArrayList<>();
        for (int i = 0; i < allMenu.size(); i++) {
            MenuDto menuDto = new MenuDto();
            if (allMenu.get(i).getSubmenu() == id) {
                menuDto.setId(allMenu.get(i).getId());
                menuDto.setMenuName(allMenu.get(i).getMenuName());
                menuDto.setSubmenu(allMenu.get(i).getSubmenu());
                menuDto.setMenulist(SunMenuDtoList(allMenu, allMenu.get(i).getId(), allMenu.size()));
                dtos.add(menuDto);
                allMenu.remove(i);
                i--;
            }
        }
        Integer menuSize2 = allMenu.size();
        if (menuSize == 0 || allMenu.isEmpty() || menuSize2 == menuSize) {
            return dtos;
        } else {
            SunMenuDtoList(allMenu, id, menuSize2);
        }
        return dtos;
    }

但是感觉这样算法还是有点问题,有点太复杂了,欢迎大家加入QQ群一起交流

原文地址:https://www.cnblogs.com/shiyuelp/p/6726353.html