package mysql import ( "errors" "gorm.io/gorm" "log" ) // Association 关联模型结构体 type Association struct { Query string Args interface{} } type BaseMapper[T any] struct { Associations []Association // 关联 } // Insert 新增 func (m *BaseMapper[T]) Insert(entity *T) error { log.Printf("insert %+v\n", entity) return db.Create(entity).Error } // Delete 删除 func (m *BaseMapper[T]) Delete(entity T) error { log.Printf("delete %+v\n", entity) return db.Delete(&entity).Error } // Update 更新 func (m *BaseMapper[T]) Update(entity *T, omits ...interface{}) error { log.Printf("update %+v\n", &entity) if len(omits) > 0 { other := omits[1:] return db.Select(omits[0], other...).Updates(entity).Error } return db.Save(entity).Error } // Detail 详情 func (m *BaseMapper[T]) Detail(entity T) (res T, err error) { log.Printf("detail %+v\n", entity) err = db.First(&entity, entity).Error if errors.Is(err, gorm.ErrRecordNotFound) { return res, nil } return res, err } // List 列表 func (m *BaseMapper[T]) List(entity *T) (res []T, err error) { if entity == nil { err = db.Order("created_at desc").Find(&res).Error } else { err = db.Where(entity).Order("created_at desc").Find(&res).Error } if err != nil { return nil, err } return res, nil } // ListWithPage 列表带分页 func (m *BaseMapper[T]) ListWithPage(entity *T, page, pageSize int) (res []T, err error) { var tx *gorm.DB if m.Associations != nil && len(m.Associations) > 0 { for _, v := range m.Associations { if tx != nil { tx = tx.Preload(v.Query, v.Args) } else { tx = db.Preload(v.Query, v.Args) } } } if tx == nil { tx = db } if entity == nil { err = tx.Order("created_at desc").Offset((page - 1) * pageSize).Limit(pageSize).Find(&res).Error } else { err = tx.Where(entity).Order("created_at desc").Offset((page - 1) * pageSize).Limit(pageSize).Find(&res).Error } if err != nil { return nil, err } return res, nil } // First 单条记录 func (m *BaseMapper[T]) First(entity T) (res T, err error) { log.Printf("first %+v\n", entity) err = db.First(&res, entity).Error if errors.Is(err, gorm.ErrRecordNotFound) { return res, nil } return res, err }