Files
digital-psychology/.ai/product/feature-spec/star-profile.md
T
jackyu66gitandCursor 4889ff5916 merge: 合入本地 Ops 扩展与 origin/main(ECR-009–016)
保留远程用户侧 ECR-009–016 与本地 Ops 目录/RBAC/CMS/危机等能力;文档标注分叉期间 ECR 编号冲突。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-13 01:45:53 +08:00

219 lines
7.9 KiB
Markdown
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.
# Feature Spec: 星座
> Status: `Active` · Map: `2.6 星座 [P2]` · Phase: `P2 Complete`
> 规范:[../feature-design.md](../feature-design.md) · 队列:[P2-BACKLOG.md](P2-BACKLOG.md)
> 竞品对照:测测星座体系(本命排盘 · 运势大全 · 连线合盘)
---
## 1. 功能定义
| 字段 | 内容 |
|---|---|
| Name | 星座(StarProfile+ 合盘(Synastry |
| Purpose | 用生日(可选出生时/出生地)生成本命排盘、相位、日周月年/一生运势、行运速览;双人合盘(比较/组合/时空/马克斯/配对 + 次限推运)与恋爱/友情/婚姻指数 |
| Business Goal | P2 探索供给;分享裂变;深度版/会员转化 |
| In | Out |
|---|---|
| 圆形本命盘 + 宫位 + 相位预览 | 占卜/算命恐吓话术 |
| 日/周/月/年/一生运势 + 行运速览 | 医疗疗效承诺 |
| 合盘五主盘 + 三推运 + 三指数;附近/邀请 | 自称「测测」;达人市场/微信关系链拉取 |
| 多维 summary + 付费 detail | |
| 挂 ProfileGrowthReport `star` / `synastry` | |
---
## 2. 用户价值
1. **为何需要:** 用熟悉的星座语言认识自己的节奏、运势与互动偏好。
2. **完成后获得:** 本命轮盘、三大星座、行星/宫位、运势与行运;合盘页看五主盘、次限与三指数。
3. **为何付费:** 完整相位表、年运/一生深析、合盘相处长文、推运深文案与跨盘相位详解。
---
## 3. 用户角色
| Actor | 能力 |
|---|---|
| Visitor | 有档案可生成基础报告(轮盘 + 今日运势 + 合盘指数) |
| DeepAccess / VIP | 可见 detail(完整相位、年运/一生深析、合盘深文案) |
| 无档案 | Empty → 页内填生日(可选时/地) |
---
## 4. 用户流程
```text
/explore 或 /star
确认 Profilebirth_datebirth_time / birth_place 可选增强)
生成 Star 报告 → 星盘轮盘 · 运势 · 行星 · 行运
深度版?→ order deep_access / 会员 → detail
可选:/synastry 全盘型合盘 · /synastry/invite/:token · /relation · 问答
```
---
## 5. 页面设计
| 路由 | 页面 | 说明 |
|---|---|---|
| `/star` | StarProfilePage | 星盘(轮盘)/ 运势 / 行星 |
| `/synastry` | SynastryPage | 五主盘 Tab + 次限 + 附近/邀请 + 深度墙 |
| `/synastry/invite/:token` | SynastryInvitePage | 好友接受邀请并生成合盘 |
| `/reports/:id` | ReportPage | type=star / synastry 专用展示 |
| `/relation` | RelationPage | 人格匹配(行为风格,复用指数) |
| `/explore` | 入口 | 排盘 / 合盘 |
```text
/star
├── Empty(页内生日表单)
├── Loading
├── Normal(轮盘+运势+行运)
├── Locked(深度墙)
└── Error
```
---
## 6. 页面状态规范
| 状态 | UI |
|---|---|
| Loading | 生成中 |
| Empty | 页内填生日(可选时/地) |
| Error | 重试 |
| Normal | 轮盘 + 运势基础层 |
| Locked | 深度版 CTA |
---
## 7. Business Rules
| ID | Rule |
|---|---|
| R1 | 必须绑定用户可访问的 Profilebirth_date 必填 |
| R2 | 内容确定性:同档案输入 → 同报告(可版本化 seed) |
| R3 | summary 始终对所有者可读;detail 需 Membership **或** DeepAccess |
| R4 | **允许**运势分、吉凶分维文案、合盘缘分/匹配指数;禁止占卜/算命恐吓与疗效承诺 |
| R5 | 太阳/月亮/上升/行星标签须伴随探索免责(非宿命断言恐吓) |
| R6 | 与个人画像并存:画像偏行为模式;本模块偏星座星盘语言 |
| R7 | 文案过 lexiconUI 主标题「星座」/「合盘」 |
| R8 | 合盘与人格匹配分流:`/synastry` 盘型;`/relation` 行为风格 |
| R9 | 附近的人默认 `geo_visible=false`;仅可见已开启位置的 self 档案 |
| R10 | 合盘星历走 Swiss Ephemeris(默认 Moshier);宫位制 Whole Sign |
| R11 | 合盘交叉校验:档案 A 为本账号 Self;档案 B 须为本账号 `other` 或附近可见他人 Self;拒绝 self×self / 同 id |
| R12 | **本命层**(轮盘/行星/相位/太阳月亮上升)随生日确定,不因打开时间重算;**运势层**(日/周/月/年 outlook · 行运)按**自然日(CST**刷新 |
| R13 | GET `/reports/latest` 与 GET `/reports/{id}`type=star):若 `summary.as_of` ≠ 当日则**原报告 id 原地更新**时效段并落库;同日再读即时返回;禁止为换日运新建报告 id(以免深度权益丢失) |
| R14 | `summary``as_of`YYYY-MM-DD)与 `valid_until`(次日 00:00 CST RFC3339);前端到点静默刷新;**不按十二时辰**切换 |
---
## 8. 数据模型影响
| 表/字段 | 变更 |
|---|---|
| `growth_reports.type` | `star` · `synastry` |
| `profiles.birth_time` | 可选参与上升/宫位 |
| `profiles.birth_place` | 可选;常用城市表解析经纬度 |
| `profiles.geo_lat/lng/visible` | 附近的人 |
| `synastry_invites` | 邀请 token · host/guest · report_id |
| 报告 JSON | `charts.*`(五主盘+推运)· `as_of` · `valid_until` · 三指数 · fortune/transits |
详见 erd;实现切片同步 OpenAPI。
---
## 9. API 需求
| Method | Path | 意图 |
|---|---|---|
| POST | `/api/v1/reports/star` | body: `profile_id` → GrowthReport |
| POST | `/api/v1/reports/synastry` | body: `profile_id_a` + `profile_id_b` + optional `as_of` |
| GET | `/api/v1/synastry/nearby` | lat/lng/radius_km → 可合盘对象 |
| POST | `/api/v1/synastry/invites` | 生成邀请 |
| GET | `/api/v1/synastry/invites/{token}` | 邀请元数据 |
| POST | `/api/v1/synastry/invites/{token}/accept` | 接受并生成报告 |
| GET | `/api/v1/reports/{id}` | 权益裁剪(复用) |
| POST | `/api/v1/orders` + pay-mock | 深度版(复用) |
---
## 10. 权限设计
| 能力 | Visitor+档案 | DeepAccess/VIP |
|---|---|---|
| 轮盘 / 日运 / 行运 / 合盘三指数 / 各盘缩略 | ✓ | ✓ |
| 完整相位 / 年运与一生深析 / 合盘相处长文 / 推运深文案 | ✗ | ✓ |
---
## 11. 埋点
| Event | 触发 |
|---|---|
| `star_completed` | 基础结果展示 |
| `star_wheel_viewed` | 点选轮盘行星 |
| `synastry_completed` | 合盘结果展示 |
| `synastry_invite_created` / `synastry_invite_accepted` | 邀请链路 |
| `synastry_nearby_opened` | 附近面板 |
| `deep_access_clicked` | surface=star / synastry |
---
## 12. 测试验收标准
**Given** Self 有生日
**When** 生成星座报告
**Then** 展示轮盘、太阳/月亮/上升、相位速览、outlook 日/周/月/年/一生与行运;无「占卜」「算命」恐吓
**Given** 两份档案
**When** POST synastry
**Then** summary 含三指数与 `charts` 五主盘 + 三推运 key;detail 无权益时剥离
**Given** 邀请 token
**When** accept
**Then** 生成 synastry 报告
**Given** 无权益
**When** 请求 detail
**Then** Server 剥离
**Given** 无档案
**When** 打开 `/star`
**Then** 页内生日表单可生成
**Given** 已有 star 报告且 `as_of` 为昨日
**When** GET latest
**Then** 日运等 outlook 按今日更新;报告 `id` 不变;响应含当日 `as_of``valid_until`
**Given** 用户停留在 `/star` 跨自然日
**When** 到达 `valid_until`
**Then** 前端静默刷新运势 Tab 内容
---
## 13. AI 开发前检查
- [x] Spec 齐全
- [x] lexicon 已登记 StarProfile
- [x] OpenAPI 切片(synastry
- [x] §12 可测
---
## 14. Implementation Notes
| 项 | 内容 |
|---|---|
| 复用 | ReportRich · DeepAccess · NatalWheel · Explore |
| Packages | `internal/star` · `ephemeris` · `natal` · `fortune` · `synastry` |
| 星历 | Swiss EphemerisCGO,默认 Moshier);热带 + Whole Sign |
| 实现 | `POST /reports/star` · `POST /reports/synastry` · nearby/invites · H5 `/star` · `/synastry` · invite |
| Gaps | ECR-012 收口:报告页复用 StarFortunePanel;分享 type=starfortuneBundle 仅读 outlook 且剥离 luckye2e mock 含 outlook |
| ESS | `docs/ECR/ECR-012-star-alignment.md`**Approved** · L2)· BD-2026-012 Approved |