保留远程用户侧 ECR-009–016 与本地 Ops 目录/RBAC/CMS/危机等能力;文档标注分叉期间 ECR 编号冲突。 Co-authored-by: Cursor <cursoragent@cursor.com>
219 lines
7.9 KiB
Markdown
219 lines
7.9 KiB
Markdown
# 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 | |
|
||
| 挂 Profile;GrowthReport `star` / `synastry` | |
|
||
|
||
---
|
||
|
||
## 2. 用户价值
|
||
|
||
1. **为何需要:** 用熟悉的星座语言认识自己的节奏、运势与互动偏好。
|
||
2. **完成后获得:** 本命轮盘、三大星座、行星/宫位、运势与行运;合盘页看五主盘、次限与三指数。
|
||
3. **为何付费:** 完整相位表、年运/一生深析、合盘相处长文、推运深文案与跨盘相位详解。
|
||
|
||
---
|
||
|
||
## 3. 用户角色
|
||
|
||
| Actor | 能力 |
|
||
|---|---|
|
||
| Visitor | 有档案可生成基础报告(轮盘 + 今日运势 + 合盘指数) |
|
||
| DeepAccess / VIP | 可见 detail(完整相位、年运/一生深析、合盘深文案) |
|
||
| 无档案 | Empty → 页内填生日(可选时/地) |
|
||
|
||
---
|
||
|
||
## 4. 用户流程
|
||
|
||
```text
|
||
/explore 或 /star
|
||
↓
|
||
确认 Profile(birth_date;birth_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 | 必须绑定用户可访问的 Profile;birth_date 必填 |
|
||
| R2 | 内容确定性:同档案输入 → 同报告(可版本化 seed) |
|
||
| R3 | summary 始终对所有者可读;detail 需 Membership **或** DeepAccess |
|
||
| R4 | **允许**运势分、吉凶分维文案、合盘缘分/匹配指数;禁止占卜/算命恐吓与疗效承诺 |
|
||
| R5 | 太阳/月亮/上升/行星标签须伴随探索免责(非宿命断言恐吓) |
|
||
| R6 | 与个人画像并存:画像偏行为模式;本模块偏星座星盘语言 |
|
||
| R7 | 文案过 lexicon;UI 主标题「星座」/「合盘」 |
|
||
| 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 Ephemeris(CGO,默认 Moshier);热带 + Whole Sign |
|
||
| 实现 | `POST /reports/star` · `POST /reports/synastry` · nearby/invites · H5 `/star` · `/synastry` · invite |
|
||
| Gaps | ECR-012 收口:报告页复用 StarFortunePanel;分享 type=star;fortuneBundle 仅读 outlook 且剥离 lucky;e2e mock 含 outlook |
|
||
| ESS | `docs/ECR/ECR-012-star-alignment.md`(**Approved** · L2)· BD-2026-012 Approved |
|