『博客开发日记』之归档接口的实现

本文最后更新于 2026年2月10日 下午

归档接口的实现


归档接口的需求

要按分页需求

要按年月来进行分类

代码实现

创建ArchiveController添加相关接口方法

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
//归档接口
@RestController
@RequestMapping("/archive")
@Api(tags = "归档", description = "归档相关接口")
public class ArchiveController
{
@Autowired
private ArchiveService archiveService;

/**
* 获取归档列表(按年月分组)
*/
@SystemLog(businessName = "查询归档列表")
@GetMapping("/getArchiveList")
@ApiOperation(value = "归档列表", notes = "获取归档列表(按年月分组)")
public ResponseResult getArchiveList() {
return archiveService.getArchiveList();
}

/**
* 按年份、月份获取文章
*/
@SystemLog(businessName = "根据年月查询文章列表")
@GetMapping("/{year}/{month}")
@ApiOperation(value = "根据年月获取文章列表", notes = "根据年月获取该月的文章列表")
@ApiImplicitParams({
@ApiImplicitParam(name = "year",value = "年份"),
@ApiImplicitParam(name = "month",value = "月份"),
@ApiImplicitParam(name = "pageNum",value = "页号"),
@ApiImplicitParam(name = "pageSize",value = "每页数量")
})
public ResponseResult getArticlesByYearMonth(
@PathVariable("year") Integer year,
@PathVariable("month") Integer month,
@RequestParam Integer pageNum,
@RequestParam(defaultValue = "10") Integer pageSize) {
return archiveService.getArticlesByYearMonth(year, month, pageNum, pageSize);
}
}

创建ArchiveServiceImpl类,实现业务

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
73
74
75
76
77
78
79
80
81
82
@Service
public class ArchiveServiceImpl implements ArchiveService
{

@Autowired
private ArticleMapper articleMapper;

@Override
public ResponseResult getArchiveList()
{
// 查询所有已发布的文章,按创建时间倒序
LambdaQueryWrapper<Article> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(Article::getStatus, SystemConstants.ARTICLE_STATUS_NORMAL)
.eq(Article::getDelFlag, SystemConstants.NOT_DELETED)
.orderByDesc(Article::getCreateTime);

List<Article> articles = articleMapper.selectList(queryWrapper);

// 按年月分组
Map<String, List<Article>> groupedArticles = articles.stream()
.collect(Collectors.groupingBy(article -> {
Calendar calendar = Calendar.getInstance();
calendar.setTime(article.getCreateTime());
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH) + 1;
return year + "-" + month;
}, LinkedHashMap::new, Collectors.toList()));

// 转换为 ArchiveVo
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
List<ArchiveVo> archiveVos = groupedArticles.entrySet().stream()
.map(entry -> {
String[] yearMonth = entry.getKey().split("-");
Integer year = Integer.parseInt(yearMonth[0]);
Integer month = Integer.parseInt(yearMonth[1]);

List<ArchiveArticleVo> articleVos = entry.getValue().stream()
.map(article -> new ArchiveArticleVo(
article.getId(),
article.getTitle(),
sdf.format(article.getCreateTime())
))
.collect(Collectors.toList());

return new ArchiveVo(year, month, articleVos.size(), articleVos);
})
.collect(Collectors.toList());

return ResponseResult.okResult(archiveVos);
}

@Override
public ResponseResult getArticlesByYearMonth(Integer year, Integer month, Integer pageNum, Integer pageSize)
{
// 构建查询条件
LambdaQueryWrapper<Article> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(Article::getStatus, SystemConstants.ARTICLE_STATUS_NORMAL)
.eq(Article::getDelFlag, SystemConstants.NOT_DELETED)
.apply("YEAR(create_time) = {0}", year)
.apply("MONTH(create_time) = {0}", month)
.orderByDesc(Article::getCreateTime);

// 分页查询
Page<Article> page = new Page<>(pageNum, pageSize);
articleMapper.selectPage(page, queryWrapper);

// 转换为 VO
List<ArchiveArticleVo> articleVos = page.getRecords().stream()
.map(article -> {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return new ArchiveArticleVo(
article.getId(),
article.getTitle(),
sdf.format(article.getCreateTime())
);
})
.collect(Collectors.toList());

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

创建ArchiveArticleVo


创建创建ArchiveArticleVo



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

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


预告

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

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

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


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


『博客开发日记』之归档接口的实现
http://example.com/2026/02/10/『博客开发日记』之归档接口的实现/
作者
云梦泽
发布于
2026年2月10日
更新于
2026年2月10日
许可协议