package repository import ( "errors" "gorm.io/gorm" ) // IsNotFound 检查是否为记录未找到错误 func IsNotFound(err error) bool { return errors.Is(err, gorm.ErrRecordNotFound) } // HandleNotFound 处理记录未找到的情况,未找到时返回 nil, nil func HandleNotFound[T any](result *T, err error) (*T, error) { if err != nil { if IsNotFound(err) { return nil, nil } return nil, err } return result, nil } // Paginate 创建分页查询 func Paginate(page, pageSize int) func(db *gorm.DB) *gorm.DB { return func(db *gorm.DB) *gorm.DB { if page < 1 { page = 1 } if pageSize < 1 { pageSize = 20 } if pageSize > 100 { pageSize = 100 } offset := (page - 1) * pageSize return db.Offset(offset).Limit(pageSize) } } // PaginatedQuery 执行分页查询,返回列表和总数 func PaginatedQuery[T any]( baseQuery *gorm.DB, page, pageSize int, orderBy string, preloads ...string, ) ([]T, int64, error) { var items []T var total int64 // 获取总数 if err := baseQuery.Count(&total).Error; err != nil { return nil, 0, err } // 分页查询 query := baseQuery.Scopes(Paginate(page, pageSize)) // 添加排序 if orderBy != "" { query = query.Order(orderBy) } // 添加预加载 for _, preload := range preloads { query = query.Preload(preload) } if err := query.Find(&items).Error; err != nil { return nil, 0, err } return items, total, nil }