最近做项目的时候,有一个接口需要分页处理,就是每页返回20条数据:比如:https://api.cn?pagg=1
这里的page就是需要获取的哪一页数据的请求参数,返回的json,当然就是返回给前台需要的数据。
这个做PC端是比较常见的,这个其实需要后端返回一个必须要的数据,就是总的条数,至于每页多少条这个是需求定的,当然还有的就是当前的页数和当前页数的数据。
比如下面的数据:
{
"total": 1836, // 总的条数
"ret_code": 0,
"totalPages": 92, // 总页数
"currentPage": 1 // 当前页数
"bookList": [ // 当前页 的数据
{
"summary": "",
"id": 3,
"bookclass": 1,
"author": "张峰",
"count": "0",
"name": "从宝宝排泄物看",
"fcount": 0,
"img": "http://www.yi18.net/img/book/00003.jpg",
"rcount": 0,
"from": "张峰"
},
……
]
}
手机端其实也基本是这样的,差别在于手机端页面是下拉刷新或者上拉加载更多。HBuilder webApp开发(二)表格上拉加载更多下拉刷新[2017.05.24更新]这是之前写的一个实现表格上拉加载更多下拉刷新功能的手机页面。其实后端需要返回的数据和上面的一样。
这个不同后端语言或者框架有不同获取方式,但是思路基本一样。获取这个参数是为了拼接sql语句的。
我使用的是Mysql,SELECT COUNT(*) FROM record
这里的record
是表名。这条sql语句就可以获取到当前表中的数据总条数,当然有限制条件的就有点不一样。
下面就是重点了,分页。
首先看看需求,每次取20条。那么就有一个位置的偏移了。第一次是0~19,第二次是20~29,依次下去。但是接口里面的第一页通常参数会传递一个1过来。
var start = (page - 1) * 20;
var sql = 'SELECT * FROM record limit ' + start + ',20';
这里的sql语句,里面的start
就是每次查村的起始点,后面的20就是位置偏移,也就是每次需要查询的条数。
这里的sql语句,难点就是limit
的使用。
上面似乎分析了很多,下面再来整理一下思路。
router.all('/api', function(req, res, next){
var param = '';
if (req.method == "POST") {
param = req.body;
} else{
param = req.query || req.params;
}
if (param.page == '' || param.page == null || param.page == undefined) {
res.end(JSON.stringify({msg:'请传入参数page',status:'102'}));
return;
}
var start = (param.page - 1) * 20;
var sql = 'SELECT COUNT(*) FROM record; SELECT * FROM record limit ' + start + ',20';
pool.getConnection(function(err, connection) {
if(err) throw err;
connection.query(sql,function (err, results) {
connection.release();
if (err){
throw err
}else{
// 计算总页数
var allCount = results[0][0]['COUNT(*)'];
var allPage = parseInt(allCount)/20;
var pageStr = allPage.toString();
// 不能被整除
if (pageStr.indexOf('.')>0) {
allPage = parseInt(pageStr.split('.')[0]) + 1;
}
var userList = results[1];
res.end(JSON.stringify({msg:'操作成功',status:'100',totalPages:allPage,currentPage:param.page,data:userList}));
}
})
})
});