分页(Pagination)技术规范
Table of Contents
做中后台系统查询分页偶尔会用到的一项技术,倒是不难,不过每次写的时候都要查一查规范,看看一般会怎么命名。
这里记录一下一些命名规范和基于一些数据库的实现,主要给自己用。
主要参考 https://ant.design/components/pagination-cn/ 因为我目前用的前端都是 antd。
1. 规范
current
当前页码,从 1 开始page_size
每页条数total
数据总数items
数据列表
前后端交互:
- 前端请求传两个参数,
current
和page_size
- 后端返回:
current
page_size
total
items
2. 一些实现
2.1. 内存分页
import ( "math" ) type Pagination struct { Current int `json:"current"` PageSize int `json:"page_size"` Total int `json:"total"` Items []interface{} `json:"items"` } // MemoryPaginate paginate in memory func MemoryPaginate(items []interface{}, current int, pageSize int) Pagination { if pageSize <= 0 { pageSize = 20 } total := len(items) pageCount := int(math.Floor(float64(total) / float64(pageSize))) if current > pageCount { current = pageCount } if current <= 0 { current = 1 } start := (current - 1) * pageSize end := start + pageSize if end > total { end = total } p := Pagination{ Current: current, PageSize: pageSize, Total: total, Items: items[start:end], } return p }
2.2. MySQL
SELECT 的官方文档说, LIMIT
可以用来约束返回的行数,它接收两个非负的参数,
- 第一个参数指定偏移量 offset,从 0 开始。如果不指定第一个参数,默认从 0 开始。
- 第二个参数指定返回的数量
比如: SELECT * FROM tbl LIMIT 5,10; # Retrieve rows 6-15
目前没有演示代码,后面再慢慢补充。
2.3. MongoDB
比较简单,使用 cursor.skip()
即可,具体见 https://docs.mongodb.com/manual/reference/method/cursor.skip/