『博客开发日记』之标签列表接口的实现

本文最后更新于 2026年3月22日 下午

标签列表接口


标签列表接口需求

一篇文章可以对应多个标签

展示的标签对应的文章要是已发布的

代码实现

因为一篇文章中可能对应多个标签,所以要创建应该文章标签表


然后有自动化生成插件生成必要的类与接口,这里不做展示

编写服务类中的功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
/**
* 标签表(Tag)表服务实现类
*
* @author makejava
* @since 2026-03-22 10:50:19
*/
@Service("tagService")
public class TagServiceImpl extends ServiceImpl<TagMapper, Tag> implements TagService
{

@Autowired
private ArticleService articleService;

@Autowired
private ArticleTagMapper articleTagMapper;

@Override
public ResponseResult getTagList()
{
//先去查询文章表状态为已发布的
LambdaQueryWrapper<Article> articleWrapper = new LambdaQueryWrapper<>();
articleWrapper.eq(Article::getStatus, SystemConstants.ARTICLE_STATUS_NORMAL);
List<Article> articleList = articleService.list(articleWrapper);

//获取已发布文章的ID集合
Set<Long> articleIds = articleList.stream()
.map(Article::getId)
.collect(Collectors.toSet());

//查询这些文章关联的标签
LambdaQueryWrapper<ArticleTag> articleTagWrapper = new LambdaQueryWrapper<>();
if (!articleIds.isEmpty()) {
articleTagWrapper.in(ArticleTag::getArticleId, articleIds);
} else {
//没有已发布文章时返回空结果
articleTagWrapper.eq(ArticleTag::getArticleId, -1L);
}
List<ArticleTag> articleTagList = articleTagMapper.selectList(articleTagWrapper);

//获取标签ID集合并去重
Set<Long> tagIds = articleTagList.stream()
.map(ArticleTag::getTagId)
.collect(Collectors.toSet());

//统计每个标签关联的文章数量
Map<Long, Long> tagArticleCountMap = articleTagList.stream()
.collect(Collectors.groupingBy(ArticleTag::getTagId, Collectors.counting()));

//查询标签详细信息
LambdaQueryWrapper<Tag> tagWrapper = new LambdaQueryWrapper<>();
if (!tagIds.isEmpty()) {
tagWrapper.in(Tag::getId, tagIds);
} else {
//没有标签时返回空结果
tagWrapper.eq(Tag::getId, -1L);
}
tagWrapper.eq(Tag::getDelFlag, SystemConstants.NOT_DELETED);
List<Tag> tagList = list(tagWrapper);

//转换为TagVo并设置文章数量
List<TagVo> tagVoList = tagList.stream()
.map(tag -> {
TagVo tagVo = BeanCopyUtils.copyBean(tag, TagVo.class);
tagVo.setArticleCount(tagArticleCountMap.getOrDefault(tag.getId(), 0L).intValue());
return tagVo;
})
.collect(Collectors.toList());

return ResponseResult.okResult(tagVoList);
}
}




PS:该系列只做为作者学习开发项目做的笔记用

不一定符合读者来学习,仅供参考


预告

后续会记录博客的开发过程

每次学习会做一份笔记来进行发表

“一花一世界,一叶一菩提”


版权所有 © 2025 云梦泽
欢迎访问我的个人网站:https://hgt12.github.io/


『博客开发日记』之标签列表接口的实现
http://example.com/2026/03/22/『博客开发日记』之标签列表接口的实现/
作者
云梦泽
发布于
2026年3月22日
更新于
2026年3月22日
许可协议