项目要求需要用到树形菜单,直接通过查表构建。
附下表:
菜单用parent_id来进行分级。上代码
// 先查出所有的公共文件目录
List<ArchiveNetDisc> andList = archiveNetDiscMapper.findShareTree();
List<ArchiveNetDisc> archiveNetDiscList = buildDeptTree(andList);
findShareTree是查出所有的目录,省的频繁查库,没有做排序分级,buildDeptTree是分级操作。
public List<ArchiveNetDisc> buildDeptTree(List<ArchiveNetDisc> depts) {
List<ArchiveNetDisc> deptList = new ArrayList<>();
List<Long> deptIdList = new ArrayList<>();
for (ArchiveNetDisc dept : depts) {
deptIdList.add(dept.getId());
}
for (ArchiveNetDisc dept : depts) {
// 如果是顶级节点,遍历该父节点所有子节点
// if (!deptIdList.contains(dept.getParentId())) {
if (ObjectUtil.isNull(dept.getParentId())) {
recursionFn(depts, dept);
deptList.add(dept);
}
}
if (deptList.isEmpty()) {
deptList = depts;
}
return deptList;
}
因为我的最高目录的parent_id是null,所以这里用ObjectUtil.isNull()进行判断。recursionFn是递归列表 ,结束条件为所遍历的节点无下一级节点。
private void recursionFn(List<ArchiveNetDisc> list, ArchiveNetDisc dept) {
// 得到子节点列表
List<ArchiveNetDisc> childList = getChildList(list, dept);
dept.setChildren(childList);
for (ArchiveNetDisc tChild : childList) {
// 如果子节点有下一级节点,得到下一级的节点列表
if (hasChild(list, tChild)) {
recursionFn(list, tChild);
}
}
}
getChildList是获得该节点的下一级子节点列表。hasChild是判断是否有子节点,也就是重新走了一遍getChildList。
private List<ArchiveNetDisc> getChildList(List<ArchiveNetDisc> list, ArchiveNetDisc dept) {
List<ArchiveNetDisc> deptList = new ArrayList<>();
for (ArchiveNetDisc d : list) {
// 遍历非顶级节点,并获得传入参数顶级节点的下一级子节点列表
if (d.getParentId() != null && d.getParentId() == dept.getId().longValue()) {
deptList.add(d);
}
}
return deptList;
}
private boolean hasChild(List<ArchiveNetDisc> list, ArchiveNetDisc dept) {
return getChildList(list, dept).size() > 0;
}