package common import ( "context" "time" "github.com/gogf/gf/v2/database/gdb" "github.com/gogf/gf/v2/frame/g" ) // BaseDao 是所有 dao 的基类:单表操作统一入口,查询缓存由 dao 层按需配置。 type BaseDao struct { Table string } func (d *BaseDao) Model() *gdb.Model { return g.DB().Model(d.Table) } func (d *BaseDao) InsertAndReturnId(ctx context.Context, data g.Map) (int64, error) { res, err := d.Model().Ctx(ctx).Data(data).Insert() if err != nil { return 0, err } return res.LastInsertId() } func (d *BaseDao) UpdateByPk(ctx context.Context, pk int64, data g.Map) error { _, err := d.Model().Ctx(ctx).WherePri(pk).Data(data).Update() return err } // ContentCache 内容查询缓存选项:TTL 来自配置 database.cache.ttl,≤0 回退 300 秒。 func (d *BaseDao) ContentCache(ctx context.Context) gdb.CacheOption { ttl := g.Cfg().MustGet(ctx, "database.cache.ttl").Int() if ttl <= 0 { ttl = 300 } return gdb.CacheOption{Duration: time.Duration(ttl) * time.Second} } // GetOne 执行单行查询,用 goframe 自带转换(Record.Struct,orm tag 优先)转为结构体; // 记录不存在返回 nil, nil。dao 层把构建好的 model(含条件/排序/缓存)传入。 func GetOne[T any](m *gdb.Model) (*T, error) { rec, err := m.One() if err != nil { return nil, err } if rec.IsEmpty() { return nil, nil } dst := new(T) if err = rec.Struct(dst); err != nil { return nil, err } return dst, nil } // GetList 执行多行查询,用 goframe 自带转换(Result.Structs)转为结构体切片;无记录返回空切片。 func GetList[T any](m *gdb.Model) ([]*T, error) { recs, err := m.All() if err != nil { return nil, err } if len(recs) == 0 { return []*T{}, nil } var items []*T if err = recs.Structs(&items); err != nil { return nil, err } return items, nil }