分页功能的前后端设计
实现分页功能的前后端交互方案和 SQL 查询设计
问题
当数据量很大时(如几万条数据),需要设计分页功能来分批展示数据。如何设计前后端的交互方案?
解答
前后端交互数据格式
后端需要返回以下数据:
{
"totalCount": 1836, // 总数据量
"totalPages": 92, // 总页数
"currentPage": 1, // 当前页码
"data": [ // 当前页数据
{
// ...
}
]
}
前端请求参数
前端向后端传递两个参数:
page:目标页码(必传)pageSize:每页显示数量(可选,默认 10)
后端实现逻辑
计算数据起始位置:
const start = (page - 1) * pageSize;
查询当前页数据:
SELECT * FROM record LIMIT ${pageSize} OFFSET ${start};
查询总数据量:
SELECT COUNT(*) FROM record;
完整代码示例
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) {
res.end(JSON.stringify({ msg: '请传入参数page', status: '102' }));
return;
}
const pageSize = param.pageSize || 10;
const start = (param.page - 1) * pageSize;
const sql = `SELECT * FROM record LIMIT ${pageSize} OFFSET ${start};`;
pool.getConnection(function (err, connection) {
if (err) throw err;
// 执行查询...
});
});
关键点
LIMIT控制每页显示的数据量,值为pageSizeOFFSET控制数据起始位置,计算公式为pageSize * (page - 1)- 后端需要返回总数据量、总页数、当前页码和当前页数据
- 前端必须传递
page参数,pageSize可选(默认 10) - 分页本质是从结果集中截取第 M 到 N 条记录
目录