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
// 当然 scope中还可以加上其他函数
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) 每次使用完分页记得撤销一下,因为上下文会延续。