『博客开发日记』之分页查询文章列表的实现

本文最后更新于 2025年12月6日 下午

分页查询文章列表的实现


分页查询文章列表的需求

在首页和分类页面都需要查询文章列表

首页:查询所有的文章

分类页面:查询对应分类下的文章

要求:

①只能查询正式发布的文章

②置顶的文章要显示在最前面

接口设计

要展示的字段有:标题,发布时间(预留最后更新时间),浏览量,文章的摘要,文章的缩略图,分类标签,文章id,分类id,页码,每页大小,total(总记录数,方面页面根据其判断是否请求传递下一页)等

然后创建接口


业务逻辑在ArticleServiceImpl中写

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
 //分页查询文章列表
@Override
public ResponseResult articleList(Integer pageNum, Integer pageSize, Long categoryId) {
//查询条件
LambdaQueryWrapper<Article> lambdaQueryWrapper = new LambdaQueryWrapper<>();
//如果有categoryId,就要求查询时要和从传入的categoryId相同,如果没有则不需要进行判断
lambdaQueryWrapper.eq(Objects.nonNull(categoryId) && categoryId > 0, Article::getCategoryId, categoryId);

//状态是正式发布的
lambdaQueryWrapper.eq(Article::getStatus, SystemConstants.ARTICLE_STATUS_NORMAL);
//置顶的文章要放在前面,isTop进行降序排序
lambdaQueryWrapper.orderByDesc(Article::getIsTop);
//分页查询
Page<Article> page = new Page<>(pageNum, pageSize);
page(page, lambdaQueryWrapper);

//查询categoryName
List<Article> articles = page.getRecords();
//stream流方式查询(方法1简化版)
articles.stream()
.map(article -> article.setCategoryName(categoryService.getById(article.getCategoryId()).getName()))
.collect(Collectors.toList());

//stream流方式查询(方法1)
// articles.stream()
// .map(new Function<Article, Article>() {
// @Override
// public Article apply(Article article) {
// //获取分类id,查询分类信息,获取分类名称
// Category category = categoryService.getById(article.getCategoryId());
// String name = category.getName();
// //把分类名称设置给articles
// article.setCategoryName(name);
// return article;
// }
// });

//for循环方式查询
// //再通过articleId去查询articleName
// for (Article article : articles) {
// Category category = categoryService.getById(article.getCategoryId());
// article.setCategoryName(category.getName());
// }

//封装查询结果为Vo
List<ArticleListVo> articleListVos = BeanCopyUtils.copyBeanList(page.getRecords(), ArticleListVo.class);

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

封装ArticleListVo,与PageVo



调试接口成功


配置分页拦截器来实现分页功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//分页配置类
@Configuration
public class PaginationConfig
{
/**
* 3.4.0之后版本
* @return
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){
MybatisPlusInterceptor mybatisPlusInterceptor = new
MybatisPlusInterceptor();
mybatisPlusInterceptor.addInnerInterceptor(new
PaginationInnerInterceptor());
return mybatisPlusInterceptor;
}
}

对FastJson进行配置

该配置写在WebConfig类里面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//对FastJson进行配置
@Bean//使用@Bean注入fastJsonHttpMessageConvert
public HttpMessageConverter fastJsonHttpMessageConverters() {
//1.需要定义一个Convert转换消息的对象
FastJsonHttpMessageConverter fastConverter = new
FastJsonHttpMessageConverter();
FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss");//有关时间格式的配置
SerializeConfig.globalInstance.put(Long.class,
ToStringSerializer.instance);
fastJsonConfig.setSerializeConfig(SerializeConfig.globalInstance);
fastConverter.setFastJsonConfig(fastJsonConfig);
HttpMessageConverter<?> converter = fastConverter;
return converter;
}

@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(fastJsonHttpMessageConverters());
}

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

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


预告

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

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

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


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


『博客开发日记』之分页查询文章列表的实现
http://example.com/2025/12/06/『博客开发日记』之分页查询文章列表的实现/
作者
云梦泽
发布于
2025年12月6日
更新于
2025年12月6日
许可协议