feat(ECR-011): 昵称、首页贴士与档案 Self 唯一/合盘交叉校验
ci / h5 (push) Canceled after 0s
ci / api (push) Canceled after 0s
ci / ess-docs (push) Canceled after 0s

每账号仅一条 self(migration 40902);合盘只选 TA;账号昵称可改;首页穿衣/颜色/养生贴士。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
jackyu66git
2026-08-12 22:05:00 +08:00
co-authored by Cursor
parent 5ceb3ce749
commit 13860bf1ef
67 changed files with 1936 additions and 275 deletions
+4 -1
View File
@@ -83,6 +83,8 @@ Device 绑定到账号 User
| R4 | 生成/查看档案与报告 API 必须已注册(users.phone 非空)且有效 session 或已绑设备账号 |
| R5 | 登出作废 session;设备可再登录其他账号 |
| R6 | 正式环境恢复校验前须改回本 Spec |
| R7 | 新账号未填昵称时,服务端用「意象词+场景词」词库(100×100)随机生成,如心语岛、微光谷 |
| R8 | 账号昵称可在个人档案页修改(PATCH `/auth/me`);首页展示昵称而非「自己」 |
---
@@ -97,10 +99,11 @@ Device 绑定到账号 User
| Method | Path | 说明 |
|---|---|---|
| POST | `/api/v1/auth/register` | 注册 |
| POST | `/api/v1/auth/register` | 注册(可带 nickname |
| POST | `/api/v1/auth/login` | 登录 |
| POST | `/api/v1/auth/logout` | 登出 |
| GET | `/api/v1/auth/me` | 当前账号 |
| PATCH | `/api/v1/auth/me` | 更新昵称 `{ nickname }` |
---
+28 -8
View File
@@ -63,8 +63,9 @@
```text
/
├── Hero / 品牌
├── 建档 CTA
├── 功能入口
├── 「自己」卡片标题展示账号昵称(默认意象词+场景词;档案页可改)
├── 穿衣指数 · 颜色搭配 · 养生推荐
├── 功能入口(4 列固定网格 · 多行换行 · 禁止横向滑动)
└── (可选)推荐内容
```
@@ -90,27 +91,34 @@ Empty:首页本身是入口,不因无档案空白死页。
| R2 | 不展示内部运维信息(API 连接状态等) |
| R3 | 入口文案符合 lexicon(个人画像/关系理解/成长会员…) |
| R4 | Tab 五名冻结:首页·探索·问答·陪伴·我的 |
| R5 | 「自己」卡片:穿衣指数 / 颜色搭配 / 养生推荐;有 Self 档案生日时按生日+本地时刻易经卦象种子调大模型生成;无档案或 LLM 不可用则本地回退 |
| R6 | 文案禁止占卜/算命恐吓与医疗疗效承诺;卦象仅作节律意象 |
---
## 8. 数据模型影响
经首页建档时写 `profiles`(见 profile Spec)。
经首页建档时写 `profiles`(见 profile Spec)。每日贴士可缓存(同用户约 45 分钟 / 按时段刷新)。
---
## 9. API 需求
复用 `POST /profiles``POST /reports/portrait`;无专用 home API。
| Method | Path | 说明 |
|---|---|---|
| GET | `/api/v1/home/tools` | 宫格(已有) |
| GET | `/api/v1/home/daily-tips` | 自己卡片贴士(DeviceAuth;有 birthday 则 LLM |
| — | 复用 | `POST /profiles``POST /reports/portrait` |
---
## 10. 权限设计
| 能力 | Visitor |
|---|---|
| 浏览首页 | ✓ |
| 建档并生成画像 | ✓ |
| 能力 | Visitor | User |
|---|---|---|
| 浏览首页 | ✓ | ✓ |
| 建档并生成画像 | 需登录 | ✓ |
| daily-tips(个性化) | 回退文案 | 有 Self 生日则 LLM |
---
@@ -134,10 +142,22 @@ Empty:首页本身是入口,不因无档案空白死页。
**When** 提交主 CTA
**Then** 进入画像基础结果路径
**Given** 已登录且有 Self 生日、已配 deepseek
**When** GET `/home/daily-tips`
**Then** `source=llm` 且含 clothing_index / palette / wellness
**Given** 无档案或无 LLM
**When** GET `/home/daily-tips`
**Then** `source=fallback` 且页面不白屏
---
## 13. AI 开发前检查
- [x] lexicon
- [x] 不恐吓 / 不算命话术
- [x] OpenAPI 已登记 `/home/daily-tips`
- [x] Spec 齐全
---
+11
View File
@@ -92,6 +92,8 @@
| R4 | 删除策略:任务未要求硬删 PII 时按实现(软删优先);级联影响报告见服务规则 |
| R5 | Ask / 画像 / 关系必须挂合法 profile_id |
| R6 | 文案用「个人档案」,不用命盘 |
| R7 | **每账号至多一条** `relation=self`(唯一索引);再建 self → 409;解码/星盘等复用或更新既有 Self,禁止重复造「我」 |
| R8 | 合盘/匹配对象列表只展示 `other` + 附近的人;不得把多余 self 当作 TA |
---
@@ -100,6 +102,7 @@
| 表 | 字段要点 |
|---|---|
| `profiles` | id, user_id, relation, display_name, birth_date, birth_time?, birth_place?, gender?, relation_type? |
| 约束 | 部分唯一:`(user_id) WHERE relation='self' AND deleted_at IS NULL` |
---
@@ -143,10 +146,18 @@
**When** 添加 TA
**Then** relation=other 且可用于关系理解
**Given** 已有 Self
**When** 再次 POST relation=self
**Then** 409 conflict;列表仍仅一条 Self
**Given** 他人 id
**When** PATCH
**Then** 失败
**Given** 同账号多条历史 self(脏数据)
**When** 迁移/启动
**Then** 仅保留最新一条,其余软删;合盘 TA 侧不再出现多个「我」
---
## 13. AI 开发前检查
+1
View File
@@ -106,6 +106,7 @@
| R8 | 合盘与人格匹配分流:`/synastry` 盘型;`/relation` 行为风格 |
| R9 | 附近的人默认 `geo_visible=false`;仅可见已开启位置的 self 档案 |
| R10 | 合盘星历走 Swiss Ephemeris(默认 Moshier);宫位制 Whole Sign |
| R11 | 合盘交叉校验:档案 A 为本账号 Self;档案 B 须为本账号 `other` 或附近可见他人 Self;拒绝 self×self / 同 id |
---