课程名称:Spring Cloud+ Vue前后端分离开发企业级在线视频系统
课程章节:第12章 通用权限设计
讲师姓名:甲蛙老师
课程内容:
资源配置管理:在写项目的权限管理模块、用户系统的时候经常碰见类似的树结构我们一般习惯称之为权限树。
课程收获:
按照一定的规则从数据库中取值,返回给前端的树形空间zTree。数据库中存储的资源的id是按照位数排序,如图所示。
之前说到反复的去数据库获取数据会让网络开销变大,所以我们应该一次性将所有需要的权限数据全部取出(有的时候是取出全部的数据,有时取得某个角色的权限数据),将取到数据放入一个list中,之后再进行数据处理。
/**
* 按约定将列表转成树
* 要求:ID要正序排列
* @return
*/
public List<ResourceDto> loadTree() {
ResourceExample example = new ResourceExample();
example.setOrderByClause("id asc");
List<Resource> resourceList = resourceMapper.selectByExample(example);
List<ResourceDto> resourceDtoList = CopyUtil.copyList(resourceList, ResourceDto.class);
for (int i = resourceDtoList.size() - 1; i >= 0; i--) {
// 当前要移动的记录
ResourceDto child = resourceDtoList.get(i);
// 如果当前节点没有父节点,则不用往下了
if (StringUtils.isEmpty(child.getParent())) {
continue;
}
// 查找父节点
for (int j = i - 1; j >= 0; j--) {
ResourceDto parent = resourceDtoList.get(j);
if (child.getParent().equals(parent.getId())) {
if (CollectionUtils.isEmpty(parent.getChildren())) {
parent.setChildren(new ArrayList<>());
}
// 添加到最前面,否则会变成倒序,因为循环是从后往前循环的
parent.getChildren().add(0, child);
// 子节点找到父节点后,删除列表中的子节点
resourceDtoList.remove(child);
}
}
}
return resourceDtoList;
}
小知识:如果要一边循环list,一边删除list中的对象,可以使用倒序循环。例如本节的资源树