分页查询文章列表
大约 3 分钟项目实战前后端分离博客项目
需求分析
在首页和分类页面都需要查询文章列表。
- 首页:查询所有的文章
- 分类页面:查询
对应分类
下的文章
要求:①只能查询正式发布
的文章 ②置顶
的文章要显示在最前面
接口设计
请求地址:
/article/articleList
请求方式:
GET
请求参数
参数 说明 pageNum 页码 pageSize 每页数量 categoryId 分类id 响应格式:
{ "code": 200, "data": { "rows": [ { "categoryName": "Java", "createTime": "2022-01-23 23:20:11", "id": "1000", "summary": "SpringSecurity框架教程-Spring Security+JWT实现项目级前端分离认证授权", "thumbnail": "https://sg-blog-oss.oss-cn-beijing.aliyuncs.com/2022/01/31/948597e164614902ab1662ba8452e106.png", "title": "SpringSecurity从入门到精通", "viewCount": "118" } ], "total": "3" }, "msg": "操作成功" }
思路分析
- 不传入分类id,查询所有文章;传入分类id,则查对应分类id下的文章。
- 需要返回分类名称和分类id,所以需要根据分类ID到
分类表
中查询分类名称。
Mybatis-Plus分页拦截器
3.4.0之后,不配置的话分页不生效。
@Configuration
public class MybatisPlusConfig {
/**
* Mybatis-Plus分页拦截器: 3.4.0之后版本
* @return MybatisPlusInterceptor
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return mybatisPlusInterceptor;
}
}
FastJson消息转化器配置
不配置的话,默认的时间格式不符合需求。
配置类WebConfig
中添加:
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(fastJsonHttpMessageConverters());
}
/**
* 注入fastJsonHttpMessageConvert
* @return HttpMessageConverter
*/
@Bean
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);
return fastConverter;
}
代码实现
文章表新增字段
/**
* 所属分类名称(不属于数据库字段)
*/
@TableField(exist = false)
private String categoryName;
ArticleListVo
@Data
public class ArticleListVo {
/**
* 文章id
*/
private Long id;
/**
* 标题
*/
private String title;
/**
* 文章摘要
*/
private String summary;
/**
* 所属分类名称
*/
private String categoryName;
/**
* 缩略图
*/
private String thumbnail;
/**
* 访问量
*/
private Long viewCount;
private Date createTime;
}
PageVo
@Data
@AllArgsConstructor
@NoArgsConstructor
public class PageVo<T> {
private List<T> rows;
private Long total;
}
controller
/**
* 分页查询文章列表
* @param pageNum 页码
* @param pageSize 每页大小
* @param categoryId 分类id
* @return 结果
*/
@GetMapping("/articleList")
public ResponseResult articleList(Integer pageNum, Integer pageSize, Long categoryId){
return articleService.articleList(pageNum, pageSize, categoryId);
}
service
@Override
public ResponseResult articleList(Integer pageNum, Integer pageSize, Long categoryId) {
// 封装查询条件
LambdaQueryWrapper<Article> queryWrapper = new LambdaQueryWrapper<>();
// 正式发布的文章
queryWrapper.eq(Article::getStatus, SystemConstants.ARTICLE_STATUS_NORMAL);
// 分类ID
queryWrapper.eq(Objects.nonNull(categoryId) && categoryId > 0, Article::getCategoryId, categoryId);
// 置顶文章排序
queryWrapper.orderByDesc(Article::getIsTop);
// 分页查询
Page<Article> page = new Page<>(pageNum, pageSize);
page(page, queryWrapper);
List<Article> articleList = page.getRecords();
// 查询分类名称
articleList.forEach(article -> {
Category category = categoryService.getById(article.getCategoryId());
article.setCategoryName(category.getName());
});
// 封装vo
List<ArticleListVo> articleListVos = BeanCopyUtils.copyBeanList(articleList, ArticleListVo.class);
PageVo<ArticleListVo> pageVo = new PageVo<>(articleListVos, page.getTotal());
return ResponseResult.okResult(pageVo);
}
测试
访问接口:127.0.0.1:7777/article/articleList?pageNum=1&pageSize=3
{
"code": 200,
"data": {
"rows": [
{
"categoryName": "java",
"createTime": "2022-01-23 23:20:11",
"id": "1",
"summary": "SpringSecurity框架教程-Spring Security+JWT实现项目级前端分离认证授权",
"thumbnail": "https://sg-blog-oss.oss-cn-beijing.aliyuncs.com/2022/01/31/948597e164614902ab1662ba8452e106.png",
"title": "SpringSecurity从入门到精通",
"viewCount": "105"
},
{
"categoryName": "PHP",
"createTime": "2022-01-17 14:58:37",
"id": "5",
"thumbnail": "",
"title": "sdad",
"viewCount": "44"
}
],
"total": "2"
},
"msg": "操作成功"
}
访问接口:127.0.0.1:7777/article/articleList?pageNum=1&pageSize=3&categoryId=1
{
"code": 200,
"data": {
"rows": [
{
"categoryName": "java",
"createTime": "2022-01-23 23:20:11",
"id": "1",
"summary": "SpringSecurity框架教程-Spring Security+JWT实现项目级前端分离认证授权",
"thumbnail": "https://sg-blog-oss.oss-cn-beijing.aliyuncs.com/2022/01/31/948597e164614902ab1662ba8452e106.png",
"title": "SpringSecurity从入门到精通",
"viewCount": "105"
}
],
"total": "1"
},
"msg": "操作成功"
}