首先有一张菜单的表,具有如下的两个字段
id,pid
一般最上层菜单的父级id为0, 如下结构
id | pid |
---|---|
a | 0 |
b | 0 |
a1 | a |
a2 | a |
b1 | b |
b2 | b |
a11 | a1 |
b11 | b1 |
等等 这种的无限向下延伸
java中有两个类 sysMenu是数据库表的model类 Menu是自己封装的 具有list<Menu>这个属性,最终前端需要的是一个list<Menu> 用于循环展示菜单
代码如下:
首先写一个查找某个菜单的子菜单的方法,并将数据转换为Menu的这个形式
/**
*
* @param id 菜单的id
* @param menuList 数据库查询到的所有菜单列表,未整理的
* @return 这个菜单的子菜单
*/
private List<Menu> getMenuListByPid(String id,List<SysMenu> menuList){
List<Menu> children = new ArrayList<>();
for (SysMenu sysMenu : menuList) {
if(id.equals(sysMenu.getpMenuId())) {
Menu temp= new Menu();
// temp 用于封装各种属性
children.add(temp);
}
}
return children;
}
然后再写递归算法,先把最上边一层的菜单列表查询出来,这个用于递归之后就是最终的结果了
List<Menu> menus = getMenuListByPid("0", menuList);
menus = loopSysMenu(menus,menuList);
递归函数如下:
/**
*
* @param menus 某一级菜单的列表
* @param menuList 数据库查询到的所有菜单列表,未整理的
* @return
*/
private List<Menu> loopSysMenu(List<Menu> menus, List<SysMenu> menuList) {
for (Menu menu : menus) {
// 循环获取某个菜单的子菜单并set到属性里边
menu.setChildren(this.getMenuListByPid(menu.getMenuId(),menuList));
// 如果某次返回的子菜单是空的,说明下边不在有子菜单了 所以跳出本次循环
if(menu.getChildren().isEmpty()) {
continue;
}
loopSysMenu(menu.getChildren(),menuList);
}
return menus;
}
最终得到的menus就是经过许多层迭代的结果,每个menu都有children,每个children又有children,前端直接循环展示即可!