Files
slogan/styleagent/dao/user_dao.go
T
adminandClaude Opus 4.7 ef22f7672a feat: slogan-agent MVP 服务端完整实现
- 用户域:注册/登录(JWT)/修改密码/个人资料
- 照片/衣橱/身形/化身:上传存储 + 3D 化身模板匹配
- 穿搭生成:天气(高德+和风+缓存) → 规则预筛 → LLM 规划(1次调用)
  → 规则评分(5维100分制) → 全低分触发 LLM 兜底创作 → 异步任务状态机
- 效果图:选主方案后异步生成 3 视角(mock/wanx 供应商 + 内容 hash 缓存 + 每日限额)
- 商业化:合作门店列表(seed 4 家)
- 冒烟:全链路端到端验证通过(mock LLM/天气),23 个 API 端点

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-07-31 12:15:11 +08:00

96 lines
3.1 KiB
Go

package dao
import (
"context"
"slogan-agent/common"
"slogan-agent/styleagent/consts"
"slogan-agent/styleagent/model/entity"
"github.com/gogf/gf/v2/database/gdb"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gcache"
"github.com/gogf/gf/v2/util/gconv"
)
var User = &userDao{}
type userDao struct{}
func init() {
ctx := context.Background()
_, err := g.DB().Exec(ctx, `CREATE TABLE IF NOT EXISTS `+consts.TableNameUser+` (
id INTEGER PRIMARY KEY AUTOINCREMENT,
role TEXT NOT NULL DEFAULT 'user',
username TEXT NOT NULL DEFAULT '',
phone TEXT NOT NULL DEFAULT '',
password TEXT NOT NULL DEFAULT '',
name TEXT NOT NULL DEFAULT '',
created_at DATETIME DEFAULT (datetime('now','localtime')),
updated_at DATETIME DEFAULT (datetime('now','localtime'))
)`)
if err != nil {
g.Log().Warningf(ctx, "create user table failed: %v", err)
}
if _, err := g.DB().Exec(ctx, "CREATE UNIQUE INDEX IF NOT EXISTS idx_slogan_user_username ON "+consts.TableNameUser+"(username) WHERE username != ''"); err != nil {
g.Log().Warningf(ctx, "create index idx_slogan_user_username failed: %v", err)
}
if _, err := g.DB().Exec(ctx, "CREATE UNIQUE INDEX IF NOT EXISTS idx_slogan_user_phone ON "+consts.TableNameUser+"(phone) WHERE phone != ''"); err != nil {
g.Log().Warningf(ctx, "create index idx_slogan_user_phone failed: %v", err)
}
}
func clearUserCache(ctx context.Context, id int64) {
_, _ = gcache.Remove(ctx, "user_GetOne_"+gconv.String(id))
_, _ = gcache.Remove(ctx, "user_GetByAccount_")
}
func (d *userDao) Insert(ctx context.Context, data *entity.User) (int64, error) {
r, err := g.DB().Exec(ctx,
"INSERT INTO "+consts.TableNameUser+" (role, username, phone, password, name, created_at, updated_at) VALUES (?, ?, ?, ?, ?, datetime('now','localtime'), datetime('now','localtime'))",
data.Role, data.Username, data.Phone, data.Password, data.Name)
if err != nil {
return 0, err
}
return r.LastInsertId()
}
func (d *userDao) GetOne(ctx context.Context, id int64) (*entity.User, error) {
var u entity.User
err := g.DB().Model(consts.TableNameUser).Ctx(ctx).
Cache(gdb.CacheOption{Duration: common.CacheTTL(), Name: "user_GetOne_" + gconv.String(id)}).
Where("id", id).Scan(&u)
if err != nil {
return nil, err
}
if u.Id == 0 {
return nil, nil
}
return &u, nil
}
func (d *userDao) GetByAccount(ctx context.Context, account string) (*entity.User, error) {
var u entity.User
err := g.DB().Model(consts.TableNameUser).Ctx(ctx).
Cache(gdb.CacheOption{Duration: common.CacheTTL(), Name: "user_GetByAccount_" + account}).
Where("username = ? OR phone = ?", account, account).Scan(&u)
if err != nil {
return nil, err
}
if u.Id == 0 {
return nil, nil
}
return &u, nil
}
func (d *userDao) Update(ctx context.Context, data *entity.User) error {
_, err := g.DB().Model(consts.TableNameUser).Ctx(ctx).Data(data).Where("id", data.Id).Update()
clearUserCache(ctx, data.Id)
return err
}
func (d *userDao) UpdateFields(ctx context.Context, id int64, data g.Map) error {
_, err := g.DB().Model(consts.TableNameUser).Ctx(ctx).Data(data).Where("id", id).Update()
clearUserCache(ctx, id)
return err
}