原文参考地址:https://blog.csdn.net/yf_mood/article/details/88594448
在菜单栏的多级别显示时,需要用到递归查询,这里参考了其他博主的文章,在此感谢。
/**
* 第一步。
* 查询资源权限的子权限
* @param id
* @param root
* @return ResponseMenuModel 为自己封装的返回实体类
*/
private List<ResponseMenuModel> getChild(String id,List<ResponseMenuModel> root){
//子菜单
List<ResponseMenuModel> childList=new ArrayList<>();
for (ResponseMenuModel sysPermissionVo : root) {
// 遍历所有节点,将父菜单id与传过来的id比较
if(!sysPermissionVo.getSysMenuId().equals("0")){
if(sysPermissionVo.getParentId().equals(id)){
childList.add(sysPermissionVo);
}
}
}
//递归终止的条件,没有子权限时
if (childList.size()==0){
return null;
}
// 如果有子菜单还有子菜单,把子菜单的子菜单再循环一遍
for (ResponseMenuModel sysPermissionVo : childList) {
sysPermissionVo.setChildren(getChild(sysPermissionVo.getSysMenuId(),root));
}
return childList;
}
/**
* 第二步
* 初始化资源权限树形结构(查找所有资源权限)
* @return ResponseMenuModel 为自己封装的实体类
*/
private List<ResponseMenuModel> innitPermissions(List<ResponseMenuModel> allpermissions) {
List<ResponseMenuModel> root=new ArrayList<>();
for (ResponseMenuModel allpermission : allpermissions) {
ResponseMenuModel sysPermissionVo = new ResponseMenuModel();
BeanUtils.copyProperties(allpermission,sysPermissionVo);
root.add(sysPermissionVo);
}
List<ResponseMenuModel> finalList=new ArrayList<>();
//先找到所有的一级菜单
for (ResponseMenuModel sysPermission : root) {
//一级菜单父id为0
if(sysPermission.getParentId().equals("0")){
finalList.add(sysPermission);
}
}
// 为一级菜单设置子菜单,getChild是递归调用的
for (ResponseMenuModel sysPermission : finalList) {
sysPermission.setChildren(getChild(sysPermission.getSysMenuId(),root));
}
return finalList;
}