『博客开发日记-后台』之获取标签列表接口的实现

本文最后更新于 2026年4月22日 晚上

获取标签列表接口的实现


获取标签列表接口的需求

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

要根据标签名进行分页查询

不能将已经删除的标签查出来

根据标签查出该标签下有多少篇文章

代码实现

由于这是关于后台的tag接口,所以要在后台项目中创建一个TagController

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//标签相关接口
@RestController
@RequestMapping("/tags")
@Api(tags = "标签", description = "文章标签相关接口")
public class TagController
{
@Autowired
private TagService tagService;

@GetMapping
@SystemLog(businessName = "后台分页查询标签列表")
@ApiOperation(value = "标签列表", notes = "分页查询标签列表", response = TagVo.class, responseContainer = "List")
@ApiImplicitParams({
@ApiImplicitParam(name = "pageNum", value = "页号", dataType = "int", paramType = "query"),
@ApiImplicitParam(name = "pageSize", value = "每页数量", dataType = "int", paramType = "query"),
@ApiImplicitParam(name = "keywords", value = "关键字(标签名称)", dataType = "string", paramType = "query")
})
public ResponseResult<PageVo> tagList(Integer pageNum, Integer pageSize, TagListDto tagListDto)
{
return adminTagService.tagList(pageNum, pageSize, tagListDto);
}
}


创建TagDto

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
* 标签操作请求DTO
*/
@Data
@ApiModel(description = "标签操作请求对象")
public class TagListDto {

@ApiModelProperty(value = "标签ID(更新时必填)", example = "1")
private Long id;

@ApiModelProperty(value = "标签名称", required = true, example = "Java")
private String name;

@ApiModelProperty(value = "标签ID列表", required = true, example = "[1,2,3]")
private List<Long> ids;

@ApiModelProperty(value = "关键字(用于模糊搜索标签名称)", example = "Vue")
private String keywords;
}

然后创建AdminTagServiceImpl在里面写接口的功能

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
//获取标签列表
@Override
public ResponseResult tagList(Integer pageNum, Integer pageSize, TagListDto tagListDto)
{
//构建标签查询条件
LambdaQueryWrapper<Tag> tagQueryWrapper = new LambdaQueryWrapper<>();

//根据关键字模糊查询标签名称
if (StringUtils.hasText(tagListDto.getKeywords())) {
tagQueryWrapper.like(Tag::getName, tagListDto.getKeywords());
}

//只查询未删除的标签
tagQueryWrapper.eq(Tag::getDelFlag, SystemConstants.NOT_DELETED);

//根据状态筛选
if (StringUtils.hasText(tagListDto.getStatus())) {
tagQueryWrapper.eq(Tag::getStatus, tagListDto.getStatus());
}

//先以排序序号升序排序和序号相同时按创建时间降序排序
tagQueryWrapper.orderByAsc(Tag::getSort)
.orderByDesc(Tag::getCreateTime);

//分页查询
Page<Tag> page = new Page<>(pageNum, pageSize);
tagService.page(page, tagQueryWrapper);

//查询所有未删除的文章
LambdaQueryWrapper<Article> articleQueryWrapper = new LambdaQueryWrapper<>();
articleQueryWrapper.eq(Article::getDelFlag, SystemConstants.NOT_DELETED)
.select(Article::getId);
List<Article> validArticles = articleService.list(articleQueryWrapper);
Set<Long> validArticleIds = validArticles.stream()
.map(Article::getId)
.collect(Collectors.toSet());

//查询所有文章标签关联关系
List<ArticleTag> articleTagList = articleTagMapper.selectList(null);

//统计每个标签关联的未删除的文章数量
Map<Long, Long> tagArticleCountMap = articleTagList.stream()
.filter(articleTag -> validArticleIds.contains(articleTag.getArticleId()))
.collect(Collectors.groupingBy(ArticleTag::getTagId, Collectors.counting()));

//封装查询结果为Vo并设置文章数量
List<AdminTagListVo> tagListVos = page.getRecords().stream()
.map(tag -> {
AdminTagListVo tagListVo = BeanCopyUtils.copyBean(tag, AdminTagListVo.class);
tagListVo.setArticleCount(tagArticleCountMap.getOrDefault(tag.getId(), 0L).intValue());
return tagListVo;
})
.collect(Collectors.toList());

PageVo pageVo = new PageVo(tagListVos, page.getTotal());
return ResponseResult.okResult(pageVo);
}

需要注意的是,由于前端需要接收标签的创建时间,所以要在TagVo里添加创建日期的参数


这样关于标签的分页查询接口基本就实现了



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

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


预告

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

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

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


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


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