原文參考地址: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;
}