1.实现分页返回数据
1.路由
// router.go
pmProject.GET("projectList", project.ProjectList) // TODO:项目列表
- controller
// controller.go
func ProjectList(c *gin.Context) {
page, _ := strconv.Atoi(c.Query("page")) // c.Query 获取的参数是string格式 转换为int
limit, _ := strconv.Atoi(c.Query("limit"))
// 获取记录总数和列表信息
projectModel := new(model.PmProjectModel)
var pro []model.PmProject
result, count := projectModel.GetProjectList(pro, page, limit)
data := response.ListQryRspData{ // 响应数据 结构体
List: result,
Count: int(count),
}
response.SuccessWithData(data, c)
}
- model.go
package model
import "gorm.io/gorm"
func (p *PmProjectModel) GetProjectList(pro []PmProject, page int, limit int) (list []PmProject, count int64) {
// 分页查询
res := db.Model(PmProject{}).Scopes(Pageinate(page, limit)).Find(&list)
count = res.RowsAffected
return
}
// 分页封装
func Pageinate(page int, pageSize int) func(db *gorm.DB) *gorm.DB {
return func(db *gorm.DB) *gorm.DB {
if page == 0 {
page = 1
}
switch {
case pageSize > 100:
pageSize = 100
case pageSize <= 0:
pageSize = 10
}
offset := (page - 1) * pageSize
return db.Offset(offset).Limit(pageSize)
}
}
接口请求:
2.知识点
2.1 limit 与 offset 理解
limit指定要查询的最大记录数。(pagesize)。
Offset指定开始返回记录前要跳过的记录数。
db.Offset(offset).Limit(pageSize)
offset := (page - 1) * pageSize
举例:
例如:有100条数据 id从1开始
page=1 pageSize=10 返回结果 1-10 从第1条数据开始查,不跳过,所以offset=(page - 1) * pageSize=0
page=2 pageSize=10 返回结果 11-20 从第11条数据开始查,跳过1-10,所以offset=(page - 1) * pageSize=10
page=3 pageSize=10 返回结果 21-30 从第21条数据开始查,跳过1-20,所以offset=(page - 1) * pageSize=20
以此类推...
2.2 Scopes 理解
Scopes 允许重用常用逻辑,共享逻辑需要定义为类型 func(*gorm.DB) *gorm.DB
理解:分页函数返回类型为 func(db *gorm.DB) *gorm.DB,Scopes接受。