一、准备一个实体类
@Data
public class Menu implements Serializable {
private Integer id;
private String name;
private String path;
private String icon;
private String description;
// 存放子菜单
private List<Menu> children;
// 父菜单的Id
private Integer parentId;
}
二、查出数据递归遍历菜单列表
public void Demo(){
// 从库里查出菜单信息
List<Menu> menuList = menuMapper.selectByFlag("ROLE_ADMIN");
// 准备一个菜单列表用来存放递归后的菜单信息
List<Menu> menus = new ArrayList<>();
// 循环遍历菜单
for (Menu menu : menuList) {
// 判断父ID是否为空,为空说明是一级菜单
if(menu.getParentId() == null){
// 调用递归方法去查这个一级菜单有无子菜单
RecursionMenu(menu, menuList);
// 递归结束,把它存入递归后的菜单列表
menus.add(menu);
}
}
}
// 递归方法(父级菜单,以及查出来的所有菜单信息)
private void RecursionMenu(Menu root, List<Menu> menuList){
// 定义一个list用来存放下一级的所有子菜单
List<Menu> childList = new ArrayList<>();
// 递归遍历所有的菜单信息
for (Menu menu : menuList) {
// 判断该根结点的id和其它菜单的父id是否相等
if(root.getId().equals(menu.getParentId())){
// 相等存入孩子菜单的list中
childList.add(menu);
}
}
// 判断孩子列表是否为空,为空说明没有子菜单,直接返回。
if(childList.size() == 0){
return ;
}
// 将该菜单的所有子菜单存入
root.setChildren(childList);
// 遍历所有的子菜单
for (Menu menu : childList) {
// 递归调用查询每一个子菜单是否还有子菜单
RecursionMenu(menu,menuList);
}
}