Limit&Offset 实现
util.go 功能实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| package util
import "gorm.io/gorm"
type Paginate struct { Current int `query:"current" json:"current"` PageSize int `query:"pageSize" json:"pageSize"` }
func (p *Paginate) Paginate() func(db *gorm.DB) *gorm.DB { page := p.Current limit := p.PageSize return func(db *gorm.DB) *gorm.DB { if page == 0 { page = 1 } switch { case limit > 100: limit = 100 case limit <= 0: limit = 10 }
offset := (page - 1) * limit return db.Offset(offset).Limit(limit) } }
|
中间件放置
1 2 3 4 5 6 7 8 9 10
| Get(web.InjectPaginate(), handler.HandleLibList)
func InjectPaginate() flamego.Handler { return func(r flamego.Render, c flamego.Context) { var req page.Paginate req.Current = c.QueryInt("page") req.PageSize = c.QueryInt("pageSize") c.Map(req) } }
|
需求中使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| func HandleLibList(r flamego.Render, paginate page.Paginate) { var list []dto.LibScoreListItem var count int64 err := dao.Lib.Model(&model.LibScore{}).Scopes(paginate.Paginate()). Find(&list).Offset(-1).Limit(-1).Count(&count).Error if err != nil { response.ServiceErr(r, err) return }
response.HTTPSuccess(r, map[string]any{ "total": count, "list": list, })
}
|
注意:Offset(-1).Limit(-1) 每次使用完分页记得撤销一下,因为上下文会延续。