从零开始的SpringBoot前后端分离入门级项目(七)

一个很正经的目录!

分页参数PageParamDTO

在我们进行分页查询的时候,我们经常需要对其中的某些字段进行某种排序(升序,降序)。那么前端每次都需要发送不同的参数,甚至不同个数的参数,这就对后端如何接受参数有所要求,有时候可能直接将排序规则拼接在字符串中如下

@PathVariable("/findAll/{id}/{DESC}")

那么这就是对id的降序排序,但是我们需要思考一个问题,分页和排序一般需要几个参数

  1. 当前页数是哪一页
  2. 每页展示几条数据
  3. 待排序的字段
  4. 排序的方式
    如果都是用请求地址拼接或者请求参数的方式未免有些许繁琐,我们不如将其进行抽象,通过一个DTO,在需要进行分页或分页并排序的操作时由前端发送给后台,请在model.dto下新建PageParamDTO,内容如下
/**
 * @Author Alfalfa99
 * @Date 2020/9/18 13:33
 * @Version 1.0
 * 分页查询DTO
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class PageParamDTO {
    /**
     * cp: 当前页数
     * ps: 每一页的数据条数
     * order: 需要排序的字段-排序的方式(asc:升序,desc:降序)
     */
    @NotNull(message = "当前页数不能为空")
    private Integer cp;
    @NotNull(message = "每页条数不能为空")
    private Integer ps;
    private Map<String,String> order;
}

当然我们拿到了装载着待排序字段和排序规则的map之后还需要进行一系列的判断并拼接成字符串,最后放到PageHelper中使用。
编写PageParamCheckUtil

/**
 * @Author Alfalfa99
 * @Date 2020/9/17 20:23
 * @Version 1.0
 * 检查分页参数
 */
@Component
public class PageParamCheckUtil {

    public String CheckOrder(Map<String, String> map) {
        StringBuilder finalOrder = new StringBuilder();
        //判断map是否为空
        if (map != null && !map.isEmpty()) {
            //读取map中的所有待排序字段及其排序方法
            for (String s : map.keySet()) {
                //把待排序字段加入finalOrder
                finalOrder.append(s);
                String order = map.getOrDefault(s, "asc").toLowerCase();
                if ("desc".equals(order)) {
                    finalOrder.append(" " + order + ",");
                } else {
                    finalOrder.append(" asc,");
                }
            }
            finalOrder.deleteCharAt(finalOrder.length() - 1);
        }
        return finalOrder.toString();
    }
}

这里要注意,如果map为空请不要把空格拼接进去,不然Mybatis在执行时会报错。
那么我就是用一个实例来进行测试吧(这里就不仔细阐述在哪里添加代码了,大家懂的都懂)

//UserDao
    /**
     * 查询所有用户
     *
     * @return
     */
    @Select("SELECT * FROM tb_user")
    List<User> findAllUser();
//UserService
    private final PageParamCheckUtil ppC; //需要先注入该工具类
    /**
     * 查询所有用户
     *
     * @return 返回用户列表
     */
    public PageResult<User> findAllUser(PageParamDTO ppDTO) {
        Page<Object> page = PageHelper.startPage(ppDTO.getCp(), ppDTO.getPs(), ppC.CheckOrder(ppDTO.getOrder()));
        List<User> allUser = adminDao.findAllUser();
        return new PageResult<>(page.getPages(), page.getTotal(), allUser);
    }

在进行查询之前使用PageHelper.startPage(当前页数,每页条数,排序规则)方法,即可帮我们自动排序并分页,page.getPages() 用来返回该分页参数下一共会有多少页, page.getTotal()用来获得总的数据条数。我们使用前文说过的分页结果类进行包装 ,返回到Controller层进行处理。

    @PostMapping("/findAllUser")
    public CommonResult<PageResult<User>> findAllUser(@Valid @RequestBody PageParamDTO ppDTO) {
        PageResult<User> allUser = adminService.findAllUser(ppDTO);
        return new CommonResult<>(20000, "OK", allUser);
    }

首先我们先往User表中插入数条数据(为了便于查看效果,我们在这里就不使用Postman进行新增用户操作,而是直接通过SQLYog向表中插入数据):
在这里插入图片描述
然后启动项目(先在拦截器配置类中放行相关接口)使用 postman进行如下测试:
在这里插入图片描述

可以看到我们成功的把四条记录都已经查询出来,在这里各位读者也可以自行修改cp,ps的参数来体验一下不同的分页规则,我们更主要的是要测试一下能否正常排序:
通过id降序
在这里插入图片描述
通过id升序
在这里插入图片描述
通过id降序,如果id相同则通过nickname升序

在这里插入图片描述
大家可以在数据库中多插入一些数据 ,然后自己尝试一下相关的操作,通过PageParamDTO和PageParamCheckUtil我们不管前端传入几个待排序的字段都可以进行便捷的排序啦!
其他的需求点都大同小异(CRUD),不再单独编写相关文章啦(其实就是我懒 )。

后记

本系列的文章到这里已经临近尾声。由于水平有限时间匆忙,文章中难免出现纰漏与错误,项目构思时也有不足之处,希望看到这里的你能够对这个项目有自己的想法,同时也请各位读者指出文章中的不足之处,笔者将一一改正!祝各位看到这里的读者今后写码之路一帆风顺,永无BUG!我们下个系列再见~
后端的代码后续会整理发布在我的GitHub中,如果有需要的读者可以前往自取(求star求点赞!
点这里前往我的GitHub
本次博客的内容也到此为止了,如果对博客内容有疑问可以私信联系笔者,如果这篇文章对你有用希望你能点一个赞,谢谢~

  • 13
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值