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

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

查询标签列表接口的实现


查询标签列表接口的需求

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

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

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

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

代码实现

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

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

@GetMapping
@SystemLog(businessName = "分页查询标签列表")
@ApiOperation(value = "分页查询标签列表", notes = "获取标签列表", response = TagVo.class, responseContainer = "List")
public ResponseResult<PageVo> tagList(Integer pageNum, Integer pageSize, TagDto tagDto)
{
return tagService.tagList(pageNum, pageSize, tagDto);
}
}


创建TagDto

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

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

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

@ApiModelProperty(value = "备注", example = "Java相关技术文章")
private String remark;

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

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

然后在TagServiceImpl写接口的功能

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
//后台获取标签列表
@Override
public ResponseResult<PageVo> tagList(Integer pageNum, Integer pageSize, TagDto tagDto)
{
//分页查询
LambdaQueryWrapper<Tag> tagWrapper = new LambdaQueryWrapper<>();
//通过keywords进行模糊搜索标签名称
tagWrapper.like(StringUtils.hasText(tagDto.getKeywords()), Tag::getName, tagDto.getKeywords());
tagWrapper.eq(Tag::getDelFlag, SystemConstants.NOT_DELETED);
tagWrapper.orderByDesc(Tag::getCreateTime);

Page<Tag> page = new Page<>();
page.setCurrent(pageNum);
page.setSize(pageSize);
page(page, tagWrapper);

//获取所有标签ID
List<Long> tagIds = page.getRecords().stream()
.map(Tag::getId)
.collect(Collectors.toList());

//统计每个标签关联的文章数量
Map<Long, Long> tagArticleCountMap;
if (!tagIds.isEmpty()) {
LambdaQueryWrapper<ArticleTag> articleTagWrapper = new LambdaQueryWrapper<>();
articleTagWrapper.in(ArticleTag::getTagId, tagIds);
List<ArticleTag> articleTagList = articleTagMapper.selectList(articleTagWrapper);

tagArticleCountMap = articleTagList.stream()
.collect(Collectors.groupingBy(ArticleTag::getTagId, Collectors.counting()));
} else {
tagArticleCountMap = Map.of();
}

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

//封装成PageVo返回
PageVo pageVo = new PageVo(tagVoList, page.getTotal());
return ResponseResult.okResult(pageVo);
}

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


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



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

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


预告

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

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

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


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


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