标题递归生成一个权限树,可通过以下过程实现:
1.首先从权限数据表中获取所有节点
2.遍历所有节点,获取所有parentId为空的根节点
3.为根节点建立次级子节点树并拼接上。
3.通过递归为子节点建立次级子树并接上,直至为末端节点拼接上空的“树”。
每条权限有自己的id、父节点parentId、权限名称name、权限还拥有次级权限children。
权限树Dto
/**
* @author Liby
* @date 2022-05-16 11:35
* @description:返回前端Dto
* @version:
*/
public class PermissionTreeDto {
private Integer id;
private Integer parentID;
private String fullName;
private List<PermissionTreeDto> children;
private String appId;
private String appTypeCode;
private String permType;
private String menuUrl;
private String icon;
.........
.........
}
设置权限树工具类
package com.bairuitech.anychat.app.util;
import com.bairuitech.anychat.app.dto.PermissionTreeDto;
import java.util.ArrayList;
import java.util.List;
/**
* @author Liby
* @date 2022-05-18 10:54
* @description:生成权限树
* @version:
*/
public class PermissionTreeUtil {
/**
* 递归设置树
*/
public static List<PermissionTreeDto> setPermissionTree(List<PermissionTreeDto> allPermissionList) {
//根节点
List<PermissionTreeDto> rootList = new ArrayList();
//子节点
List<PermissionTreeDto> childList = new ArrayList();
//遍历所有节点,将所有根节点放入rootList集合中
for (PermissionTreeDto permission : allPermissionList) {
if (permission.getParentID() == null) {
rootList.add(permission);
}
}
//遍历根节点设置子节点
for (PermissionTreeDto permission : rootList) {
childList = getChildren(permission.getId(), allPermissionList);
permission.setChildren(childList);
}
return rootList;
}
/**
* 递归获取树的子节点
*/
private static List<PermissionTreeDto> getChildren(Integer id, List<PermissionTreeDto> allList) {
//存放子节点
ArrayList<PermissionTreeDto> childList = new ArrayList();
//遍历所有节点,如果该节点的parentId等于传过来的id,则该节点为子节点
for (PermissionTreeDto permission : allList) {
if (permission.getParentID() != null && permission.getParentID().equals(id)) {
childList.add(permission);
}
}
//递归设置子节点的子节点
for (PermissionTreeDto permission : childList) {
permission.setChildren(getChildren(permission.getId(), allList));
}
//如果没有子节点则返回空集合
if (childList.size() == 0) {
return new ArrayList<>();
}
return childList;
}
}
获取权限接口
@PostMapping("/getAppPermission")
List<BasePermission> allPermissionList = permissionService.getAllByPermType();
//实体转换
List<PermissionTreeDto> adminPermissionList = BeanConvertUtil.copyListProperties(allPermissionList, PermissionTreeDto::new);
//生成权限树
List<PermissionTreeDto> permissionTree = PermissionTreeUtil.setPermissionTree(adminPermissionList);
return ResultModel.success(permissionTree);
}
结果可以看到生成了多层级的权限树