由于项目需要,写了个提供给h5,还有客户端的分页接口。而公司使用的框架 laravel 自带的框架paginate套用不方便,因为paginate的分页是原理是在对数据库进行query的时候分页,相当于在sql语句里面多加了几个动态的 limit参数;而我的需求则是根据页码的不同动态的拿出一些商品ids,然后根据这些商品 ids 去获取当前这一页所有的商品列表信息;
本文这里仅介绍根据不同页码去获取当前页的商品ids的实现:
经典分页设计的概念:
1 per_num每页多少条纪录数量;
2 total_count总共的纪录条数;
3 max_page最大页码;
4 page客户端请求的当前页码
首先我设定每页纪录数量:
$per_num = 20;
其次,我根据业务逻辑计算总共的纪录条数:
$total_count = count($sku_ids);
然后,我根据前两个值计算出最大有数据的页码:
$max_page = floor($total_count/$per_num);
接下来;
根据实际上的产品设计做出对应的异常处理:
总纪录为0处理:
if ($total_count == 0) {
return $columns;
}
根据业务逻辑去处理一些异常页码,假如我的第一页客户端请求的页码为0,需要考虑的异常页码有;1小于0的异常输入,2大于最大页码的异常输入,3最大页码出纪录条数不足per_num时候的处理;
根据我的业务逻辑,做出如下处理
if ($page > $max_page) {
return $columns;
}
if ($page < 0) {
$page = 0;
}
最大页码出纪录条数不足per_num时候的处理:判断是否是最后一页,如果是最后一页,当前页的纪录条数位 总纪录数除以设定的每页纪录数取余数,如果不是最后一页,当前页的纪录条数为设定的每页纪录数;
$current_sku_ids = [];
//当页纪录条数
$current_num = ($page == $max_page) ? ($total_count % $per_num) : $per_num;
接下来,根据拿到的当前页码,每页纪录数,从已经获取的数据中拿到当前的商品ids
for ($i = 0; $i < $current_num; $i++) {
$key = $page * $per_num + $i;
$current_sku_ids[] = $sku_ids[$key];
}
最后,根据当前页的商品ids拿到当前页所有的商品信息;并做后续的业务逻辑处理
//取得当页的 sku_ids 的商品信息
$goodsList = \App::make('SProductItemsSkus')->dailyActivitiesFormatData($current_sku_ids);
然后前端可以使用此接口实现可维护的分页加载商品列表效果