//基础类树形结构返回对象
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class TreeBOClass extends ClassDO {
List<TreeBOClass> children;
public void addChild(TreeBOClass treeBOClass) {
children.add(treeBOClass);
}
}
//对象基础类
@TableName("****")
@KeySequence("****") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ClassDO extends BaseDO {
/**
* id
*/
@TableId
private Long id;
/**
* 父栏目id
*/
private Long parentId;
/**
* 名称
*/
private String categoryName;
/**
* 显示顺序
*/
private Integer orderNum;
/**
* 状态:0正常 1停用
*/
private Integer status;
}
Controller:
@GetMapping("/list-tree")
@Operation(summary = "获取树形列表")
@Parameter(name = "parentId", description = "父级id", example = "1024")
@PreAuthorize("@ss.hasPermission('sys:list-tree')")
public CommonResult<List<TreeBOClass>> getTreeList(Long parentId) {
return success(classDOService.getTreeList(parentId));
}
service:
//获取目录树形结构集合
public List<TreeBOClass> getClassTreeList(Long parentId) {
List<TreeBOClass> list = new ArrayList<>();
List<TreeBOClass> treeList = getTreeDirectory(parentId);
if (treeList == null) {
return null;
}
TreeBOClass treeBOClass;
for (TreeBOClass treeBO : treeList) {
treeBOClass = packageDirectory(treeBO, Objects.nonNull(parentId) ? parentId : ParentEnum.ROOT.getParentId());
list.add(treeBOClass);
}
return list;
}
private TreeBOClass packageDirectory(TreeBOClass parentBO, Long parentId) {
TreeBOClass newParentBO = BeanUtils.toBean(parentBO, TreeBOClass.class);
newParentBO.setParentId(parentId);
newParentBO.setChildren(new ArrayList<>());
// 递归复制子节点
TreeBOClass newChildBO;
for (TreeBOClass childBO : parentBO.getChildren()) {
newChildBO = getDirectory(childBO, childBO.getParentId());
newParentBO.addChild(newChildBO);
}
return newParentBO;
}
private List<TreeBOClass> getTreeDirectory(Long parentId) {
List<ClassDO> classDOList = classDOMapper.selectList(new LambdaQueryWrapper<ClassDO>()
.eq(ClassDO::getStatus, CommonStatusEnum.ENABLE.getStatus())
.eq(Objects.nonNull(parentId), OpenCategoryDO::getParentId, parentId)
.orderByAsc(ClassDO::getOrderNum));
Map<Long, List<TreeBOClass>> parentIdMap = new HashMap<>(16);
List<TreeBOClass> treeList = new ArrayList<>();
List<TreeBOClass> treeBOList;
TreeBOClass treeBO;
for (ClassDO classDO : classDOList) {
treeBO = BeanUtils.toBean(classDO, TreeBOClass.class);
treeList.add(treeBO);
Long treeParentId = classDO.getParentId();
if (parentIdMap.containsKey(treeParentId)) {
treeBOList = parentIdMap.get(treeParentId);
treeBOList.add(treeBO);
} else {
treeBOList = new ArrayList<>();
treeBOList.add(treeBO);
parentIdMap.put(treeParentId, treeBOList);
}
}
// 设置子集
List<TreeBOClass> children;
for (TreeBOClass treeBO : treeList) {
children = parentIdMap.get(treeBO.getId());
if (children == null) {
treeBO.setChildren(new ArrayList<>());
} else {
treeBO.setChildren(children);
}
}
// 返回顶端数据
return parentIdMap.get(Objects.nonNull(parentId) ? parentId : ParentEnum.ROOT.getParentId());
}