基于SpringBoot + Vue的个人博客系统05——时间线接口

た 入场券 2022-12-02 01:05 180阅读 0赞

简介

博客一般都会有一个时间线,本篇介绍时间线接口的实现

代码实现

1、开发时间线功能之前,我们先将数据库中的文章时间打乱,这样的话按照年份汇总会显得比较均匀

  1. package pers.qianyucc.qblog.service;
  2. import cn.hutool.core.util.*;
  3. import lombok.extern.slf4j.*;
  4. import org.junit.*;
  5. import org.junit.runner.*;
  6. import org.springframework.beans.factory.annotation.*;
  7. import org.springframework.boot.test.context.*;
  8. import org.springframework.test.context.junit4.*;
  9. import pers.qianyucc.qblog.*;
  10. import pers.qianyucc.qblog.dao.*;
  11. import pers.qianyucc.qblog.model.entity.*;
  12. import java.time.*;
  13. import java.util.*;
  14. @Slf4j
  15. @RunWith(SpringRunner.class)
  16. @SpringBootTest(classes = { BlogApplication.class})
  17. public class ArticleServiceTest {
  18. @Autowired
  19. private ArticleMapper articleMapper;
  20. @Test
  21. public void solveTime() {
  22. List<ArticlePO> articles = articleMapper.selectList(null);
  23. for (int i = 0; i < articles.size(); i++) {
  24. ArticlePO po = articles.get(i);
  25. LocalDateTime dateTime = LocalDateTime.now().plusYears(RandomUtil.randomInt(-5, 5));
  26. long epochMilli = dateTime.toInstant(ZoneOffset.UTC).toEpochMilli();
  27. po.setGmtCreate(epochMilli);
  28. po.setGmtUpdate(epochMilli);
  29. articleMapper.updateById(po);
  30. }
  31. }
  32. }

说明:

  • 先查出所有数据,将创建时间和更新时间上下浮动5年,再写回数据库

2、创建视图层类

  1. package pers.qianyucc.qblog.model.vo;
  2. import lombok.*;
  3. import java.util.*;
  4. @Data
  5. @Builder
  6. public class TimelineVO {
  7. private String year;
  8. private List<Item> items;
  9. @Data
  10. @Builder
  11. public static class Item {
  12. private String id;
  13. private String gmtCreate;
  14. private String title;
  15. }
  16. }

说明:

  • 时间线可以按照月份汇总,也可以按照年份汇总,这里按照年份汇总
  • 因为要实现点击时间线的标题跳转到对应文章的功能,所以这里连同文章 id 一并返回给前端

3、在 ArticleService 中实现时间线逻辑

  1. public List<TimelineVO> timeline() {
  2. ArrayList<TimelineVO> res = new ArrayList<>();
  3. QueryWrapper<ArticlePO> wrapper = new QueryWrapper<>();
  4. wrapper.select("id", "title", "gmt_create");
  5. List<Map<String, Object>> maps = articleMapper.selectMaps(wrapper);
  6. maps.stream().map(m -> TimelineVO.Item.builder()
  7. .id((String) m.get("id"))
  8. .gmtCreate(BlogUtils.formatDate((Long) m.get("gmt_create")))
  9. .title((String) m.get("title"))
  10. .build())
  11. .collect(Collectors.groupingBy(item -> {
  12. String[] arr = item.getGmtCreate().split("-");
  13. String year = arr[0];
  14. return year;
  15. })).forEach((k, v) -> res.add(TimelineVO.builder().year(k).items(v).build()));
  16. res.sort(Comparator.comparing(TimelineVO::getYear).reversed());
  17. // log.info("timeline list : {}", JSONUtil.toJsonStr(res));
  18. return res;
  19. }

说明:上面代码主要可分为以下几个步骤

  1. 将查询到的 Map 转换为 Item(TimelineVO 的内部类) 对象
  2. 从 item 对象的 gmtCreate 属性中获取年份,根据年份分组
  3. 遍历每个分组,创建 TimelineVO 对象,加入集合

4、在 ArticleController 中新建接口

  1. @GetMapping("/timeline")
  2. @ApiOperation("获取文章时间线")
  3. public Results<List<TimelineVO>> getTimeline() {
  4. List<TimelineVO> timeline = articleService.timeline();
  5. return Results.ok(timeline);
  6. }

5、使用 knife4j 测试

测试结果

参考代码:https://gitee.com/qianyucc/QBlog2/tree/v-8.0

发表评论

表情:
评论列表 (有 0 条评论,180人围观)

还没有评论,来说两句吧...

相关阅读