- 准备工作
- 包装分页工具函数
- 使用gorm中的Scopes调用分页
一、准备工作
admin.go
type Admin struct {
Id int64 `json:"id"`
Username string `json:"username"` // 用户名
Nickname string `json:"nickname"` // 用户名
Avatar string `json:"avatar"` // 头像
Password string `json:"-"` // 密码
Status int64 `json:"status"` // 状态 1. 正常 0 禁用
CreatedAt Time `json:"created_at"` // 创建时间
UpdatedAt Time `json:"-"` // 更新时间
DeletedAt gorm.DeletedAt `json:"-"`
}
func (admin Admin) TableName() string {
return "admins"
}
二、 包装分页工具函数
在utils文件下新建Paginate.go
func Paginate(req *dto.PageDto) func(db *gorm.DB) *gorm.DB {
return func(db *gorm.DB) *gorm.DB {
page := req.Page
if page == 0 {
page = 1
}
pageSize := req.PageSize
switch {
case pageSize > 100:
pageSize = 100
case pageSize <= 0:
pageSize = 10
}
offset := (page - 1) * pageSize
return db.Offset(offset).Limit(pageSize)
}
}
PageDto
page: 当前页码
pageSize: 每页的条数
type PageDto struct {
Page int `form:"page" json:"page"`
PageSize int `form:"pageSize" json:"pageSize"`
}
三、使用gorm中的Scopes调用分页
列表接收参数 AdminListReq
type AdminListReq struct {
Nickname string `json:"nickname"` // 搜索名称
PageDto
}
在admin.go文件中编写获取列表函数 使用Scopes调用分页
// GetAdminList 获取全部TableUser对象
func GetAdminList(req *dto.AdminListReq) (admins []Admin, total int64, err error) {
query := DB.Model(Admin{})
if req != nil {
if req.Nickname != "" {
query.Where("nickname like ?", "%"+req.Nickname+"%")
}
}
// 排序
query = query.Order("id desc")
pageReq := &dto.PageDto{
Page: req.Page,
PageSize: req.PageSize,
}
err = query.Scopes(utils.Paginate(pageReq)).Find(&admins).Count(&total).Error
if err != nil {
return nil, 0, err
}
return admins, total, nil
}
最后admins数组中就是想要得到的数据,total为总条数,至于接口数据如何返回可自行定义。