基于SpringBoot从零构建博客网站 - 分页显示文章列表功能

显示文章列表一般都是采用分页显示,比如每页10篇文章显示。这样就不用每次就将所有的文章查询出来,而且当文章数量特别多的时候,如果一次性查询出来很容易出现OOM异常。

后台的分页插件采用的是mybatis-plus自带的,前端显示时利用boostrap的风格显示。

1、开启分页插件

对于mybatis-plus框架,开启分页插件是很简单的,只需要加一个配置类,即:

/**
 * Mybatis Plus分页配置类
 *
 * @author lzj
 * @since 1.0
 * @date [2019-08-11]
 */
@EnableTransactionManagement
@Configuration
@MapperScan("com.swnote.*.dao.*")
public class MybatisPlusConfig {

    /**
     * 分页插件
     */
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
        return paginationInterceptor;
    }
}

这样就将分页插件配置好了。

2、文章分页后台逻辑

mybatis-plus框架很友好的提供好分页查询的功能,为此在后台可以直接调用,核心的逻辑为:

/**
 * 分页加载出文章列表页面
 *
 * @param code
 * @param pageIndex
 * @param model
 * @param session
 * @return
 */
@RequestMapping(value = "/u/{code}/article/{pageIndex}", method = RequestMethod.GET)
public String list(@PathVariable("code") String code, @PathVariable("pageIndex") int pageIndex, Model model, HttpSession session) throws Exception {
    // 根据code获取用户信息
    User user = userService.getByCode(code);
    if (user == null) {
        log.error("code:" + code + ",不存在的用户");
        throw new Exception("不存在的用户");
    }
    String userId = user.getUserId();

    // 获取登录信息
    User tempUser = (User) session.getAttribute(Const.SESSION_USER);

    // 判断是否是该用户的笔记集
    boolean flag = false;
    if (tempUser != null && userId.equals(tempUser.getUserId())) {
        flag = true;
    }

    // 构建查询条件
    Map<String, Object> params = new HashMap<String, Object>();
    params.put("userId", userId);
    if (!flag) {
        params.put("status", Article.STATUS_SUCCESS);
    }

    // 分页查询
    IPage<Article> articles = articleService.page(new Page<Article>(pageIndex, 10), new QueryWrapper<Article>().allEq(params).orderByDesc("publishTime"));

    // 获取文章相关的信息
    List<Article> list = articles.getRecords();
    if (list != null && !list.isEmpty()) {
        list.stream().forEach(article -> {
            // 作者用户ID,获取用户信息
            User articleUser = userService.getById(article.getUserId());
            if (StringUtils.isEmpty(articleUser.getRealName())) {
                article.setUserName(articleUser.getLoginName());
            } else {
                article.setUserName(articleUser.getRealName());
            }

            // 根据专栏ID,获取专栏信息
            if (!StringUtils.isEmpty(article.getGroupId())) {
                Group articleGroup = groupService.getById(article.getGroupId());
                article.setGroupName(articleGroup.getName());
            }
        });
    }

    model.addAttribute("user", user);
    model.addAttribute("articles", articles);
    return Const.BASE_INDEX_PAGE + "blog/article/list";
}

里面最主要的分页查询代码为:

// 分页查询
IPage<Article> articles = articleService.page(new Page<Article>(pageIndex, 10), new QueryWrapper<Article>().allEq(params).orderByDesc("publishTime"));

3、文章分页前台逻辑

其实分页前台逻辑主要是将分页的页码生成好,在此罗列出生成分页页码的核心代码如下:

<#assign articlePages = (articles.total / articles.size)?ceiling>
<#if articlePages gt 1>
    <div class="col-md-12" align="center">
        <span class="pages-total">${articles.total}条 共${articlePages}页</span>
        <ul class="pagination">
            <#if articles.current == 1>
                <li class="disabled"><a href="javascript:void(0);">上一页</a></li>
            <#else>
                <#assign pre = articles.current - 1>
                <li><a href="${rc.contextPath}/u/${user.code}/article/${pre}">上一页</a></li>
            </#if>

            <#if articles.current == articlePages>
                <li class="disabled"><a href="javascript:void(0);">下一页</a></li>
            <#else>
                <#assign next = articles.current + 1>
                <li><a href="${rc.contextPath}/u/${user.code}/article/${next}">下一页</a></li>
            </#if>
        </ul>
    </div>
</#if>

这个mybatis-plus框架生成分页数据好像生成的总页数没有传过来,所以在前台将总页数计算出来,即:

<#assign articlePages = (articles.total / articles.size)?ceiling>

前台文章列表展示风格如下:

关注我

以你最方便的方式关注我:
微信公众号:

posted @ 2019-08-20 13:32  架构与我  阅读(717)  评论(1编辑  收藏  举报