Files
sundynix-pets/pets-be/internal/model/user.go
T
Blizzard 8606c1dfc8 feat(be): Phase C —— 个人主页装扮 + 养宠数据
## User 加四个装扮字段
bio / bg_file_id / theme / hide_pets。

hide_pets 存的是「隐藏」而不是「展示」,为的是零值即默认:AutoMigrate
给存量行填 0,正好等于「展示宠物墙」,不用给老用户跑一次刷值。对外
API 仍然用 show_pets(UI 上是个「展示我的宠物」开关,正着说更自然),
只在 handler 边界取一次反。

theme 存 key 不存色值。色值属于前端表现层,存进库以后想调色就得改数据;
存 key 还能保证前端只渲染已知的那几种。非法 key 走 40000,老用户的空
theme 在读取时兜底成 warm,前端不会拿空 key 去查表。

## GET /users/:id/profile 扩展
原来只有昵称头像和三个计数,现在带上 bio / bg_url / theme / show_pets
+ 宠物名片墙 + 养宠数据。自己看和别人看走同一个接口,省得两套渲染慢慢长歪。

## 养宠数据
days     养宠天数,按最早那只的建档日算——这里要表达的是「你在这照顾它
         多久了」,不是宠物活了多久
records  累计记录条数
act_days 有记录的天数
streak   连续打卡

streak 有个必须处理的边界:今天还没记录不能算断签,否则用户每天早上打开
都会看到连续天数归零。实现是先看今天有没有记,没有就从昨天起往回数。

## PUT /api/user/decoration
四个字段全用指针,区分「没传」和「传了空串」——清空个性签名和不改个性
签名是两件事。bio 服务端截到 60 字。

联调验证(本地 9090):
  老用户读取     theme 兜底 warm、bio ''、hide_pets false
  改装扮        theme=mint、bio 落库
  theme=rainbow 40000 参数不合法
  bio 100 字     截断到 60
  show_pets     false → pets 字段消失,stats.pet_count 仍为 1
  别人视角       is_self=false、followed=false、装扮和宠物墙都能看到
  streak        1/2/3/5 天前各记一条:act_days=4 streak=3(第 4 天空档正确断开)
                今天再补一条:act_days=5 streak=4

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-29 17:54:16 +08:00

29 lines
1.6 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package model
// User 小程序用户(铲屎官)
type User struct {
Base
OpenID string `gorm:"size:64;index" json:"openid"`
Nickname string `gorm:"size:64" json:"nickname"`
// 昵称是系统随机生成的(还没被用户或微信授权覆盖过)。
// 有这个标记才能安全地在用户授权时覆盖,而不会把他改过的昵称冲掉。
NicknameAuto bool `json:"nickname_auto"`
PetCount int `gorm:"-" json:"pet_count"` // 计算字段:后台列表用
Avatar string `gorm:"size:512" json:"avatar"`
AvatarFileID string `gorm:"size:24" json:"avatar_file_id"` // 关联 files 表;优先于 Avatar
AvatarURL string `gorm:"-" json:"avatar_url"` // 计算字段:由 AvatarFileID 解析
Phone string `gorm:"size:32" json:"phone"`
Onboarded bool `json:"onboarded"`
Disabled bool `json:"disabled"`
IsBot bool `gorm:"size:24;index" json:"is_bot"` // 虚拟宠友账号(AI 社区运营用)
// —— 个人主页装扮 ——
Bio string `gorm:"size:120" json:"bio"` // 个性签名
BgFileID string `gorm:"size:24" json:"bg_file_id"` // 主页头图,关联 files 表
BgURL string `gorm:"-" json:"bg_url"` // 计算字段:由 BgFileID 解析
Theme string `gorm:"size:16" json:"theme"` // 主题色 key,见 service.UserThemes
// 存「隐藏」而不是「展示」,为的是零值即默认:老数据 AutoMigrate 出来是 0
// 正好等于「展示宠物墙」,不需要给存量用户跑一次刷值
HidePets bool `json:"hide_pets"`
}