分页查询文章列表

HeJin大约 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": "操作成功"
}