查询接口 - 树形菜单查询接口实现

该博客详细介绍了如何通过Controller、Service及ServiceImpl实现返回分类的树形菜单API。主要涉及利用Stream对数据进行处理,根据分类名称进行过滤、排序,并使用TreeUtil构建树结构。在分类名称不为空时,返回非树结构的列表;反之,构建完整的树形结构并返回。
摘要由CSDN通过智能技术生成

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{
[
{
视频[
{
电影[
{恐怖片},
{战争片}
]
},
{
电视剧[
{爱情},
{戏剧}
]
},
{
动漫[
{爱情},
{戏剧}
]
}
]
}
]
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Whitemeen太白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值