项目需要树状展示目录,hutool还是比较好用的,例子记录一下
// 从Dir_INFO表中查出所有的数据
List<DirInfo> fileCategoryDOS = DirInfoRepository.findAll();
// 统计父节点下子节点数量
Map<String, Long> parentCount = fileCategoryDOS.stream().collect(Collectors.groupingBy(DirInfo::getCParentId, Collectors.counting()));
// 构建node列表List<TreeNode<String>> nodeList = CollUtil.newArrayList();
// 构建node列表
List<TreeNode<String>> collect = fileCategoryDOS.stream().map(fileCategoryDO -> {
//自定义返回属性
Map<String, Object> map = new HashMap<>();
//层级
map.put("level", fileCategoryDO.getCDirLevel());
//前端tree显示名称
map.put("label", fileCategoryDO.getCDirName());
//判断是否为叶子节点
map.put("leaf", !parentCount.containsKey(fileCategoryDO.getCDirId()));
//把tree显示需要的属性添加到TreeNode中
TreeNode<String> treeNode = new TreeNode<String>().setId(fileCategoryDO.getCDirId())
.setName(fileCategoryDO.getCDirName())
.setParentId(fileCategoryDO.getCParentId())
.setWeight(fileCategoryDO.getCDirSort())
.setExtra(map);
return treeNode;
}).collect(Collectors.toList());
//配置
TreeNodeConfig treeNodeConfig = new TreeNodeConfig();
// 自定义属性名 都要默认值的
treeNodeConfig.setWeightKey("orderNum");
treeNodeConfig.setIdKey("id");
treeNodeConfig.setChildrenKey("children");
// 最大递归深度
treeNodeConfig.setDeep(10);
//转换器 转换成树状结构
List<Tree<String>> treeNodes = TreeUtil.build(collect, "0", treeNodeConfig,
(treeNode, tree) -> {
tree.setId(treeNode.getId());
tree.setParentId(treeNode.getParentId());
tree.setWeight(treeNode.getWeight());
tree.setName(treeNode.getName());
// 层级
tree.putExtra("level", treeNode.getExtra().getOrDefault("level", null));
// 是否叶子节点
tree.putExtra("leaf", treeNode.getExtra().getOrDefault("leaf", null));
// 目录名称
tree.putExtra("label", treeNode.getExtra().getOrDefault("label", null));
// tree.putExtra("gmt_create", treeNode.getExtra().getOrDefault("gmt_create", null));
});
return treeNodes;