53 lines
1.3 KiB
Go
53 lines
1.3 KiB
Go
package utils
|
||
|
||
import (
|
||
"gorm.io/gorm"
|
||
)
|
||
|
||
// 标准分页结构体,接收最原始的DO
|
||
// 建议在外部再建一个字段一样的结构体,用以将DO转换成DTO或VO
|
||
type Page[T any] struct {
|
||
CurrentPage int64 `json:"currentPage"`
|
||
PageSize int64 `json:"pageSize"`
|
||
Total int64 `json:"total"`
|
||
Pages int64 `json:"pages"`
|
||
Data []T `json:"data"`
|
||
}
|
||
|
||
// 各种查询条件先在query设置好后再放进来
|
||
func (page *Page[T]) SelectPages(query *gorm.DB) (e error) {
|
||
var model T
|
||
query.Model(&model).Count(&page.Total)
|
||
if page.Total == 0 {
|
||
page.Data = []T{}
|
||
return
|
||
}
|
||
e = query.Model(&model).Scopes(Paginate(page)).Find(&page.Data).Error
|
||
return
|
||
}
|
||
|
||
func Paginate[T any](page *Page[T]) func(db *gorm.DB) *gorm.DB {
|
||
return func(db *gorm.DB) *gorm.DB {
|
||
if page.CurrentPage <= 0 {
|
||
page.CurrentPage = 1
|
||
}
|
||
switch {
|
||
case page.PageSize > 10000:
|
||
page.PageSize = 10000 // 限制一下分页大小
|
||
case page.PageSize <= 0:
|
||
page.PageSize = 10
|
||
}
|
||
page.Pages = page.Total / page.PageSize
|
||
if page.Total%page.PageSize != 0 {
|
||
page.Pages++
|
||
}
|
||
p := page.CurrentPage
|
||
if page.CurrentPage > page.Pages {
|
||
p = page.Pages
|
||
}
|
||
size := page.PageSize
|
||
offset := int((p - 1) * size)
|
||
return db.Offset(offset).Limit(int(size))
|
||
}
|
||
}
|