模型基类
分页模型
PageRequest 与 PageResponse 提供统一的分页请求和响应结构
分页模型
xModels 提供通用分页模型,统一分页请求参数、排序规则和分页响应结构。
import xModels "github.com/bamboo-services/bamboo-base-go/major/models"核心类型
PageRequest
分页请求参数:
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
泛型分页响应结构:
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"
}
]
}常用方法
字段
类型