package response // PageQuery 公共分页请求参数(列表接口统一内嵌复用) // 用法:type XxxListReq struct { response.PageQuery; Keyword string `form:"keyword"` } type PageQuery struct { Page int `form:"page" json:"page"` PageSize int `form:"page_size" json:"page_size"` } const ( defaultPage = 1 defaultPageSize = 10 maxPageSize = 100 ) // Normalize 修正非法/越界的分页参数,返回可安全使用的值 func (p *PageQuery) Normalize() { if p.Page <= 0 { p.Page = defaultPage } if p.PageSize <= 0 { p.PageSize = defaultPageSize } if p.PageSize > maxPageSize { p.PageSize = maxPageSize } } // Offset 供 GORM .Offset() 使用 func (p PageQuery) Offset() int { page, size := p.Page, p.PageSize if page <= 0 { page = defaultPage } if size <= 0 { size = defaultPageSize } return (page - 1) * size } // Limit 供 GORM .Limit() 使用 func (p PageQuery) Limit() int { if p.PageSize <= 0 { return defaultPageSize } if p.PageSize > maxPageSize { return maxPageSize } return p.PageSize } // PageResult 公共分页响应结构 type PageResult struct { List any `json:"list"` Total int64 `json:"total"` Page int `json:"page"` PageSize int `json:"page_size"` } // NewPage 组装分页响应;list 传空时序列化为 [] func NewPage(list any, total int64, p PageQuery) PageResult { page, size := p.Page, p.PageSize if page <= 0 { page = defaultPage } if size <= 0 { size = defaultPageSize } return PageResult{List: list, Total: total, Page: page, PageSize: size} }