controller
/**
* 返回分类的树形菜单
*
* @param categoryName 分类名称(查询条件)
* @return 返回分类的树形菜单
*/
@ApiOperation(value = "返回分类的树形菜单", notes = "返回分类的树形菜单")
@GetMapping("/tree")
public R<List<Tree<Long>>> getTree(String categoryName) {
return (R.ok(appsCategoryService.selectTree(categoryName)));
}
service
/**
* 获取分类的树形菜单
*
* @param categoryName 分类名称(查询条件)
* @return 分类的树形菜单
*/
List<Tree<Long>> selectTree(String categoryName);
serviceImpl
/**
* 获取分类的树形菜单
*
* @param categoryName 分类名称(查询条件)
* @return 分类的树形菜单
*/
@Override
public List<Tree<Long>> selectTree(String categoryName) {
// 查询全部分类
List<AppsCategory> appsCategoryAllList = appsCategoryMapper.selectList(Wrappers.<AppsCategory>lambdaQuery()
.like(StringUtils.isNotBlank(categoryName),AppsCategory::getCategoryName, categoryName));
// 设置treeNode并收集到list中
List<TreeNode<Long>> collect = appsCategoryAllList.stream()
.filter(category -> category.getId().intValue() != category.getParentId())
.sorted(Comparator.comparingInt(AppsCategory::getRankWeight))
.map(category -> {
TreeNode<Long> treeNode = new TreeNode<>();
// 设置treeNode的id
treeNode.setId(category.getId());
// 设置treeNode父级id,据此构建树结构
treeNode.setParentId(category.getParentId());
treeNode.setName(category.getCategoryName());
// 设置treeNode排序依据字段
treeNode.setWeight(category.getRankWeight());
// 设置treeNode额外信息
Map<String, Object> extra = new HashMap<>(8);
extra.put("remark", category.getRemark());
extra.put("createTime", category.getCreateTime());
treeNode.setExtra(extra);
// 返回treeNode到stream流中
return treeNode;
// collect容器收集stream流中的treeNode组装成list
}).collect(Collectors.toList());
// 1.当分类名称不为空时(查询条件不为空),进行模糊查询 不组装树结构 直接返回 list方便编辑
if (StrUtil.isNotBlank(categoryName)) {
// 将treeNode直接拷贝放入到tree中,不根据treeNode的层级关系组装成树结构
return collect.stream().map(node -> {
Tree<Long> tree = new Tree<>();
// 将collect容器中的treeNode的额外信息放入tree中(根据treeNode的id放入对应节点)
tree.putAll(node.getExtra());
// 将treeNode节点基本信息拷贝到tree中(根据treeNode的id放入对应节点)
BeanUtils.copyProperties(node, tree);
// 返回tree到stream流中
return tree;
// collect容器收集stream流中的tree组装成list
}).collect(Collectors.toList());
}
// 2.当分类名称为空时(查询条件为空),进行查询所有 组装成树结构 并返回
// 根据parentId=0L作为树的root节点,对collect中的多个子树进行树的构建 并返回
return TreeUtil.build(collect, 0L);
}
tree{
[
{
视频[
{
电影[
{恐怖片},
{战争片}
]
},
{
电视剧[
{爱情},
{戏剧}
]
},
{
动漫[
{爱情},
{戏剧}
]
}
]
}
]
}