背景:
三級樹實現效果
這里只介紹,查詢數據庫,構建三級目錄的后端業務邏輯
1.創建查詢類(對應數據庫需要查出的字段)
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ColumnTree {
private Integer value; //當前標簽的id
private String label;
private Integer parentId;//當前標簽的父id
private List<ColumnTree> children = new ArrayList<>();//遞歸思想,這個屬性將作為子級目錄
}
2.service層的業務邏輯
public GlobalResponse findColumnsTree() {
//先查詢出數據所有的標簽數據列表
List<ColumnTree> columnTrees = columnMapper.selectTreeInfo();
//判斷是否有數據
if (CollectionUtils.isNotEmpty(columnTrees)) {
// 過濾所有的一級目錄,父id為0
List<ColumnTree> firstColumn = columnTrees.stream().filter(c -> c.getParentId().toString().equals("0")).collect(Collectors.toList());
//查出非一級目錄,按照其父id分類
Map<Integer, List<ColumnTree>> collect = columnTrees.stream().filter(c -> !(c.getParentId().toString().equals("0"))).collect(Collectors.groupingBy(ColumnTree::getParentId));
//遍歷一級目錄
firstColumn.forEach(a -> {
//如果一級目錄的id中是否包含非一級目錄的父id
if (collect.get(a.getValue()) == null) {
//沒有,說明不是該一級目錄沒有下一級目錄,則將其子目錄設為空
a.setChildren(new ArrayList<>());
} else {
//有,則說明有二級目錄,將二級目錄的的List集合,賦給子目錄
a.setChildren(collect.get(a.getValue()));
//構建三級樹
//遍歷二級目錄,判斷是否含有三級目錄
collect.get(a.getValue()).forEach(b -> {
if (collect.get(b.getValue()) == null) {
//沒有,將二級目錄下的三級目錄設為空
b.setChildren(new ArrayList<>());
} else {
//有,將三級目錄的List集合,賦給三級目錄
b.setChildren(collect.get(b.getValue()));
}
});
}
});
//將firstColumn返回,前端可以通過遍歷獲取各級目錄的數據從而形成三級樹的效果
return GlobalResponse.success(firstColumn);
} else {
return GlobalResponse.success(new ArrayList<>());
}
}