# 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 |