refactor: base.repo与base.app精简优化

This commit is contained in:
meilin.huang
2024-04-29 12:29:56 +08:00
parent f2c7ef78c0
commit a5cd7caf19
14 changed files with 108 additions and 105 deletions

View File

@@ -23,26 +23,24 @@ type App[T model.ModelI] interface {
UpdateById(ctx context.Context, e T) error
// UpdateByCond 更新满足条件的数据
// @param values 需为模型结构体指针或map(更新零值等)
// @param cond 可为*model.QueryCond也可以为普通查询model
UpdateByCond(ctx context.Context, e T, cond any) error
UpdateByCond(ctx context.Context, values any, cond any) error
// DeleteById 根据实体主键删除实体
DeleteById(ctx context.Context, id uint64) error
DeleteById(ctx context.Context, id ...uint64) error
// DeleteByCond 根据条件进行删除
DeleteByCond(ctx context.Context, cond any) error
// Updates 根据实体条件更新参数udpateFields指定字段
Updates(ctx context.Context, cond any, udpateFields map[string]any) error
// Save 保存实体实体IsCreate返回true则新增否则更新
Save(ctx context.Context, e T) error
// GetById 根据实体id查询
GetById(e T, id uint64, cols ...string) (T, error)
// GetByIdIn 根据实体id数组查询
GetByIdIn(list any, ids []uint64, orderBy ...string) error
// GetByIds 根据实体id数组查询
GetByIds(list any, ids []uint64, orderBy ...string) error
// GetByCond 根据实体条件查询实体信息(获取单个实体)
GetByCond(cond any) error
@@ -85,13 +83,11 @@ func (ai *AppImpl[T, R]) UpdateById(ctx context.Context, e T) error {
return ai.GetRepo().UpdateById(ctx, e)
}
func (ai *AppImpl[T, R]) UpdateByCond(ctx context.Context, e T, cond any) error {
return ai.GetRepo().UpdateByCond(ctx, e, cond)
}
// 根据实体条件更新参数udpateFields指定字段 (单纯更新,不做其他业务逻辑处理)
func (ai *AppImpl[T, R]) Updates(ctx context.Context, cond any, udpateFields map[string]any) error {
return ai.GetRepo().Updates(cond, udpateFields)
// UpdateByCond 更新满足条件的数据
// @param values 需为模型结构体指针或map(更新零值等)
// @param cond 可为*model.QueryCond也可以为普通查询model
func (ai *AppImpl[T, R]) UpdateByCond(ctx context.Context, values any, cond any) error {
return ai.GetRepo().UpdateByCond(ctx, values, cond)
}
// 保存实体实体IsCreate返回true则新增否则更新
@@ -106,8 +102,8 @@ func (ai *AppImpl[T, R]) SaveWithDb(ctx context.Context, db *gorm.DB, e T) error
}
// 根据实体主键删除实体 (单纯删除实体,不做其他业务逻辑处理)
func (ai *AppImpl[T, R]) DeleteById(ctx context.Context, id uint64) error {
return ai.GetRepo().DeleteById(ctx, id)
func (ai *AppImpl[T, R]) DeleteById(ctx context.Context, id ...uint64) error {
return ai.GetRepo().DeleteById(ctx, id...)
}
// 根据指定条件删除实体 (单纯删除实体,不做其他业务逻辑处理)
@@ -123,8 +119,8 @@ func (ai *AppImpl[T, R]) GetById(e T, id uint64, cols ...string) (T, error) {
return e, nil
}
func (ai *AppImpl[T, R]) GetByIdIn(list any, ids []uint64, orderBy ...string) error {
return ai.GetRepo().GetByIdIn(list, ids, orderBy...)
func (ai *AppImpl[T, R]) GetByIds(list any, ids []uint64, orderBy ...string) error {
return ai.GetRepo().GetByIds(list, ids, orderBy...)
}
// 根据实体条件查询实体信息

View File

@@ -5,6 +5,8 @@ import (
"mayfly-go/pkg/contextx"
"mayfly-go/pkg/gormx"
"mayfly-go/pkg/model"
"mayfly-go/pkg/utils/collx"
"time"
"gorm.io/gorm"
)
@@ -34,11 +36,13 @@ type Repo[T model.ModelI] interface {
UpdateByIdWithDb(ctx context.Context, db *gorm.DB, e T, columns ...string) error
// UpdateByCond 更新满足条件的数据
// @param values 需要模型结构体或map
// @param cond 条件
UpdateByCond(ctx context.Context, e T, cond any) error
UpdateByCond(ctx context.Context, values any, cond any) error
// UpdateByCondWithDb 更新满足条件的数据
UpdateByCondWithDb(ctx context.Context, db *gorm.DB, e T, cond any) error
// @param values 需要模型结构体或map
UpdateByCondWithDb(ctx context.Context, db *gorm.DB, values any, cond any) error
// 保存实体实体IsCreate返回true则新增否则更新
Save(ctx context.Context, e T) error
@@ -48,13 +52,10 @@ type Repo[T model.ModelI] interface {
SaveWithDb(ctx context.Context, db *gorm.DB, e T) error
// 根据实体主键删除实体
DeleteById(ctx context.Context, id uint64) error
DeleteById(ctx context.Context, id ...uint64) error
// 使用指定gorm db执行主要用于事务执行
DeleteByIdWithDb(ctx context.Context, db *gorm.DB, id uint64) error
// 根据实体条件更新参数udpateFields指定字段
Updates(cond any, udpateFields map[string]any) error
DeleteByIdWithDb(ctx context.Context, db *gorm.DB, id ...uint64) error
// 根据实体条件删除实体
DeleteByCond(ctx context.Context, cond any) error
@@ -62,11 +63,14 @@ type Repo[T model.ModelI] interface {
// 使用指定gorm db执行主要用于事务执行
DeleteByCondWithDb(ctx context.Context, db *gorm.DB, cond any) error
// ExecBySql 执行原生sql
ExecBySql(sql string, params ...any) error
// 根据实体id查询
GetById(e T, id uint64, cols ...string) error
// 根据实体id数组查询对应实体列表并将响应结果映射至list
GetByIdIn(list any, ids []uint64, orderBy ...string) error
GetByIds(list any, ids []uint64, orderBy ...string) error
// GetByCond 根据实体条件查询实体信息(单个结果集)
GetByCond(cond any) error
@@ -119,37 +123,50 @@ func (br *RepoImpl[T]) BatchInsertWithDb(ctx context.Context, db *gorm.DB, es []
}
func (br *RepoImpl[T]) UpdateById(ctx context.Context, e T, columns ...string) error {
if db := contextx.GetDb(ctx); db != nil {
return br.UpdateByIdWithDb(ctx, db, e, columns...)
}
return gormx.UpdateById(br.fillBaseInfo(ctx, e), columns...)
return br.UpdateByIdWithDb(ctx, contextx.GetDb(ctx), e, columns...)
}
func (br *RepoImpl[T]) UpdateByIdWithDb(ctx context.Context, db *gorm.DB, e T, columns ...string) error {
if db == nil {
return gormx.UpdateById(br.fillBaseInfo(ctx, e), columns...)
}
return gormx.UpdateByIdWithDb(db, br.fillBaseInfo(ctx, e), columns...)
}
func (br *RepoImpl[T]) UpdateByCond(ctx context.Context, e T, cond any) error {
if db := contextx.GetDb(ctx); db != nil {
return br.UpdateByCondWithDb(ctx, db, e, cond)
func (br *RepoImpl[T]) UpdateByCond(ctx context.Context, values any, cond any) error {
return br.UpdateByCondWithDb(ctx, contextx.GetDb(ctx), values, cond)
}
func (br *RepoImpl[T]) UpdateByCondWithDb(ctx context.Context, db *gorm.DB, values any, cond any) error {
if e, ok := values.(T); ok {
// 先随机设置一个id让fillBaseInfo不填充create信息
e.SetId(1)
e = br.fillBaseInfo(ctx, e)
// model的主键值需为空否则会带上主键条件
e.SetId(0)
values = e
} else {
var mapValues map[string]any
// 非model实体则为map
if m, ok := values.(map[string]any); ok {
mapValues = m
} else if collxm, ok := values.(collx.M); ok {
mapValues = map[string]any(collxm)
}
if len(mapValues) > 0 {
mapValues[model.UpdateTimeColumn] = time.Now()
if la := contextx.GetLoginAccount(ctx); la != nil {
mapValues[model.ModifierColumn] = la.Username
mapValues[model.ModifierIdColumn] = la.Id
}
values = mapValues
}
}
e = br.fillBaseInfo(ctx, e)
// model的主键值需为空否则会带上主键条件
e.SetId(0)
return gormx.UpdateByCond(e, toQueryCond(cond))
}
func (br *RepoImpl[T]) UpdateByCondWithDb(ctx context.Context, db *gorm.DB, e T, cond any) error {
e = br.fillBaseInfo(ctx, e)
// model的主键值需为空否则会带上主键条件
e.SetId(0)
return gormx.UpdateByCondWithDb(db, br.fillBaseInfo(ctx, e), toQueryCond(cond))
}
func (br *RepoImpl[T]) Updates(cond any, udpateFields map[string]any) error {
return gormx.Updates(br.GetModel(), cond, udpateFields)
if db == nil {
return gormx.UpdateByCond(br.GetModel(), values, toQueryCond(cond))
}
return gormx.UpdateByCondWithDb(db, br.GetModel(), values, toQueryCond(cond))
}
func (br *RepoImpl[T]) Save(ctx context.Context, e T) error {
@@ -166,15 +183,15 @@ func (br *RepoImpl[T]) SaveWithDb(ctx context.Context, db *gorm.DB, e T) error {
return br.UpdateByIdWithDb(ctx, db, e)
}
func (br *RepoImpl[T]) DeleteById(ctx context.Context, id uint64) error {
func (br *RepoImpl[T]) DeleteById(ctx context.Context, id ...uint64) error {
if db := contextx.GetDb(ctx); db != nil {
return br.DeleteByIdWithDb(ctx, db, id)
return br.DeleteByIdWithDb(ctx, db, id...)
}
return gormx.DeleteById(br.GetModel(), id)
return gormx.DeleteById(br.GetModel(), id...)
}
func (br *RepoImpl[T]) DeleteByIdWithDb(ctx context.Context, db *gorm.DB, id uint64) error {
return gormx.DeleteByIdWithDb(db, br.GetModel(), id)
func (br *RepoImpl[T]) DeleteByIdWithDb(ctx context.Context, db *gorm.DB, id ...uint64) error {
return gormx.DeleteByIdWithDb(db, br.GetModel(), id...)
}
func (br *RepoImpl[T]) DeleteByCond(ctx context.Context, cond any) error {
@@ -188,6 +205,10 @@ func (br *RepoImpl[T]) DeleteByCondWithDb(ctx context.Context, db *gorm.DB, cond
return gormx.DeleteByCondWithDb(db, br.GetModel(), toQueryCond(cond))
}
func (br *RepoImpl[T]) ExecBySql(sql string, params ...any) error {
return gormx.ExecSql(sql, params...)
}
func (br *RepoImpl[T]) GetById(e T, id uint64, cols ...string) error {
if err := gormx.GetById(e, id, cols...); err != nil {
return err
@@ -195,7 +216,7 @@ func (br *RepoImpl[T]) GetById(e T, id uint64, cols ...string) error {
return nil
}
func (br *RepoImpl[T]) GetByIdIn(list any, ids []uint64, orderBy ...string) error {
func (br *RepoImpl[T]) GetByIds(list any, ids []uint64, orderBy ...string) error {
return br.SelectByCond(model.NewCond().In(model.IdColumn, ids).OrderBy(orderBy...), list)
}
@@ -231,6 +252,7 @@ func (br *RepoImpl[T]) fillBaseInfo(ctx context.Context, e T) T {
return e
}
// toQueryCond 统一转为*model.QueryCond
func toQueryCond(cond any) *model.QueryCond {
if qc, ok := cond.(*model.QueryCond); ok {
return qc

View File

@@ -22,10 +22,10 @@ func GetById(dbModel any, id uint64, cols ...string) error {
return NewQuery(dbModel, model.NewCond().Columns(cols...).Eq(model.IdColumn, id)).GenGdb().Scopes(UndeleteScope).First(dbModel).Error
}
// 获取满足model中不为空的字段值条件的单个对象。model需为指针类型需要将查询出来的值赋值给model
// 根据model获取单个实体对象
//
// 若 error不为nil则为不存在该记录
// @param cond 模型条件
// @param cond 查询条件
func GetByCond(dbModel any, cond *model.QueryCond) error {
return NewQuery(dbModel, cond).GenGdb().Scopes(UndeleteScope).First(cond.GetDest()).Error
}
@@ -37,7 +37,7 @@ func CountByCond(dbModel any, cond *model.QueryCond) int64 {
return count
}
// 根据查询条件分页查询数据
// PageQuery 根据查询条件分页查询数据
// 若未指定查询列则查询列以toModels字段为准
func PageQuery[T any](q *Query, pageParam *model.PageParam, toModels T) (*model.PageResult[T], error) {
q.Undeleted()
@@ -60,7 +60,7 @@ func PageQuery[T any](q *Query, pageParam *model.PageParam, toModels T) (*model.
return &model.PageResult[T]{Total: count, List: toModels}, nil
}
// 根据指定查询条件分页查询数据
// PageByCond 根据指定查询条件分页查询数据
func PageByCond[T any](dbModel any, cond *model.QueryCond, pageParam *model.PageParam, toModels T) (*model.PageResult[T], error) {
return PageQuery(NewQuery(dbModel, cond), pageParam, toModels)
}
@@ -111,31 +111,27 @@ func UpdateByIdWithDb(db *gorm.DB, model any, columns ...string) error {
}
// UpdateByCondWithDb 使用指定gorm.DB更新满足条件的数据(model的主键值需为空否则会带上主键条件)
func UpdateByCond(dbModel any, cond *model.QueryCond) error {
return UpdateByCondWithDb(global.Db, dbModel, cond)
func UpdateByCond(dbModel any, values any, cond *model.QueryCond) error {
return UpdateByCondWithDb(global.Db, dbModel, values, cond)
}
// UpdateByCondWithDb 使用指定gorm.DB更新满足条件的数据(model的主键值需为空否则会带上主键条件)
func UpdateByCondWithDb(db *gorm.DB, model any, cond *model.QueryCond) error {
gormDb := db.Model(model).Select(cond.GetSelectColumns())
// @values values must be a struct or map.
func UpdateByCondWithDb(db *gorm.DB, dbModel any, values any, cond *model.QueryCond) error {
gormDb := db.Model(dbModel).Select(cond.GetSelectColumns())
setGdbWhere(gormDb, cond)
return gormDb.Updates(model).Error
}
// 根据实体条件更新参数udpateFields指定字段
func Updates(model any, condition any, updateFields map[string]any) error {
return global.Db.Model(model).Where(condition).Updates(updateFields).Error
return gormDb.Updates(values).Error
}
// 根据id删除model
// @param model 数据库映射实体模型
func DeleteById(model_ any, id uint64) error {
return DeleteByIdWithDb(global.Db, model_, id)
func DeleteById(model_ any, id ...uint64) error {
return DeleteByIdWithDb(global.Db, model_, id...)
}
// 根据id使用指定gromDb删除
func DeleteByIdWithDb(db *gorm.DB, model_ any, id uint64) error {
return db.Model(model_).Where("id = ?", id).Updates(getDeleteColumnValue()).Error
func DeleteByIdWithDb(db *gorm.DB, model_ any, id ...uint64) error {
return DeleteByCondWithDb(db, model_, model.NewCond().In(model.IdColumn, id))
}
// 根据cond条件删除指定model表数据

View File

@@ -12,6 +12,9 @@ const (
IdColumn = "id"
DeletedColumn = "is_deleted" // 删除字段
DeleteTimeColumn = "delete_time"
ModifierColumn = "modifier"
ModifierIdColumn = "modifier_id"
UpdateTimeColumn = "update_time"
ModelDeleted int8 = 1
ModelUndeleted int8 = 0