feat: complete huihui square avatar workflows

This commit is contained in:
stefanfeng
2026-07-24 14:04:21 +08:00
parent 2ef58a44b8
commit e3bda469bb
68 changed files with 8062 additions and 132 deletions

View File

@@ -0,0 +1,75 @@
# 会会数字分身 · 用户资料与分身隔离落地说明
## 问题
用户登录成功后,发现页面显示"已有数字分身",且没有看到当前登录账号的头像/昵称;同时希望在创建数字分身时直接沿用当前会会账号的名称和头像。
## 根因
1. **后端 `GET /api/avatar` 全局返回所有分身**,没有按用户隔离;且 `backend/main.py``seed()` 在数据库为空时会插入一个名为"我的数字分身"的种子记录。任何新登录用户都会看到它。
2. 用户头像/昵称虽然已经在登录响应中返回并落库存入 `users` 表,但**仪表盘没有展示**。
3. `AvatarCreate.vue` 只预填了昵称到 `displayName`,没有 `photoUrl` 字段,也没有头像预览。
## 改动
### 后端:分身按用户隔离
- `backend/models.py`
- `Avatar` 新增 `owner_id` 字段(会会 `huihui_user_id`),索引,默认空字符串。
- `to_dict()` 暴露 `ownerId`
- `backend/database.py`
-`_try_add_columns` 中加入 `("avatars", "owner_id", "VARCHAR DEFAULT ''")`,容器启动时自动给已有 SQLite 表加列。
- `backend/routers/avatars.py`
- 新增 `_resolve_user()``Authorization: Bearer <app_token>` 解析当前用户。
- `GET /api/avatar` 仅返回 `owner_id == user.huihui_user_id` 的分身;无/无效 token 返回空列表。
- `POST /api/avatar` 创建时写入当前用户的 `owner_id`
### 前端:仪表盘展示用户资料头
- `src/views/AvatarManage.vue`
- 引入 `useUserStore`
- 顶部新增用户资料头:圆形头像(`userStore.user.avatarUrl`,无则 emoji 回退)+ 昵称 + 登录状态/手机号。
- 分身卡片优先显示真实头像 `photoUrl`,无则回退 emoji。
### 前端:创建分身预填名称与头像
- `src/views/AvatarCreate.vue`
- 表单新增 `photoUrl`
- `onMounted``avatarStore.userProfile || userStore.user` 预填 `name``displayName``photoUrl`
- Step1 新增"分身头像"预览区与"已沿用你的会会头像"提示。
- 确认页显示用户头像(或 emoji 回退)。
- 提交时携带 `photoUrl`
- 引导页"已有数字分身?"文案改为 `v-if="avatarStore.avatars.length > 0"`,避免新用户被误导。
### Ardot 视觉稿
- 新建「会会数字分身-仪表盘与创建页」(`fileId: 706241841026616`)。
- 包含两屏:
1. 数字分身管理仪表盘状态栏、橙头、用户资料头、Token 余额、分身卡片、工具入口)。
2. 创建数字分身 Step1头像预览、预填名称/显示名称、描述、下一步)。
- 沿用 Glass Sunset Warm 品牌色系(`#FFF6EC` 背景、`#FF8C42` 主色、`#4A2511` 文字)。
## 部署
- 前端:`./node_modules/.bin/vite build``rsync dist/``docker cp``avatar-test-frontend` → restart。
- 后端:`rsync models.py / database.py / routers/avatars.py``docker cp``avatar-test-backend` → restart启动时自动迁移 `owner_id` 列。
## 验证结果(容器内实测)
| 检查项 | 结果 |
|---|---|
| `owner_id` 列已迁移 | ✅ |
| 种子分身 `owner_id=''` | ✅ |
| 无 auth `GET /api/avatar` | `{data:[],total:0}` ✅ |
| 登录用户 `GET /api/avatar` | `{data:[],total:0}`(种子隐藏)✅ |
| 创建分身写入 `ownerId` + `photoUrl` | ✅ |
| 创建后本人列表只含 1 条 | ✅ |
| 删除后列表回归空 | ✅ |
## 用户现在体验
1. 登录后进入 `/#/`(创建引导)或 `/#/avatar/manage`(仪表盘),**顶部会显示当前会会账号的头像和昵称**。
2. 新用户首次登录时,**不会看到任何"已有"分身**(列表为空)。
3. 点"立即创建一个"进入创建流程,**名称和头像已经自动预填**了当前用户的会会昵称和头像。
4. 创建成功后,仪表盘只显示用户自己创建的分身。
## 访问地址
测试环境(同网段/隧道可达):
- 创建引导页:`http://192.168.1.188:8099/#/`
- 仪表盘:`http://192.168.1.188:8099/#/avatar/manage`
- 登录页:`http://192.168.1.188:8099/#/login/sms`
## 后续可选
- 生产环境切到 `99hui.com` 后可真正下发短信;当前 `fat-open` 预发环境建议继续用账号密码登录。
- 可在创建页支持用户上传/裁剪自定义头像,替代目前直接沿用会会头像的方案。