分页(Pagination)技术规范

Table of Contents

做中后台系统查询分页偶尔会用到的一项技术,倒是不难,不过每次写的时候都要查一查规范,看看一般会怎么命名。

这里记录一下一些命名规范和基于一些数据库的实现,主要给自己用。

主要参考 https://ant.design/components/pagination-cn/ 因为我目前用的前端都是 antd。

1. 规范

  • current 当前页码,从 1 开始
  • page_size 每页条数
  • total 数据总数
  • items 数据列表

前后端交互:

  • 前端请求传两个参数, currentpage_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/

First created: 2021-01-14 15:50:31
Last updated: 2021-11-15 Mon 10:18
Power by Emacs 27.1 (Org mode 9.4.4)