# 若依分页功能

分页的效果:分页处理一方面可以提高我们浏览数据的效率,符合我们浏览者的心里,减少大量数据存在的杂乱问题;另一方面用 sql 进行数据查询时就实现分页,如 mysql 的 limit,sql 查询结果是第几页的数据,十分的效率;同时分页技术也可以,降低带宽使用,提高访问速度。分页的原理:前端采用 pageNum 和 pageSize ;后端采用函数 startPage 和 getDataTable;

# 前端部分:

先找到前端部分代码中的 ruoyi-ui/src/views/monitor/operlog/index.vue 中的这一串代码

image-20240530100313569

初始化了 total 为 0 所返回的 total 的值取决于后台传来的数据条数;@pageination 所绑定的 getList 方法,负责处理所返回的数据 实现分页功能

image-20240530100433297

getList 方法中调用了 List 函数

image-20240530100449423

其中 method: 'get' 为请求的访问方式即对应后端的 GetMapping

image-20240530100518970

页面端使用 F12 开发者工具查看了网络中的 XHR 和提取 可以看到 后端返回了

image-20240530100550091

其中 pageNum 和 pageSize 分别为页面数和每页所存放数据条数

# 后端部分:

实现分页的代码:

controller

要想使用 startPage 和 getDataTable 我们必须先继承 ruoyi 中的 BaseController 类,下面会讲到源码实现

/**
  * 查询 shp 文件信息添加数据并分页
  * @author 窦凯欣
  */
    @ApiOperation(value = "查询shp文件信息添加数据并分页")
    @ApiImplicitParam(value = "xkzh", name = "许可证号", type = "String")
    @ApiResponses(value = {
            @ApiResponse(code = 200, message = "success", response = KsTcVo.class)
    })
    @Anonymous
    @GetMapping("/mineLayersController/mountDataAll")
    public TableDataInfo<KsTcVo> mountDataAll(String xkzh)
    {
        startPage();
        TableDataInfo dataTable = getDataTable(ksTcService.mountDataAll(xkzh));
        List<KsTcVo> ksTcVos = BeanUtil.copyToList(dataTable.getRows(), KsTcVo.class);
        dataTable.setRows(ksTcVos);
        return dataTable;
    }

serviceImpl

/**
  * 查询 shp 文件信息添加数据并分页
  * @author 窦凯欣
  */
    @Override
    public List<KsTc> mountDataAll(String xkzh)
    {
        List<KsTc> ksTcs = ksTcxMapper.selectList(new LambdaQueryWrapper<KsTc>()
                .eq(!StringUtil.isNullOrEmpty(xkzh), KsTc::getXkzh, xkzh));
        return ksTcs;
    }

startPage () 和 getDataTable (List) 分贝起到了分页功能的实现和返回数据库数据的功能,任何分页功能的实现都需要先执行 startPage 这个方法

在 ruoyi 中 BaseController 的 startPage 和 getDataTable 代码如下:

/**
   * 设置请求分页数据
   */
    protected void startPage() {
        PageUtils.startPage();
    }
/**
   * 响应请求分页数据
   */
    @SuppressWarnings({"rawtypes", "unchecked"})
    protected TableDataInfo getDataTable(List<?> list) {
        TableDataInfo rspData = new TableDataInfo();
        rspData.setCode(HttpStatus.SUCCESS);
        rspData.setMsg("查询成功");
        rspData.setRows(list);
        rspData.setTotal(new PageInfo(list).getTotal());
        return rspData;
    }

先来解读下 startPage 里面的源代码:

/**
   * 设置请求分页数据
   */
    public static void startPage()
    {
        // 返回封装好的分页对象
        PageDomain pageDomain = TableSupport.buildPageRequest();
        Integer pageNum = pageDomain.getPageNum();
        Integer pageSize = pageDomain.getPageSize();
        String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy());
        Boolean reasonable = pageDomain.getReasonable();
        PageHelper.startPage(pageNum, pageSize, orderBy).setReasonable(reasonable);
    }
/**
  * 封装分页对象
  */
    public static PageDomain getPageDomain()
    {
        PageDomain pageDomain = new PageDomain();
        pageDomain.setPageNum(Convert.toInt(ServletUtils.getParameter(PAGE_NUM), 1));
        pageDomain.setPageSize(Convert.toInt(ServletUtils.getParameter(PAGE_SIZE), 10));
        pageDomain.setOrderByColumn(ServletUtils.getParameter(ORDER_BY_COLUMN));
        pageDomain.setIsAsc(ServletUtils.getParameter(IS_ASC));
        pageDomain.setReasonable(ServletUtils.getParameterToBool(REASONABLE));
        return pageDomain;
    }
    public static PageDomain buildPageRequest()
    {
        return getPageDomain();
    }

进入 ServletUtils.getParameter (PAGE_NUM)

/**
  * 获取 HttpServlcetRequest 对象调用 getParamter 传入 String 参数获取请求头中对应的参数并返回
  */
    public static String getParameter(String name)
    {
        return getRequest().getParameter(name);
    }
 /**
   * 获取 request
   */
    public static HttpServletRequest getRequest()
    {
        return getRequestAttributes().getRequest();
    }
	/**
	  * 获取 RequestContextHolder.getRequestAttributes () 对象并返回
	  */
	public static ServletRequestAttributes getRequestAttributes()
    {
        RequestAttributes attributes = RequestContextHolder.getRequestAttributes();
        return (ServletRequestAttributes) attributes;
    }

由此我们得知他从 HttpServletRequest 对象中获取对应的请求头的参数也就是 pageNum 和 pageSize 的参数,那么在 getPageDomain 方法中的 PageDomain 对象的参数都是这样进行构建的

最终返回到 startPage

/**
  * 设置请求分页数据
  */
    public static void startPage()
    {
        PageDomain pageDomain = TableSupport.buildPageRequest();
        Integer pageNum = pageDomain.getPageNum();
        Integer pageSize = pageDomain.getPageSize();
        String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy());
        Boolean reasonable = pageDomain.getReasonable();
        PageHelper.startPage(pageNum, pageSize, orderBy).setReasonable(reasonable);
    }

最后使用 PageHelper 插件进行分页