Files
huihuiSquare/overview-avatar-user-isolation-2026-07-21.md
2026-07-24 14:04:21 +08:00

76 lines
4.2 KiB
Markdown
Raw Permalink 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.
# 会会数字分身 · 用户资料与分身隔离落地说明
## 问题
用户登录成功后,发现页面显示"已有数字分身",且没有看到当前登录账号的头像/昵称;同时希望在创建数字分身时直接沿用当前会会账号的名称和头像。
## 根因
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` 预发环境建议继续用账号密码登录。
- 可在创建页支持用户上传/裁剪自定义头像,替代目前直接沿用会会头像的方案。