多级菜单存在同一张表,一次性把所有关系取出来
这两天遇到一个问题,一般来说下一级菜单都是点击了上一级菜单后再请求出来,但是这边项目有一个需求就是要把所有的菜单全部一次性拿出来,那么就出现了一个问题,怎样给前端返回数据,于是想了一个办法,那就是菜单类嵌套菜单类,这样的话不管有多少级菜单都可以一次性取出来,前端也能直接清楚当前数据是的关系,不需要太多的辅助条件来判断
首先写一个辅助类
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群一起交流
进阶之路,神挡杀神佛挡杀佛,欢迎大家一起加QQ群共同讨论成长,群号:620095084
欢迎搜索关注微信公众号 基础全知道 :JavaBasis ,第一时间阅读最新文章
欢迎搜索关注微信公众号 基础全知道 :JavaBasis ,第一时间阅读最新文章