package gormx import ( "gorm.io/gorm" ) type LimitHandler func(db *gorm.DB) *gorm.DB func Finder[T any](model T, db *gorm.DB, objs ...LimitHandler) (int64, []T, error) { for _, obj := range objs { db = obj(db) } var models []T err := db.Model(&model).Find(&models).Error if err != nil { return 0, nil, err } var sum int64 err = db.Model(&model).Count(&sum).Error return sum, models, err } // FinderPage 分页查找 func FinderPage[T any](db *gorm.DB, page, limit int, objs ...LimitHandler) (int64, []T, error) { return pageFinder[T](db, pageHandle(page, limit), objs...) } func pageFinder[T any](db *gorm.DB, limit LimitHandler, objs ...LimitHandler) (int64, []T, error) { // 定义表 var model T db = db.Model(&model) for _, obj := range objs { db = obj(db) } // 查找全部数量 var sum int64 if err := db.Model(&model).Count(&sum).Error; err != nil { return 0, nil, err } // 分页查找 db = limit(db) var models []T if err := db.Find(&models).Error; err != nil { return 0, nil, err } return sum, models, nil } func pageHandle(page, limit int) LimitHandler { return func(db *gorm.DB) *gorm.DB { // 用户输入起始位 var beginIndex int if page < 0 { beginIndex = -1 } else { beginIndex = (page - 1) * limit } return db.Offset(beginIndex).Limit(limit) } }