多级菜单查询用递归算法
1.递归算法的关键在于找到顶层的入口
2.再向下查找,将一级菜单于二级菜单的从属id相比较,循环嵌套
主要实体类中有两个特殊的属性
一级菜单level值为1,向后类推
其中用到了MyBatisPlus
表结构pid为菜单的父菜单,pid为0的为顶层菜单。
1.多层菜单查询首先找到pid为0的顶层菜单进入
public List<Permission> queryAllMenu() {
//查询所有菜单的数据
List<Permission> permissionList = baseMapper.selectList(new QueryWrapper<Permission>().orderByDesc("id"))l
//把所有菜单按照要求进行封装
List<Permission> resultList = buildPermission(permissionList);
return resultList;
}
public static List<Permission> buildPermisstion(List<Permission> permissionList) ){
List<Permission> findList = new ArrayList<>();
for(Permission permissionNode : permissionList){
//得到顶层菜单 pid=0菜单
if("0".equals(permissionNode.getPid())) {
//设置顶层菜单的level是1
permissionNode.setLevel(1);
//根据顶层菜单,向里面进行查询子菜单,封装到finalNode里面
finalList.add(selectChildren(permissionNode,permissionList));}
}
return finalList
}
2.接下来才是真正的递归算法
private static Permission selectChildren(Permission permissionNode, List<Permission> permissionList) {
//因为要向一层菜单里方二层,所以先将对象初始化
permissionNode.setChildren(new ArayList<Permission>());
for(Permission it:permissionList){
//判断二值是否相等,相等则为父子菜单
if(permissionNode.getId.equal(permissionList.getPid)){
//将父菜单的level加1赋值给子菜单
int level = permissionNode.getLevel()+1;
it.setLevel(level);
//如果children为空,进行初始化操作
if(permissionNode.getChildren() == null) {
permissionNode.setChildren(new ArrayList<Permission>());
}
//把查询出来的子菜单放到父菜单里面
permissionNode.getChildren().add(selectChildren(it,permissionList));
}
}
return permissionNode;
}
}