竹简文档
模型基类

分页模型

PageRequest 与 PageResponse 提供统一的分页请求和响应结构

分页模型

xModels 提供通用分页模型,统一分页请求参数、排序规则和分页响应结构。

import xModels "github.com/bamboo-services/bamboo-base-go/major/models"

核心类型

PageRequest

分页请求参数:

page.go
type PageRequest struct {
    Page int64    `json:"page" form:"page" binding:"omitempty,min=1"`
    Size int64    `json:"size" form:"size" binding:"omitempty,min=1,max=200"`
    Sort PageSort `json:"sort" form:"sort" binding:"omitempty,enum_string=asc desc"`
}

PageResponse

泛型分页响应结构:

page.go
type PageResponse[T any] struct {
    CurrentPage int64 `json:"current_page"`
    TotalPages  int64 `json:"total_pages"`
    TotalItems  int64 `json:"total_items"`
    Size        int64 `json:"size"`
    Items       T     `json:"items"`
}

PageSort

排序方向枚举:

const (
    SortAsc  PageSort = "asc"
    SortDesc PageSort = "desc"
)

PageProvider

当业务请求结构体实现该接口时,可通过 GetPageRequest 统一提取分页参数:

type PageProvider interface {
    GetPageSettings() PageRequest
}

func GetPageRequest[T any](req T) PageRequest

默认分页配置

const (
    DefaultPageNumber int64 = 1
    DefaultPageSize   int64 = 20
    DefaultPageMaxSize int64 = 200
)

var DefaultPageConfig = xModels.PageConfig{
    DefaultPage: xModels.DefaultPageNumber,
    DefaultSize: xModels.DefaultPageSize,
    MaxSize:     xModels.DefaultPageMaxSize,
    DefaultSort: xModels.SortAsc,
}

快速使用

解析分页请求

func ListUsers(ctx *gin.Context) {
    req := xModels.DefaultPageRequest()
    _ = ctx.ShouldBindQuery(&req)
    req = req.Normalize()

    offset := req.Offset()
    limit := req.Limit()
    order := "created_at " + req.OrderDirection()

    // 查询数据库...
    _ = offset
    _ = limit
    _ = order
}

构造分页响应

func ListUsers(ctx *gin.Context) {
    req := xModels.PageRequest{Page: 1, Size: 10}.Normalize()

    totalItems := int64(95)
    users := []UserDTO{{ID: 1, Username: "alice"}}

    page := xModels.NewPageFromRequest(req, totalItems, users)
    xResult.SuccessHasData(ctx, "查询成功", page)
}

从业务请求统一提取分页参数

type ListUserRequest struct {
    Keyword string
    Page    xModels.PageRequest
}

func (r ListUserRequest) GetPageSettings() xModels.PageRequest {
    return r.Page
}

func ListUsers(ctx *gin.Context) {
    req := ListUserRequest{}
    _ = ctx.ShouldBindQuery(&req)

    pageReq := xModels.GetPageRequest(req)
    page := xModels.NewPageFromRequest(pageReq, 95, []UserDTO{})
    xResult.SuccessHasData(ctx, "查询成功", page)
}

响应示例:

{
  "current_page": 1,
  "total_pages": 10,
  "total_items": 95,
  "size": 10,
  "items": [
    {
      "id": 1,
      "username": "alice"
    }
  ]
}

常用方法

字段

类型

下一步

On this page