# 若依分页功能
分页的效果:分页处理一方面可以提高我们浏览数据的效率,符合我们浏览者的心里,减少大量数据存在的杂乱问题;另一方面用 sql 进行数据查询时就实现分页,如 mysql 的 limit,sql 查询结果是第几页的数据,十分的效率;同时分页技术也可以,降低带宽使用,提高访问速度。分页的原理:前端采用 pageNum 和 pageSize ;后端采用函数 startPage 和 getDataTable;
# 前端部分:
先找到前端部分代码中的 ruoyi-ui/src/views/monitor/operlog/index.vue 中的这一串代码
初始化了 total 为 0 所返回的 total 的值取决于后台传来的数据条数;@pageination 所绑定的 getList 方法,负责处理所返回的数据 实现分页功能
getList 方法中调用了 List 函数
其中 method: 'get' 为请求的访问方式即对应后端的 GetMapping
页面端使用 F12 开发者工具查看了网络中的 XHR 和提取 可以看到 后端返回了
其中 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 插件进行分页