Compare commits
131
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7155b8b53a | ||
|
|
db4d118f9a | ||
|
|
fc53be22f8 | ||
|
|
e7290ed726 | ||
|
|
db3669c595 | ||
|
|
580ba85b61 | ||
|
|
57687de360 | ||
|
|
f4bd57ce1b | ||
|
|
9d4fb52d29 | ||
|
|
96292d0e95 | ||
|
|
635a83fe11 | ||
|
|
ebc2d3ad80 | ||
|
|
8d856fb56c | ||
|
|
d33a25a663 | ||
|
|
c693ac4bbc | ||
|
|
e0f605558b | ||
|
|
aa197b719b | ||
|
|
580f5ea3f0 | ||
|
|
69cb99600f | ||
|
|
1db5fcc018 | ||
|
|
258deb0184 | ||
|
|
b3fe4363fd | ||
|
|
fa8b0ba963 | ||
|
|
0158036341 | ||
|
|
dc93999f9e | ||
|
|
87b463b2bb | ||
|
|
fcc7667ba3 | ||
|
|
19091bff12 | ||
|
|
77907f79ee | ||
|
|
2b295472a4 | ||
|
|
f492088237 | ||
|
|
cd3ac2c9ab | ||
|
|
ec20e9744e | ||
|
|
aff6621ff8 | ||
|
|
56f661748a | ||
|
|
655141980a | ||
|
|
9707b72808 | ||
|
|
ad45d17dff | ||
|
|
d81e8364cc | ||
|
|
b7b0b18802 | ||
|
|
0d50c0ee73 | ||
|
|
62cd8c45dd | ||
|
|
4889ff5916 | ||
|
|
89756f65b4 | ||
|
|
13860bf1ef | ||
|
|
5ceb3ce749 | ||
|
|
1026cd0596 | ||
|
|
e9c11cdf1d | ||
|
|
432c090046 | ||
|
|
e955f1e6a2 | ||
|
|
63742c1d66 | ||
|
|
5de9a7bbe5 | ||
|
|
b34b4f281f | ||
|
|
5c462ecb2a | ||
|
|
0fa6da2446 | ||
|
|
bd9e13497f | ||
|
|
57acfa6105 | ||
|
|
ebc93b6c7e | ||
|
|
09b9c4daab | ||
|
|
45e98f6872 | ||
|
|
aad6cdf7ea | ||
|
|
487bee78d1 | ||
|
|
01063208a1 | ||
|
|
447fb6da16 | ||
|
|
58eef7c02b | ||
|
|
24a115297b | ||
|
|
0d4bc5054e | ||
|
|
b904e6b04f | ||
|
|
271e312669 | ||
|
|
5846d39d97 | ||
|
|
e6740a0326 | ||
|
|
00d9ed5610 | ||
|
|
1f572c4151 | ||
|
|
c1a8a58488 | ||
|
|
78857d5510 | ||
|
|
b91806ba80 | ||
|
|
8c50b3d925 | ||
|
|
e32466357d | ||
|
|
f51b2524c5 | ||
|
|
32ac559385 | ||
|
|
ac1aec857d | ||
|
|
bf1ae8bc53 | ||
|
|
dd4d644eaa | ||
|
|
de224184a6 | ||
|
|
4b5e5bc63d | ||
|
|
140b08ca01 | ||
|
|
22f9e358ae | ||
|
|
93227d3316 | ||
|
|
e270a38393 | ||
|
|
cae3380cbf | ||
|
|
de025d72bc | ||
|
|
c81f57a7d1 | ||
|
|
37b91e51b8 | ||
|
|
00a798bd85 | ||
|
|
1c157a0e46 | ||
|
|
61ae3b0451 | ||
|
|
1afda1d389 | ||
|
|
1eeb0b00e7 | ||
|
|
0e26aabef8 | ||
|
|
882c01d81a | ||
|
|
e25cd94b0c | ||
|
|
f75b42397f | ||
|
|
b5a05941d9 | ||
|
|
85ed0901bb | ||
|
|
27f27a1cb2 | ||
|
|
d33c8fdfe9 | ||
|
|
0ee4d4f5ae | ||
|
|
31a0ec721a | ||
|
|
e58a24ddd2 | ||
|
|
d48e95d42c | ||
|
|
ca3b13554c | ||
|
|
7ab9add5dd | ||
|
|
7e9023f0a8 | ||
|
|
879bf70cb7 | ||
|
|
4a583c9480 | ||
|
|
00fc7f82b9 | ||
|
|
7034c92de7 | ||
|
|
67701d1f7b | ||
|
|
69fa1b85d6 | ||
|
|
e735aa43e3 | ||
|
|
19d3cd5945 | ||
|
|
583133dd09 | ||
|
|
9f65c11bad | ||
|
|
b46d651892 | ||
|
|
e589af9bc0 | ||
|
|
53eb4577b3 | ||
|
|
bd22d9dddd | ||
|
|
15a9db374a | ||
|
|
14b836f53b | ||
|
|
0f320e040b | ||
|
|
dd94e57277 |
+7
-5
@@ -27,6 +27,8 @@ Also always: `ai-contract.md`, `forbidden.md`, `file-map.md`, `workflow.md`, `co
|
|||||||
├── domain/
|
├── domain/
|
||||||
│ └── domain-map.md # DDD contexts / aggregates
|
│ └── domain-map.md # DDD contexts / aggregates
|
||||||
├── product/
|
├── product/
|
||||||
|
│ ├── feature-design.md # Feature Spec 强制规范
|
||||||
|
│ ├── feature-spec/ # 单功能详细设计
|
||||||
│ ├── feature-map.md # 愈心谷 Feature Tree
|
│ ├── feature-map.md # 愈心谷 Feature Tree
|
||||||
│ └── cece-feature-map.md
|
│ └── cece-feature-map.md
|
||||||
├── file-map.md
|
├── file-map.md
|
||||||
@@ -36,11 +38,11 @@ Also always: `ai-contract.md`, `forbidden.md`, `file-map.md`, `workflow.md`, `co
|
|||||||
├── api.md
|
├── api.md
|
||||||
├── database.md
|
├── database.md
|
||||||
├── ui.md # IA pointer → design/
|
├── ui.md # IA pointer → design/
|
||||||
├── design/ # AI Design System Contract
|
├── design/ # AI Design System + reverse-engineering-spec.md
|
||||||
│ ├── design-system.md
|
├── environment.md # Local / CI / Prod 分离
|
||||||
│ ├── component-catalog.md
|
├── development.md # 本地本机开发
|
||||||
│ └── platform/
|
├── docker.md # Docker 用途边界
|
||||||
├── deployment.md
|
├── deployment.md # 生产 / CI 部署
|
||||||
├── testing.md
|
├── testing.md
|
||||||
├── security.md
|
├── security.md
|
||||||
├── review.md
|
├── review.md
|
||||||
|
|||||||
+9
-2
@@ -5,12 +5,19 @@ Do **not** build everything at once. Rules have maintenance cost.
|
|||||||
## Phase 1 — Now (shipped)
|
## Phase 1 — Now (shipped)
|
||||||
|
|
||||||
- Rules: constitution, architecture, domain, coding, api, database, ui, …
|
- Rules: constitution, architecture, domain, coding, api, database, ui, …
|
||||||
|
- **Environment layer (FROZEN):** `environment.md` · `development.md` · `docker.md` · `deployment.md` · `commands.md`
|
||||||
- ADR, patterns, examples, playbooks
|
- ADR, patterns, examples, playbooks
|
||||||
- Review / DoD / checklists / forbidden / commands / workflow / file-map
|
- Review / DoD / checklists / forbidden / workflow / file-map
|
||||||
- `ai-contract.md`
|
- `ai-contract.md`
|
||||||
- Cursor runtime: `.cursor/*` → symlink → `.ai/` (no content copy)
|
- Cursor runtime: `.cursor/*` → symlink → `.ai/` (no content copy)
|
||||||
|
|
||||||
**Invest next engineering time in:** polishing `patterns/`, `examples/`, `playbooks/` while building real features — not more rule files.
|
**Invest next time in product implementation, not more meta-rules:**
|
||||||
|
|
||||||
|
```
|
||||||
|
产品冻结 → Domain → ERD → OpenAPI → 页面路由 → P1 编码
|
||||||
|
```
|
||||||
|
|
||||||
|
Do **not** expand the engineering-spec layer unless a repeated AI failure demands it.
|
||||||
|
|
||||||
## Phase 2 — When the codebase grows
|
## Phase 2 — When the codebase grows
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,32 @@
|
|||||||
|
# ADR-0007 — ESS 与 `.ai/` 双轨治理
|
||||||
|
|
||||||
|
- Status: Accepted
|
||||||
|
- Date: 2026-08-05
|
||||||
|
- Tags: process, ess, agents
|
||||||
|
|
||||||
|
## Context
|
||||||
|
|
||||||
|
仓库已有成熟的 `.ai/` AI Engineering System(领域、Feature Spec、DoD、架构冻结)。
|
||||||
|
2026-08-05 绑定 **engineering-spec-system v1.0**,引入 `docs/ECR|TASKS|HANDOFF|STATE` 与角色门禁。
|
||||||
|
若两套文档并行且无优先级,Agent 会冲突或重复发明规则。
|
||||||
|
|
||||||
|
## Decision
|
||||||
|
|
||||||
|
1. **产品 / 领域 / Lexicon / Feature Spec / DoD / 架构冻结 / 安全编码**:以 **`.ai/`** 为唯一权威。
|
||||||
|
2. **变更分级 / 角色(Architect·Engineer·Reviewer·Release)/ ECR·Task·Handoff·validate**:以 **ESS + 根目录 `docs/`** 为权威。
|
||||||
|
3. **L2+ 行为或结构重构**:必须同时满足
|
||||||
|
- Active Feature Spec(若涉及产品行为;纯结构重构可用 PRODUCT_SPEC「行为冻结」)
|
||||||
|
- Approved ECR under `docs/ECR/`
|
||||||
|
4. **L3 栈或包边界**:另需 `.ai/adr/` Accepted;ESS ENGINEERING_SPEC 引用该 ADR。
|
||||||
|
5. **禁止**将 ESS 整树复制进本仓;仅保留 Profile / wrappers / 过程工件。
|
||||||
|
|
||||||
|
## Consequences
|
||||||
|
|
||||||
|
- Agent 会话:先 `docs/PROJECT_PROFILE.md`,再按 `AGENTS.md` 加载 `.ai/`。
|
||||||
|
- 冲突时:用户可见语义与完成标准听 `.ai/`;能否开工听 ECR/Role。
|
||||||
|
- 后续重构按 ECR-001 分 Phase,禁止无合同大爆炸重写。
|
||||||
|
|
||||||
|
## Alternatives considered
|
||||||
|
|
||||||
|
- 用 ESS 替换 `.ai/`:丢弃已验证的 lexicon/DoD/feature-spec,成本高,否决。
|
||||||
|
- 只用 `.ai/` 忽略 ESS:无法满足「用 ESS 治理重构」诉求,否决。
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
# ADR-0008 — Go 为唯一用户后台,咨询域过渡反代
|
||||||
|
|
||||||
|
- Status: Accepted
|
||||||
|
- Date: 2026-09-14
|
||||||
|
- Tags: identity, miniprogram, consult, gateway
|
||||||
|
|
||||||
|
## Context
|
||||||
|
|
||||||
|
愈心谷 C 端同时打两套后台:咨询/测评在 Java + MySQL,愈心魔方在 Go + PostgreSQL。
|
||||||
|
`wx.login` 的 `code` 只能用一次,无法先后换两套 token。小程序需要单一身份与单一请求入口。
|
||||||
|
|
||||||
|
## Decision
|
||||||
|
|
||||||
|
1. **Go + PostgreSQL 是唯一用户身份源。** 微信 openid / 手机号写在 `users`。
|
||||||
|
2. **Java 过渡期为被调方**:Go 用 openid/phone 调内网 `issue-mini-app` 换 Java Redis token,并反代 `/app-api`、`/admin-api`。
|
||||||
|
3. **咨询业务表本 ADR 不迁**;支付与档期另开 ECR。
|
||||||
|
4. **Admin 登录独立**,不走本决策。
|
||||||
|
|
||||||
|
## Consequences
|
||||||
|
|
||||||
|
- 小程序只配置 Go 域名(现网经 `/psy/api/` 反代)。
|
||||||
|
- 下线 Java 必须另开 ECR,并先迁支付。
|
||||||
|
- 历史魔方账密用户按手机号合并到 `wx_openid`。
|
||||||
|
|
||||||
|
## Alternatives considered
|
||||||
|
|
||||||
|
- 只做 SSO、双库长期并存:否决(用户要求合库合服务)。
|
||||||
|
- 以 Java 吸收魔方:否决(栈已锁定 Go + PG)。
|
||||||
|
- 客户端双 token:否决(code 单次使用,且拖住前端统一接入)。
|
||||||
+12
-6
@@ -9,27 +9,33 @@ MUST read:
|
|||||||
1. `.ai/constitution.md`
|
1. `.ai/constitution.md`
|
||||||
2. `.ai/architecture.md`
|
2. `.ai/architecture.md`
|
||||||
3. `.ai/domain.md` (+ `domain/domain-map.md` when touching models/API)
|
3. `.ai/domain.md` (+ `domain/domain-map.md` when touching models/API)
|
||||||
4. `.ai/coding.md`
|
4. `.ai/definition-of-done.md`(完成标准;开始前知道何谓 Done)
|
||||||
5. Task-relevant: `api.md` / `database.md` / `ui.md` / `security.md` / `product/feature-map.md`
|
5. `.ai/coding.md`
|
||||||
6. UI tasks: `design/design-system.md` + `design/component-catalog.md` + `design/platform/*`
|
6. Task-relevant: `api.md` / `database.md` / `ui.md` / `security.md` / `testing.md` / `product/lexicon.md` + `product/feature-map.md` + **`product/feature-design.md`** + **`product/feature-spec/<id>.md`**(该功能 Spec;§4 User Flow、§7 Rules、§9 API、§12 Acceptance 必须非空)
|
||||||
7. Relevant ADR under `.ai/adr/` if changing stack or style
|
7. Run/dev tasks: `environment.md` + `development.md`(部署/镜像任务才读 `deployment.md` / `docker.md`)
|
||||||
|
8. UI tasks: `design/design-system.md` + `design/component-catalog.md` + `design/platform/*`
|
||||||
|
9. Competitor / reverse-engineering tasks: `design/reverse-engineering-spec.md`(STEP 1–18 · Evidence First;禁止 Demo 式省略)
|
||||||
|
10. Relevant ADR under `.ai/adr/` if changing stack or style
|
||||||
|
|
||||||
## After coding
|
## After coding
|
||||||
|
|
||||||
MUST:
|
MUST:
|
||||||
|
|
||||||
1. Run / follow `.ai/review.md` and print Review block
|
1. Verify `.ai/definition-of-done.md` — **Done ≠ Code Complete**
|
||||||
2. Verify `.ai/definition-of-done.md`
|
2. Run / follow `.ai/review.md` and print **Review Report**(DoD §7)
|
||||||
3. Use matching checklist under `.ai/checklists/`
|
3. Use matching checklist under `.ai/checklists/`
|
||||||
4. Prefer verifying with `.ai/commands.md` (build/test/health)
|
4. Prefer verifying with `.ai/commands.md` (build/test/health)
|
||||||
|
5. If P1 scope: update or respect labels in `product/p1-status.md`(当前为 **P1 Complete**;扩行为须新 Spec)
|
||||||
|
|
||||||
## Never
|
## Never
|
||||||
|
|
||||||
- Guess API shape
|
- Guess API shape
|
||||||
- Guess DB schema
|
- Guess DB schema
|
||||||
- Guess product requirement
|
- Guess product requirement
|
||||||
|
- Code new/changed feature behavior without Feature Spec(`product/feature-design.md`)
|
||||||
- Invent endpoints, tables, or domain words not in `.ai/domain.md` / OpenAPI / task
|
- Invent endpoints, tables, or domain words not in `.ai/domain.md` / OpenAPI / task
|
||||||
- Silently reverse an Accepted ADR
|
- Silently reverse an Accepted ADR
|
||||||
|
- Default local workflow to full-stack Docker / rebuild app images on every code change
|
||||||
|
|
||||||
## If unclear
|
## If unclear
|
||||||
|
|
||||||
|
|||||||
+8
-3
@@ -1,16 +1,21 @@
|
|||||||
# Architecture
|
# Architecture
|
||||||
|
|
||||||
|
Go 包边界(冻结):[architecture/go-services.md](architecture/go-services.md)
|
||||||
|
Domain / ERD:[domain/domain-map.md](domain/domain-map.md) · [domain/erd.md](domain/erd.md)
|
||||||
|
|
||||||
## Allowed call graph
|
## Allowed call graph
|
||||||
|
|
||||||
```
|
```
|
||||||
UI (user-h5 / mini-program)
|
UI (user-h5 / mini-program / admin-h5)
|
||||||
→ packages/sdk
|
→ packages/sdk(或 admin 薄 api 客户端)
|
||||||
→ API Handler
|
→ API Handler
|
||||||
→ Service
|
→ Service
|
||||||
→ Repository
|
→ Repository
|
||||||
→ Database
|
→ Database
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Admin 路由挂 `/api/v1/admin/*`,鉴权与终端 `DeviceAuth` **隔离**(见 `feature-spec/ops-admin.md`)。
|
||||||
|
|
||||||
## Forbidden
|
## Forbidden
|
||||||
|
|
||||||
- Handler → Database (skip Service/Repository)
|
- Handler → Database (skip Service/Repository)
|
||||||
@@ -27,7 +32,7 @@ UI (user-h5 / mini-program)
|
|||||||
| `apps/api` | Only backend |
|
| `apps/api` | Only backend |
|
||||||
| `apps/user-h5` | Primary client (Vue3+TS) |
|
| `apps/user-h5` | Primary client (Vue3+TS) |
|
||||||
| `apps/mini-program` | Scaffold only until tasked |
|
| `apps/mini-program` | Scaffold only until tasked |
|
||||||
| `apps/admin-h5` | Deferred |
|
| `apps/admin-h5` | Ops Phase A(ECR-006) |
|
||||||
| `packages/sdk` | Multi-platform HTTP client |
|
| `packages/sdk` | Multi-platform HTTP client |
|
||||||
| `packages/types` | Shared TS types |
|
| `packages/types` | Shared TS types |
|
||||||
| `packages/utils` | Pure helpers |
|
| `packages/utils` | Pure helpers |
|
||||||
|
|||||||
@@ -0,0 +1,51 @@
|
|||||||
|
# Go 服务边界(冻结)
|
||||||
|
|
||||||
|
单二进制 `apps/api`;按包拆分,**禁止**跨层:Handler → Service → Repository。
|
||||||
|
详见 [../architecture.md](../architecture.md)。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Packages under `internal/service/`
|
||||||
|
|
||||||
|
| Package | 职责 | P1 | 实现态(2026-08) |
|
||||||
|
|---|---|---|---|
|
||||||
|
| `user` | 注册/游客升级/Session | Yes | 多在 profile/auth 路径;无独立包名时勿重复造轮 |
|
||||||
|
| `profile` | 个人档案 CRUD、切换 | Yes | `service/profile` |
|
||||||
|
| `portrait` | 生成个人画像 → GrowthReport | Yes | 计算在 `internal/portrait`;用例经 report/handler 路径 |
|
||||||
|
| `scale` | 探索测试定义与计分 | Yes | `service/scale` + `internal/scale` |
|
||||||
|
| `relation` | RelationInsight | Yes **必做** | `service/relation` + `internal/relation` |
|
||||||
|
| `report` | GrowthReport 读取 + **权益裁剪** | Yes | `service/report` |
|
||||||
|
| `ask` | Thread/Message;P1 规则引擎 + 额度 | Yes(Demo) | `service/ask` + `internal/ask` |
|
||||||
|
| `companion` | SolarTerm 读、Mood 写 | Shell | `service/companion` |
|
||||||
|
| `membership` | 成长会员状态与额度 | Yes | `service/membership`(ECR-001 Phase C 已从 report 抽出) |
|
||||||
|
| `order` | Order + pay-mock + DeepAccess 发放 | Yes | 用例在 `service/membership`(同 Phase C;未单独拆包) |
|
||||||
|
| `imagecard` | 意象卡片 | P2 | `service/imagecard` |
|
||||||
|
| `admin` | 运营后台鉴权与运维用例 | Ops-A | `service/admin`(ECR-006) |
|
||||||
|
|
||||||
|
### Engine vs Service
|
||||||
|
|
||||||
|
| Kind | Path | Can | Cannot |
|
||||||
|
|---|---|---|---|
|
||||||
|
| Engine | `internal/{portrait,relation,star,ask,scale,rhythm,…}` | 纯计算 / 组装报告结构 | 引用 `gin.Context`;做权益解锁 |
|
||||||
|
| Service | `internal/service/*` | 用例编排、鉴权后业务、调 repo/engine | SQL 直写;跳过归属校验 |
|
||||||
|
|
||||||
|
`internal/handler/`:每域一组 handler,只做 bind/validate/调用 service。
|
||||||
|
`internal/repository/`:SQL;无 business unlock 规则(规则在 service/report + membership)。
|
||||||
|
|
||||||
|
星座周期展望引擎包:`internal/star/outlook`(原 `fortune`,ECR-002)。对外 JSON 仅 `outlook` / `outlook_detail`;周期提示字段为 `boost`(ECR-003 已移除 `fortune`/`lucky` 兼容键)。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 跨域规则
|
||||||
|
|
||||||
|
- **权益判定**只在 `report` / `ask` / `membership` service,不在 handler、不在 H5。
|
||||||
|
- `portrait` 与 `relation` 写 `growth_reports`;读一律走 `report.Get`(带裁剪)。
|
||||||
|
- `ask` 强制校验 `profile` 归属当前 user。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 禁止
|
||||||
|
|
||||||
|
- 新建 `decode` / `match` / `unlock` / `fortune` 包名
|
||||||
|
- Handler 直连 DB
|
||||||
|
- 在 JSON 字段名使用 `luck` / `fortune` / `ji_xiong`
|
||||||
+36
-14
@@ -1,16 +1,38 @@
|
|||||||
# Checklist: Feature
|
# Checklist: Feature
|
||||||
|
|
||||||
- [ ] Architecture layers respected
|
对照 `.ai/definition-of-done.md` + `product/feature-design.md`。全部适用项勾选后才能称 Feature Complete。
|
||||||
- [ ] Domain words match `.ai/domain.md`
|
|
||||||
- [ ] API (+ OpenAPI if public)
|
## Product / Spec
|
||||||
- [ ] Service
|
|
||||||
- [ ] Repository (if persistence)
|
- [ ] `feature-spec/<id>.md` 存在且 Status=Active(或本次已更新)
|
||||||
- [ ] Migration (if schema)
|
- [ ] feature-map / journey / page-tree 覆盖
|
||||||
- [ ] SDK/types (if client needs)
|
- [ ] Spec §4 User Flow 完整(含无数据/权益分支)
|
||||||
- [ ] UI (if user-facing)
|
- [ ] Spec §7 Business Rules 含 Server 权益
|
||||||
- [ ] Test or smoke steps
|
- [ ] Spec §9 API 与 OpenAPI 一致
|
||||||
- [ ] Docs touched if behavior user-visible
|
- [ ] Spec §12 Acceptance 已逐条验证
|
||||||
- [ ] `go test` / `npm run build:h5` as applicable
|
- [ ] Loading / Empty / Error / Normal(+ Locked 若适用)
|
||||||
- [ ] Health still OK
|
- [ ] lexicon 文案
|
||||||
- [ ] Review block printed
|
|
||||||
- [ ] DoD satisfied
|
## Backend
|
||||||
|
|
||||||
|
- [ ] OpenAPI
|
||||||
|
- [ ] Envelope errors(非裸 error)
|
||||||
|
- [ ] handler → service → repository
|
||||||
|
- [ ] AuthZ / 权益服务端
|
||||||
|
- [ ] Migration if schema
|
||||||
|
- [ ] L1 unit for core logic
|
||||||
|
|
||||||
|
## Frontend
|
||||||
|
|
||||||
|
- [ ] 四态(+ Locked)
|
||||||
|
- [ ] lexicon 文案
|
||||||
|
- [ ] SDK/types 若需要
|
||||||
|
|
||||||
|
## Verify
|
||||||
|
|
||||||
|
- [ ] L0: `go test ./...` / `npm run build:h5`
|
||||||
|
- [ ] L2 integration 或书面 smoke(P1 关键流须自动化)
|
||||||
|
- [ ] Health OK
|
||||||
|
- [ ] Review Report 已输出
|
||||||
|
- [ ] Spec §14 Implementation Notes / Gaps 已更新
|
||||||
|
- [ ] Scope label 正确(Demo / Feature Complete / …)
|
||||||
|
|||||||
+68
-36
@@ -1,67 +1,99 @@
|
|||||||
# Commands — Do Not Guess
|
# Commands — Do Not Guess
|
||||||
|
|
||||||
Run from repo root unless noted.
|
Run from **repo root** unless noted.
|
||||||
|
Policy: [environment.md](environment.md) · [development.md](development.md)
|
||||||
|
|
||||||
## Go API (`apps/api`)
|
本仓库用 **npm workspaces**(`npm run …`);等价于文档中的 pnpm 习惯用法。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Local Development — First time
|
||||||
|
|
||||||
|
1. Install host toolchains: Go 1.22+ · Node 20+ · Docker Desktop(仅依赖服务)
|
||||||
|
2. `npm install`
|
||||||
|
3. `cp apps/api/config.example.yaml apps/api/config.local.yaml`(填 `database.*` 与 `deepseek.api_key`)
|
||||||
|
4. `npm run deps:up`(或 `docker compose -f docker-compose.dev.yml up -d`)
|
||||||
|
5. Start API once so migrations apply: `cd apps/api && go run ./cmd/server`
|
||||||
|
6. Verify: `curl -s http://127.0.0.1:8080/api/v1/healthz`
|
||||||
|
7. Start H5: `npm run dev:h5` → http://127.0.0.1:5173
|
||||||
|
8. (可选)埋点:`cp apps/user-h5/.env.example apps/user-h5/.env.local`,填 `VITE_GA_MEASUREMENT_ID`;调试可设 `VITE_ANALYTICS_DEBUG=1`(见 `feature-spec/analytics.md`)
|
||||||
|
|
||||||
|
Optional CN Go proxy: `export GOPROXY=https://goproxy.cn,direct`
|
||||||
|
Optional API hot reload: install `air`, then `cd apps/api && air`(见 `.air.toml`)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Local Development — Daily
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
export GOPROXY=https://goproxy.cn,direct # if download timeout
|
# Terminal 1 — infrastructure only
|
||||||
|
npm run deps:up
|
||||||
|
|
||||||
|
# Terminal 2 — backend (host)
|
||||||
|
cd apps/api
|
||||||
|
air
|
||||||
|
# 或: go run ./cmd/server
|
||||||
|
|
||||||
|
# Terminal 3 — frontend (host)
|
||||||
|
npm run dev:h5
|
||||||
|
```
|
||||||
|
|
||||||
|
Stop deps: `npm run deps:down`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Go API
|
||||||
|
|
||||||
|
```bash
|
||||||
cd apps/api
|
cd apps/api
|
||||||
go mod tidy
|
go mod tidy
|
||||||
go build ./...
|
|
||||||
go test ./...
|
go test ./...
|
||||||
|
# L2(需 deps:up):Portrait / Relation / Membership 三流
|
||||||
|
go test ./internal/integration/ -count=1
|
||||||
|
go build ./...
|
||||||
go run ./cmd/server
|
go run ./cmd/server
|
||||||
```
|
```
|
||||||
|
|
||||||
Health:
|
根目录快捷:`npm run test:api` · `npm run test:api:integration`(L2 需先 `deps:up`)
|
||||||
|
|
||||||
|
Env defaults / template: `deploy/.env.example`
|
||||||
|
Migrate: applied on API startup (`apps/api/migrations/*.up.sql`)
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
curl -s http://127.0.0.1:8080/api/v1/healthz
|
curl -s http://127.0.0.1:8080/api/v1/healthz
|
||||||
curl -s http://127.0.0.1:8080/api/v1/ping
|
curl -s http://127.0.0.1:8080/api/v1/ping
|
||||||
```
|
```
|
||||||
|
|
||||||
|
**Do not** `docker build` the API for everyday coding.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## User H5
|
## User H5
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
npm install
|
|
||||||
npm run dev:h5
|
npm run dev:h5
|
||||||
npm run build:h5
|
npm run build:h5
|
||||||
|
npm run test:h5 # Vitest
|
||||||
|
npm run test:e2e # Playwright(先 build:h5;用系统 Chrome)
|
||||||
```
|
```
|
||||||
|
|
||||||
## Docker / DB
|
**Do not** dockerize Vite for everyday coding.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Admin H5(Ops Phase A · ECR-006)
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
docker compose -f deploy/docker-compose.yml up -d
|
# config.local.yaml 需 admin.bootstrap_*(见 config.example.yaml);仅空库种子
|
||||||
docker compose -f deploy/docker-compose.yml down
|
npm run dev:admin # http://127.0.0.1:5174/
|
||||||
|
npm run build:admin
|
||||||
|
npm run test:e2e:admin # Playwright(preview + mock API,无需 Go)
|
||||||
|
npm run test:e2e:live # 前后台联调(需 deps:up + API :8080;见 e2e-live/)
|
||||||
```
|
```
|
||||||
|
|
||||||
## Lint (when configured)
|
---
|
||||||
|
|
||||||
```bash
|
## CI / production
|
||||||
# Go — after golangci-lint is added:
|
|
||||||
# cd apps/api && golangci-lint run
|
|
||||||
|
|
||||||
# H5 — after eslint is added:
|
见 [deployment.md](deployment.md) · [docker.md](docker.md)。
|
||||||
# npm run lint -w @yuxingu/user-h5
|
仅在发布/CI 任务使用镜像与 `deploy/docker-compose.prod.yml`。
|
||||||
```
|
|
||||||
|
|
||||||
## Migrations (when make targets exist)
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Preferred once Makefile lands:
|
|
||||||
# make migrate
|
|
||||||
# make migrate-down
|
|
||||||
|
|
||||||
# Until then: document the goose/migrate command used in the PR.
|
|
||||||
```
|
|
||||||
|
|
||||||
## Dev all (local)
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# terminal 1
|
|
||||||
cd apps/api && go run ./cmd/server
|
|
||||||
|
|
||||||
# terminal 2
|
|
||||||
npm run dev:h5
|
|
||||||
```
|
|
||||||
|
|||||||
@@ -14,6 +14,8 @@
|
|||||||
8. Every feature deployable.
|
8. Every feature deployable.
|
||||||
9. Every API documented (OpenAPI or apps/docs).
|
9. Every API documented (OpenAPI or apps/docs).
|
||||||
10. Every database change versioned (migration required).
|
10. Every database change versioned (migration required).
|
||||||
|
11. **Local feedback speed > local environment purity.** 本地开发追求分钟级反馈;生产/CI 追求环境一致。二者禁止混用工作流(见 `.ai/environment.md`)。
|
||||||
|
12. **Done ≠ Code Complete.** 功能完成标准见 `.ai/definition-of-done.md`;禁止仅以「有 API / 能打开页 / build 过」宣告完成。
|
||||||
|
|
||||||
## Product Laws (YuXinGu)
|
## Product Laws (YuXinGu)
|
||||||
|
|
||||||
|
|||||||
+18
-9
@@ -1,9 +1,10 @@
|
|||||||
# Database — Golden Rules
|
# Database — Golden Rules
|
||||||
|
|
||||||
|
Schema source of truth for P1 tables: [domain/erd.md](domain/erd.md).
|
||||||
|
|
||||||
## Naming
|
## Naming
|
||||||
|
|
||||||
- `snake_case` only for tables and columns.
|
- `snake_case` only for tables and columns.
|
||||||
- Good: `user_profile`, `payment_order`, `user_session`.
|
|
||||||
- Forbidden prefixes: `tbl_`, `t_`.
|
- Forbidden prefixes: `tbl_`, `t_`.
|
||||||
|
|
||||||
## Required columns on business tables
|
## Required columns on business tables
|
||||||
@@ -17,9 +18,8 @@ deleted_at
|
|||||||
|
|
||||||
## Types
|
## Types
|
||||||
|
|
||||||
- Never `varchar(5000)` as a habit.
|
|
||||||
- Prefer bounded `varchar(n)`.
|
- Prefer bounded `varchar(n)`.
|
||||||
- `TEXT` only when necessary (long content bodies).
|
- `TEXT` only when necessary.
|
||||||
- Timestamps: `timestamptz`.
|
- Timestamps: `timestamptz`.
|
||||||
|
|
||||||
## Keys & indexes
|
## Keys & indexes
|
||||||
@@ -27,13 +27,22 @@ deleted_at
|
|||||||
- Every foreign key indexed.
|
- Every foreign key indexed.
|
||||||
- Unique business keys enforced with UNIQUE.
|
- Unique business keys enforced with UNIQUE.
|
||||||
|
|
||||||
## Migrations
|
## Migration Rules(强制)
|
||||||
|
|
||||||
- Schema change without migration = incomplete feature.
|
1. **Every schema change requires a migration** under `apps/api/migrations/`.
|
||||||
- Migrations live in `apps/api/migrations/`.
|
2. **Never** modify production (or shared) databases by hand (`ALTER TABLE` in psql as a substitute for migration).
|
||||||
- Provide Up and Down when tool supports it.
|
3. **Migration files are immutable** after merge to `main` — fix forward with a new migration; do not rewrite history on shared branches.
|
||||||
|
4. **Destructive changes** (drop column/table, type narrowing) require an explicit rollback/forward strategy in the same change set (Down file or follow-up migration + note).
|
||||||
|
5. App code must not query columns that are not yet migrated.
|
||||||
|
6. Local apply: start API(auto-migrate)or documented migrate command in [commands.md](commands.md).
|
||||||
|
|
||||||
## Soft delete
|
## Soft delete
|
||||||
|
|
||||||
- Default: set `deleted_at`, do not hard delete user content in MVP.
|
- Default: set `deleted_at`; do not hard-delete user content in P1.
|
||||||
- Queries must filter `deleted_at IS NULL` unless explicitly including deleted.
|
- Queries filter `deleted_at IS NULL` unless the task says otherwise.
|
||||||
|
|
||||||
|
## AI MUST NOT
|
||||||
|
|
||||||
|
- 「先改库再补 migration」
|
||||||
|
- 在 handler 里拼临时 DDL
|
||||||
|
- 发明未在 `domain.md` / `erd.md` 出现的表名(先改文档)
|
||||||
|
|||||||
+191
-13
@@ -1,17 +1,195 @@
|
|||||||
# Definition of Done
|
# Definition of Done — AI Quality Gate(强制)
|
||||||
|
|
||||||
Code finished ≠ Done.
|
**Done ≠ Code Complete.**
|
||||||
|
**Done = Feature Complete + Verified + Documented.**
|
||||||
|
|
||||||
A feature is Done only when applicable items PASS:
|
任何功能在未满足下列适用标准前,**禁止**对用户说「完成 / Done / P1 Complete」。
|
||||||
|
若某项 N/A,必须写明原因;静默跳过 = Not Done。
|
||||||
|
|
||||||
- [ ] Code (compiles / typechecks)
|
加载:每个任务结束前必须对照本文件;见 `AGENTS.md`。
|
||||||
- [ ] API (handler + service + repository as needed)
|
|
||||||
- [ ] Test (unit or listed smoke for critical paths)
|
|
||||||
- [ ] Migration (if schema changed)
|
|
||||||
- [ ] Docker / deploy notes (if new service or env)
|
|
||||||
- [ ] Docs (OpenAPI / short PRD note if user-visible)
|
|
||||||
- [ ] Review (`.ai/review.md` checklist output)
|
|
||||||
- [ ] Build (`go test ./...` and/or `npm run build:h5` for touched side)
|
|
||||||
- [ ] Health check still green (`/api/v1/healthz`)
|
|
||||||
|
|
||||||
If an item is N/A, state why. Silent skip = not Done.
|
---
|
||||||
|
|
||||||
|
## 0. 禁止的「伪完成」信号
|
||||||
|
|
||||||
|
仅有下列项 **不足以** 称 Done:
|
||||||
|
|
||||||
|
- API 路由存在
|
||||||
|
- 页面能打开
|
||||||
|
- `go test ./...` 或 `npm run build:h5` 通过
|
||||||
|
- **没有** `product/feature-spec/<id>.md` 却声称功能完整
|
||||||
|
|
||||||
|
还缺:Feature Spec、测试分层、异常/空/加载态、权限、完整用户路径、文档与 Review。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. Feature 完成(产品层)
|
||||||
|
|
||||||
|
必须:
|
||||||
|
|
||||||
|
| 项 | 要求 |
|
||||||
|
|---|---|
|
||||||
|
| Feature Spec | 存在 `product/feature-spec/<id>.md`;§4 Flow / §7 Rules / §9 API / §12 Acceptance 非空(见 `feature-design.md`) |
|
||||||
|
| Feature Map | 已在 `product/feature-map.md` 定义且范围清晰 |
|
||||||
|
| 用户路径 | Spec §4 + `user-journey.md` 对应 Step;入口可达 |
|
||||||
|
| 页面入口 | Spec §5 + `page-tree.md` 路由存在 |
|
||||||
|
| Loading | 网络请求有加载态(Spec §6) |
|
||||||
|
| Empty | 无数据有引导(非空白死页) |
|
||||||
|
| Error | 失败可感知 + 可恢复(重试/返回) |
|
||||||
|
|
||||||
|
示例 — 个人画像完整路径(缺一不可称该 Feature Done):
|
||||||
|
|
||||||
|
```
|
||||||
|
进入 → 无档案 → 创建档案 → 生成画像
|
||||||
|
→ 查看基础版 → 深度版入口 → 支付/mock → 完整分析可见
|
||||||
|
```
|
||||||
|
|
||||||
|
仅有「`/portrait` 显示一段文案」= **Demo / Incomplete**。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. Backend Done
|
||||||
|
|
||||||
|
### 2.1 API
|
||||||
|
|
||||||
|
- OpenAPI(`proto/openapi.yaml`)已更新
|
||||||
|
- Request / Response 字段明确
|
||||||
|
- 错误走统一信封 `{code,message,data}`;业务失败用数字 `code` + 可读 `message`
|
||||||
|
- **禁止**裸 `{ "error": "..." }` 作为对外约定
|
||||||
|
|
||||||
|
### 2.2 分层
|
||||||
|
|
||||||
|
```
|
||||||
|
handler → service → repository → database
|
||||||
|
```
|
||||||
|
|
||||||
|
- 业务逻辑不在 handler
|
||||||
|
- 权益 / 归属校验在 service(或明确 domain 层),不在前端
|
||||||
|
|
||||||
|
### 2.3 测试(见 §4)
|
||||||
|
|
||||||
|
- 核心 service / engine 有单元测试(Level 1)
|
||||||
|
- P1 关键流有集成测试或可重复的自动化冒烟(Level 2)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. Frontend Done
|
||||||
|
|
||||||
|
### 3.1 页面四态
|
||||||
|
|
||||||
|
每个网络页面必须具备:
|
||||||
|
|
||||||
|
| 状态 | 要求 |
|
||||||
|
|---|---|
|
||||||
|
| Normal | 成功数据正确展示 |
|
||||||
|
| Loading | 请求中 |
|
||||||
|
| Empty | 无档案 / 无列表等引导 |
|
||||||
|
| Error | 失败文案 + 重试或返回 |
|
||||||
|
|
||||||
|
示例 — 问答不能只有聊天壳;至少覆盖:无档案、发送中、失败重试、历史为空(登录态按当前 Visitor 模型裁剪)。
|
||||||
|
|
||||||
|
### 3.2 组件
|
||||||
|
|
||||||
|
抽公共组件时:可复用、props 明确、状态完整;遵守 `design/component-catalog.md` + lexicon。
|
||||||
|
|
||||||
|
### 3.3 文案
|
||||||
|
|
||||||
|
用户可见文本符合 `product/lexicon.md`。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. Test Done(分级)
|
||||||
|
|
||||||
|
| Level | 名称 | 最低要求 | P1 Feature |
|
||||||
|
|---|---|---|---|
|
||||||
|
| **0** | Build | `go test ./...`;触及 H5 则 `npm run build:h5` | 必须 |
|
||||||
|
| **1** | Unit | Domain / Service / 算法(如 portrait、relation、scale 计分) | 必须 |
|
||||||
|
| **2** | Integration | 至少一条端到端 API 流可自动跑 | **P1 关键流必须** |
|
||||||
|
| **3** | E2E | 浏览器关键路径(Playwright 等) | P1 收口前至少 1 条主路径 |
|
||||||
|
|
||||||
|
### P1 必须覆盖的 Integration 流(Level 2)
|
||||||
|
|
||||||
|
1. **Portrait:** create profile → generate portrait → deep_access mock → detail 可见
|
||||||
|
2. **Relation:** two profiles → relation insight → deep_access → tips 可见
|
||||||
|
3. **Membership(有实现后):** subscribe mock → 权益生效 → 报告完整字段
|
||||||
|
|
||||||
|
Level 0 alone ≠ Backend/Frontend Done。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. Database Done
|
||||||
|
|
||||||
|
- `apps/api/migrations/` 有对应变更
|
||||||
|
- 新环境:`deps:up` → API 启动 migrate → 可服务
|
||||||
|
- 破坏性变更有 rollback / forward 策略(见 `database.md`)
|
||||||
|
- Seed 可选但须幂等或可重复说明
|
||||||
|
|
||||||
|
禁止手改共享/生产库代替 migration。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. Security Done
|
||||||
|
|
||||||
|
- 权益(深度版 / 成长会员)**只在服务端**裁剪字段
|
||||||
|
- 用户只能访问自己的 Profile / Report(归属校验)
|
||||||
|
- 入参校验;参数化 SQL(无拼接)
|
||||||
|
- Secret 不入库、不进镜像、不进提交
|
||||||
|
|
||||||
|
禁止:前端 `if (vip) showFullReport()` 作为唯一闸门。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 7. AI Review Done
|
||||||
|
|
||||||
|
功能声称完成前,**必须**输出:
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
## Review Report
|
||||||
|
- Feature: <name>
|
||||||
|
- Scope label: Demo | Feature Complete | P1 Complete | N/A
|
||||||
|
- Architecture: PASS | FAIL — <note>
|
||||||
|
- API: PASS | FAIL | N/A — <note>
|
||||||
|
- Security: PASS | FAIL | N/A — <note>
|
||||||
|
- Test (L0/L1/L2/L3): PASS | FAIL — <note>
|
||||||
|
- Frontend states (L/E/E/N): PASS | FAIL | N/A — <note>
|
||||||
|
- Documentation: PASS | FAIL | N/A — <note>
|
||||||
|
- Environment: PASS | FAIL | N/A — <note>
|
||||||
|
- Known Issues: <list or none>
|
||||||
|
```
|
||||||
|
|
||||||
|
任一关键 FAIL → 不得标 Done。
|
||||||
|
|
||||||
|
另保留 `.ai/review.md` 细项可一并勾选。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 8. Release Done(版本发布时)
|
||||||
|
|
||||||
|
- CHANGELOG
|
||||||
|
- Migration 说明
|
||||||
|
- Environment / 配置说明
|
||||||
|
- Test Result(含 Level)
|
||||||
|
- Rollback Plan
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 9. 阶段标签(强制用词)
|
||||||
|
|
||||||
|
| 标签 | 含义 |
|
||||||
|
|---|---|
|
||||||
|
| **Vertical Slice Demo** | 主路径可演示;缺测/缺态/缺功能仍可存在 |
|
||||||
|
| **Feature Complete** | 单功能满足本文件 §1–7 |
|
||||||
|
| **P1 Complete** | feature-map P1 必做项全部 Feature Complete + L2 三流 + 至少 1 条 L3(或书面豁免经用户同意) |
|
||||||
|
| **P2 Complete** | feature-map P2 范围全部 Feature Complete + P2 L2 流 + 至少 1 条 P2 L3(真支付除外,见 feature-map) |
|
||||||
|
|
||||||
|
当前仓库默认状态见:[product/p1-status.md](product/p1-status.md) · [product/p2-status.md](product/p2-status.md)。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 10. 宣称 Done 前的最短自问
|
||||||
|
|
||||||
|
1. 用户能否走完 journey,不只是打开页?
|
||||||
|
2. 无数据 / 失败时页面是否可用?
|
||||||
|
3. 不付费能否靠改前端看到深度字段?(不应)
|
||||||
|
4. 新机器按 `commands.md` 能否复现?
|
||||||
|
5. Review Report 是否已贴出且无 FAIL?
|
||||||
|
|||||||
+76
-23
@@ -1,33 +1,86 @@
|
|||||||
# Deployment — Golden Rules
|
# Production & CI Deployment — AI Contract
|
||||||
|
|
||||||
## Containers
|
本文件只约束 **CI** 与 **Production**。
|
||||||
|
本地编码见 [development.md](development.md);Docker 角色见 [docker.md](docker.md)。
|
||||||
|
|
||||||
- Every runnable service that ships to prod must have a Dockerfile.
|
---
|
||||||
- Never use image tag `latest` in production.
|
|
||||||
- Always semantic version tags: `v0.1.0` or git SHA.
|
|
||||||
|
|
||||||
## Health
|
## Production Rules
|
||||||
|
|
||||||
- Liveness: `GET /api/v1/healthz` required.
|
Production **MUST** use immutable images.
|
||||||
- When DB is required for traffic: add readiness endpoint (e.g. `/api/v1/readyz`) that checks DB.
|
|
||||||
- Alias names `/health` `/readiness` `/liveness` may map to the above; keep one canonical path documented in OpenAPI.
|
|
||||||
|
|
||||||
## Config
|
### MUST NOT(生产)
|
||||||
|
|
||||||
- Secrets via env only. Commit `.env.example`, never `.env`.
|
- 服务器上 `git pull` 后直接编译运行当主发布路径
|
||||||
- Required: `APP_ENV`, `HTTP_ADDR`, `DATABASE_URL`.
|
- 手工在机器上 `npm install` / `go mod download` 当发布步骤
|
||||||
|
- 登录容器改代码或改依赖冒充发布
|
||||||
|
- 使用镜像 tag `latest`
|
||||||
|
- 把本地 `.env` / 开发密钥打进镜像
|
||||||
|
|
||||||
## CI
|
### Happy path
|
||||||
|
|
||||||
- No manual prod deploy as the happy path — CI builds and tags.
|
```
|
||||||
- Minimum gates: `go test ./...` (api), `npm run build:h5`.
|
Git Push → CI → Test → Build Image → Registry → Deploy → Health Check
|
||||||
|
|
||||||
## Local
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker compose -f deploy/docker-compose.yml up -d
|
|
||||||
cd apps/api && go run ./cmd/server
|
|
||||||
npm run dev:h5
|
|
||||||
```
|
```
|
||||||
|
|
||||||
If Go module download times out in CN: `export GOPROXY=https://goproxy.cn,direct`.
|
### Health
|
||||||
|
|
||||||
|
- Liveness: `GET /api/v1/healthz`(必须)
|
||||||
|
- Readiness(有 DB 流量时): `GET /api/v1/readyz`(检查 DB;可后补)
|
||||||
|
- Canonical paths 写入 OpenAPI
|
||||||
|
|
||||||
|
### Config
|
||||||
|
|
||||||
|
- Secrets **仅**环境变量 / 密钥管理系统
|
||||||
|
- 提交 `deploy/.env.example`,永不提交 `.env`
|
||||||
|
- 生产必备示例:`APP_ENV=prod` `HTTP_ADDR` `DATABASE_URL`(及日后支付/JWT 密钥)
|
||||||
|
|
||||||
|
### Containers
|
||||||
|
|
||||||
|
- 可运行的生产服务最终应有 Dockerfile(`deploy/Dockerfile.*`)
|
||||||
|
- Tag:`v0.x.y` 或 git SHA
|
||||||
|
|
||||||
|
### Deployment Target(预留,勿提前复杂化)
|
||||||
|
|
||||||
|
| Phase | Target | When |
|
||||||
|
|---|---|---|
|
||||||
|
| **1** | Docker Compose on a VPS | 首版上线默认 |
|
||||||
|
| **2** | Managed containers(云厂商容器服务) | 运维成本上去时 |
|
||||||
|
| **3** | Kubernetes | 明确有多服务/扩缩容需求时 |
|
||||||
|
|
||||||
|
P1 **不要**引入 K8s。缺的 Dockerfile / prod compose **按发布任务再加**,不为本地写代码先造全套镜像工作流。
|
||||||
|
|
||||||
|
### Topology(Phase 1 目标)
|
||||||
|
|
||||||
|
```
|
||||||
|
Docker Compose (VPS)
|
||||||
|
├── Go API container
|
||||||
|
├── Nginx(user-h5 静态或反代)
|
||||||
|
├── PostgreSQL
|
||||||
|
├── Redis(需要时)
|
||||||
|
└── Object storage(需要时)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## CI Rules
|
||||||
|
|
||||||
|
CI 优先 **一致性**:
|
||||||
|
|
||||||
|
- `go test ./...`(`apps/api`)
|
||||||
|
- `npm run build:h5`
|
||||||
|
- (有 Dockerfile 后)build 镜像 smoke
|
||||||
|
- 不在 CI 里要求开发者本机 Docker Desktop 才能合并文档/纯前端 PR(按 job 需要)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Local vs Prod(对照)
|
||||||
|
|
||||||
|
| Topic | Local | Production |
|
||||||
|
|---|---|---|
|
||||||
|
| Go / Vue | 本机热更 | 镜像 |
|
||||||
|
| Postgres | `docker-compose.dev.yml` | 托管或 compose/k8s |
|
||||||
|
| 反馈 | 分钟级 | 发布质量与回滚 |
|
||||||
|
| 配置 | `.env.local` / dev | 密钥系统 / prod env |
|
||||||
|
|
||||||
|
禁止把右栏流程套到左栏日常开发。
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ Machine-readable **UI/UX/VI contract** for agents generating H5 / Mini Program /
|
|||||||
|
|
||||||
| File | Purpose |
|
| File | Purpose |
|
||||||
|---|---|
|
|---|---|
|
||||||
|
| **[reverse-engineering-spec.md](reverse-engineering-spec.md)** | **竞品/成熟 App 逆向工程设计规范(V1.0)** · Evidence First · STEP 1–18 |
|
||||||
| [design-system.md](design-system.md) | Foundation: tokens, color, type, spacing, motion, voice |
|
| [design-system.md](design-system.md) | Foundation: tokens, color, type, spacing, motion, voice |
|
||||||
| [component-catalog.md](component-catalog.md) | Button / Card / Chat / Report / Membership … |
|
| [component-catalog.md](component-catalog.md) | Button / Card / Chat / Report / Membership … |
|
||||||
| [platform/h5.md](platform/h5.md) | Mobile Web implementation limits |
|
| [platform/h5.md](platform/h5.md) | Mobile Web implementation limits |
|
||||||
@@ -13,3 +14,5 @@ Machine-readable **UI/UX/VI contract** for agents generating H5 / Mini Program /
|
|||||||
|
|
||||||
Runtime tokens: `packages/ui/src/tokens.css`
|
Runtime tokens: `packages/ui/src/tokens.css`
|
||||||
Product chrome / tabs: `../ui.md`
|
Product chrome / tabs: `../ui.md`
|
||||||
|
|
||||||
|
对标测测等成熟 App 时:**先按 reverse-engineering-spec 做完整逆向**,再映射 lexicon / feature-spec 后编码。禁止只出 Demo/MVP 式省略分析。
|
||||||
|
|||||||
@@ -118,11 +118,11 @@ Surface white, `--radius-lg`, `--shadow-card`. No random card skins.
|
|||||||
|
|
||||||
Status: **required** — Explore entry (icon + title + one line).
|
Status: **required** — Explore entry (icon + title + one line).
|
||||||
|
|
||||||
### ReportCard
|
### ReportCard(成长报告卡)
|
||||||
|
|
||||||
Status: **required**
|
Status: **required**
|
||||||
|
|
||||||
Decode / Match summary. Shows free conclusion; locked sections use PaywallLock. Footer disclaimer slot.
|
Portrait / RelationInsight summary. Free base conclusion; locked sections use PaywallLock(文案用「深度版」). Footer disclaimer.
|
||||||
|
|
||||||
### MoodCard
|
### MoodCard
|
||||||
|
|
||||||
@@ -138,9 +138,9 @@ Status: **required**
|
|||||||
|
|
||||||
Membership plans. Clear price · period · benefits. **MUST NOT** fake countdown / dark patterns. CTA = Primary Button.
|
Membership plans. Clear price · period · benefits. **MUST NOT** fake countdown / dark patterns. CTA = Primary Button.
|
||||||
|
|
||||||
### UnlockCard
|
### DeepAccessCard
|
||||||
|
|
||||||
Status: **required** — single Report / Match Unlock alternative to VIP.
|
Status: **required** — 单次深度版成长报告 / 关系理解完整建议(替代 VIP 订阅)。
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -180,7 +180,7 @@ Status: **required** — Self / Other list; “帮 TA 测” entry.
|
|||||||
|
|
||||||
### ShareCard
|
### ShareCard
|
||||||
|
|
||||||
Status: **required** — Decode / ScaleResult share visual; brand + one conclusion line; no medical claims.
|
Status: **required** — 探索结果 / 画像关键词分享;品牌 + 一句结论;无医疗与占卜声称。
|
||||||
|
|
||||||
### ScaleQuestion / ScaleResultView
|
### ScaleQuestion / ScaleResultView
|
||||||
|
|
||||||
|
|||||||
@@ -248,7 +248,8 @@ Contrast for body text; touch ≥ 44px; no hover-only essentials; label interact
|
|||||||
## 13. Brand Voice
|
## 13. Brand Voice
|
||||||
|
|
||||||
温和、清晰、尊重。禁止恐吓 / 道德绑架 / 虚假倒计时.
|
温和、清晰、尊重。禁止恐吓 / 道德绑架 / 虚假倒计时.
|
||||||
Report/Ask: lifestyle disclaimer(非医疗、非算命). Labels follow `.ai/domain.md`.
|
成长报告 / 问答:生活建议向免责声明(非医疗、非占卜).
|
||||||
|
**中文命名强制:** `.ai/product/lexicon.md`(无「解码/运势/合盘/解锁」等禁用主文案).
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,265 @@
|
|||||||
|
# AI Reverse Engineering Design Specification (V1.0)
|
||||||
|
|
||||||
|
> **项目级设计规范** · 适用于 Claude Code / Cursor / GPT / Gemini 等全部 AI
|
||||||
|
> 场景:对标成熟 App(如测测)做**能力与系统逆向**,输出可直接支撑工程落地的完整设计
|
||||||
|
> 冲突优先级见文末「与愈心谷契约的关系」
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. Mission
|
||||||
|
|
||||||
|
你不是产品经理,也不是程序员。
|
||||||
|
|
||||||
|
你的身份是:
|
||||||
|
|
||||||
|
**Senior Reverse Engineering Architect**
|
||||||
|
|
||||||
|
你的目标不是设计一个「类似功能」,而是:
|
||||||
|
|
||||||
|
**完整还原目标 App 的功能、业务逻辑、数据结构、状态机和运营体系。**
|
||||||
|
|
||||||
|
任何输出都必须以:
|
||||||
|
|
||||||
|
- **Production Ready**
|
||||||
|
- **Enterprise Ready**
|
||||||
|
- **Feature Complete**
|
||||||
|
|
||||||
|
作为目标。
|
||||||
|
|
||||||
|
| 禁止 | 必须 |
|
||||||
|
|---|---|
|
||||||
|
| Demo | 可支撑前后端 + 运营完整链路 |
|
||||||
|
| MVP(作为终点) | Feature Complete 分析 |
|
||||||
|
| 为简单而省略 | 全部展开 |
|
||||||
|
| 只描述页面外观 | 推导页面背后的系统 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. Reverse Engineering Rule
|
||||||
|
|
||||||
|
每一个页面都必须认为:
|
||||||
|
|
||||||
|
> 你看到的只是冰山一角。
|
||||||
|
> 页面背后一定存在:业务逻辑 · 数据库 · 后台 · 缓存 · 状态机 · 运营 · 统计 · 权限 · 异常处理 · 日志 · 配置 · 监控 ……
|
||||||
|
|
||||||
|
你的任务就是**全部推导出来**。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. Completeness Principle
|
||||||
|
|
||||||
|
任何功能**禁止**输出:
|
||||||
|
|
||||||
|
- 应该 / 可能 / 大概
|
||||||
|
- 简单实现 / 略 / TODO / 以后再做
|
||||||
|
|
||||||
|
必须全部展开。缺一项即未完成。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. Evidence First(证据优先)
|
||||||
|
|
||||||
|
每一项分析必须标注来源,禁止把猜测写成事实。
|
||||||
|
|
||||||
|
| 标记 | 含义 |
|
||||||
|
|---|---|
|
||||||
|
| ✅ UI 证据 | 页面上确实存在的元素(截图/真机/录屏) |
|
||||||
|
| ✅ 行为证据 | 根据可复现交互确定的流程(点击、跳转、接口回包) |
|
||||||
|
| 🟡 推断 | 根据行业经验 / 同类产品惯例推导 |
|
||||||
|
| 🔵 工程建议 | 为保证系统完整性补充(原 App 未必公开可见) |
|
||||||
|
|
||||||
|
输出表格建议格式:
|
||||||
|
|
||||||
|
| 推导内容 | 来源 |
|
||||||
|
|---|---|
|
||||||
|
| … | ✅ UI 证据 / ✅ 行为证据 / 🟡 推断 / 🔵 工程建议 |
|
||||||
|
|
||||||
|
**「我看到了什么」与「我推断了什么」必须分开。**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. Reverse Engineering Workflow
|
||||||
|
|
||||||
|
每分析一个页面(或一条完整用户能力),**严格按下列顺序,禁止跳步。**
|
||||||
|
|
||||||
|
### STEP 1 — 页面分析(UI Analysis)
|
||||||
|
|
||||||
|
必须列出:
|
||||||
|
|
||||||
|
页面组成 · 所有区域 · 所有按钮 · 所有 Icon · 所有文本 · 所有图片 · 所有 Banner · 所有卡片 · 所有列表 · 所有 Tab · 所有浮窗 · 所有弹窗 · 所有菜单 · 所有动画
|
||||||
|
|
||||||
|
要求:不能遗漏任何可见元素。每项尽量带 ✅ UI 证据。
|
||||||
|
|
||||||
|
### STEP 2 — 功能分析(Feature Analysis)
|
||||||
|
|
||||||
|
对页面上每一个元素,必须回答:
|
||||||
|
|
||||||
|
- 有什么作用?
|
||||||
|
- 点击后发生什么?长按?双击?
|
||||||
|
- 是否可分享 / 复制 / 删除 / 收藏 / 举报 / 编辑?
|
||||||
|
- 是否有权限限制 / VIP 限制 / 登录限制?
|
||||||
|
|
||||||
|
### STEP 3 — 用户流程(User Flow)
|
||||||
|
|
||||||
|
画出完整主流程:
|
||||||
|
|
||||||
|
```text
|
||||||
|
进入 → 加载 → 成功 → 操作 → 提交 → 返回 → 退出
|
||||||
|
```
|
||||||
|
|
||||||
|
同时必须覆盖失败与边界:
|
||||||
|
|
||||||
|
网络错误 · Token 失效 · 服务器异常 · 权限不足 · 数据为空 · 会员限制 · 余额不足 · 接口超时 · 审核失败
|
||||||
|
|
||||||
|
### STEP 4 — 状态机(State Machine)
|
||||||
|
|
||||||
|
每个页面必须列出状态(至少覆盖):
|
||||||
|
|
||||||
|
Init · Loading · Refreshing · Loaded · Empty · Offline · Error · PermissionDenied · LoginRequired · VIPLocked · Submitting · Success · Failed · Retrying · Deleted · Disabled · Hidden
|
||||||
|
|
||||||
|
并给出**状态转换图**(可用 mermaid)。
|
||||||
|
|
||||||
|
### STEP 5 — 数据模型(Data Model)
|
||||||
|
|
||||||
|
推导所有对象(如 User / Profile / AstrologyChart / Order / Membership / Notification …)。
|
||||||
|
|
||||||
|
每个字段必须写:字段 · 类型 · 是否为空 · 默认值 · 来源 · 用途 · 是否缓存 · 是否索引 · **证据标记**。
|
||||||
|
|
||||||
|
### STEP 6 — 数据库设计
|
||||||
|
|
||||||
|
推导表结构(含运营/审计表)。每张表:字段 · 主键 · 唯一索引 · 普通索引 · 外键 · 更新时间 · 删除策略。
|
||||||
|
|
||||||
|
落地到本仓库时,同步 `.ai/domain/erd.md` 与 migrations。
|
||||||
|
|
||||||
|
### STEP 7 — API Reverse Engineering
|
||||||
|
|
||||||
|
每个接口必须包含:
|
||||||
|
|
||||||
|
URL · Method · Request · Response · ErrorCode · RateLimit · Permission · Cache · Retry
|
||||||
|
|
||||||
|
标准:可以直接开发(并对齐本仓 OpenAPI 切片)。
|
||||||
|
|
||||||
|
### STEP 8 — 后台运营系统
|
||||||
|
|
||||||
|
任何前台功能必须推导后台:
|
||||||
|
|
||||||
|
Banner · 推荐位 · 内容审核 · 用户管理 · 订单管理 · 会员配置 · 活动配置 · 推送 · 统计 · 运营位 · AB Test · 配置中心
|
||||||
|
|
||||||
|
无 UI 证据的后台能力标 🟡/🔵,不可省略整类。
|
||||||
|
|
||||||
|
### STEP 9 — 权限系统
|
||||||
|
|
||||||
|
推导角色:游客 · 登录用户 · VIP · SVIP · 管理员 · 运营 · 客服 · 审核员 · 超级管理员
|
||||||
|
|
||||||
|
每个角色:能做什么 / 不能做什么。映射到本产品时对齐现有 Visitor / DeepAccess / Membership(见 feature-spec)。
|
||||||
|
|
||||||
|
### STEP 10 — 支付系统
|
||||||
|
|
||||||
|
若涉及:订单 · 退款 · 支付状态 · 失败/取消 · 重复支付 · 补单 · 风控 · 发票。
|
||||||
|
本仓当前可用 `pay-mock`;完整支付链路仍须在 Spec 中写清状态机,实现可分期。
|
||||||
|
|
||||||
|
### STEP 11 — 消息系统
|
||||||
|
|
||||||
|
Push · 站内信 · 短信 · 邮件 · 消息中心 · 未读数 · 角标 · 通知策略。
|
||||||
|
|
||||||
|
### STEP 12 — 埋点系统
|
||||||
|
|
||||||
|
页面曝光 · 按钮点击 · 停留 · 漏斗 · 转化 · 留存 · 分享 · 支付 · 搜索 · 异常。
|
||||||
|
事件名过 `.ai/product/feature-spec/analytics.md` 与 lexicon。
|
||||||
|
|
||||||
|
### STEP 13 — 配置系统
|
||||||
|
|
||||||
|
哪些后台可配 / 写死 / 远程配置 / 灰度 / AB。
|
||||||
|
|
||||||
|
### STEP 14 — 缓存策略
|
||||||
|
|
||||||
|
本地缓存 · Redis · CDN · 图片 · 分页 · 用户 · 配置。
|
||||||
|
|
||||||
|
### STEP 15 — 异常处理
|
||||||
|
|
||||||
|
断网 · 弱网 · 超时 · 重复点击 · Token 失效 · 数据损坏 · 接口升级 · 版本过低 · 审核失败 · 资源不存在。
|
||||||
|
|
||||||
|
### STEP 16 — 日志系统
|
||||||
|
|
||||||
|
用户日志 · 错误日志 · 接口日志 · 支付日志 · 审核日志 · 运营日志 · 安全日志。
|
||||||
|
|
||||||
|
### STEP 17 — 安全分析
|
||||||
|
|
||||||
|
权限 · SQL 注入 · XSS · CSRF · 重放 · 验证码 · 风控 · 设备绑定 · 账号安全。
|
||||||
|
并遵守 `.ai/security.md`。
|
||||||
|
|
||||||
|
### STEP 18 — 可扩展性
|
||||||
|
|
||||||
|
未来增量 · DB 扩展 · API 兼容 · 模块解耦。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. Completeness Checklist
|
||||||
|
|
||||||
|
输出结束前必须自检(任一项未分析则**不得结束**):
|
||||||
|
|
||||||
|
- [ ] 页面 / 按钮 / 弹窗
|
||||||
|
- [ ] 用户流程 / 异常流程
|
||||||
|
- [ ] API / 数据库
|
||||||
|
- [ ] 后台 / 权限 / 支付
|
||||||
|
- [ ] 配置 / 埋点 / 日志
|
||||||
|
- [ ] 安全 / 扩展
|
||||||
|
- [ ] 每条关键结论带 Evidence 标记
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 7. Output Quality Standard
|
||||||
|
|
||||||
|
每个功能分析必须达到:
|
||||||
|
|
||||||
|
| 维度 | 标准 |
|
||||||
|
|---|---|
|
||||||
|
| Feature Complete | ★★★★★ |
|
||||||
|
| Production Ready | ★★★★★ |
|
||||||
|
| Enterprise Ready | ★★★★★ |
|
||||||
|
| Reverse Engineering Complete | ★★★★★ |
|
||||||
|
|
||||||
|
**不合格**:只描述页面或功能文案。
|
||||||
|
**合格**:开发团队可据此直接实现完整链路(前台 · 后台 · 接口 · 数据 · 运营),且证据层级清晰。
|
||||||
|
|
||||||
|
分析产物默认写入:
|
||||||
|
|
||||||
|
1. `product/feature-spec/<id>.md`(用户可见能力与规则;过 lexicon)
|
||||||
|
2. 必要时附 `product/feature-spec/<id>-re.md` 或同目录附录(完整 STEP 1–18 逆向底稿)
|
||||||
|
3. 同步 `erd` / OpenAPI / `page-tree` / `feature-map` / analytics
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 8. 与愈心谷契约的关系(强制)
|
||||||
|
|
||||||
|
本规范解决的是:**能力与系统如何被完整逆向出来**。
|
||||||
|
落地品牌与禁词仍由产品契约约束:
|
||||||
|
|
||||||
|
| 层级 | 文档 | 作用 |
|
||||||
|
|---|---|---|
|
||||||
|
| 最高 | `product/lexicon.md` | 用户可见中文;硬禁「占卜/算命」恐吓等 |
|
||||||
|
| 战略 | `product/STRATEGY.md` | 参考竞品模型 ≠ 复制竞品品牌/视觉 |
|
||||||
|
| 能力树 | `product/feature-map.md` | 分期与边界 |
|
||||||
|
| 本规范 | `design/reverse-engineering-spec.md` | 逆向分析深度与完整性 |
|
||||||
|
| 功能输入 | `product/feature-design.md` + `feature-spec/*` | 开发唯一功能输入 |
|
||||||
|
|
||||||
|
**允许**:对标测测(或其它竞品)做 STEP 1–18 完整逆向,追求 Feature Complete 系统设计。
|
||||||
|
**禁止**:在 UI/PRD/Ask 中自称「测测」;照搬竞品商标、独特视觉品牌资产;违反 lexicon 的恐吓/疗效话术。
|
||||||
|
**落地命名**:逆向结论映射为愈心谷模块名(如「星座」「合盘」),写入 feature-spec 后再编码。
|
||||||
|
|
||||||
|
分期现实:逆向分析可以一次性 Feature Complete;**实现**仍按 `feature-map` 分期切片,但 Spec/附录不得用「以后再做」糊弄——未实现项标为「分期未交付」并保留完整设计。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 9. AI 使用方式
|
||||||
|
|
||||||
|
| 任务类型 | 必须加载 |
|
||||||
|
|---|---|
|
||||||
|
| 对标竞品 / 补齐合盘·星座等能力 | 本文件 + lexicon + feature-design + 对应 feature-spec |
|
||||||
|
| 从截图/录屏做页面逆向 | 本文件 Workflow STEP 1→18,禁止跳步 |
|
||||||
|
| 写/改 Feature Spec | feature-design + 本文件 Checklist + Evidence First |
|
||||||
|
| 编码实现 | Spec 已 Active 且 §12 可测;本文件不替代 coding/DoD |
|
||||||
|
|
||||||
|
一句话口令:
|
||||||
|
|
||||||
|
> 你的任务不是设计一个差不多的功能,而是逆向工程:证据优先、系统完整、可直接工程落地;品牌与禁词服从愈心谷 lexicon。
|
||||||
@@ -0,0 +1,105 @@
|
|||||||
|
# Local Development Rules — AI Contract
|
||||||
|
|
||||||
|
**目标:** 快速修改、快速验证、快速调试(分钟级反馈)。
|
||||||
|
|
||||||
|
**不是目标:** 把笔记本变成迷你生产集群。
|
||||||
|
|
||||||
|
总原则见 [environment.md](environment.md)。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## MUST
|
||||||
|
|
||||||
|
1. Go API:本机 `go run` / **air** 热更新。
|
||||||
|
2. user-h5:本机 **Node + Vite**(`npm run dev:h5`)。
|
||||||
|
3. 依赖数据服务(Postgres;日后 Redis 等):`docker compose -f docker-compose.dev.yml up -d`。
|
||||||
|
4. 配置:根目录或 `apps/api` 使用 `.env` / `.env.local`(不提交);模板见 `deploy/.env.example`。
|
||||||
|
5. H5 通过 Vite proxy 访问本机 API(`/api` → `127.0.0.1:8080`),无需把前端放进容器。
|
||||||
|
6. 验证优先:`go test`、`curl healthz`、浏览器 / Vite,而不是先写 Dockerfile。
|
||||||
|
|
||||||
|
## MUST NOT
|
||||||
|
|
||||||
|
- 每次改 Go/Vue 代码就 `docker build` 应用镜像再跑。
|
||||||
|
- 用 production image / `APP_ENV=prod` 做日常开发。
|
||||||
|
- `docker compose` 启动 **api + web** 作为默认本地工作流(除非任务明确是「验证 compose 集成」)。
|
||||||
|
- 将本地环境完全等同生产(密钥、域名、副本数、对象存储真集群等)。
|
||||||
|
- 把密钥写进 compose 或镜像层。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Recommended local topology
|
||||||
|
|
||||||
|
```
|
||||||
|
Host (macOS / Linux)
|
||||||
|
├── Go 1.22+
|
||||||
|
│ ├── go run ./cmd/server 或 air
|
||||||
|
│ └── delve(可选调试)
|
||||||
|
├── Node 20+(npm workspaces;可选 pnpm)
|
||||||
|
│ └── Vite → :5173
|
||||||
|
└── Docker Desktop(仅服务)
|
||||||
|
├── PostgreSQL :5432
|
||||||
|
├── Redis(需要时再加)
|
||||||
|
└── Object storage(需要时再加)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Go Backend
|
||||||
|
|
||||||
|
| Item | Local |
|
||||||
|
|---|---|
|
||||||
|
| Runtime | 本机 Go |
|
||||||
|
| Entry | `apps/api` |
|
||||||
|
| Hot reload | 推荐 [air](https://github.com/air-verse/air);配置 `.air.toml`(可选) |
|
||||||
|
| Env | `HTTP_ADDR=:8080` `DATABASE_URL=postgres://yuxingu:yuxingu@127.0.0.1:5432/yuxingu?sslmode=disable` `APP_ENV=dev` |
|
||||||
|
| Migrate | API 启动时自动应用 `apps/api/migrations/*.up.sql` |
|
||||||
|
| CN proxy | `export GOPROXY=https://goproxy.cn,direct` |
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# terminal — deps
|
||||||
|
docker compose -f docker-compose.dev.yml up -d
|
||||||
|
|
||||||
|
# terminal — API
|
||||||
|
cd apps/api
|
||||||
|
go run ./cmd/server
|
||||||
|
# 或: air
|
||||||
|
```
|
||||||
|
|
||||||
|
## Vue H5
|
||||||
|
|
||||||
|
| Item | Local |
|
||||||
|
|---|---|
|
||||||
|
| Runtime | 本机 Node |
|
||||||
|
| Dev | `npm run dev:h5` → http://127.0.0.1:5173 |
|
||||||
|
| Build check | `npm run build:h5` |
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install
|
||||||
|
npm run dev:h5
|
||||||
|
```
|
||||||
|
|
||||||
|
## Database / deps only
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker compose -f docker-compose.dev.yml up -d # postgres
|
||||||
|
docker compose -f docker-compose.dev.yml down
|
||||||
|
docker compose -f docker-compose.dev.yml logs -f postgres
|
||||||
|
```
|
||||||
|
|
||||||
|
只起依赖,**不起** api / web / worker。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Auth note (P1 local)
|
||||||
|
|
||||||
|
访客身份:`X-Device-Key`(H5 存 `localStorage.yxg_device_key`)。
|
||||||
|
无需为本地开发先搭完整 JWT,除非任务是登录竖切。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Before claiming Done (local)
|
||||||
|
|
||||||
|
- [ ] 未引入「Docker-only 改代码」流程
|
||||||
|
- [ ] API 本机可 `healthz`
|
||||||
|
- [ ] H5 本机 Vite 可打开
|
||||||
|
- [ ] DB 用 compose.dev,而非把业务进程塞进同一默认 compose
|
||||||
@@ -0,0 +1,70 @@
|
|||||||
|
# Docker Policy — AI Contract
|
||||||
|
|
||||||
|
## Docker SHOULD be used for
|
||||||
|
|
||||||
|
| ✓ | Examples |
|
||||||
|
|---|---|
|
||||||
|
| 依赖数据服务 | PostgreSQL |
|
||||||
|
| 缓存 | Redis(需要时) |
|
||||||
|
| 消息队列 | 需要时再加 |
|
||||||
|
| 对象存储 | MinIO / S3 兼容(需要时) |
|
||||||
|
| 第三方依赖模拟 | mailhog 等(需要时) |
|
||||||
|
| 生产/CI 应用交付 | 不可变 api / web 镜像 |
|
||||||
|
|
||||||
|
## Docker SHOULD NOT be used for
|
||||||
|
|
||||||
|
| ✗ | Why |
|
||||||
|
|---|---|
|
||||||
|
| Go API 日常开发 | 拖慢反馈;用本机 `go run` / `air` |
|
||||||
|
| Vue H5 日常开发 | 拖慢 HMR;用本机 Vite |
|
||||||
|
| Hot reload 工作流 | 禁止「改代码 → docker build → run」 |
|
||||||
|
| 把本机当成迷你 K8s | 违反 constitution:本地反馈速度优先 |
|
||||||
|
|
||||||
|
见 [development.md](development.md) · [environment.md](environment.md)。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Local compose(deps only)
|
||||||
|
|
||||||
|
| File | Role |
|
||||||
|
|---|---|
|
||||||
|
| `docker-compose.dev.yml`(仓库根) | **默认本地**:仅依赖服务 |
|
||||||
|
| `deploy/docker-compose.yml` | 与 dev 对齐的依赖入口(兼容旧命令);生产见 prod 文件 |
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker compose -f docker-compose.dev.yml up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
**允许的服务(local):** `postgres`(+ 需要时 `redis` / `minio`)
|
||||||
|
**禁止默认加入(local):** `api` · `user-h5` · `worker` · `nginx`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Production / CI images
|
||||||
|
|
||||||
|
| Artifact | Location (target) |
|
||||||
|
|---|---|
|
||||||
|
| Backend Dockerfile | `deploy/Dockerfile.api`(按需新增) |
|
||||||
|
| H5/Nginx Dockerfile | `deploy/Dockerfile.user-h5`(按需新增) |
|
||||||
|
| Prod compose / K8s | `deploy/docker-compose.prod.yml` 等 |
|
||||||
|
|
||||||
|
生产镜像规则见 [deployment.md](deployment.md):禁止 `latest`;语义化版本或 git SHA。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## AI MUST NOT
|
||||||
|
|
||||||
|
- 把「本地开发」文档写成只能 `docker compose up` 全栈。
|
||||||
|
- 在业务 PR 里强制同事每次改代码都 build 应用镜像。
|
||||||
|
- 将 `.env` 秘密 `COPY` 进镜像。
|
||||||
|
- 混用 `docker-compose.dev.yml` 与 prod 环境变量文件。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## When full-stack compose is OK
|
||||||
|
|
||||||
|
仅当任务明确是:
|
||||||
|
|
||||||
|
- 验证 prod compose / 镜像入口
|
||||||
|
- CI integration job
|
||||||
|
- 演示「一键依赖+应用」给非开发角色(仍非日常编码默认)
|
||||||
+39
-52
@@ -1,65 +1,52 @@
|
|||||||
# Domain Language — Ubiquitous Terms
|
# Domain Language — Ubiquitous Terms
|
||||||
|
|
||||||
Use ONLY these words in code, API, UI copy (Chinese labels noted).
|
Use ONLY these words in code and API.
|
||||||
Do not invent synonyms (Customer / Client / Account) unless added here via ADR.
|
**User-facing Chinese:** [product/lexicon.md](product/lexicon.md)
|
||||||
|
**Feature tree:** [product/feature-map.md](product/feature-map.md)
|
||||||
|
**Contexts / ER:** [domain/domain-map.md](domain/domain-map.md) · [domain/erd.md](domain/erd.md)
|
||||||
|
|
||||||
**Bounded contexts / aggregates / ER:** [domain/domain-map.md](domain/domain-map.md)
|
---
|
||||||
**Product feature tree:** [product/feature-map.md](product/feature-map.md)
|
|
||||||
|
|
||||||
## Identity & access
|
## Tech → User (frozen)
|
||||||
|
|
||||||
| Term | Meaning | Not |
|
| Tech | User CN |
|
||||||
|---|---|---|
|
|---|---|
|
||||||
| **Visitor** | 未登录访客;可有匿名 device id | Guest(勿混用) |
|
| Profile | 个人档案 |
|
||||||
| **User** | 已注册主体(有 user id) | Customer / Client |
|
| Portrait | 个人画像 |
|
||||||
| **Member** | 同 User:已注册用户的业务称呼;代码字段优先 `user` | — |
|
| Scale | 探索测试 |
|
||||||
| **VIP** | 付费会员期内的 User(membership active) | Member(勿把所有注册用户叫 VIP) |
|
| ScaleResult / Result | 探索结果 |
|
||||||
| **Session** | 登录态 / token 会话 | — |
|
| GrowthReport | 成长报告 |
|
||||||
|
| RelationInsight | 关系理解 |
|
||||||
|
| Ask | AI成长助手(Tab:问答) |
|
||||||
|
| Memory | 成长记录 |
|
||||||
|
| Mood | 心情记录 |
|
||||||
|
| SolarTerm | 节气生活 |
|
||||||
|
| Membership | 成长会员 |
|
||||||
|
| DeepAccess | 深度版 |
|
||||||
|
| Constitution | 身心探索 |
|
||||||
|
| StarProfile | 星象性格(P2) |
|
||||||
|
| LifeRhythm | 身心节律(P2) |
|
||||||
|
| ImageCard | 意象卡片(P2) |
|
||||||
|
|
||||||
## Commerce
|
Deprecated aliases: Decode→Portrait · Match→RelationInsight · Unlock→DeepAccess · Tarot→ImageCard
|
||||||
|
|
||||||
|
Never invent package names: `horoscope_luck`, `tarot`(用户域用 `image_card` / `star_profile` / `life_rhythm`)。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Identity
|
||||||
|
|
||||||
| Term | Meaning |
|
| Term | Meaning |
|
||||||
|---|---|
|
|---|---|
|
||||||
| **Subscription** | 会员订阅计划(月/季/年) |
|
| **Visitor** | 匿名访客 + device id |
|
||||||
| **Membership** | 用户当前会员权益状态(是否 VIP、到期时间、额度) |
|
| **User** | 注册主体 |
|
||||||
| **Order** | 支付订单(报告解锁或订阅) |
|
| **VIP** | Membership active |
|
||||||
| **Payment** | 一笔支付尝试 / 渠道回调结果 |
|
| **Session** | token 会话 |
|
||||||
| **Refund** | 退款记录 |
|
|
||||||
| **Unlock** | 对某 Report 的购买解锁(非 VIP 也可单次解锁) |
|
|
||||||
|
|
||||||
## Profile & content
|
---
|
||||||
|
|
||||||
| Term | Meaning |
|
## Core aggregates (names for packages/tables)
|
||||||
|---|---|
|
|
||||||
| **Profile** | 档案:自己或 TA 的生日等输入 |
|
|
||||||
| **Self Profile** | relation = self |
|
|
||||||
| **Other Profile** | relation = other(TA) |
|
|
||||||
| **Decode** | 愈心解码报告(数字性格 + 体质建议) |
|
|
||||||
| **Report** | 统称:Decode / Match / 尊享报告等可交付物 |
|
|
||||||
| **Match** | 双人/家庭契合度报告 |
|
|
||||||
| **Scale** | 心理量表 |
|
|
||||||
| **ScaleResult** | 量表作答与计分结果 |
|
|
||||||
|
|
||||||
## Retention & AI
|
`user` · `profile` · `portrait` · `scale` · `scale_result` · `growth_report` · `relation_insight` · `ask_thread` · `ask_message` · `mood` · `memory_item` · `subscription` · `membership` · `order` · `payment` · `deep_access`
|
||||||
|
|
||||||
| Term | Meaning |
|
Never invent: `customer`, `decode`, `horoscope_luck`, `tarot` packages for P1.
|
||||||
|---|---|
|
|
||||||
| **Companion** | 陪伴域:节气、心情 |
|
|
||||||
| **SolarTerm** | 二十四节气内容单元 |
|
|
||||||
| **Mood** | 每日心情打卡 |
|
|
||||||
| **Ask** | 「问」能力:基于 Profile 的解读对话 |
|
|
||||||
| **Consult** | 真人顾问咨询(后置) |
|
|
||||||
|
|
||||||
## Platform
|
|
||||||
|
|
||||||
| Term | Meaning |
|
|
||||||
|---|---|
|
|
||||||
| **user-h5** | 用户 H5 客户端 |
|
|
||||||
| **mini-program** | 微信小程序客户端 |
|
|
||||||
| **api** | Go 后端唯一服务 |
|
|
||||||
| **Legacy** | 根目录旧静态原型,只读 |
|
|
||||||
|
|
||||||
## Naming in code
|
|
||||||
|
|
||||||
- Go packages / JSON: `user`, `profile`, `report`, `order`, `membership`, `scale`
|
|
||||||
- Never: `customer`, `client` (except HTTP client), `account` (unless wallet later + ADR)
|
|
||||||
|
|||||||
@@ -1,6 +1,12 @@
|
|||||||
# Domain docs
|
# Domain
|
||||||
|
|
||||||
| File | Purpose |
|
| File | Purpose |
|
||||||
|---|---|
|
|---|---|
|
||||||
| [../domain.md](../domain.md) | Ubiquitous language — terms only |
|
| [../domain.md](../domain.md) | Tech ↔ 用户名 |
|
||||||
| [domain-map.md](domain-map.md) | Bounded contexts, aggregates, ER sketch |
|
| [domain-map.md](domain-map.md) | Bounded contexts(P1 冻结 + Ops Wave 0 Draft) |
|
||||||
|
| [erd.md](erd.md) | P1 表结构草案(冻结) |
|
||||||
|
| [boundary-rules.md](boundary-rules.md) | BC owns / allowed / forbidden(**P0** · Wave 0) |
|
||||||
|
| [glossary.yaml](glossary.yaml) | 工程/API 唯一词(与 lexicon 双轨) |
|
||||||
|
| [entity-catalog.md](entity-catalog.md) | 概念级实体目录(无 migration) |
|
||||||
|
|
||||||
|
Ops Contract-First 归档:`docs/WAVE0/`。
|
||||||
|
|||||||
@@ -0,0 +1,239 @@
|
|||||||
|
# Bounded Context Boundary Rules
|
||||||
|
|
||||||
|
> Wave 0 · **P0 资产** · AI / Engineer 只读;变更须 Architect + Human
|
||||||
|
> 运行时权威副本:`.ai/domain/boundary-rules.md`
|
||||||
|
|
||||||
|
Status: `Draft`(Human Review 后 Frozen)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 如何读
|
||||||
|
|
||||||
|
- **owns**:该 BC **唯一写权威**(修改入口)。
|
||||||
|
- **does_not_own**:明示禁止「顺手改」。
|
||||||
|
- **allowed**:允许的依赖(多为读或经门面)。
|
||||||
|
- **forbidden**:禁止的依赖(含跨 BC 写支付/会员等)。
|
||||||
|
|
||||||
|
违反本文件 = Reviewer **BLOCK**(架构回归)。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Admin_Auth_Audit
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
Admin_Auth_Audit:
|
||||||
|
owns:
|
||||||
|
- AdminAccount
|
||||||
|
- AdminSession
|
||||||
|
- AuditLog
|
||||||
|
does_not_own:
|
||||||
|
- UserStatus
|
||||||
|
- MembershipPlan
|
||||||
|
- Entitlement
|
||||||
|
allowed:
|
||||||
|
- Admin_RBAC.read
|
||||||
|
forbidden:
|
||||||
|
- Payment.write
|
||||||
|
- C端业务聚合根的隐式写入
|
||||||
|
```
|
||||||
|
|
||||||
|
## Admin_RBAC
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
Admin_RBAC:
|
||||||
|
owns:
|
||||||
|
- AdminRole
|
||||||
|
- AdminPermission
|
||||||
|
does_not_own:
|
||||||
|
- User
|
||||||
|
- Profile
|
||||||
|
- Membership
|
||||||
|
allowed:
|
||||||
|
- Admin_Auth_Audit.write_audit
|
||||||
|
forbidden:
|
||||||
|
- Payment
|
||||||
|
- Membership.write
|
||||||
|
- DeviceAuth.user_token_issue
|
||||||
|
```
|
||||||
|
|
||||||
|
## Identity_Profile
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
Identity_Profile:
|
||||||
|
owns:
|
||||||
|
- User
|
||||||
|
- Profile
|
||||||
|
- DeviceIdentity
|
||||||
|
- UserStatus
|
||||||
|
- BehaviorSnapshot
|
||||||
|
- PsychologicalTagSet
|
||||||
|
does_not_own:
|
||||||
|
- MembershipPlan
|
||||||
|
- Entitlement
|
||||||
|
- Order
|
||||||
|
- Payment
|
||||||
|
- RedemptionCode
|
||||||
|
allowed:
|
||||||
|
- Analytics_OpsB.read
|
||||||
|
forbidden:
|
||||||
|
- Payment
|
||||||
|
- Membership.write
|
||||||
|
```
|
||||||
|
|
||||||
|
## Membership_Orders
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
Membership_Orders:
|
||||||
|
owns:
|
||||||
|
- MembershipPlan
|
||||||
|
- Entitlement
|
||||||
|
- Membership
|
||||||
|
- Order
|
||||||
|
- DeepAccess
|
||||||
|
- RedemptionCode
|
||||||
|
- Payment # mock 今;真支付适配器后置,仍归本 BC
|
||||||
|
does_not_own:
|
||||||
|
- UserStatus
|
||||||
|
- AdminRole
|
||||||
|
- FilterRule
|
||||||
|
allowed:
|
||||||
|
- Identity_Profile.read
|
||||||
|
forbidden:
|
||||||
|
- Ask_Ops.write_prompt
|
||||||
|
- Content_Safety.rule_mutate_via_order
|
||||||
|
```
|
||||||
|
|
||||||
|
## Analytics_OpsB
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
Analytics_OpsB:
|
||||||
|
owns:
|
||||||
|
- AnalyticsSession
|
||||||
|
- AnalyticsEvent
|
||||||
|
does_not_own:
|
||||||
|
- User
|
||||||
|
- Membership
|
||||||
|
allowed:
|
||||||
|
- Identity_Profile.read_ids_only
|
||||||
|
forbidden:
|
||||||
|
- Payment
|
||||||
|
- 采集 PII 正文(生日/问答全文等)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Ops_Content
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
Ops_Content:
|
||||||
|
owns:
|
||||||
|
- HomeTool
|
||||||
|
- ScalePublishState
|
||||||
|
does_not_own:
|
||||||
|
- Scale 题目正文编辑器(未开 ECR 前禁止扩张)
|
||||||
|
allowed:
|
||||||
|
- Explore_Reports.publish_gate
|
||||||
|
forbidden:
|
||||||
|
- Community
|
||||||
|
- Payment
|
||||||
|
```
|
||||||
|
|
||||||
|
## Account_Risk
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
Account_Risk:
|
||||||
|
owns:
|
||||||
|
- RiskFlag
|
||||||
|
- BanRecord
|
||||||
|
does_not_own:
|
||||||
|
- MembershipPlan
|
||||||
|
allowed:
|
||||||
|
- Identity_Profile.UserStatus.transition # 经明确应用服务
|
||||||
|
- Admin_Auth_Audit.write_audit
|
||||||
|
forbidden:
|
||||||
|
- Payment.refund_silent
|
||||||
|
```
|
||||||
|
|
||||||
|
## Content_Safety
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
Content_Safety:
|
||||||
|
owns:
|
||||||
|
- FilterRule
|
||||||
|
- ModerationCase
|
||||||
|
- BlockPolicy
|
||||||
|
- CrisisEvent
|
||||||
|
- CrisisPolicy
|
||||||
|
does_not_own:
|
||||||
|
- Membership
|
||||||
|
- Payment
|
||||||
|
- AdminRole
|
||||||
|
allowed:
|
||||||
|
- Identity_Profile.read
|
||||||
|
- Ask_Ops.read_session_meta
|
||||||
|
forbidden:
|
||||||
|
- Membership.write
|
||||||
|
- Payment
|
||||||
|
```
|
||||||
|
|
||||||
|
## Ask_Ops
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
Ask_Ops:
|
||||||
|
owns:
|
||||||
|
- AskSessionView
|
||||||
|
- QualityFeedback
|
||||||
|
- HandoffCase
|
||||||
|
- SystemPrompt
|
||||||
|
- KnowledgeSource
|
||||||
|
- KnowledgeChunk
|
||||||
|
- ToolDefinition
|
||||||
|
does_not_own:
|
||||||
|
- Payment
|
||||||
|
- MembershipPlan
|
||||||
|
- UserStatus
|
||||||
|
allowed:
|
||||||
|
- Identity_Profile.read
|
||||||
|
- Content_Safety.evaluate
|
||||||
|
forbidden:
|
||||||
|
- Payment
|
||||||
|
- Membership.write
|
||||||
|
- Admin_RBAC.write
|
||||||
|
```
|
||||||
|
|
||||||
|
## Ops_CMS_NoUGC
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
Ops_CMS_NoUGC:
|
||||||
|
owns:
|
||||||
|
- Banner
|
||||||
|
- FeedSlot
|
||||||
|
- ScheduledPublication
|
||||||
|
does_not_own:
|
||||||
|
- UGC Post
|
||||||
|
- CommentGraph
|
||||||
|
- TrustScore
|
||||||
|
allowed:
|
||||||
|
- Admin_RBAC.check
|
||||||
|
forbidden:
|
||||||
|
- Community
|
||||||
|
- 用户生成内容入库为主路径
|
||||||
|
```
|
||||||
|
|
||||||
|
## Community
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
Community:
|
||||||
|
status: Forbidden
|
||||||
|
owns: []
|
||||||
|
note: feature-map UGC 广场 [No];开启须 L3 ADR + 新 Capability
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 反模式(禁止)
|
||||||
|
|
||||||
|
```text
|
||||||
|
AskService → load User → update Membership → charge Payment
|
||||||
|
UserService.updateMembership()
|
||||||
|
Content_Safety 直接改 Entitlement
|
||||||
|
Ops_CMS 引入「用户帖子」表却声称 NoUGC
|
||||||
|
```
|
||||||
+54
-172
@@ -1,183 +1,65 @@
|
|||||||
# Domain Map — 愈心谷(DDD 视角)
|
# Domain Map — 冻结(P1 工程真源)
|
||||||
|
|
||||||
给后端 / DB / OpenAPI / SDK 用的**能力域与实体图**。
|
变更本文件或 ERD 需简短 ADR。词汇:[../domain.md](../domain.md) · ERD:[erd.md](erd.md) · API:`proto/openapi.yaml` · Go 边界:[../architecture/go-services.md](../architecture/go-services.md)
|
||||||
词汇以 [../domain.md](../domain.md) 为准;产品范围以 [../product/feature-map.md](../product/feature-map.md) 为准。
|
|
||||||
竞品能力对照:[../product/cece-feature-map.md](../product/cece-feature-map.md)。
|
|
||||||
|
|
||||||
AI 生成表结构或 API 时:先落本图中的 Context / Aggregate,再写 migration;禁止发明未列出的聚合根名。
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 1. Bounded Contexts
|
## Bounded Contexts
|
||||||
|
|
||||||
|
| Context | Aggregates | P1 | Owner package |
|
||||||
|
|---|---|---|---|
|
||||||
|
| Identity | User, Session, DeviceIdentity | Yes | `internal/service/user` |
|
||||||
|
| Profile | Profile | Yes | `internal/service/profile` |
|
||||||
|
| Discovery | Portrait, Scale, ScaleResult, GrowthReport | Yes | `portrait`, `scale`, `report` |
|
||||||
|
| Relation | RelationInsight | Yes **必做** | `relation` |
|
||||||
|
| Ask | AskThread, AskMessage, AskQuota | Demo(规则引擎) | `ask` |
|
||||||
|
| Companion | Mood, SolarTerm | P2 | `internal/companion` · `/solar-terms/today` · `/moods` |
|
||||||
|
| StarProfile | StarProfile report | P2 | `internal/star` · `POST /reports/star` |
|
||||||
|
| LifeRhythm | LifeRhythm / Constitution | P2 | `internal/rhythm` · `POST /reports/rhythm` |
|
||||||
|
| ImageCard | ImageCard draw + deck | P2 | `internal/imagecard` · `/image-cards/*` |
|
||||||
|
| Memory | MemoryItem | P2/P3 | `memory` |
|
||||||
|
| Commerce | Subscription, Membership, Order, Payment, DeepAccess | Yes mock | `order`, `membership` |
|
||||||
|
| Consult | — | P3 | — |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Ops Platform Bounded Contexts(Wave 0 Draft)
|
||||||
|
|
||||||
|
> 详细 owns/forbidden:[`boundary-rules.md`](boundary-rules.md) · 词表:[`glossary.yaml`](glossary.yaml) · 实体:[`entity-catalog.md`](entity-catalog.md)
|
||||||
|
> 归档:`docs/WAVE0/domain/` · Capability:`docs/WAVE0/capability/ops-capability-map.md`
|
||||||
|
> **不修改**上方 P1 不变量;Ops BC 实现须独立 ECR。
|
||||||
|
|
||||||
|
| Context | Capability | Status |
|
||||||
|
|---|---|---|
|
||||||
|
| Admin_Auth_Audit | AdminGovernance | Shipped Ops-A |
|
||||||
|
| Admin_RBAC | AdminGovernance | Draft → ECR-013A |
|
||||||
|
| Analytics_OpsB | GrowthInsights / UserIntelligence(read) | Shipped Ops-B |
|
||||||
|
| Ops_Content | ExploreConfig (partial) | Shipped Ops-C |
|
||||||
|
| Account_Risk | AccountLifecycle | Spec via ECR-013B(Identity_Profile owns UserStatus) |
|
||||||
|
| Content_Safety | ContentSafety · CrisisCare | ContentSafety **ECR-019**;CrisisCare **ECR-022**(CrisisPolicy 只读) |
|
||||||
|
| Ask_Ops | AskOperations · AICoreConfig | AskOperations **ECR-017/020**;AICoreConfig **ECR-021**(SystemPrompt 只读) |
|
||||||
|
| Ops_CMS_NoUGC | OpsCMS | Draft |
|
||||||
|
| Community | — | **Forbidden** |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Context diagram
|
||||||
|
|
||||||
```
|
```
|
||||||
┌─────────────┐ ┌──────────────┐ ┌─────────────┐
|
Identity → Profile → Discovery(Portrait/Scale/GrowthReport)
|
||||||
│ Identity │──▶│ Profile │──▶│ Discovery │
|
↘ RelationInsight ← P1 双引擎
|
||||||
│ (User) │ │ Life Archive│ │ Decode/Scale│
|
↘ Ask (+ Memory later)
|
||||||
└─────────────┘ └──────┬───────┘ └──────┬──────┘
|
↘ Companion
|
||||||
│ │
|
↓
|
||||||
▼ ▼
|
Commerce(DeepAccess/Membership)
|
||||||
┌──────────────┐ ┌─────────────┐
|
|
||||||
│ Relationship │ │ Ask │
|
|
||||||
│ Match │ │ Companion │
|
|
||||||
└──────┬───────┘ └──────┬──────┘
|
|
||||||
│ │
|
|
||||||
▼ ▼
|
|
||||||
┌─────────────────────────────────┐
|
|
||||||
│ Commerce │
|
|
||||||
│ Subscription / Order / Unlock │
|
|
||||||
└─────────────────────────────────┘
|
|
||||||
│
|
|
||||||
┌──────────────┼──────────────┐
|
|
||||||
▼ ▼ ▼
|
|
||||||
ContentFeed GrowthShare Consult(*)
|
|
||||||
(* later)
|
|
||||||
```
|
```
|
||||||
|
|
||||||
| Context | 职责 | MVP |
|
|
||||||
|---|---|---|
|
|
||||||
| **Identity** | Visitor/User/Session | Yes |
|
|
||||||
| **Profile** | Self/Other 生命档案 | Yes |
|
|
||||||
| **Discovery** | Decode、Scale、Report 生成 | Yes |
|
|
||||||
| **Relationship** | Match | Yes |
|
|
||||||
| **Ask** | 档案上下文对话、额度 | Skeleton |
|
|
||||||
| **Companion** | SolarTerm、Mood | Skeleton |
|
|
||||||
| **Commerce** | Subscription、Membership、Order、Unlock、Payment | Yes (mock) |
|
|
||||||
| **Content** | Feed 配置 | Static OK |
|
|
||||||
| **Growth** | Share 卡片元数据 | Minimal |
|
|
||||||
| **Consult** | 真人顾问 Marketplace | No |
|
|
||||||
| **Recommendation** | 推荐 | V1 rules |
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 2. Aggregates & Entities(命名强制)
|
## Invariants
|
||||||
|
|
||||||
### Identity
|
1. GrowthReport 完整字段仅当 Membership active **或** DeepAccess 存在。
|
||||||
|
2. Ask 必须绑定 `profile_id`(Self 或 Other)。
|
||||||
| Type | Name | Notes |
|
3. RelationInsight 引用两个 Profile;禁止无档案的「合婚」式空算。
|
||||||
|---|---|---|
|
4. 客户端不可信任本地「已深度版」标志。
|
||||||
| Aggregate | **User** | 注册主体 |
|
5. 档案表不存吉凶列;**报告 JSON payload 允许**运势分/匹配指数(如 `fortune.daily.score`、`love_index`)。
|
||||||
| Entity | Session | token 会话 |
|
|
||||||
| Entity | DeviceIdentity | Visitor 匿名 |
|
|
||||||
|
|
||||||
### Profile(生命档案)
|
|
||||||
|
|
||||||
| Type | Name | Notes |
|
|
||||||
|---|---|---|
|
|
||||||
| Aggregate | **Profile** | `relation`: self \| other |
|
|
||||||
| VO | BirthInput | date;time/place optional later |
|
|
||||||
| VO | RelationType | partner/family/friend/… |
|
|
||||||
|
|
||||||
### Discovery
|
|
||||||
|
|
||||||
| Type | Name | Notes |
|
|
||||||
|---|---|---|
|
|
||||||
| Aggregate | **Report** | type: decode \| match \| … |
|
|
||||||
| Domain Svc | DecodeEngine | 可复算;结果入 Report |
|
|
||||||
| Aggregate | **Scale** | 量表定义 |
|
|
||||||
| Entity | ScaleQuestion | |
|
|
||||||
| Aggregate | **ScaleResult** | 作答 + 计分 |
|
|
||||||
|
|
||||||
### Relationship
|
|
||||||
|
|
||||||
| Type | Name | Notes |
|
|
||||||
|---|---|---|
|
|
||||||
| Aggregate | **Match** | 引用两个 Profile;产出 Report 或嵌入 |
|
|
||||||
|
|
||||||
### Ask / Companion
|
|
||||||
|
|
||||||
| Type | Name | Notes |
|
|
||||||
|---|---|---|
|
|
||||||
| Aggregate | **AskThread** | 挂 profile_id |
|
|
||||||
| Entity | AskMessage | role user/assistant |
|
|
||||||
| Entity | AskQuota | 与 Membership 联动 |
|
|
||||||
| Aggregate | **Mood** | 日维度打卡 |
|
|
||||||
| Read Model | **SolarTerm** | 日历内容;可配置表 |
|
|
||||||
|
|
||||||
### Commerce
|
|
||||||
|
|
||||||
| Type | Name | Notes |
|
|
||||||
|---|---|---|
|
|
||||||
| Aggregate | **Subscription** | 计划 SKU |
|
|
||||||
| Aggregate | **Membership** | 用户权益状态 |
|
|
||||||
| Aggregate | **Order** | 订阅或 Unlock |
|
|
||||||
| Entity | Payment | mock / 渠道 |
|
|
||||||
| Entity | Unlock | order → report 解锁 |
|
|
||||||
|
|
||||||
### Content / Growth(薄)
|
|
||||||
|
|
||||||
| Type | Name | Notes |
|
|
||||||
|---|---|---|
|
|
||||||
| Entity | FeedItem | 运营配置 |
|
|
||||||
| VO | SharePayload | 分享卡字段 |
|
|
||||||
|
|
||||||
### Consult(Later)
|
|
||||||
|
|
||||||
| Type | Name | Notes |
|
|
||||||
|---|---|---|
|
|
||||||
| Aggregate | Consultant | |
|
|
||||||
| Aggregate | ConsultOrder | |
|
|
||||||
| Entity | ConsultSession | |
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 3. 关键关系(ER 草图)
|
|
||||||
|
|
||||||
```
|
|
||||||
User 1──* Profile
|
|
||||||
Profile 1──* Report
|
|
||||||
Profile 1──* AskThread
|
|
||||||
User 1──* ScaleResult
|
|
||||||
User 1──0..1 Membership
|
|
||||||
User 1──* Order
|
|
||||||
Order 0..1── Unlock ──▶ Report
|
|
||||||
Profile ── Match ── Profile
|
|
||||||
User 1──* Mood
|
|
||||||
```
|
|
||||||
|
|
||||||
权益规则:**Membership / Unlock 只由服务端判定**;客户端不可信任。
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 4. Context → 代码落点
|
|
||||||
|
|
||||||
| Context | Go | H5 |
|
|
||||||
|---|---|---|
|
|
||||||
| Identity | `internal/service/user` | login / mine |
|
|
||||||
| Profile | `service/profile` | decode form, mine |
|
|
||||||
| Discovery | `service/report`, `service/scale` | decode, explore, report |
|
|
||||||
| Relationship | `service/match` | match |
|
|
||||||
| Ask | `service/ask` | ask tab |
|
|
||||||
| Companion | `service/companion` | companion tab |
|
|
||||||
| Commerce | `service/order`, `membership` | paywall, mine |
|
|
||||||
|
|
||||||
包名只用 `domain.md` 词汇:`user` `profile` `report` `order` `membership` `scale` `ask` `mood`。
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 5. 测测域 → 愈心谷域 映射
|
|
||||||
|
|
||||||
| 测测概念 | 愈心谷 |
|
|
||||||
|---|---|
|
|
||||||
| 星盘档案 | **Profile**(生日+体质相关输入) |
|
|
||||||
| 测测 AI | **Ask** |
|
|
||||||
| 真人 1v1 | **Consult**(后置) |
|
|
||||||
| MBTI 等 | **Scale** |
|
|
||||||
| 缘分合盘 | **Match**(合规叙事) |
|
|
||||||
| 今日运势 | **SolarTerm** + 生活建议(替换) |
|
|
||||||
| 会员 | **Subscription / Membership** |
|
|
||||||
| AI 玩法广场 | **[No] MVP** |
|
|
||||||
| 心情打卡 | **Mood** |
|
|
||||||
| 沙盘/心情小镇 | **[No]** |
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 6. 生成顺序(给 AI)
|
|
||||||
|
|
||||||
1. 改范围 → 更新 `product/feature-map.md` MVP 标记
|
|
||||||
2. 新实体 → 本文件 + `domain.md` 词条(若新词)
|
|
||||||
3. migration → `playbooks/new-table.md`
|
|
||||||
4. API → `playbooks/add-api.md` + OpenAPI
|
|
||||||
5. 页面 → `playbooks/new-page.md` + design contract
|
|
||||||
|
|
||||||
下一步可选:单独 `apps/docs/erd.md` 或 migrations 初稿(本任务不强制)。
|
|
||||||
|
|||||||
@@ -0,0 +1,43 @@
|
|||||||
|
# Entity Catalog(Wave 0 · 概念级)
|
||||||
|
|
||||||
|
> 仅登记名称、归属 BC、Capability、生命周期备注。**不建表、不写 migration。**
|
||||||
|
> 与 [`glossary.yaml`](glossary.yaml) · [`boundary-rules.md`](boundary-rules.md) 一致。
|
||||||
|
|
||||||
|
Status: `Draft`
|
||||||
|
|
||||||
|
| Entity | BC | Capability | Notes |
|
||||||
|
|--------|----|------------|-------|
|
||||||
|
| AdminAccount | Admin_Auth_Audit | AdminGovernance | 已存在 Ops-A |
|
||||||
|
| AdminSession | Admin_Auth_Audit | AdminGovernance | 已存在 |
|
||||||
|
| AuditLog | Admin_Auth_Audit | AdminGovernance | 已存在;只追加 |
|
||||||
|
| AdminRole | Admin_RBAC | AdminGovernance | **ECR-013A** |
|
||||||
|
| AdminPermission | Admin_RBAC | AdminGovernance | **ECR-013A** |
|
||||||
|
| User | Identity_Profile | AccountLifecycle | 已存在 |
|
||||||
|
| Profile | Identity_Profile | UserIntelligence | 已存在 |
|
||||||
|
| UserStatus | Identity_Profile | AccountLifecycle | **ECR-013B** 状态机 |
|
||||||
|
| AccountStateTransition | Identity_Profile | AccountLifecycle | **ECR-013B** |
|
||||||
|
| BehaviorSnapshot | Identity_Profile | UserIntelligence | **ECR-016** 读模型(analytics 聚合) |
|
||||||
|
| PsychologicalTagSet | Identity_Profile | UserIntelligence | **ECR-016** 由报告 type 派生 |
|
||||||
|
| MembershipPlan | Membership_Orders | CommerceEntitlement | **ECR-014 Closed** |
|
||||||
|
| Entitlement | Membership_Orders | CommerceEntitlement | **ECR-018** 读模型(Membership∪DeepAccess) |
|
||||||
|
| RedemptionCode | Membership_Orders | CommerceEntitlement | **ECR-015 Closed** |
|
||||||
|
| Membership | Membership_Orders | CommerceEntitlement | 已存在 |
|
||||||
|
| Order | Membership_Orders | CommerceEntitlement | 已存在 |
|
||||||
|
| DeepAccess | Membership_Orders | CommerceEntitlement | 已存在 |
|
||||||
|
| Payment | Membership_Orders | CommerceEntitlement | mock;真支付最后 |
|
||||||
|
| HomeTool | Ops_Content | ExploreConfig | 已存在 Ops-C |
|
||||||
|
| ScalePublishState | Ops_Content | ExploreConfig | 已存在 |
|
||||||
|
| AnalyticsSession / Event | Analytics_OpsB | GrowthInsights | 已存在 Ops-B |
|
||||||
|
| FilterRule | Content_Safety | ContentSafety | **ECR-019** 只读 + evaluate |
|
||||||
|
| ModerationCase | Content_Safety | ContentSafety | 后置 |
|
||||||
|
| CrisisEvent / CrisisPolicy | Content_Safety | CrisisCare | **ECR-022** CrisisPolicy 只读;CrisisEvent 后置 |
|
||||||
|
| SystemPrompt / Knowledge* / ToolDefinition | Ask_Ops | AICoreConfig | **ECR-021** SystemPrompt 只读;Knowledge/Tools 后置 |
|
||||||
|
| AskSessionView / QualityFeedback | Ask_Ops | AskOperations | **ECR-017** AskSessionView;**ECR-020** QualityFeedback |
|
||||||
|
| Banner / FeedSlot | Ops_CMS_NoUGC | OpsCMS | 后置 |
|
||||||
|
| UGC* | Community | — | **Forbidden** |
|
||||||
|
|
||||||
|
## 状态机(ECR-013B · 契约已开)
|
||||||
|
|
||||||
|
`UserStatus`: 见 `.ai/product/feature-spec/ops-account-lifecycle.md`。
|
||||||
|
`deleted` soft-delete **不在 013B**(另开)。
|
||||||
|
实现轮前:**禁止** migration / DeviceAuth 改动。
|
||||||
@@ -0,0 +1,260 @@
|
|||||||
|
# ERD — P1 Schema(冻结草案)
|
||||||
|
|
||||||
|
实现时用 migration 落地;列名可微调但**表/聚合关系不得偏离**。
|
||||||
|
类型:Postgres。敏感:生日等属 Profile,需可删账号级联。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Tables
|
||||||
|
|
||||||
|
### users
|
||||||
|
| column | type | notes |
|
||||||
|
|---|---|---|
|
||||||
|
| id | uuid PK | |
|
||||||
|
| created_at | timestamptz | |
|
||||||
|
| status | text | active/deleted |
|
||||||
|
|
||||||
|
### device_identities
|
||||||
|
| column | type | notes |
|
||||||
|
|---|---|---|
|
||||||
|
| id | uuid PK | |
|
||||||
|
| device_key | text unique | Visitor |
|
||||||
|
| user_id | uuid null FK→users | 升级后绑定 |
|
||||||
|
|
||||||
|
### profiles
|
||||||
|
| column | type | notes |
|
||||||
|
|---|---|---|
|
||||||
|
| id | uuid PK | |
|
||||||
|
| user_id | uuid FK→users | |
|
||||||
|
| relation | text | self \| other |
|
||||||
|
| display_name | text | |
|
||||||
|
| birth_date | date | required P1 |
|
||||||
|
| birth_time | time null | optional |
|
||||||
|
| birth_place | text null | optional |
|
||||||
|
| geo_lat | float null | 附近的人 |
|
||||||
|
| geo_lng | float null | |
|
||||||
|
| geo_visible | bool | default false;开启后可被附近列表看到 |
|
||||||
|
| gender | text null | |
|
||||||
|
| relation_type | text null | partner/family/friend… when other |
|
||||||
|
| created_at | timestamptz | |
|
||||||
|
|
||||||
|
### synastry_invites
|
||||||
|
| column | type | notes |
|
||||||
|
|---|---|---|
|
||||||
|
| id | uuid PK | |
|
||||||
|
| token | text unique | 分享路径 `/synastry/invite/:token` |
|
||||||
|
| host_user_id | uuid FK→users | |
|
||||||
|
| host_profile_id | uuid FK→profiles | |
|
||||||
|
| expires_at | timestamptz | |
|
||||||
|
| guest_user_id | uuid null | |
|
||||||
|
| guest_profile_id | uuid null | |
|
||||||
|
| report_id | uuid null FK→growth_reports | accept 后写入 |
|
||||||
|
| created_at | timestamptz | |
|
||||||
|
|
||||||
|
### scales
|
||||||
|
| column | type | notes |
|
||||||
|
|---|---|---|
|
||||||
|
| id | uuid PK | |
|
||||||
|
| slug | text unique | |
|
||||||
|
| title | text | 探索测试标题 |
|
||||||
|
| status | text | published/draft |
|
||||||
|
|
||||||
|
### scale_questions
|
||||||
|
| column | type | notes |
|
||||||
|
|---|---|---|
|
||||||
|
| id | uuid PK | |
|
||||||
|
| scale_id | uuid FK | |
|
||||||
|
| sort | int | |
|
||||||
|
| body | jsonb | 题干与选项 |
|
||||||
|
|
||||||
|
### scale_results
|
||||||
|
| column | type | notes |
|
||||||
|
|---|---|---|
|
||||||
|
| id | uuid PK | |
|
||||||
|
| user_id | uuid FK | |
|
||||||
|
| scale_id | uuid FK | |
|
||||||
|
| profile_id | uuid FK | |
|
||||||
|
| answers | jsonb | |
|
||||||
|
| result | jsonb | 探索结果摘要(可公开字段) |
|
||||||
|
| created_at | timestamptz | |
|
||||||
|
|
||||||
|
### growth_reports
|
||||||
|
| column | type | notes |
|
||||||
|
|---|---|---|
|
||||||
|
| id | uuid PK | |
|
||||||
|
| user_id | uuid FK | |
|
||||||
|
| profile_id | uuid FK | |
|
||||||
|
| type | text | portrait \| relation \| … |
|
||||||
|
| summary | jsonb | **基础版**,始终可按规则返回 |
|
||||||
|
| detail | jsonb | **深度版**,服务端按权益剥离 |
|
||||||
|
| created_at | timestamptz | |
|
||||||
|
|
||||||
|
### relation_insights
|
||||||
|
| column | type | notes |
|
||||||
|
|---|---|---|
|
||||||
|
| id | uuid PK | |
|
||||||
|
| user_id | uuid FK | |
|
||||||
|
| profile_a_id | uuid FK | usually self |
|
||||||
|
| profile_b_id | uuid FK | other |
|
||||||
|
| summary | jsonb | 对比标签等基础 |
|
||||||
|
| report_id | uuid null FK→growth_reports | 深度建议所在报告 |
|
||||||
|
| created_at | timestamptz | |
|
||||||
|
|
||||||
|
### ask_threads
|
||||||
|
| column | type | notes |
|
||||||
|
|---|---|---|
|
||||||
|
| id | uuid PK | |
|
||||||
|
| user_id | uuid FK | |
|
||||||
|
| profile_id | uuid FK | 当前解读对象 |
|
||||||
|
| created_at | timestamptz | |
|
||||||
|
|
||||||
|
### ask_messages
|
||||||
|
| column | type | notes |
|
||||||
|
|---|---|---|
|
||||||
|
| id | uuid PK | |
|
||||||
|
| thread_id | uuid FK | |
|
||||||
|
| role | text | user \| assistant |
|
||||||
|
| content | text | |
|
||||||
|
| created_at | timestamptz | |
|
||||||
|
|
||||||
|
### memberships
|
||||||
|
| column | type | notes |
|
||||||
|
|---|---|---|
|
||||||
|
| user_id | uuid PK FK→users | |
|
||||||
|
| plan | text | month/quarter/year |
|
||||||
|
| status | text | active/expired |
|
||||||
|
| expires_at | timestamptz | |
|
||||||
|
| ask_quota_left | int | |
|
||||||
|
|
||||||
|
### orders
|
||||||
|
| column | type | notes |
|
||||||
|
|---|---|---|
|
||||||
|
| id | uuid PK | |
|
||||||
|
| user_id | uuid FK | |
|
||||||
|
| kind | text | membership \| deep_access |
|
||||||
|
| amount_cents | int | |
|
||||||
|
| status | text | created/paid/failed |
|
||||||
|
| created_at | timestamptz | |
|
||||||
|
|
||||||
|
### payments
|
||||||
|
| column | type | notes |
|
||||||
|
|---|---|---|
|
||||||
|
| id | uuid PK | |
|
||||||
|
| order_id | uuid FK | |
|
||||||
|
| channel | text | mock \| wechat… |
|
||||||
|
| status | text | |
|
||||||
|
| raw | jsonb null | |
|
||||||
|
|
||||||
|
### deep_accesses
|
||||||
|
| column | type | notes |
|
||||||
|
|---|---|---|
|
||||||
|
| id | uuid PK | |
|
||||||
|
| user_id | uuid FK | |
|
||||||
|
| report_id | uuid FK→growth_reports | |
|
||||||
|
| order_id | uuid FK | |
|
||||||
|
| created_at | timestamptz | |
|
||||||
|
|
||||||
|
### moods(P2 可先建表空用)
|
||||||
|
| column | type | notes |
|
||||||
|
|---|---|---|
|
||||||
|
| id | uuid PK | |
|
||||||
|
| user_id | uuid FK | |
|
||||||
|
| day | date | |
|
||||||
|
| score | int null | |
|
||||||
|
| note | text null | |
|
||||||
|
|
||||||
|
### memory_items(P3)
|
||||||
|
| column | type | notes |
|
||||||
|
|---|---|---|
|
||||||
|
| id | uuid PK | |
|
||||||
|
| user_id | uuid FK | |
|
||||||
|
| kind | text | |
|
||||||
|
| payload | jsonb | |
|
||||||
|
| created_at | timestamptz | |
|
||||||
|
|
||||||
|
### admin_accounts(Ops-A · ECR-006)
|
||||||
|
| column | type | notes |
|
||||||
|
|---|---|---|
|
||||||
|
| id | uuid PK | |
|
||||||
|
| username | text unique | |
|
||||||
|
| password_hash | text | bcrypt |
|
||||||
|
| status | text | active/disabled |
|
||||||
|
| created_at | timestamptz | |
|
||||||
|
| updated_at | timestamptz | |
|
||||||
|
|
||||||
|
### admin_sessions
|
||||||
|
| column | type | notes |
|
||||||
|
|---|---|---|
|
||||||
|
| id | uuid PK | |
|
||||||
|
| admin_id | uuid FK→admin_accounts | |
|
||||||
|
| token | text unique | opaque |
|
||||||
|
| expires_at | timestamptz | |
|
||||||
|
| created_at | timestamptz | |
|
||||||
|
|
||||||
|
### admin_audit_logs
|
||||||
|
| column | type | notes |
|
||||||
|
|---|---|---|
|
||||||
|
| id | uuid PK | |
|
||||||
|
| admin_id | uuid FK | |
|
||||||
|
| action | text | e.g. membership.grant |
|
||||||
|
| target_type | text | user/order/… |
|
||||||
|
| target_id | text | |
|
||||||
|
| meta | jsonb | |
|
||||||
|
| created_at | timestamptz | 只追加 |
|
||||||
|
|
||||||
|
### analytics_sessions(Ops-B · ECR-007)
|
||||||
|
| column | type | notes |
|
||||||
|
|---|---|---|
|
||||||
|
| session_id | text PK | 客户端 session_id |
|
||||||
|
| device_key | text | |
|
||||||
|
| user_id | uuid FK null | |
|
||||||
|
| started_at | timestamptz | |
|
||||||
|
| ended_at | timestamptz null | |
|
||||||
|
| exit_page | text null | |
|
||||||
|
| duration_ms | int null | |
|
||||||
|
|
||||||
|
### analytics_events
|
||||||
|
| column | type | notes |
|
||||||
|
|---|---|---|
|
||||||
|
| id | uuid PK | |
|
||||||
|
| session_id | text FK→analytics_sessions | |
|
||||||
|
| user_id | uuid FK null | |
|
||||||
|
| name | text | page_view / page_leave / … |
|
||||||
|
| page_path | text null | |
|
||||||
|
| props | jsonb | 白名单键;无 PII |
|
||||||
|
| client_ts | timestamptz | |
|
||||||
|
| received_at | timestamptz | 只追加 |
|
||||||
|
|
||||||
|
### home_tools(Ops-C · ECR-008)
|
||||||
|
| column | type | notes |
|
||||||
|
|---|---|---|
|
||||||
|
| id | uuid PK | |
|
||||||
|
| row_index | smallint | 1 \| 2 |
|
||||||
|
| sort_order | int | |
|
||||||
|
| path | text | 站内相对路径 |
|
||||||
|
| icon | text | HomeToolIcon 白名单 |
|
||||||
|
| label | text | ≤16 字 |
|
||||||
|
| badge | text null | |
|
||||||
|
| badge_tone | text null | hot \| new |
|
||||||
|
| enabled | bool | |
|
||||||
|
| updated_at | timestamptz | |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Relationship sketch
|
||||||
|
|
||||||
|
```
|
||||||
|
users 1──* profiles
|
||||||
|
users 1──* scale_results
|
||||||
|
users 1──* growth_reports
|
||||||
|
users 1──0..1 memberships
|
||||||
|
users 1──* orders 1──* payments
|
||||||
|
growth_reports 1──* deep_accesses
|
||||||
|
profiles ── relation_insights ── profiles
|
||||||
|
users 1──* ask_threads 1──* ask_messages
|
||||||
|
admin_accounts 1──* admin_sessions
|
||||||
|
admin_accounts 1──* admin_audit_logs
|
||||||
|
users 1──* analytics_sessions 1──* analytics_events
|
||||||
|
home_tools(运营配置宫格)
|
||||||
|
scales.status published|draft
|
||||||
|
```
|
||||||
@@ -0,0 +1,116 @@
|
|||||||
|
# domain glossary — engineering / API unique terms
|
||||||
|
|
||||||
|
# Wave 0 Draft. Runtime copy: .ai/domain/glossary.yaml
|
||||||
|
# User-facing copy stays in .ai/product/lexicon.md
|
||||||
|
# Conflict: Architect + Human resolve; do not invent synonyms in code.
|
||||||
|
|
||||||
|
version: "0.1.0"
|
||||||
|
status: draft
|
||||||
|
|
||||||
|
terms:
|
||||||
|
AdminRole:
|
||||||
|
zh: 管理员角色
|
||||||
|
bc: Admin_RBAC
|
||||||
|
forbidden: [admin_group, privilege_group]
|
||||||
|
|
||||||
|
AdminPermission:
|
||||||
|
zh: 管理员权限点
|
||||||
|
bc: Admin_RBAC
|
||||||
|
forbidden: [acl_flag, authz_bit]
|
||||||
|
|
||||||
|
AuditLog:
|
||||||
|
zh: 操作审计日志
|
||||||
|
bc: Admin_Auth_Audit
|
||||||
|
forbidden: [admin_history]
|
||||||
|
|
||||||
|
UserStatus:
|
||||||
|
zh: 用户账户状态
|
||||||
|
bc: Identity_Profile
|
||||||
|
values: [active, disabled, banned, suspended]
|
||||||
|
forbidden: [user_flag, account_level]
|
||||||
|
|
||||||
|
AccountStateTransition:
|
||||||
|
zh: 账户状态迁移
|
||||||
|
bc: Identity_Profile
|
||||||
|
forbidden: [status_patch_log]
|
||||||
|
|
||||||
|
MembershipPlan:
|
||||||
|
zh: 会员套餐
|
||||||
|
bc: Membership_Orders
|
||||||
|
forbidden: [package, vip_level, 订阅档, sku_vip]
|
||||||
|
|
||||||
|
Entitlement:
|
||||||
|
zh: 权益
|
||||||
|
bc: Membership_Orders
|
||||||
|
forbidden: [privilege_pack, benefit_bundle]
|
||||||
|
|
||||||
|
RedemptionCode:
|
||||||
|
zh: 兑换码
|
||||||
|
bc: Membership_Orders
|
||||||
|
forbidden: [gift_card, activation_key_alias]
|
||||||
|
|
||||||
|
DeepAccess:
|
||||||
|
zh: 深度版
|
||||||
|
bc: Membership_Orders
|
||||||
|
forbidden: [Unlock, unlock_report]
|
||||||
|
|
||||||
|
BehaviorSnapshot:
|
||||||
|
zh: 行为快照
|
||||||
|
bc: Identity_Profile
|
||||||
|
forbidden: [user_track_dump]
|
||||||
|
|
||||||
|
PsychologicalTagSet:
|
||||||
|
zh: 心理标签集
|
||||||
|
bc: Identity_Profile
|
||||||
|
forbidden: [psy_labels_raw]
|
||||||
|
|
||||||
|
FilterRule:
|
||||||
|
zh: 过滤规则
|
||||||
|
bc: Content_Safety
|
||||||
|
forbidden: [badword_only]
|
||||||
|
|
||||||
|
ModerationCase:
|
||||||
|
zh: 审核工单
|
||||||
|
bc: Content_Safety
|
||||||
|
forbidden: [review_ticket_ugc]
|
||||||
|
|
||||||
|
CrisisEvent:
|
||||||
|
zh: 危机事件
|
||||||
|
bc: Content_Safety
|
||||||
|
forbidden: [suicide_flag_public]
|
||||||
|
|
||||||
|
CrisisPolicy:
|
||||||
|
zh: 危机策略
|
||||||
|
bc: Content_Safety
|
||||||
|
forbidden: [kill_switch_generic]
|
||||||
|
|
||||||
|
SystemPrompt:
|
||||||
|
zh: 系统提示词
|
||||||
|
bc: Ask_Ops
|
||||||
|
forbidden: [god_prompt]
|
||||||
|
|
||||||
|
KnowledgeSource:
|
||||||
|
zh: 知识源
|
||||||
|
bc: Ask_Ops
|
||||||
|
forbidden: [rag_file]
|
||||||
|
|
||||||
|
KnowledgeChunk:
|
||||||
|
zh: 知识块
|
||||||
|
bc: Ask_Ops
|
||||||
|
forbidden: [embedding_row_ui]
|
||||||
|
|
||||||
|
ToolDefinition:
|
||||||
|
zh: 工具定义
|
||||||
|
bc: Ask_Ops
|
||||||
|
forbidden: [function_call_config_loose]
|
||||||
|
|
||||||
|
Banner:
|
||||||
|
zh: 运营横幅
|
||||||
|
bc: Ops_CMS_NoUGC
|
||||||
|
forbidden: [story_feed_ugc]
|
||||||
|
|
||||||
|
Community:
|
||||||
|
zh: (禁止能力)
|
||||||
|
bc: Community
|
||||||
|
status: forbidden
|
||||||
|
forbidden: [ugc_plaza, 社区广场]
|
||||||
@@ -0,0 +1,62 @@
|
|||||||
|
# Environment Policy — AI Contract
|
||||||
|
|
||||||
|
项目环境分为三类,**禁止混用配置与工作流**:
|
||||||
|
|
||||||
|
| Environment | Goal | Typical tools |
|
||||||
|
|---|---|---|
|
||||||
|
| **1. Local Development** | 分钟级反馈、快速改代码 | 本机 Go / Node + Docker **仅依赖服务** |
|
||||||
|
| **2. CI** | 一致性、可重复验证 | 容器构建、单测、集成测 |
|
||||||
|
| **3. Production Deployment** | 稳定、不可变交付 | 镜像 + Compose/K8s |
|
||||||
|
|
||||||
|
## Principles
|
||||||
|
|
||||||
|
1. **Local 优先开发效率** — 改一行代码应秒级/十秒级可见,禁止「每次改代码都 docker build」。
|
||||||
|
2. **CI 优先一致性** — 用干净环境证明可构建、可测试。
|
||||||
|
3. **Production 优先稳定性** — 不可变镜像;禁止服务器上 `git pull && go build` 当主路径。
|
||||||
|
|
||||||
|
## AI MUST
|
||||||
|
|
||||||
|
- 本地写 Go / Vue 时默认 **本机 runtime**(见 [development.md](development.md))。
|
||||||
|
- Docker 本地用途默认 = **依赖服务**(Postgres 等),见 [docker.md](docker.md)。
|
||||||
|
- 部署相关只改 [deployment.md](deployment.md) / `deploy/*`,不把 prod 流程套到本地编码。
|
||||||
|
|
||||||
|
## AI MUST NOT
|
||||||
|
|
||||||
|
- 假设「有 Docker = 本地必须 compose 起 api/web」。
|
||||||
|
- 为改一行业务代码要求 rebuild application image。
|
||||||
|
- 把 `.env` / 生产密钥写进镜像或提交进库。
|
||||||
|
- 用 production `APP_ENV` / 生产 `DATABASE_URL` 跑本地热更。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Configuration Ownership
|
||||||
|
|
||||||
|
| File | Owner | Committed? |
|
||||||
|
|---|---|---|
|
||||||
|
| `deploy/.env.example`(或根 `.env.example`) | 模板:键名 + 无秘密默认值 | **Yes** |
|
||||||
|
| `.env.local` | 本地覆盖 | **No** |
|
||||||
|
| `.env.test` / CI secrets | CI 注入或加密变量 | 密钥 **No** |
|
||||||
|
| `.env.production` / 平台密钥 | 部署系统注入 | **No** |
|
||||||
|
|
||||||
|
### Rules
|
||||||
|
|
||||||
|
- Code **never** contains environment-specific secret values.
|
||||||
|
- Local values stay in `.env.local`(已被 `.gitignore` 的 `*.local` / `.env` 覆盖)。
|
||||||
|
- Production values are injected by the deployment system — not copied from a laptop.
|
||||||
|
- `.env*` files containing secrets must **never** be committed.
|
||||||
|
- Do not load `.env.production` in local `air` / Vite.
|
||||||
|
- Prefer one template (`.env.example`);按环境注入,勿把三套真密钥放进仓库。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Freeze
|
||||||
|
|
||||||
|
环境层(本文件 + `development.md` + `docker.md` + `deployment.md` + `commands.md` 相关部分)**已冻结**。
|
||||||
|
除非真实踩坑,否则不再横向扩工程规范;下一投入点 = P1 领域实现(schema / API / 页面)。
|
||||||
|
|
||||||
|
## Related
|
||||||
|
|
||||||
|
- Local: [development.md](development.md)
|
||||||
|
- Docker role: [docker.md](docker.md)
|
||||||
|
- Prod/CI deploy: [deployment.md](deployment.md)
|
||||||
|
- Commands: [commands.md](commands.md)
|
||||||
+24
-4
@@ -54,19 +54,39 @@ No raw `fetch` in `pages/`.
|
|||||||
|
|
||||||
Rules, ADR, patterns, examples, playbooks, checklists. Not runtime code.
|
Rules, ADR, patterns, examples, playbooks, checklists. Not runtime code.
|
||||||
|
|
||||||
|
### Environment docs
|
||||||
|
|
||||||
|
| Path | Owns |
|
||||||
|
|---|---|
|
||||||
|
| `environment.md` | Local vs CI vs Prod policy |
|
||||||
|
| `development.md` | Host Go / Vite local rules |
|
||||||
|
| `docker.md` | When Docker is / is not used |
|
||||||
|
| `deployment.md` | Prod immutable images / CI |
|
||||||
|
| `commands.md` | Copy-paste commands |
|
||||||
|
|
||||||
|
Runtime compose for **deps only**: repo-root `docker-compose.dev.yml`.
|
||||||
|
|
||||||
### .ai/product/ & .ai/domain/
|
### .ai/product/ & .ai/domain/
|
||||||
|
|
||||||
| Path | Owns |
|
| Path | Owns |
|
||||||
|---|---|
|
|---|---|
|
||||||
| `product/feature-map.md` | 愈心谷 L0/L1/L2 + MVP 标记 |
|
| `product/lexicon.md` | 产品中文语言契约(最高优先级) |
|
||||||
| `product/cece-feature-map.md` | 测测竞品合并 Feature Tree |
|
| `product/feature-design.md` | Feature Spec 强制规范 |
|
||||||
| `domain/domain-map.md` | Bounded contexts / aggregates / ER |
|
| `product/feature-spec/` | 单功能详细设计(流程/规则/API/验收) |
|
||||||
| `domain.md` | Ubiquitous terms only |
|
| `product/user-journey.md` | 转化路径 |
|
||||||
|
| `product/page-tree.md` | H5 路由冻结 |
|
||||||
|
| `product/feature-map.md` | 能力树 · 五 Tab 冻结 |
|
||||||
|
| `product/ENGINEERING-FREEZE.md` | P1 真源索引 |
|
||||||
|
| `playbooks/feature-spec.md` | Spec → 实现步骤 |
|
||||||
|
| `domain/domain-map.md` + `erd.md` | Contexts + 表结构 |
|
||||||
|
| `architecture/go-services.md` | Go 包边界 |
|
||||||
|
| `domain.md` | Tech ↔ 用户名 |
|
||||||
|
|
||||||
### .ai/design/
|
### .ai/design/
|
||||||
|
|
||||||
| Path | Owns |
|
| Path | Owns |
|
||||||
|---|---|
|
|---|---|
|
||||||
|
| `reverse-engineering-spec.md` | 竞品/成熟 App 逆向工程规范(STEP 1–18 · Evidence First) |
|
||||||
| `design-system.md` | Tokens, color, type, spacing, motion, voice |
|
| `design-system.md` | Tokens, color, type, spacing, motion, voice |
|
||||||
| `component-catalog.md` | Allowed reusable UI components |
|
| `component-catalog.md` | Allowed reusable UI components |
|
||||||
| `platform/*.md` | H5 / mini-program / website / Flutter limits |
|
| `platform/*.md` | H5 / mini-program / website / Flutter limits |
|
||||||
|
|||||||
+10
-1
@@ -19,14 +19,21 @@ AI obeys NEVER rules strictly.
|
|||||||
- Never invent response shapes other than `{code,message,data}`.
|
- Never invent response shapes other than `{code,message,data}`.
|
||||||
- Never use POST for pure read/query.
|
- Never use POST for pure read/query.
|
||||||
- Never skip migration when schema changes.
|
- Never skip migration when schema changes.
|
||||||
|
- Never hand-apply schema changes on shared/prod DB instead of migrations.
|
||||||
|
- Never edit already-merged migration files on `main` (fix forward).
|
||||||
- Never hard-delete user PII without explicit task (use soft delete).
|
- Never hard-delete user PII without explicit task (use soft delete).
|
||||||
|
|
||||||
## Security / deploy
|
## Security / deploy / environment
|
||||||
|
|
||||||
- Never hardcode passwords, tokens, or secrets.
|
- Never hardcode passwords, tokens, or secrets.
|
||||||
- Never commit `.env` or private keys.
|
- Never commit `.env` or private keys.
|
||||||
- Never use Docker image tag `latest` in production.
|
- Never use Docker image tag `latest` in production.
|
||||||
- Never log full birthday + answers payloads casually.
|
- Never log full birthday + answers payloads casually.
|
||||||
|
- Never introduce a **Docker-only** local coding workflow for Go/Vue.
|
||||||
|
- Never require application **image rebuild** after every local code change.
|
||||||
|
- Never put local secrets into Docker images.
|
||||||
|
- Never mix local/dev config with production config or prod compose as daily default.
|
||||||
|
- Never assume `docker compose up` must start api + web for development.
|
||||||
|
|
||||||
## Product / process
|
## Product / process
|
||||||
|
|
||||||
@@ -35,3 +42,5 @@ AI obeys NEVER rules strictly.
|
|||||||
- Never modify files outside the current task.
|
- Never modify files outside the current task.
|
||||||
- Never extend Legacy root HTML unless the task is migration.
|
- Never extend Legacy root HTML unless the task is migration.
|
||||||
- Never guess requirements — ASK FIRST.
|
- Never guess requirements — ASK FIRST.
|
||||||
|
- Never implement **new feature behavior** or **expand** an existing feature without an Active Feature Spec under `product/feature-spec/`(见 `product/feature-design.md`)。Bugfix 若暴露 Spec 错误必须同步修正 Spec。
|
||||||
|
- Never treat `feature-map.md` alone as sufficient design input for coding.
|
||||||
|
|||||||
@@ -0,0 +1,19 @@
|
|||||||
|
# Playbook: Feature Spec → Implementation
|
||||||
|
|
||||||
|
在写任何新功能或重大行为变更前执行。
|
||||||
|
|
||||||
|
## Steps
|
||||||
|
|
||||||
|
1. 在 `product/feature-map.md` 确认节点与分期(P1/P2/P3/No)。
|
||||||
|
2. 复制 `product/feature-spec/_TEMPLATE.md` → `product/feature-spec/<id>.md`。
|
||||||
|
3. 填满 §1–§13;文案过 `lexicon.md`。
|
||||||
|
4. 在 `feature-spec/README.md` 登记索引。
|
||||||
|
5. 若改数据/API:同步 `domain/erd.md` + `proto/openapi.yaml`(可先草案)。
|
||||||
|
6. 按 `playbooks/add-api.md` / `new-page.md` / `new-table.md` 实现。
|
||||||
|
7. 编码中更新 Spec §14 Implementation Notes;Gaps 标 `Gap:`。
|
||||||
|
8. 对照 Spec §12 + `checklists/feature.md` + DoD 验收。
|
||||||
|
|
||||||
|
## Stop
|
||||||
|
|
||||||
|
- Spec §4 / §7 / §9 / §12 为空 → 禁止编码。
|
||||||
|
- 需求不清 → ASK FIRST。
|
||||||
+12
-11
@@ -5,14 +5,15 @@ Use when: “新增页面”
|
|||||||
## Steps
|
## Steps
|
||||||
|
|
||||||
1. Confirm IA tab vs secondary page (`.ai/ui.md`)
|
1. Confirm IA tab vs secondary page (`.ai/ui.md`)
|
||||||
2. Read `.ai/design/design-system.md` + `component-catalog.md` + `design/platform/h5.md`
|
2. Read `.ai/product/lexicon.md` + `feature-map.md`(文案禁用词)
|
||||||
3. Reuse catalog components; update catalog if adding a new one
|
3. Read `.ai/design/design-system.md` + `component-catalog.md` + `design/platform/h5.md`
|
||||||
4. Add route in `apps/user-h5/src/router`
|
4. Reuse catalog components; update catalog if adding a new one
|
||||||
5. Add `pages/XxxPage.vue` (PascalCase); tokens only (no raw brand hex)
|
5. Add route in `apps/user-h5/src/router`
|
||||||
6. Extract components if file approaches 300–400 lines
|
6. Add `pages/XxxPage.vue` (PascalCase); tokens only (no raw brand hex)
|
||||||
7. Data via `src/api` → `@yuxingu/sdk` only
|
7. Extract components if file approaches 300–400 lines
|
||||||
8. Use domain words from `.ai/domain.md`
|
8. Data via `src/api` → `@yuxingu/sdk` only
|
||||||
9. Loading / empty / error states
|
9. Domain terms from `.ai/domain.md`;UI 中文从 lexicon
|
||||||
10. Compliance copy if report-like
|
10. Loading / empty / error states
|
||||||
11. `npm run build:h5`
|
11. Compliance copy if 成长报告-like
|
||||||
12. Review + checklist/feature.md
|
12. `npm run build:h5`
|
||||||
|
13. Review + checklist/feature.md
|
||||||
|
|||||||
@@ -0,0 +1,36 @@
|
|||||||
|
# Engineering Freeze — 进入 P1 开发前真源
|
||||||
|
|
||||||
|
以下文件为 **P1 冻结输入**;改动需 ADR 或产品确认。
|
||||||
|
|
||||||
|
| # | 真源 | 路径 |
|
||||||
|
|---|---|---|
|
||||||
|
| 1 | 产品语言 | `product/lexicon.md` |
|
||||||
|
| 2 | 能力树 + 冻结 IA | `product/feature-map.md` |
|
||||||
|
| 3 | Feature Spec 规范 | `product/feature-design.md` |
|
||||||
|
| 4 | 功能详细设计 | `product/feature-spec/` |
|
||||||
|
| 5 | 用户旅程 | `product/user-journey.md` |
|
||||||
|
| 6 | H5 页面树 | `product/page-tree.md` |
|
||||||
|
| 7 | 域词 | `domain.md` |
|
||||||
|
| 8 | Domain Map | `domain/domain-map.md` |
|
||||||
|
| 9 | ERD | `domain/erd.md` |
|
||||||
|
| 10 | API Contract | `proto/openapi.yaml` |
|
||||||
|
| 11 | Go 服务边界 | `architecture/go-services.md` |
|
||||||
|
| 12 | Design System | `design/design-system.md` |
|
||||||
|
|
||||||
|
环境规范层已冻结(`.ai/environment.md` 等)。
|
||||||
|
完成闸门:`.ai/definition-of-done.md`(强制)。
|
||||||
|
状态标签:`.ai/product/p1-status.md` → **`P1 Complete`**(必做项收口;P2 另列)。
|
||||||
|
|
||||||
|
**P2 三模块(设计已立项,实现另开切片):** 星象性格 · 身心节律 · 意象卡片
|
||||||
|
→ Spec:`feature-spec/star-profile.md` · `life-rhythm.md` · `image-card.md` · 队列见 `feature-spec/P2-BACKLOG.md`
|
||||||
|
→ 实现前须 Spec Active + OpenAPI/erd;**不计入 P1 Complete**。
|
||||||
|
|
||||||
|
## Review 清单(合并前必过)
|
||||||
|
|
||||||
|
1. 用户可见文本是否仅来自 lexicon?有无旧产品词/玄学预测?
|
||||||
|
2. 对应 `feature-spec/<id>.md` 是否存在且 §4/§7/§9/§12 非空?
|
||||||
|
3. 路由是否落在 page-tree?
|
||||||
|
4. Domain / 表名是否符合 domain.md(无 decode/luck 等)?
|
||||||
|
5. 权益是否只在服务端裁剪?
|
||||||
|
6. 关系理解是否仍在 P1 路径中(双引擎)?
|
||||||
|
7. 数据模型是否留有 Memory / Consult 扩展位(不阻塞 P1)?
|
||||||
+23
-10
@@ -1,12 +1,25 @@
|
|||||||
# Product docs for AI agents
|
# Product docs(AI 真源)
|
||||||
|
|
||||||
| File | Audience | Purpose |
|
| File | Purpose |
|
||||||
|---|---|---|
|
|---|---|
|
||||||
| [STRATEGY.md](STRATEGY.md) | All agents | **执行优先级**:先测测 parity,Vision v1 已封存 |
|
| [ENGINEERING-FREEZE.md](ENGINEERING-FREEZE.md) | **P1 冻结清单** |
|
||||||
| [feature-map.md](feature-map.md) | PRD / H5 / API | 愈心谷差异化能力树(Design Vision v1) |
|
| [p1-status.md](p1-status.md) | **P1 完成度(当前:P1 Complete)** |
|
||||||
| [cece-feature-map.md](cece-feature-map.md) | Competitor / parity | 测测 Feature Tree — 下一版对齐主参考 |
|
| [p2-status.md](p2-status.md) | **P2 完成度(当前:P2 Complete)** |
|
||||||
| [../domain/domain-map.md](../domain/domain-map.md) | Backend / DB / OpenAPI | Bounded contexts & entities |
|
| [lexicon.md](lexicon.md) | 产品语言契约(最高优先级) |
|
||||||
| [../domain.md](../domain.md) | All code | Ubiquitous language (terms only) |
|
| [feature-design.md](feature-design.md) | **Feature Spec 强制规范** |
|
||||||
|
| [feature-spec/](feature-spec/README.md) | **功能详细设计(单功能 HOW)** |
|
||||||
|
| [feature-map.md](feature-map.md) | 能力树 · 五 Tab 冻结(WHAT) |
|
||||||
|
| [user-journey.md](user-journey.md) | 转化路径(含关系分享引擎) |
|
||||||
|
| [page-tree.md](page-tree.md) | H5 路由树 |
|
||||||
|
| [STRATEGY.md](STRATEGY.md) | 参考模型 ≠ 复制品牌 |
|
||||||
|
| [cece-feature-map.md](cece-feature-map.md) | 竞品对照(勿抄品牌视觉) |
|
||||||
|
| [../design/reverse-engineering-spec.md](../design/reverse-engineering-spec.md) | **逆向工程设计规范 V1.0**(对标成熟 App 时强制) |
|
||||||
|
| [feature-spec/cece-frontend-re/](feature-spec/cece-frontend-re/README.md) | **测测前端全量逆向设计文档**(五 Tab + 工具域 + STEP 5–18) |
|
||||||
|
| [feature-spec/cece-frontend-re/complete-design/](feature-spec/cece-frontend-re/complete-design/README.md) | **测测对标 · 完整产品设计包(Design Complete)**;模拟器校验见包内 99 |
|
||||||
|
|
||||||
Product narrative docs (human PRD): `apps/docs/`.
|
冲突:`lexicon` > `feature-map` 分期 > **`feature-spec`** > `user-journey` / `page-tree` > 历史文档。
|
||||||
**冲突时:** `STRATEGY.md` 的 parity 执行 > Vision v1 创新项。
|
对标竞品分析时另加:`design/reverse-engineering-spec.md`(完整性与证据层级)。
|
||||||
|
|
||||||
|
开发链路:`feature-map` →(对标时)逆向 STEP 1–18 → `feature-spec` → domain/OpenAPI → 实现 → 测试 → Review。
|
||||||
|
|
||||||
|
P2 探索收口:[p2-status.md](p2-status.md) · [feature-spec/P2-BACKLOG.md](feature-spec/P2-BACKLOG.md) · 星座 / 身心节律 / 意象卡片。
|
||||||
|
|||||||
+29
-20
@@ -1,32 +1,41 @@
|
|||||||
# Product Strategy Snapshot
|
# Product Strategy
|
||||||
|
|
||||||
## Sealed design (this repo state)
|
## 原则
|
||||||
|
|
||||||
Documented vision: **愈心谷差异化** — 数字性格 + 中医体质 + 关系档案 + 节气,学测测飞轮但替换运势主叙事。
|
| 参考竞品 | 愈心谷自己的 |
|
||||||
|
|---|---|
|
||||||
|
| 功能模型 | 品牌语言(见 [lexicon.md](lexicon.md)) |
|
||||||
|
| 用户路径 | 功能命名 |
|
||||||
|
| 商业模型(测评→档案→AI→会员→咨询) | 叙事:成长 / 认识自己 / 理解他人 |
|
||||||
|
|
||||||
Canonical docs at seal time:
|
**不是**竞品品牌复制品。UI/PRD/Ask **禁止**出现:测测(自称)、占卜/算命恐吓、医疗疗效承诺;禁止以「塔罗」作主路径入口名。
|
||||||
|
|
||||||
- `product/feature-map.md` — 愈心谷能力树(含 MVP 标记)
|
**能力与系统可按逆向规范完整对标**:见 [../design/reverse-engineering-spec.md](../design/reverse-engineering-spec.md)(Evidence First · STEP 1–18 · Feature Complete)。
|
||||||
- `product/cece-feature-map.md` — 测测竞品树
|
逆向的是功能/业务/数据/运营体系;落地时用愈心谷命名与 lexicon,不照搬竞品商标与独特视觉品牌。
|
||||||
- `domain/domain-map.md` — 领域模型
|
|
||||||
- `apps/docs/prd-mvp.md` · `business-model.md` · `product-roadmap.md`
|
|
||||||
- `.ai/design/*` — Design System Contract
|
|
||||||
|
|
||||||
Treat the above as **Design Vision v1(已封存)** — 可对照、可回退,不作为下一迭代的强制做完清单。
|
**P2 允许同构探索模块**(能力可对标竞品;星座模块允许运势分与匹配指数,须过 lexicon):
|
||||||
|
|
||||||
|
| 竞品能力域 | 愈心谷模块(用户名) | Spec |
|
||||||
|
|---|---|---|
|
||||||
|
| 星座 | 星座(星盘 · 运势 · 合盘) | `feature-spec/star-profile.md` |
|
||||||
|
| 命理 | 身心节律 | `feature-spec/life-rhythm.md` |
|
||||||
|
| 塔罗 | 意象卡片 | `feature-spec/image-card.md` |
|
||||||
|
|
||||||
|
星盘/运势可作模块内主文案;品牌 slogan 仍以成长/认识自己为主。须过 lexicon。
|
||||||
|
|
||||||
|
封存的差异化长文设计见 git tag `design-vision-v1`(历史参考)。
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Next build direction(执行优先)
|
## 执行分期(与 feature-map 对齐)
|
||||||
|
|
||||||
**先出一版和测测结构类似的产品,不要一上来就创新。**
|
1. **P1** — 档案 · 性格探索/画像 · 人格测评 · 关系理解 · 问答 · 深度版 · 会员 · 分享 · 埋点
|
||||||
|
2. **P2** — 星象性格 · 身心节律 · 意象卡片 · 节气陪伴深化 · 心情记录 · 成长计划 → **P2 Complete**([p2-status.md](p2-status.md))
|
||||||
|
3. **P3** — 长期记忆 · 成长数据库 · 真人顾问
|
||||||
|
|
||||||
| 原则 | 含义 |
|
真支付仍属部署阶段,不进入 P1/P2 Complete 判定。
|
||||||
|---|---|
|
|
||||||
| IA 对齐测测 | 首页发现 · 问(AI)· 在线/咨询位 · 消息或可后置 · 我的 |
|
|
||||||
| 能力对齐测测漏斗 | 测评拉新 → 档案 → AI 问 → 会员 → 咨询占位 |
|
|
||||||
| 叙事可先「泛心理 + 星座/性格」 | 体质/节气差异化后置,不阻塞首版 |
|
|
||||||
| 不做冷启动重资产 | 不做达人双边冷启动、不做硬件、不做 UGC 玩法广场首版 |
|
|
||||||
|
|
||||||
差异化 Vision v1 在首版跑通测测式漏斗后再渐进引入(Decode 体质、节气陪伴等)。
|
冲突时:**lexicon + feature-map > 历史 Vision 文档中的旧命名(解码/Unlock 等)**。
|
||||||
|
|
||||||
执行时以即将撰写的 **Cece-parity PRD / feature-map-v0** 为准;冲突时:**parity 执行 > Vision v1 创新项**。
|
工程冻结清单:[ENGINEERING-FREEZE.md](ENGINEERING-FREEZE.md)。
|
||||||
|
P1 双引擎:个人画像 **与** 关系理解,不可只做「我是谁」。
|
||||||
|
|||||||
@@ -11,7 +11,9 @@
|
|||||||
| L1 Capability | 系统背后有哪些能力域 | §2 挂在各入口下 / §3 横切 |
|
| L1 Capability | 系统背后有哪些能力域 | §2 挂在各入口下 / §3 横切 |
|
||||||
| 演进 | 工具 → AI 顾问 → Life OS | §4 |
|
| 演进 | 工具 → AI 顾问 → Life OS | §4 |
|
||||||
|
|
||||||
愈心谷落地地图见 [feature-map.md](feature-map.md)。领域实体见 [../domain/domain-map.md](../domain/domain-map.md)。
|
愈心谷落地地图见 [feature-map.md](feature-map.md)。领域实体见 [../domain/domain-map.md](../domain/domain-map.md)。
|
||||||
|
对单页/单能力做完整逆向时,强制遵循 [../design/reverse-engineering-spec.md](../design/reverse-engineering-spec.md)(Evidence First · STEP 1–18)。
|
||||||
|
**前端全量逆向设计套件(详细):** [feature-spec/cece-frontend-re/](feature-spec/cece-frontend-re/README.md) · **完整设计包:** [feature-spec/cece-frontend-re/complete-design/](feature-spec/cece-frontend-re/complete-design/README.md)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,118 @@
|
|||||||
|
# Feature Design Standard
|
||||||
|
|
||||||
|
**任何新功能或重大行为变更,开发前必须存在对应 Feature Specification。**
|
||||||
|
|
||||||
|
Feature Spec 是产品、设计、开发的**唯一功能输入**。
|
||||||
|
`feature-map.md` 只回答「做什么 / 在哪棵树上」——**不够**开始编码。
|
||||||
|
|
||||||
|
完整链路:
|
||||||
|
|
||||||
|
```
|
||||||
|
feature-map(能力树)
|
||||||
|
→ feature-spec(功能详细设计)
|
||||||
|
→ domain / OpenAPI / erd(技术契约)
|
||||||
|
→ implementation
|
||||||
|
→ test
|
||||||
|
→ review
|
||||||
|
```
|
||||||
|
|
||||||
|
规范位置:本文件。
|
||||||
|
Spec 目录:[`feature-spec/`](feature-spec/README.md)。
|
||||||
|
模板:[`feature-spec/_TEMPLATE.md`](feature-spec/_TEMPLATE.md)。
|
||||||
|
对标成熟 App:[`../design/reverse-engineering-spec.md`](../design/reverse-engineering-spec.md)(逆向 STEP 1–18 · Evidence First)。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 禁止
|
||||||
|
|
||||||
|
- 根据一句需求直接编码
|
||||||
|
- 根据页面截图或竞品 UI **跳步猜测**业务规则(须走逆向规范并标注证据)
|
||||||
|
- 未定义 User Flow / 页面状态 / Business Rules 就开发
|
||||||
|
- 仅有页面或 API「能跑」就称 Feature Complete
|
||||||
|
- Spec 未更新就扩大已有功能行为(bugfix 除外)
|
||||||
|
- 在 Spec 中偷偷扩大 `feature-map` 分期范围(P2 写成 P1)
|
||||||
|
- 对标竞品时输出 Demo/MVP 式省略(「略」「TODO」「以后再做」)作为 Spec 终态
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 允许的例外
|
||||||
|
|
||||||
|
| 场景 | 要求 |
|
||||||
|
|---|---|
|
||||||
|
| 明确 bugfix(行为已在 Spec/OpenAPI 定义) | 可直接修;若暴露 Spec 错误则同步修正 Spec |
|
||||||
|
| 文案/lexicon 微调且不改规则 | 可改代码 + lexicon;不强制新 Spec |
|
||||||
|
| 纯重构(对外行为不变) | 不强制新 Spec;DoD 仍适用 |
|
||||||
|
| 存量功能尚无 Spec | **进入该功能开发前必须先 retrofit Spec**;否则只许修明确 bug,不得扩行为 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 冲突优先级
|
||||||
|
|
||||||
|
1. `lexicon.md`(用户可见中文)
|
||||||
|
2. `feature-map.md` 分期与边界标记
|
||||||
|
3. **本功能的 `feature-spec/<id>.md`**(流程、规则、验收)
|
||||||
|
4. `user-journey.md` / `page-tree.md`
|
||||||
|
5. `domain/` + OpenAPI(实现契约;必须与 Spec §8/§9 对齐)
|
||||||
|
6. 历史 PRD / `apps/docs/*` / 立项文档
|
||||||
|
|
||||||
|
Spec 文案不得违反 lexicon。Spec 不得把 `[P2]`/`[No]` 能力写成已交付。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Feature Spec 强制章节
|
||||||
|
|
||||||
|
每份 Spec 必须包含(可用 N/A + 原因,不可省略标题):
|
||||||
|
|
||||||
|
| # | 章节 | 要求 |
|
||||||
|
|---|---|---|
|
||||||
|
| 1 | 功能定义 | Name / Purpose / Business Goal |
|
||||||
|
| 2 | 用户价值 | 为何需要 / 完成后获得什么 / 为何付费 |
|
||||||
|
| 3 | 用户角色 | Guest / User / VIP(对齐实际 Identity 模型) |
|
||||||
|
| 4 | 用户流程 | ASCII 或 mermaid;含分支 |
|
||||||
|
| 5 | 页面设计 | 路由 + 页面列表;对照 page-tree |
|
||||||
|
| 6 | 页面状态 | Loading / Empty / Error / Normal / Locked(适用则写) |
|
||||||
|
| 7 | Business Rules | 编号 Rule N;**权益由 Server 判断** |
|
||||||
|
| 8 | 数据模型影响 | 表/字段;指向 erd,禁止臆造 |
|
||||||
|
| 9 | API 需求 | 路径级意图;细节以 OpenAPI 为准并须同步 |
|
||||||
|
| 10 | 权限设计 | 角色 × 能力矩阵 |
|
||||||
|
| 11 | 埋点 | 事件名;未接 SDK 也先定义 |
|
||||||
|
| 12 | 测试验收标准 | Given / When / Then |
|
||||||
|
| 13 | AI 开发前检查 | checkbox |
|
||||||
|
| 14 | Implementation Notes | 编码时填写:包、迁移、与现状 gap |
|
||||||
|
|
||||||
|
User Flow 与验收故事**写在 Spec 内**,不另建平行 `user-story/` 真相源。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## AI 开发前检查(强制)
|
||||||
|
|
||||||
|
Before implementation, AI MUST verify:
|
||||||
|
|
||||||
|
- [ ] Feature Spec 文件存在(`feature-spec/<id>.md`)
|
||||||
|
- [ ] 已在 `feature-map.md` 挂树且分期正确
|
||||||
|
- [ ] User Flow(§4)已定义
|
||||||
|
- [ ] Business Rules(§7)已定义
|
||||||
|
- [ ] API 需求(§9)已定义,并计划更新 OpenAPI
|
||||||
|
- [ ] 数据影响(§8)已核对 erd
|
||||||
|
- [ ] 页面状态(§6)已定义
|
||||||
|
- [ ] Acceptance(§12)已定义
|
||||||
|
- [ ] 文案符合 `lexicon.md`
|
||||||
|
|
||||||
|
任一项缺失 → **停止编码,先补 Spec 或 ASK**。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 何时更新 Spec
|
||||||
|
|
||||||
|
- 新功能:先复制 `_TEMPLATE.md` → 填满 → 再编码
|
||||||
|
- 改规则 / 改权益 / 改主流程 / 改付费墙:先改 Spec,再改代码
|
||||||
|
- 仅修 bug:若 Spec 与现实不符,修完后回写 Spec
|
||||||
|
|
||||||
|
Playbook:[`../playbooks/feature-spec.md`](../playbooks/feature-spec.md)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 与 DoD 的关系
|
||||||
|
|
||||||
|
无适用 Feature Spec → **不得**勾选 Feature Complete(见 `definition-of-done.md` §1)。
|
||||||
|
「OpenAPI 有了 / 页面打开了」而 Spec 缺失 = 伪完成。
|
||||||
+255
-187
@@ -1,212 +1,280 @@
|
|||||||
# 愈心谷 — Product Feature Map
|
# 愈心谷 — Product Feature Map
|
||||||
|
|
||||||
**权威产品能力树**(PRD / 路由 / 竖切范围以此为准)。
|
**权威产品能力树(WHAT)。** 语言以 [lexicon.md](lexicon.md) 为准。
|
||||||
竞品原文树:[cece-feature-map.md](cece-feature-map.md)
|
单功能详细设计(HOW):[feature-design.md](feature-design.md) · [feature-spec/](feature-spec/README.md)
|
||||||
领域实体:[../domain/domain-map.md](../domain/domain-map.md)
|
参考测测的是:**功能模型 · 用户路径 · 商业模型**;品牌叙事与命名必须是愈心谷自己的。
|
||||||
词汇:[../domain.md](../domain.md) · PRD:`apps/docs/prd-mvp.md`
|
领域实体:[../domain/domain-map.md](../domain/domain-map.md) · 词汇:[../domain.md](../domain.md)
|
||||||
|
竞品对照(可含竞品原名):[cece-feature-map.md](cece-feature-map.md)
|
||||||
|
策略:[STRATEGY.md](STRATEGY.md)
|
||||||
|
|
||||||
标记:`[MVP]` `[V1]` `[Later]` `[No]`
|
标记:`[P1]` 第一阶段 · `[P2]` 第二阶段 · `[P3]` 第三阶段 · `[No]`
|
||||||
|
**编码前**必须打开对应 Feature Spec;仅有本文件不够。
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## L0 — App 信息架构
|
## 定位
|
||||||
|
|
||||||
|
愈心谷 = 通过数字性格、身心特征、关系理解与 AI 陪伴,帮助用户更好地认识自己、理解他人的个人成长平台。
|
||||||
|
|
||||||
|
### 核心飞轮
|
||||||
|
|
||||||
|
```
|
||||||
|
探索自己 → 建立个人档案 → 获得个性化分析
|
||||||
|
→ AI 持续陪伴 → 会员深入体验 → 长期成长记录
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## L0 信息架构(冻结)
|
||||||
|
|
||||||
```
|
```
|
||||||
愈心谷
|
愈心谷
|
||||||
├── 首页 HomeWash:品牌 + Decode + Feed
|
├── 首页 发现与入口中心
|
||||||
├── 探索 Scale / Decode / 轻工具
|
├── 探索 核心功能中心
|
||||||
├── 问 Ask(战略中心 Tab)
|
├── 问答 AI 成长助手(战略中心 Tab)
|
||||||
├── 陪伴 SolarTerm + Mood
|
├── 陪伴 日常留存
|
||||||
├── 我的 Life Profile 资产
|
└── 我的 档案 / 成长报告 / 成长会员
|
||||||
├── 增长运营(横切)
|
|
||||||
└── 平台生态(横切 · 后置)
|
|
||||||
```
|
```
|
||||||
|
|
||||||
路径:`发现 → 建档/测评 → 问/陪伴留存 → 会员·解锁 →(后)Consult`
|
**五 Tab 名称与顺序冻结,未经 ADR 不得改。**
|
||||||
|
路径见 [user-journey.md](user-journey.md)。
|
||||||
|
P1 双引擎:**个人画像 + 关系理解**(不可弱化关系侧)。
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## L1 — 产品能力树(合并 IA × Domain)
|
## 1. 首页(发现与入口中心)
|
||||||
|
|
||||||
```
|
详见 Spec:[feature-spec/home.md](feature-spec/home.md)
|
||||||
愈心谷 Feature Tree
|
|
||||||
├── 1. Identity & 生命档案
|
### 1.1 创建个人档案 `[P1]`
|
||||||
├── 2. Self Discovery(自我探索)
|
|
||||||
├── 3. Relationship(关系)
|
详见 Spec:[feature-spec/profile.md](feature-spec/profile.md)
|
||||||
├── 4. AI Companion(问)
|
|
||||||
├── 5. Companion Rhythm(陪伴节奏)
|
| 三级 | 内容 |
|
||||||
├── 6. Human Expert(真人 · 后置)
|
|---|---|
|
||||||
├── 7. Content & Feed
|
| 1.1.1 我的信息 | 出生日期;出生时间/地点(可后置);性别 |
|
||||||
├── 8. Growth
|
| 1.1.2 关系对象 | 伴侣 · 家人 · 朋友 |
|
||||||
├── 9. Commerce
|
| 1.1.3 档案管理 | 编辑 · 删除 · 切换 |
|
||||||
└── 10. Data & Recommendation(平台能力)
|
|
||||||
```
|
### 1.2 快捷功能入口(九宫格)
|
||||||
|
|
||||||
|
性格探索 · 人格测试 · 关系分析 · 个人画像 · AI问答 · 身心探索 · 节气陪伴 · 会员中心 · 更多
|
||||||
|
|
||||||
|
(身心探索 / 节气:`[P1]` 可轻入口,深做在 `[P2]`)
|
||||||
|
|
||||||
|
### 1.3 推荐内容 `[P1]` 静态/运营即可
|
||||||
|
|
||||||
|
今日推荐 · 热门探索 · 成长文章 · 用户故事 · 精选成长报告
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### 1. Identity & 生命档案
|
## 2. 探索(核心功能中心)
|
||||||
|
|
||||||
| 二级 | 三级 | 范围 |
|
### 2.1 性格探索 `[P1]`
|
||||||
|
|
||||||
|
帮助用户了解行为模式。详见:[feature-spec/portrait.md](feature-spec/portrait.md) · [reports.md](feature-spec/reports.md)
|
||||||
|
|
||||||
|
| 三级 | 内容 |
|
||||||
|
|---|---|
|
||||||
|
| 2.1.1 性格测试 | 人格类型 · 行为偏好 · 思维方式 |
|
||||||
|
| 2.1.2 成长报告 | 免费:基础画像;会员/深度版:完整分析 |
|
||||||
|
| 2.1.3 分享卡片 | 关键词 · 性格标签 |
|
||||||
|
|
||||||
|
### 2.2 人格测评 `[P1]`
|
||||||
|
|
||||||
|
MBTI 类 · 沟通方式 · 情感模式 · 成长倾向(首版 ≥1 个热门)
|
||||||
|
详见 Spec:[feature-spec/explore-test.md](feature-spec/explore-test.md)
|
||||||
|
|
||||||
|
### 2.3 个人画像(成长画像) `[P1]`
|
||||||
|
|
||||||
|
替代竞品「星盘档案」叙事。内容:性格特点 · 兴趣倾向 · 行为模式 · 关系特点 · 生活建议
|
||||||
|
详见 Spec:[feature-spec/portrait.md](feature-spec/portrait.md)
|
||||||
|
|
||||||
|
### 2.4 关系理解 `[P1 · 双引擎之一,不可砍]`
|
||||||
|
|
||||||
|
详见 Spec:[feature-spec/relation.md](feature-spec/relation.md)
|
||||||
|
|
||||||
|
| 三级 | 内容 |
|
||||||
|
|---|---|
|
||||||
|
| 2.4.1 创建关系 | 添加 TA |
|
||||||
|
| 2.4.2 双人分析 | 了解双方差异(沟通/行为标签对比) |
|
||||||
|
| 2.4.3 相处建议 | 沟通方式 · 互动模式 · 关系维护(深度版) |
|
||||||
|
| 2.4.4 分享卡 | 「我的方式 vs TA 的方式 → 查看关系理解」 |
|
||||||
|
|
||||||
|
禁止宿命/恐吓文案。增长价值不低于个人画像。
|
||||||
|
|
||||||
|
### 2.5 身心探索 `[P2]`(差异化)
|
||||||
|
|
||||||
|
产品化主入口见 **2.7 身心节律**(避免双树)。轻入口可保留在首页/探索。
|
||||||
|
|
||||||
|
| 三级 | 内容 |
|
||||||
|
|---|---|
|
||||||
|
| 2.5.1 体质倾向 | 了解身体特点 |
|
||||||
|
| 2.5.2 生活习惯建议 | 饮食 · 作息 · 运动 |
|
||||||
|
| 2.5.3 节气提醒 | 季节变化 · 生活调整 |
|
||||||
|
|
||||||
|
禁止:治疗、改善疾病、疗效承诺。
|
||||||
|
|
||||||
|
### 2.6 星座 `[P2]`
|
||||||
|
|
||||||
|
详见 Spec:[feature-spec/star-profile.md](feature-spec/star-profile.md)
|
||||||
|
对标竞品「星座」能力:本命星盘 · 行星 · 日/周/月/年运 · 恋爱/友情/婚姻匹配指数。
|
||||||
|
UI 名:星座。允许运势分与合盘指数;禁止占卜、算命恐吓。
|
||||||
|
|
||||||
|
### 2.7 身心节律 `[P2]`
|
||||||
|
|
||||||
|
详见 Spec:[feature-spec/life-rhythm.md](feature-spec/life-rhythm.md)
|
||||||
|
对标竞品「命理」能力之生活向:**五行/体质倾向 + 生活建议**。
|
||||||
|
= §2.5 的产品化主入口。禁止流年吉凶、改命、疗效承诺。
|
||||||
|
|
||||||
|
### 2.8 意象卡片 `[P2]`
|
||||||
|
|
||||||
|
详见 Spec:[feature-spec/image-card.md](feature-spec/image-card.md)
|
||||||
|
对标竞品「塔罗」能力:**投射反思卡片**。
|
||||||
|
UI **不出现「塔罗」**。禁止神谕吉凶、恐吓话术。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. 问答(AI 核心)
|
||||||
|
|
||||||
|
详见 Spec:[feature-spec/ask.md](feature-spec/ask.md)
|
||||||
|
|
||||||
|
### 3.1 AI 成长助手 `[P1]`
|
||||||
|
|
||||||
|
定位:了解你的智能伙伴。不是占卜,不是预测。
|
||||||
|
|
||||||
|
| 三级 | 内容 |
|
||||||
|
|---|---|
|
||||||
|
| 3.1.1 自我提问 | 性格 · 关系 · 成长 |
|
||||||
|
| 3.1.2 档案关联回答 | 结合个人档案与探索结果 |
|
||||||
|
| 3.1.3 深度分析 | 会员 / 深度版 |
|
||||||
|
|
||||||
|
### 3.2 AI 场景入口 `[P1]`
|
||||||
|
|
||||||
|
认识自己 · 理解关系 · 职业探索 · 情绪整理 · 生活建议
|
||||||
|
|
||||||
|
顶栏:切换「我的档案 / TA 的档案」。可并列「顾问预约」占位(履约 `[P3]`)。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. 陪伴(日常留存)`[P2]` 主做;`[P1]` 可占位壳
|
||||||
|
|
||||||
|
详见 Spec:[feature-spec/companion.md](feature-spec/companion.md)
|
||||||
|
|
||||||
|
### 4.1 今日状态
|
||||||
|
|
||||||
|
心情记录 · 今日感受 · 成长记录
|
||||||
|
|
||||||
|
### 4.2 节气生活
|
||||||
|
|
||||||
|
今日节气 · 季节变化 · 日常建议(生活建议,非运势)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. 我的(个人中心)`[P1]`
|
||||||
|
|
||||||
|
| 二级 | 内容 |
|
||||||
|
|---|---|
|
||||||
|
| 5.1 我的档案 | 个人资料 · 探索记录 · 关系记录 → [profile.md](feature-spec/profile.md) |
|
||||||
|
| 5.2 我的成长报告 | 已完成探索 · 已购深度版 · 收藏 → [reports.md](feature-spec/reports.md) |
|
||||||
|
| 5.3 会员中心 | 完整分析 · 高级成长报告 · AI 更多次数 · 专属内容 → [membership.md](feature-spec/membership.md) |
|
||||||
|
|
||||||
|
分享裂变:[feature-spec/share.md](feature-spec/share.md)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. 商业体系(模型参考成熟产品,话术用愈心谷)
|
||||||
|
|
||||||
|
详见 Spec:[feature-spec/membership.md](feature-spec/membership.md)
|
||||||
|
|
||||||
|
### 6.1 深度版成长报告 `[P1]`
|
||||||
|
|
||||||
|
- 免费:基础结果 / 基础画像
|
||||||
|
- 付费:完整分析 · 行为模式 · 关系建议 · 成长方向
|
||||||
|
|
||||||
|
### 6.2 会员订阅 `[P1]`
|
||||||
|
|
||||||
|
月会员 · 季度会员 · 年度会员(支付可先 mock)
|
||||||
|
|
||||||
|
### 6.3 `[No]` 首版
|
||||||
|
|
||||||
|
干扰广告 · **以「塔罗」命名的商城主路径** · 达人双边冷启动 · 硬件
|
||||||
|
|
||||||
|
(意象卡片属探索模块 `[P2]`,不是塔罗商城。)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 分期范围
|
||||||
|
|
||||||
|
### 第一阶段 `[P1]` — 必须
|
||||||
|
|
||||||
|
用户档案 · 性格探索 · 个人画像 · 关系理解 · AI 问答 · 成长报告深度版 · 会员系统
|
||||||
|
|
||||||
|
**不含** 2.6–2.8;P2 三模块不计入 P1 Complete。
|
||||||
|
|
||||||
|
### 第二阶段 `[P2]` — **P2 Complete**
|
||||||
|
|
||||||
|
星象性格 · 身心节律 · 意象卡片 · 节气陪伴深化 · 心情记录 · 成长计划 · 探索三级目录 · 量表矩阵
|
||||||
|
|
||||||
|
状态真源:[p2-status.md](p2-status.md) · Spec:`feature-spec/star-profile.md` · `life-rhythm.md` · `image-card.md` · [P2-BACKLOG.md](feature-spec/P2-BACKLOG.md)
|
||||||
|
排除不变:消息/达人/UGC 广场/运势 Feed;真支付部署阶段再做。
|
||||||
|
|
||||||
|
### 第三阶段 `[P3]`
|
||||||
|
|
||||||
|
长期 AI 记忆 · 个人成长数据库 · 真人咨询 · 专家服务
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 7. 运营后台(内部 · 非 C 端 Tab)
|
||||||
|
|
||||||
|
详见 Spec:[feature-spec/ops-admin.md](feature-spec/ops-admin.md) · ECR-006
|
||||||
|
**演进规范(Wave 0):** [`docs/WAVE0/`](../../docs/WAVE0/) · Capability Map · boundary-rules · Contract-First(禁止 Feature 堆砌进实现)
|
||||||
|
|
||||||
|
| 分期 | 内容 |
|
||||||
|
|---|---|
|
||||||
|
| Phase A `[Ops]` | 登录 · 用户/订单查询 · 会员授予 · 审计 · `apps/admin-h5`(ECR-006 Closed) |
|
||||||
|
| Phase B `[Ops]` | 行为分析:自有埋点 + 管理端「数据」看板(**ECR-007** · Spec `ops-analytics.md`) |
|
||||||
|
| Phase C `[Ops]` | 内容:首页宫格 CRUD · 测评上下架(**ECR-008** · Spec `ops-content.md`) |
|
||||||
|
| Phase D `[Ops]` | 商业加深:订单筛选 · 展示价 · 退款只读(**ECR-009** · Spec `ops-commerce.md`) |
|
||||||
|
| Phase E `[Ops]` | 系统:RBAC · 封禁 · 推送占位(**ECR-010** · Spec `ops-system.md`) |
|
||||||
|
| Phase D+ Contract | **Contract-First** 扩展目录:**ECR-013A…040**(RBAC/兑换码/问答运营/安全/危机/CMS/ExploreConfig 等)。见 `docs/WAVE0/` |
|
||||||
|
| Phase F+ / Write-Wave | **写面加深**(首刀 **ECR-041 Banner** · `docs/WAVE0/WRITE_WAVE_AUTHORIZATION.md`);封禁细策略 · 真推送;**UGC 仍 `[No]`**;**真支付最后** |
|
||||||
|
|
||||||
|
不计入 P1 Complete;不进入五 Tab。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## L2 路由(冻结 · user-h5)
|
||||||
|
|
||||||
|
| 路径 | 页面 | 说明 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| 1.1 注册登录 | 手机 / 微信 / 游客 device / 升级 User | [MVP] 游客+升级;微信 [V1] |
|
| `/` | 首页 | 发现入口 |
|
||||||
| 1.2 Self Profile | 生日(必填);时辰/地点(可选后置) | [MVP] 生日 |
|
| `/explore` | 探索 | 探索测试列表等 |
|
||||||
| 1.3 Other Profile | 伴侣/家人/朋友等关系对象 | [MVP] 基础 Other |
|
| `/ask` | 问答 | AI成长助手 |
|
||||||
| 1.4 档案管理 | 编辑 · 删除 · 多档案切换 · Ask 关联 | [MVP] |
|
| `/companion` | 陪伴 | 节气/心情 |
|
||||||
| 1.5 兴趣标签 | 性格/关系/养生等(非运势标签) | [V1] |
|
| `/mine` | 我的 | 资产总览 |
|
||||||
| 1.6 行为资产 | 浏览 · Decode · Scale · Ask · Order 记录 | [MVP] 服务端最小集 |
|
| `/profile` | 个人档案 | 创建/编辑/切换 Self·Other |
|
||||||
|
| `/portrait` | 个人画像 | 性格探索结果 |
|
||||||
|
| `/relation` | 关系理解 | 双人分析 |
|
||||||
|
| `/membership` | 成长会员 | 套餐与权益 |
|
||||||
|
| `/scales/:slug` | 探索测试作答 | |
|
||||||
|
| `/reports` | 成长报告列表 | |
|
||||||
|
| `/reports/:id` | 成长报告详情 | |
|
||||||
|
| `/star` | 星座 | P2 Complete |
|
||||||
|
| `/synastry` | 合盘 | P2 Complete |
|
||||||
|
| `/synastry/invite/:token` | 合盘邀请 | P2 Complete |
|
||||||
|
| `/rhythm` | 身心节律 | P2 Complete |
|
||||||
|
| `/cards` | 意象卡片 | P2 Complete |
|
||||||
|
|
||||||
**[No]** 出生地理风水必填、吉凶标签画像。
|
兼容重定向:`/decode` → `/portrait`(仅技术兼容,UI 不出现 decode 文案)。
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### 2. Self Discovery(获客工具层)
|
## 护城河(愈心谷)
|
||||||
|
|
||||||
| 二级 | 三级 | 范围 |
|
| 梯队 | 能力 |
|
||||||
|---|---|---|
|
|---|---|
|
||||||
| 2.1 Decode | 数字性格 + 体质倾向;简版结论 / 完整原因+方案 | **[MVP] 核心** |
|
| ★★★★★ | 个人档案 · 问答挂档案 · 关系理解 · 个人画像(性格×身心) |
|
||||||
| 2.2 Scale 性格 | MBTI 等热门量表 · 结果页 · 分享 | [MVP] ≥1 热门 |
|
| ★★★★ | 人格测评 · 会员/深度版 · 陪伴节奏 |
|
||||||
| 2.3 Scale 情感/心理 | 恋爱人格、情绪压力等 | [V1] |
|
| ★★ | 推荐 Feed · 分享裂变 |
|
||||||
| 2.4 趣味 Scale | 轻传播向 | [V1] 克制 |
|
| 后置/不做 | UGC 玩法广场 · 达人市场冷启动 · 塔罗主路径 · 运势主 Feed |
|
||||||
| 2.5 五行/八卦轻解读 | 挂在 Decode 或探索,非运势主叙事 | [V1] |
|
|
||||||
| 2.6 中医体质系统 | 体质倾向 · 生活建议 · 节气联动 | [MVP] 在 Decode 内;深化 [V1] |
|
|
||||||
|
|
||||||
**[No]** 塔罗默认入口、紫微/抽签主路径、今日运势主 Feed。
|
|
||||||
**[Later]** 易经决策系统(合规评审后)。
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 3. Relationship
|
|
||||||
|
|
||||||
| 二级 | 三级 | 范围 |
|
|
||||||
|---|---|---|
|
|
||||||
| 3.1 Match | 双人契合分预览 · 解读锁定 | [MVP] |
|
|
||||||
| 3.2 相处建议 | 基于性格×体质,非合婚吉凶 | [MVP] 简版;[V1] 完整 |
|
|
||||||
| 3.3 关系管理 | 重要日期、关系笔记 | [Later] |
|
|
||||||
|
|
||||||
**[No]** 八字合婚吉凶、缘分指数恐吓文案。
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 4. AI Companion(问 = AI Life Assistant)
|
|
||||||
|
|
||||||
| 二级 | 三级 | 范围 |
|
|
||||||
|---|---|---|
|
|
||||||
| 4.1 Ask 对话 | 性格 / 关系 / 养生路径引导;非运势默认 | [MVP] 规则模板或薄 LLM |
|
|
||||||
| 4.2 上下文 | 当前 Profile(Self/Other)挂载 | **[MVP]** |
|
|
||||||
| 4.3 视角切换 | Ask 顶栏显式切换档案 | [MVP] |
|
|
||||||
| 4.4 结构化回答 | 短答 · 要点 · 免责声明 | [MVP] |
|
|
||||||
| 4.5 长期记忆 | 跨会话情绪/事件记忆 | [V1+] |
|
|
||||||
| 4.6 报告生成 | 从 Ask/Decode 生成可 Unlock Report | [V1] |
|
|
||||||
| 4.7 双轨入口 | Ask ‖ Consult 占位切换 | [MVP] 占位;履约 [Later] |
|
|
||||||
|
|
||||||
**[No]** 多智能体并列品牌(灵犀/小智式)、算命引导语、AI 心情小镇级 3D。
|
|
||||||
|
|
||||||
人格模式(产品语义,非多 App):陪伴模式 / 解读模式 — [V1]。
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 5. Companion Rhythm(陪伴 Tab)
|
|
||||||
|
|
||||||
| 二级 | 三级 | 范围 |
|
|
||||||
|---|---|---|
|
|
||||||
| 5.1 SolarTerm | 今日节气 · 生活方式建议 | [MVP] 可静态 |
|
|
||||||
| 5.2 Mood | 打卡 · 简史 | [MVP] 最小写 |
|
|
||||||
| 5.3 情绪分析/练习 | 安抚话术、放松练习 | [V1] |
|
|
||||||
| 5.4 成长计划 | 目标 · 打卡 · 成长报告 | [Later] |
|
|
||||||
|
|
||||||
**[No]** 运势日历作为陪伴主轴。
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 6. Human Expert(Consult)
|
|
||||||
|
|
||||||
| 二级 | 三级 | 范围 |
|
|
||||||
|---|---|---|
|
|
||||||
| 6.1 顾问类型 | 养生顾问 / 关系顾问(合规资质) | [Later] |
|
|
||||||
| 6.2 流程 | 列表 · 预约 · 支付 · 会话 · 评价 | [Later] |
|
|
||||||
| 6.3 Marketplace | 达人入驻 · 分佣 | [Later] 非冷启动优先 |
|
|
||||||
|
|
||||||
**[MVP]** 仅「顾问预约」表单占位,不履约。
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 7. Content & Feed
|
|
||||||
|
|
||||||
| 二级 | 三级 | 范围 |
|
|
||||||
|---|---|---|
|
|
||||||
| 7.1 首页 Feed | 官方卡片:热门 Scale、Decode、节气 | [MVP] 运营配置/静态 |
|
|
||||||
| 7.2 文章 | 性格 / 关系 / 养生知识 | [V1] |
|
|
||||||
| 7.3 社区 UGC | 发帖赞评关注 | **[No] MVP**;[Later] 审慎 |
|
|
||||||
| 7.4 AI 玩法广场 | UGC Prompt 集市 | **[No] MVP**;[Later] |
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 8. Growth
|
|
||||||
|
|
||||||
| 二级 | 三级 | 范围 |
|
|
||||||
|---|---|---|
|
|
||||||
| 8.1 分享卡 | Decode / ScaleResult / Match 预览 | [MVP] |
|
|
||||||
| 8.2 裂变 | 分享 → 建档 → 再测 | [V1] |
|
|
||||||
| 8.3 激励 | 签到积分勋章 | [Later] |
|
|
||||||
| 8.4 SEO/内容获客 | Web 落地 | [Later] website |
|
|
||||||
|
|
||||||
**[No]** 干扰广告、虚假紧迫倒计时。
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 9. Commerce
|
|
||||||
|
|
||||||
| 二级 | 三级 | 范围 |
|
|
||||||
|---|---|---|
|
|
||||||
| 9.1 Subscription | 月/季/年 | [MVP] mock 支付 |
|
|
||||||
| 9.2 Membership 权益 | 完整 Decode、Ask 次数、深度节气等 | [MVP] |
|
|
||||||
| 9.3 Unlock | 单次报告 / Match 解读 | [MVP] |
|
|
||||||
| 9.4 Order / Payment | 下单 · pay-mock ·(真支付) | [MVP] mock;真支付 [V1] |
|
|
||||||
| 9.5 课程/商城 | — | [Later] / 低优 |
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 10. Data & Recommendation(平台)
|
|
||||||
|
|
||||||
| 二级 | 三级 | 范围 |
|
|
||||||
|---|---|---|
|
|
||||||
| 10.1 用户数据 | 行为 · Mood · Scale · Ask(最小化、可删) | [MVP] 基础 |
|
|
||||||
| 10.2 推荐 | Feed / Scale 推荐 | [V1] 规则即可 |
|
|
||||||
| 10.3 专家/商品推荐 | — | [Later] |
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## L2 — 页面 / 路由映射(user-h5)
|
|
||||||
|
|
||||||
| L0 | 路由建议 | 主要能力 |
|
|
||||||
|---|---|---|
|
|
||||||
| 首页 | `/` | Decode 入口、Feed |
|
|
||||||
| 探索 | `/explore` | Scale 列表、工具 |
|
|
||||||
| 问 | `/ask` | Ask + Consult 占位 |
|
|
||||||
| 陪伴 | `/companion` | SolarTerm、Mood |
|
|
||||||
| 我的 | `/mine` | Profiles、Membership、Orders |
|
|
||||||
| 二级 | `/decode` `/scales/:slug` `/match` `/report/:id` | Discovery / Relationship / Commerce |
|
|
||||||
|
|
||||||
实现约束:`.ai/design/*` · playbook `new-page` / `add-api`。
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 护城河优先级(愈心谷)
|
|
||||||
|
|
||||||
| 梯队 | 能力 | 说明 |
|
|
||||||
|---|---|---|
|
|
||||||
| ★★★★★ | 生命档案 Profile · Ask 挂档案 · Relationship Match · Decode(性格×体质) | Memory + 差异化叙事 |
|
|
||||||
| ★★★★ | Scale · SolarTerm/Mood · Membership/Unlock | 获客与留存与变现 |
|
|
||||||
| ★★ | Feed 运营 · 分享裂变 | 增长 |
|
|
||||||
| ★ / No | UGC 广场 · 达人市场 · 硬件 · 塔罗主路径 | 明确后置或不做 |
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 竖切顺序(与 roadmap 对齐)
|
|
||||||
|
|
||||||
1. **Phase A** — Identity + Decode + Commerce mock
|
|
||||||
2. **Phase B** — Scale + Match + Share
|
|
||||||
3. **Phase C** — Ask 骨架 + Companion
|
|
||||||
4. **Phase D** — 真支付 · 小程序 · Consult 试点
|
|
||||||
|
|
||||||
详见 `apps/docs/product-roadmap.md`。
|
|
||||||
|
|||||||
@@ -0,0 +1,236 @@
|
|||||||
|
# P1 全功能流程走查(Feature Spec Layer)
|
||||||
|
|
||||||
|
**日期:** 2026-08-02
|
||||||
|
**目的:** 按新链路对 P1 全部功能过一遍——**只做设计与对齐审计,本文件不授权直接开新编码**。
|
||||||
|
**链路:**
|
||||||
|
|
||||||
|
```
|
||||||
|
feature-map → feature-spec → OpenAPI/erd → implementation → test → review
|
||||||
|
```
|
||||||
|
|
||||||
|
规范:[../feature-design.md](../feature-design.md) · 索引:[README.md](README.md)
|
||||||
|
|
||||||
|
图例:
|
||||||
|
|
||||||
|
| 标记 | 含义 |
|
||||||
|
|---|---|
|
||||||
|
| PASS | 本关已满足,可进入下一关或维持 |
|
||||||
|
| PARTIAL | 主路径可用,有明确 Gap(见各 Spec §14) |
|
||||||
|
| SHELL | 有意占位(如陪伴 P1) |
|
||||||
|
| BLOCK | 缺 Spec/契约,禁止扩行为 |
|
||||||
|
| N/A | 本关不适用 |
|
||||||
|
|
||||||
|
编码优先级:
|
||||||
|
|
||||||
|
1. ~~P0 横切:埋点最小集~~ → **切片 A 已完成**(见 [analytics.md](analytics.md))
|
||||||
|
2. P1 体验 Gap:探索测试中断恢复
|
||||||
|
3. P2 探索三模块:见 [P2-BACKLOG.md](P2-BACKLOG.md)(星象性格 → 身心节律 → 意象卡片)
|
||||||
|
4. 真支付、短链分享、陪伴心情 UI(各改对应 Spec)
|
||||||
|
其余 Spec §11 事件:后续迭代再挂,勿一次铺满。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 总表
|
||||||
|
|
||||||
|
| # | 功能 | Spec | map | OpenAPI/erd | 实现 | 测试 | DoD 标签建议 | 下一步(设计侧已闭合?) |
|
||||||
|
|---|---|---|---|---|---|---|---|---|
|
||||||
|
| 1 | 首页 | [home](home.md) | PASS | N/A(复用 profiles) | PASS | PARTIAL | Feature Complete(体验) | 埋点;可选推荐位 |
|
||||||
|
| 2 | 个人档案 | [profile](profile.md) | PASS | PASS | PASS | PARTIAL | Feature Complete | 软删策略写清;埋点 |
|
||||||
|
| 3 | 个人画像 | [portrait](portrait.md) | PASS | PASS | PASS | PASS | Feature Complete | 埋点;内容已多维 |
|
||||||
|
| 4 | 关系理解 | [relation](relation.md) | PASS | PASS | PASS | PASS | Feature Complete | 埋点 |
|
||||||
|
| 5 | 探索测试 | [explore-test](explore-test.md) | PASS | PASS | PASS | PARTIAL | Feature Complete − Gap | **设计已标**中断恢复 Gap |
|
||||||
|
| 6 | AI 问答 | [ask](ask.md) | PASS | PASS | PASS | PASS | Feature Complete | 埋点;真 LLM 依赖配置 |
|
||||||
|
| 7 | 会员/深度版 | [membership](membership.md) | PASS | PASS | PASS | PASS | Feature Complete(mock) | 真支付另开 Spec 修订 |
|
||||||
|
| 8 | 成长报告 | [reports](reports.md) | PASS | PASS | PASS | PARTIAL | Feature Complete | 收藏/PDF = Gap |
|
||||||
|
| 9 | 分享卡 | [share](share.md) | PASS | N/A(前端载荷) | PASS | PARTIAL | Feature Complete − Gap | 短链 = Gap |
|
||||||
|
| 10 | 陪伴 | [companion](companion.md) | PASS | PARTIAL | SHELL | N/A 深测 | **Shell only** | 禁止当 P1 Complete |
|
||||||
|
|
||||||
|
**横切:** 埋点最小集已实现(analytics)· 真支付仍为 mock(P1 接受)· Visitor 模型与 Spec 一致。
|
||||||
|
**收口标签:** 见 [p1-status.md](../p1-status.md) → **P1 Complete**。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 逐功能走查(六步)
|
||||||
|
|
||||||
|
每步问题:① Spec 是否 Active 且 §4/7/9/12 非空?② map/page-tree 对齐?③ OpenAPI/erd?④ 实现是否覆盖主路径与四态?⑤ 测试是否覆盖 §12?⑥ Review/Gaps 是否写入 §14?
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 1. 首页 · home
|
||||||
|
|
||||||
|
| 步 | 结果 | 笔记 |
|
||||||
|
|---|---|---|
|
||||||
|
| Spec | PASS | Purpose/Flow/Rules 齐全 |
|
||||||
|
| map / page-tree | PASS | `/` |
|
||||||
|
| 契约 | N/A | 无专用 API |
|
||||||
|
| 实现 | PASS | 生日 CTA → portrait;快捷入口;无 API 状态墙 |
|
||||||
|
| 测试 | PARTIAL | 缺独立 Home e2e;主路径被 portrait e2e 间接覆盖 |
|
||||||
|
| Review | PASS | Gap:埋点、推荐 Feed 静态 |
|
||||||
|
|
||||||
|
**流程结论:** 设计闭合。编码仅在做埋点/推荐时先改 Spec §11/§5。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 2. 个人档案 · profile
|
||||||
|
|
||||||
|
| 步 | 结果 | 笔记 |
|
||||||
|
|---|---|---|
|
||||||
|
| Spec | PASS | |
|
||||||
|
| map / page-tree | PASS | `/profile` · `/mine` 入口 |
|
||||||
|
| 契约 | PASS | GET/POST/PATCH/DELETE profiles |
|
||||||
|
| 实现 | PASS | 列表/编辑/删除/加 TA |
|
||||||
|
| 测试 | PARTIAL | L2 有 profile 更新删除流 |
|
||||||
|
| Review | PASS | Gap:birth_time/place UI;删除级联说明 |
|
||||||
|
|
||||||
|
**流程结论:** 设计闭合。扩字段前先改 Spec §8 + erd。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 3. 个人画像 · portrait
|
||||||
|
|
||||||
|
| 步 | 结果 | 笔记 |
|
||||||
|
|---|---|---|
|
||||||
|
| Spec | PASS | 含多维报告结构附录 |
|
||||||
|
| map / page-tree | PASS | `/portrait` |
|
||||||
|
| 契约 | PASS | POST portrait · GET report · orders |
|
||||||
|
| 实现 | PASS | 引擎多维 + ReportRich + DeepAccess |
|
||||||
|
| 测试 | PASS | engine L1 · 集成 deep_access · PortraitPage.spec |
|
||||||
|
| Review | PASS | Gap:埋点;真支付 |
|
||||||
|
|
||||||
|
**流程结论:** 设计闭合。内容结构变更必须先改 Spec 附录再改 `internal/portrait`。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 4. 关系理解 · relation
|
||||||
|
|
||||||
|
| 步 | 结果 | 笔记 |
|
||||||
|
|---|---|---|
|
||||||
|
| Spec | PASS | 双引擎、禁用合盘 |
|
||||||
|
| map / page-tree | PASS | `/relation` |
|
||||||
|
| 契约 | PASS | POST insight |
|
||||||
|
| 实现 | PASS | 多维对比 + 深度 sections |
|
||||||
|
| 测试 | PASS | engine L1 · 集成 · RelationPage.spec |
|
||||||
|
| Review | PASS | Gap:埋点 |
|
||||||
|
|
||||||
|
**流程结论:** 设计闭合。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 5. 探索测试 · explore-test
|
||||||
|
|
||||||
|
| 步 | 结果 | 笔记 |
|
||||||
|
|---|---|---|
|
||||||
|
| Spec | PASS | 子能力表已展开 |
|
||||||
|
| map / page-tree | PASS | `/explore` `/scales/:slug` |
|
||||||
|
| 契约 | PASS | scales list/detail/result |
|
||||||
|
| 实现 | PASS | 两套 seed;丰富 result;无结果付费墙(Spec 已声明) |
|
||||||
|
| 测试 | PARTIAL | score/result L1;缺完整答题 e2e |
|
||||||
|
| Review | PASS | **Gap(已设计):** 答题中断恢复;埋点;若上锁结果须先改 Spec |
|
||||||
|
|
||||||
|
**流程结论:** 设计闭合;中断恢复属已登记 Gap,开工前在 Spec §4/§7 补规则细节即可编码。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 6. AI 问答 · ask
|
||||||
|
|
||||||
|
| 步 | 结果 | 笔记 |
|
||||||
|
|---|---|---|
|
||||||
|
| Spec | PASS | 配额、降级、挂档案 |
|
||||||
|
| map / page-tree | PASS | `/ask` |
|
||||||
|
| 契约 | PASS | quota/threads/messages |
|
||||||
|
| 实现 | PASS | DeepSeek + 规则降级;四态较全 |
|
||||||
|
| 测试 | PASS | reply L1 · 集成 thread |
|
||||||
|
| Review | PASS | Gap:埋点;长期记忆 P3 |
|
||||||
|
|
||||||
|
**流程结论:** 设计闭合。改配额数字或 system prompt 结构 → 先改 Spec §7/§14。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 7. 深度版 / 成长会员 · membership
|
||||||
|
|
||||||
|
| 步 | 结果 | 笔记 |
|
||||||
|
|---|---|---|
|
||||||
|
| Spec | PASS | DeepAccess ∪ Membership |
|
||||||
|
| map / page-tree | PASS | `/membership` + 报告内墙 |
|
||||||
|
| 契约 | PASS | membership/me · orders · pay-mock |
|
||||||
|
| 实现 | PASS | mock 支付落库;服务端裁剪 detail |
|
||||||
|
| 测试 | PASS | L2 unlock |
|
||||||
|
| Review | PASS | Gap:真支付网关(须 Spec 修订 §9) |
|
||||||
|
|
||||||
|
**流程结论:** mock 商业闭环设计闭合。真支付 = 新一轮 Spec→契约→实现。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 8. 成长报告 · reports
|
||||||
|
|
||||||
|
| 步 | 结果 | 笔记 |
|
||||||
|
|---|---|---|
|
||||||
|
| Spec | PASS | |
|
||||||
|
| map / page-tree | PASS | `/reports` + `/reports/:id`(page-tree 已对齐) |
|
||||||
|
| 契约 | PASS | GET list/detail |
|
||||||
|
| 实现 | PASS | ReportsPage · ReportPage · Mine 入口 |
|
||||||
|
| 测试 | PARTIAL | 详情流较强;列表专项可补 |
|
||||||
|
| Review | PASS | Gap:收藏、PDF |
|
||||||
|
|
||||||
|
**流程结论:** 设计闭合。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 9. 分享卡 · share
|
||||||
|
|
||||||
|
| 步 | 结果 | 笔记 |
|
||||||
|
|---|---|---|
|
||||||
|
| Spec | PASS | 前端 query 载荷 |
|
||||||
|
| map / page-tree | PASS | `/share` |
|
||||||
|
| 契约 | N/A | 无专用 API(Spec 已写) |
|
||||||
|
| 实现 | PASS | ShareSheet/Card/Page |
|
||||||
|
| 测试 | PARTIAL | 有分享相关测 |
|
||||||
|
| Review | PASS | Gap:短链服务、系统分享 |
|
||||||
|
|
||||||
|
**流程结论:** P1 设计闭合。短链需新 API → 先改 Spec §8/§9。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 10. 陪伴 · companion
|
||||||
|
|
||||||
|
| 步 | 结果 | 笔记 |
|
||||||
|
|---|---|---|
|
||||||
|
| Spec | PASS | **明确 P1 Shell / P2** |
|
||||||
|
| map / page-tree | PASS | `/companion` |
|
||||||
|
| 契约 | PARTIAL | solar-terms + moods API 有;UI 未接 moods |
|
||||||
|
| 实现 | SHELL | 本地节气;心情文案占位 |
|
||||||
|
| 测试 | N/A | 壳不要求深测 |
|
||||||
|
| Review | PASS | **禁止**未改 Phase 就做心情 OS |
|
||||||
|
|
||||||
|
**流程结论:** 壳范围设计闭合。P2 开工 = 升 Spec Phase + 补 §4/§7/§12 后再编码。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 流程门禁抽查(本轮)
|
||||||
|
|
||||||
|
- [x] 无 Spec 的 P1 功能:无
|
||||||
|
- [x] Spec 均含 §4 / §7 / §9 / §12
|
||||||
|
- [x] feature-map 已链到 Spec
|
||||||
|
- [x] 陪伴未误标为 P1 Feature Complete
|
||||||
|
- [x] 横切埋点统一登记为 Gap,未假装已完成
|
||||||
|
- [x] **本轮不编码**——仅文档与 page-tree 对齐
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 批准编码时的推荐切片(需你点名后再动)
|
||||||
|
|
||||||
|
| 切片 | 先改 Spec | 再改代码 |
|
||||||
|
|---|---|---|
|
||||||
|
| A. 埋点最小集 | 各 Spec §11 选 5 个核心事件 | H5 统一 `track()` + GA |
|
||||||
|
| B. 探索测试草稿恢复 | explore-test §4/§7 | localStorage 恢复答案 |
|
||||||
|
| C. 真支付 | membership §9/§7 | 支付适配器 + 回调 |
|
||||||
|
| D. 陪伴 P2 | companion Phase→P2 | moods UI |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 签字栏(人工)
|
||||||
|
|
||||||
|
| 角色 | 确认 | 日期 |
|
||||||
|
|---|---|---|
|
||||||
|
| 产品/你 | 走查结论是否接受 | |
|
||||||
|
| 开发开工 | 从切片 A/B/C/D 择一 | |
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
# P2 Backlog — 探索三模块 + 合规全量目录
|
||||||
|
|
||||||
|
**状态:`P2 Complete`(见 [../p2-status.md](../p2-status.md))**
|
||||||
|
**命名决策:** 星座 / 身心节律 / 意象卡片;UI 无「塔罗」主入口、无「算命/占卜」恐吓
|
||||||
|
**契约:** [../lexicon.md](../lexicon.md) · [../feature-map.md](../feature-map.md) · [../STRATEGY.md](../STRATEGY.md)
|
||||||
|
|
||||||
|
真支付:部署阶段。排除:消息 / 达人 / UGC 广场。星座模块内允许日周月年运(非独立运势 Feed)。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 模块 ↔ Spec
|
||||||
|
|
||||||
|
| 顺序 | 模块 | Spec | 路由 | 状态 |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| 0 | 探索目录 | — | `/explore` · `/explore/:category` | Done |
|
||||||
|
| 1 | 星座 | [star-profile.md](star-profile.md) | `/star` · `/synastry` | Done |
|
||||||
|
| 2 | 身心节律 | [life-rhythm.md](life-rhythm.md) | `/rhythm` | Done |
|
||||||
|
| 3 | 意象卡片 | [image-card.md](image-card.md) | `/cards` | Done(≥78 牌 · ≥8 场景) |
|
||||||
|
| 4 | 量表矩阵 | [explore-test.md](explore-test.md) | `/scales/*` | Done(≥8) |
|
||||||
|
| 5 | 成长计划 | companion / growth | `/growth-plan` | Done |
|
||||||
|
| 6 | 心情轨迹 | companion | `/companion` | Done |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 签字栏
|
||||||
|
|
||||||
|
| 项 | 状态 |
|
||||||
|
|---|---|
|
||||||
|
| 设计三 Spec | Done |
|
||||||
|
| 探索 catalog API | Done |
|
||||||
|
| L0–L3 验证 | Done(见 p2-status) |
|
||||||
|
| 真支付 | 部署阶段(不挡 P2 Complete) |
|
||||||
@@ -0,0 +1,71 @@
|
|||||||
|
# Feature Spec 索引
|
||||||
|
|
||||||
|
规范:[../feature-design.md](../feature-design.md) · 模板:[_TEMPLATE.md](_TEMPLATE.md)
|
||||||
|
|
||||||
|
| Spec | 功能 | feature-map | 主要路由 | Phase |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| [home.md](home.md) | 首页 / 发现入口 | §1 首页 | `/` | P1 |
|
||||||
|
| [profile.md](profile.md) | 个人档案 | §1.1 · §5.1 | `/profile` | P1 |
|
||||||
|
| [account-auth.md](account-auth.md) | 账号登录 | §5.x | `/login` | P1 |
|
||||||
|
| [profile-bootstrap.md](profile-bootstrap.md) | 生日包生成 | §1.1 | profiles→reports | P1 |
|
||||||
|
| [portrait.md](portrait.md) | 个人画像 | §2.1 · §2.3 | `/portrait` | P1 |
|
||||||
|
| [relation.md](relation.md) | 关系理解 | §2.4 | `/relation` | P1 |
|
||||||
|
| [explore-test.md](explore-test.md) | 探索测试 | §2.2 | `/explore` · `/scales/:slug` | P1 |
|
||||||
|
| [ask.md](ask.md) | AI 成长助手 | §3 | `/ask` | P1 |
|
||||||
|
| [membership.md](membership.md) | 深度版 / 成长会员 | §6 · §5.3 | `/membership` | P1 |
|
||||||
|
| [reports.md](reports.md) | 成长报告列表/详情 | §2.1.2 · §5.2 | `/reports` · `/reports/:id` | P1 |
|
||||||
|
| [share.md](share.md) | 分享卡 | journey 双引擎 | `/share` | P1 |
|
||||||
|
| [companion.md](companion.md) | 陪伴(节气+心情) | §4 | `/companion` | P2 Complete |
|
||||||
|
| [analytics.md](analytics.md) | 增长埋点最小集 | 横切 | H5 `track` | P1 |
|
||||||
|
| [star-profile.md](star-profile.md) | 星象性格 | §2.6 | `/star` | P2 Complete |
|
||||||
|
| [life-rhythm.md](life-rhythm.md) | 身心节律 | §2.7 | `/rhythm` | P2 Complete |
|
||||||
|
| [image-card.md](image-card.md) | 意象卡片 | §2.8 | `/cards` | P2 Complete |
|
||||||
|
| [ops-admin.md](ops-admin.md) | 运营后台 | §7 | `admin-h5` `/` `/users/:id` … | Ops-A |
|
||||||
|
| [ops-analytics.md](ops-analytics.md) | 运营行为分析(埋点+数据看板) | §7 | `admin-h5` `/analytics` · H5 track | Ops-B · ECR-007 |
|
||||||
|
| [ops-content.md](ops-content.md) | 运营内容(宫格+测评上下架) | §7 | `admin-h5` `/content` · `GET /home/tools` | Ops-C · ECR-008 |
|
||||||
|
| [ops-commerce.md](ops-commerce.md) | 运营商业加深(订单筛选+展示价+退款只读) | §7 | `admin-h5` `/orders` `/pricing` | Ops-D · ECR-009 |
|
||||||
|
| [ops-system.md](ops-system.md) | 运营系统(RBAC+封禁+推送占位) | §7 | `admin-h5` `/push` `/admins` | Ops-E · ECR-010 |
|
||||||
|
| [input-compliance.md](input-compliance.md) | 用户文字输入合规 | 横切 · 安全 | 各写接口 · code 40060 | P2 · ECR-012 |
|
||||||
|
| [ops-rbac.md](ops-rbac.md) | 运营 RBAC | §7 | `admin-h5` `/me` permissions · `/admin/roles*` | Ops · **ECR-013A** |
|
||||||
|
| [ops-redemption-code.md](ops-redemption-code.md) | 兑换码 RedemptionCode | §7 | `admin-h5` `/codes` · `POST /membership/redeem` | Ops · **ECR-015(local)** |
|
||||||
|
| [ops-user-intelligence.md](ops-user-intelligence.md) | 用户洞察 UserIntelligence | §7 | `admin-h5` 用户详情「洞察」 | Ops · **ECR-016(local)** |
|
||||||
|
| [ops-ask-operations.md](ops-ask-operations.md) | 问答运营 AskOperations | §7 | `admin-h5` `/ask` | Ops · **ECR-017** |
|
||||||
|
| [ops-entitlement.md](ops-entitlement.md) | 用户权益 Entitlement | §7 | `admin-h5` 用户详情「权益」 | Ops · **ECR-018** |
|
||||||
|
| [ops-content-safety.md](ops-content-safety.md) | 内容安全 ContentSafety | §7 | `admin-h5` `/safety` | Ops · **ECR-019** |
|
||||||
|
| [ops-quality-feedback.md](ops-quality-feedback.md) | 问答质量反馈 QualityFeedback | §7 | `admin-h5` `/ask` | Ops · **ECR-020** |
|
||||||
|
| [ops-ai-core-config.md](ops-ai-core-config.md) | AI 核心配置 AICoreConfig | §7 | `admin-h5` `/ai` | Ops · **ECR-021** |
|
||||||
|
| [ops-crisis-care.md](ops-crisis-care.md) | 危机关怀 CrisisCare | §7 | `admin-h5` `/crisis` | Ops · **ECR-022** |
|
||||||
|
| [ops-knowledge-source.md](ops-knowledge-source.md) | AI 知识源 KnowledgeSource | §7 | `admin-h5` `/ai` | Ops · **ECR-023** |
|
||||||
|
| [ops-banner.md](ops-banner.md) | OpsCMS Banner(只读基线) | §7 | `admin-h5` `/cms` | Ops · **ECR-024** |
|
||||||
|
| [ops-banner-write.md](ops-banner-write.md) | OpsCMS Banner **写面** | §7 | admin CMS 写 · `GET /home/banners` | Write-Wave · **ECR-041** |
|
||||||
|
| [ops-feed-slot.md](ops-feed-slot.md) | OpsCMS FeedSlot(只读基线) | §7 | `admin-h5` `/cms` | Ops · **ECR-025** |
|
||||||
|
| [ops-feed-slot-write.md](ops-feed-slot-write.md) | OpsCMS FeedSlot **写面** | §7 | admin CMS 写 · `GET /home/feed-slots` | Write-Wave · **ECR-042** |
|
||||||
|
| [ops-scheduled-publication.md](ops-scheduled-publication.md) | OpsCMS ScheduledPublication | §7 | `/admin/cms/publications*` | Ops · **ECR-026** |
|
||||||
|
| [ops-knowledge-chunk.md](ops-knowledge-chunk.md) | AICoreConfig KnowledgeChunk | §7 | `/admin/ai/knowledge-chunks*` | Ops · **ECR-027** |
|
||||||
|
| [ops-tool-definition.md](ops-tool-definition.md) | AICoreConfig ToolDefinition | §7 | `/admin/ai/tools*` | Ops · **ECR-028** |
|
||||||
|
| [ops-block-policy.md](ops-block-policy.md) | ContentSafety BlockPolicy | §7 | `/admin/content-safety/block-policies*` | Ops · **ECR-029** |
|
||||||
|
| [ops-moderation-case.md](ops-moderation-case.md) | ContentSafety ModerationCase | §7 | `/admin/content-safety/cases*` | Ops · **ECR-030** |
|
||||||
|
| [ops-crisis-event.md](ops-crisis-event.md) | CrisisCare CrisisEvent | §7 | `/admin/crisis/events*` | Ops · **ECR-031** |
|
||||||
|
| [ops-intervention-outcome.md](ops-intervention-outcome.md) | CrisisCare InterventionOutcome | §7 | `/admin/crisis/interventions*` | Ops · **ECR-032** |
|
||||||
|
| [ops-handoff-case.md](ops-handoff-case.md) | AskOperations HandoffCase | §7 | `/admin/ask/handoffs*` | Ops · **ECR-033** |
|
||||||
|
| [ops-privacy-request.md](ops-privacy-request.md) | AdminGovernance PrivacyRequest | §7 | `/admin/privacy/requests*` | Ops · **ECR-034** |
|
||||||
|
| [ops-star-config.md](ops-star-config.md) | ExploreConfig StarConfig(只读) | §7 | `/admin/explore/star-configs*` | Ops · **ECR-035** |
|
||||||
|
| [ops-star-config-write.md](ops-star-config-write.md) | StarConfig **写面** | §7 | admin 写 · `GET /star/configs` | ExploreConfig · **ECR-043** |
|
||||||
|
| [ops-rhythm-config.md](ops-rhythm-config.md) | ExploreConfig RhythmConfig(只读) | §7 | `/admin/explore/rhythm-configs*` | Ops · **ECR-036** |
|
||||||
|
| [ops-rhythm-config-write.md](ops-rhythm-config-write.md) | RhythmConfig **写面** | §7 | admin 写 · `GET /rhythm/configs` | ExploreConfig · **ECR-044** |
|
||||||
|
| [ops-image-card-deck.md](ops-image-card-deck.md) | ExploreConfig ImageCardDeck(只读) | §7 | `/admin/explore/image-card-decks*` | Ops · **ECR-037** |
|
||||||
|
| [ops-image-card-deck-write.md](ops-image-card-deck-write.md) | ImageCardDeck **写面** | §7 | admin 写 · `GET /cards/decks` | ExploreConfig · **ECR-045** |
|
||||||
|
| [ops-report-template.md](ops-report-template.md) | GrowthInsights ReportTemplate(只读) | §7 | `/admin/growth/report-templates*` | Ops · **ECR-038** |
|
||||||
|
| [ops-report-template-write.md](ops-report-template-write.md) | ReportTemplate **写面** | §7 | admin POST/PUT · growth.write | GrowthInsights · **ECR-048** |
|
||||||
|
| [ops-funnel-definition.md](ops-funnel-definition.md) | GrowthInsights FunnelDefinition(只读) | §7 | `/admin/analytics/funnel-definitions*` | Ops · **ECR-039** |
|
||||||
|
| [ops-funnel-definition-write.md](ops-funnel-definition-write.md) | FunnelDefinition **写面** | §7 | admin POST/PUT · growth.write | GrowthInsights · **ECR-047** |
|
||||||
|
| [ops-scale-definition.md](ops-scale-definition.md) | ExploreConfig ScaleDefinition(只读) | §7 | `/admin/explore/scales*` | Ops · **ECR-040** |
|
||||||
|
| [ops-scale-definition-write.md](ops-scale-definition-write.md) | ScaleDefinition **写面** | §7 | admin POST/PUT · status 仍 ECR-008 | ExploreConfig · **ECR-046** |
|
||||||
|
|
||||||
|
新功能:复制 `_TEMPLATE.md` → 填满 → 在本表登记 → 再编码。
|
||||||
|
|
||||||
|
**P1 全量流程走查:** [P1-PROCESS-REVIEW.md](P1-PROCESS-REVIEW.md)
|
||||||
|
**P2 收口状态:** [../p2-status.md](../p2-status.md) · [P2-BACKLOG.md](P2-BACKLOG.md)
|
||||||
|
|
||||||
|
|
||||||
|
**竞品逆向(测测前端全量):** [cece-frontend-re/](cece-frontend-re/README.md) · **完整设计包:** [cece-frontend-re/complete-design/](cece-frontend-re/complete-design/README.md) · 方法见 [../../design/reverse-engineering-spec.md](../../design/reverse-engineering-spec.md)
|
||||||
@@ -0,0 +1,203 @@
|
|||||||
|
# Feature Spec: \<Name\>
|
||||||
|
|
||||||
|
> 复制本文件为 `<id>.md`。规范:[../feature-design.md](../feature-design.md)
|
||||||
|
> 语言:[../lexicon.md](../lexicon.md) · 能力树:[../feature-map.md](../feature-map.md)
|
||||||
|
> Status: `Draft` | `Active` | `Deprecated`
|
||||||
|
> Map node: (如 `2.3 个人画像 [P1]`)
|
||||||
|
> Phase: `P1` | `P2` | `P3`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. 功能定义
|
||||||
|
|
||||||
|
| 字段 | 内容 |
|
||||||
|
|---|---|
|
||||||
|
| Name | |
|
||||||
|
| Purpose | |
|
||||||
|
| Business Goal | |
|
||||||
|
|
||||||
|
**In Scope / Out of Scope**(防止偷偷扩 scope)
|
||||||
|
|
||||||
|
| In | Out |
|
||||||
|
|---|---|
|
||||||
|
| | |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. 用户价值
|
||||||
|
|
||||||
|
必须回答:
|
||||||
|
|
||||||
|
1. 用户为什么需要它?
|
||||||
|
2. 用户完成后获得什么?
|
||||||
|
3. 为什么愿意付费?(若无付费面,写 N/A)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. 用户角色
|
||||||
|
|
||||||
|
对齐当前 Identity(Visitor 设备身份 + 可选升级)。写清**实际能做什么**,勿照搬竞品。
|
||||||
|
|
||||||
|
| Actor | 说明 | 本功能能力 |
|
||||||
|
|---|---|---|
|
||||||
|
| Guest / Visitor | 未登录设备身份 | |
|
||||||
|
| User | 已有持久用户/档案 | |
|
||||||
|
| VIP | 成长会员 active | |
|
||||||
|
| DeepAccess | 单份报告深度版已购 | |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. 用户流程
|
||||||
|
|
||||||
|
```text
|
||||||
|
进入
|
||||||
|
↓
|
||||||
|
…
|
||||||
|
```
|
||||||
|
|
||||||
|
或 mermaid。必须含:无数据分支、权益分支、失败分支(可简写并在 §6 展开)。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. 页面设计
|
||||||
|
|
||||||
|
对照 [../page-tree.md](../page-tree.md)。
|
||||||
|
|
||||||
|
| 路由 | 页面 | 说明 |
|
||||||
|
|---|---|---|
|
||||||
|
| | | |
|
||||||
|
|
||||||
|
页面结构示例:
|
||||||
|
|
||||||
|
```text
|
||||||
|
/path
|
||||||
|
├── Empty State
|
||||||
|
├── Loading State
|
||||||
|
├── Result / Normal State
|
||||||
|
└── Locked State
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. 页面状态规范
|
||||||
|
|
||||||
|
| 状态 | 说明 | UI 行为 |
|
||||||
|
|---|---|---|
|
||||||
|
| Loading | 请求中 | |
|
||||||
|
| Empty | 无数据 | 引导去哪 |
|
||||||
|
| Error | 失败 | 重试/返回 |
|
||||||
|
| Normal | 成功 | |
|
||||||
|
| Locked | 付费/权益限制 | CTA |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 7. Business Rules
|
||||||
|
|
||||||
|
编号规则;**权益与归属必须在 Server 判定**。
|
||||||
|
|
||||||
|
| ID | Rule |
|
||||||
|
|---|---|
|
||||||
|
| R1 | |
|
||||||
|
| R2 | |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 8. 数据模型影响
|
||||||
|
|
||||||
|
指向 [../../domain/erd.md](../../domain/erd.md)。新增/变更表字段列表;无则写「无 schema 变更」。
|
||||||
|
|
||||||
|
| 表 | 变更 | 备注 |
|
||||||
|
|---|---|---|
|
||||||
|
| | | |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 9. API 需求
|
||||||
|
|
||||||
|
路径级意图即可;字段细节以 `proto/openapi.yaml` 为准,**实现时必须同步 OpenAPI**。
|
||||||
|
|
||||||
|
| Method | Path | 意图 |
|
||||||
|
|---|---|---|
|
||||||
|
| | | |
|
||||||
|
|
||||||
|
Response 权益意图示例:`summary` 始终按规则返回;`detail` 无权益时剥离或 null。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 10. 权限设计
|
||||||
|
|
||||||
|
| 能力 | Visitor | User | DeepAccess | VIP |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| 查看基础 | | | | |
|
||||||
|
| 查看完整 | | | | |
|
||||||
|
| 写入/生成 | | | | |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 11. 埋点
|
||||||
|
|
||||||
|
未接分析 SDK 也先定义事件名。
|
||||||
|
|
||||||
|
| Event | 触发 |
|
||||||
|
|---|---|
|
||||||
|
| `<feature>_started` | |
|
||||||
|
| `<feature>_completed` | |
|
||||||
|
| `deep_access_clicked` | |
|
||||||
|
| `purchase_completed` | |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 12. 测试验收标准
|
||||||
|
|
||||||
|
### 主路径
|
||||||
|
|
||||||
|
**Given** …
|
||||||
|
**When** …
|
||||||
|
**Then** …
|
||||||
|
|
||||||
|
### 权益 / 异常
|
||||||
|
|
||||||
|
**Given** …
|
||||||
|
**When** …
|
||||||
|
**Then** …
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 13. AI 开发前检查
|
||||||
|
|
||||||
|
- [ ] Spec 本章齐全(无空关键节)
|
||||||
|
- [ ] feature-map 已挂树
|
||||||
|
- [ ] lexicon 文案已核对
|
||||||
|
- [ ] OpenAPI / erd 更新计划已明确
|
||||||
|
- [ ] §12 可转化为 L1/L2/E2E 用例
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 14. Implementation Notes
|
||||||
|
|
||||||
|
编码时填写(首次实现或重大变更):
|
||||||
|
|
||||||
|
| 项 | 内容 |
|
||||||
|
|---|---|
|
||||||
|
| Packages | `apps/api/internal/...` · `apps/user-h5/src/...` |
|
||||||
|
| Migrations | |
|
||||||
|
| Gaps vs Spec | (`Gap:` 未实现项) |
|
||||||
|
| Tests | L1 / L2 / e2e 路径 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 附录:子能力展开检查(复杂功能必填)
|
||||||
|
|
||||||
|
防止只写「入口 → 结果 → 分享」。按需勾选/展开:
|
||||||
|
|
||||||
|
- [ ] 入口与列表
|
||||||
|
- [ ] 主操作流程(逐步)
|
||||||
|
- [ ] 中断 / 恢复 / 草稿
|
||||||
|
- [ ] 结果生成(免费层)
|
||||||
|
- [ ] 深度层 / 付费墙
|
||||||
|
- [ ] 分享
|
||||||
|
- [ ] AI 解释 / 追问入口
|
||||||
|
- [ ] 数据统计 / 埋点
|
||||||
|
- [ ] 验收标准覆盖上述每一项
|
||||||
|
|
||||||
|
示例(探索测试):测试入口 · 列表 · 题目流程 · 答题保存 · 中断恢复 · 结果生成 · 免费层 · 深度层 · 分享 · AI 解释 · 统计 · 验收。
|
||||||
@@ -0,0 +1,164 @@
|
|||||||
|
# Feature Spec: 账号登录
|
||||||
|
|
||||||
|
> Status: `Active` · Map: `5.x 账号 [P1+]` · Phase: `P1`
|
||||||
|
> 规范:[../feature-design.md](../feature-design.md)
|
||||||
|
> 关联:[profile-bootstrap.md](profile-bootstrap.md)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. 功能定义
|
||||||
|
|
||||||
|
| 字段 | 内容 |
|
||||||
|
|---|---|
|
||||||
|
| Name | 账号登录(小程序微信;H5 过渡账密) |
|
||||||
|
| Purpose | 跨设备持久用户身份;未登录不可生成/查看生日衍生结果 |
|
||||||
|
| Business Goal | 数据归属清晰;咨询与魔方同一人;为会员与深度版付费打底 |
|
||||||
|
|
||||||
|
| In | Out |
|
||||||
|
|---|---|
|
||||||
|
| 小程序微信登录 / 登出 / me | 短信 OTP |
|
||||||
|
| 设备身份绑定到已注册账号 | 游客可看完整报告 |
|
||||||
|
| Bearer Session | 运营 Admin 登录(独立) |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. 用户价值
|
||||||
|
|
||||||
|
1. 换手机后仍能看到自己的档案与报告。
|
||||||
|
2. 登录后输入生日一次生成、各页直读。
|
||||||
|
3. N/A(登录本身免费)。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. 用户角色
|
||||||
|
|
||||||
|
| Actor | 能力 |
|
||||||
|
|---|---|
|
||||||
|
| Visitor | 仅设备身份;可打开登录页;**不可**建档出结果 |
|
||||||
|
| User(已注册) | CRUD 本人档案与 TA;读已生成报告 |
|
||||||
|
| VIP / DeepAccess | 同前,权益不变 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. 用户流程
|
||||||
|
|
||||||
|
```text
|
||||||
|
进入结果页或建档
|
||||||
|
↓
|
||||||
|
未登录? → 小程序 login-pop(微信)或 H5 /login(过渡账密)
|
||||||
|
↓
|
||||||
|
Device 绑定到账号 User
|
||||||
|
↓
|
||||||
|
进入档案 / 结果页(读缓存报告)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. 页面设计
|
||||||
|
|
||||||
|
| 路由 | 页面 |
|
||||||
|
|---|---|
|
||||||
|
| `/login` | H5 LoginPage(过渡账密;小程序已删除此页) |
|
||||||
|
| 小程序 `login-pop` | 微信手机号授权(唯一 C 端登录) |
|
||||||
|
| `/mine` | 展示账号手机号尾号 + 退出 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. 页面状态规范
|
||||||
|
|
||||||
|
| 状态 | UI |
|
||||||
|
|---|---|
|
||||||
|
| Loading | 登录中 |
|
||||||
|
| Error | 密码错误 / 手机号已注册 |
|
||||||
|
| Normal | 跳转 redirect 或 /mine |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 7. Business Rules
|
||||||
|
|
||||||
|
| ID | Rule |
|
||||||
|
|---|---|
|
||||||
|
| R1 | **小程序:** 微信 `code` + 手机号授权登录;按 `wx_openid` 命中,否则按手机号合并历史账密账号;未命中则建号 |
|
||||||
|
| R2 | **H5 过渡:** OpenLogin(任意非空手机号+密码)仍可用,避免 H5 断服;小程序不再提供账密页。正式关掉账密须另改本 Spec |
|
||||||
|
| R3 | 登录成功后:签发 session;device_identities.user_id 改绑到账号 |
|
||||||
|
| R4 | 生成/查看档案与报告 API 必须已注册(users.phone 非空)且有效 session 或已绑设备账号 |
|
||||||
|
| R5 | 登出作废 session;设备可再登录其他账号 |
|
||||||
|
| R6 | 正式环境恢复校验前须改回本 Spec |
|
||||||
|
| R7 | 新账号未填昵称时,服务端用「意象词+场景词」词库(100×100)随机生成,如心语岛、微光谷 |
|
||||||
|
| R8 | 账号昵称可在个人档案页修改(PATCH `/auth/me`);首页与各页「自己」展示位统一用昵称(合盘/问答/星座/档案卡) |
|
||||||
|
| R9 | 账号头像可在「我的」页更换:相册或拍照上传;服务端持久化;GET `/auth/me` 返回 `avatar_url`;未设置时 UI 用愈心小人正面默认头像(`public/default-avatar.png`,源图 `public/logo/愈心小人1.png`) |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 8. 数据模型影响
|
||||||
|
|
||||||
|
- `users.phone` UNIQUE · `users.wx_openid` UNIQUE · `users.wx_unionid` · `users.java_platform_user_id` · `users.password_hash` · `users.nickname` · `users.avatar_url`
|
||||||
|
- `user_sessions(token, user_id, expires_at)`
|
||||||
|
- 本地文件:`data/avatars/{user_id}.{jpg|png|webp}`(进程相对路径)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 9. API 需求
|
||||||
|
|
||||||
|
| Method | Path | 说明 |
|
||||||
|
|---|---|---|
|
||||||
|
| POST | `/api/v1/auth/wechat` | 小程序微信登录 `{ code, encryptedData, iv }` |
|
||||||
|
| POST | `/api/v1/auth/register` | H5 过渡注册(可带 nickname) |
|
||||||
|
| POST | `/api/v1/auth/login` | H5 过渡登录 |
|
||||||
|
| POST | `/api/v1/auth/logout` | 登出 |
|
||||||
|
| GET | `/api/v1/auth/me` | 当前账号(含 avatar_url) |
|
||||||
|
| PATCH | `/api/v1/auth/me` | 更新昵称 `{ nickname }` |
|
||||||
|
| POST | `/api/v1/auth/me/avatar` | multipart `file`;jpeg/png/webp;≤2MB → 更新 avatar_url |
|
||||||
|
| GET | `/api/v1/media/avatars/:file` | 公开读头像文件 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 10. 权限设计
|
||||||
|
|
||||||
|
| 能力 | Visitor | User |
|
||||||
|
|---|---|---|
|
||||||
|
| register/login | ✓ | ✓ |
|
||||||
|
| profiles / reports 写读 | ✗ | ✓ |
|
||||||
|
| 上传头像 | ✗ | ✓ |
|
||||||
|
| 读头像媒体 | ✓ | ✓ |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 11. 埋点
|
||||||
|
|
||||||
|
经统一 `track()`(见 [analytics.md](analytics.md) · [ops-analytics.md](ops-analytics.md))。
|
||||||
|
**非** P1 核心漏斗 5 事件;接入后走自有 `POST /analytics/events`(及可选 GA)。
|
||||||
|
禁止参数含手机号、明文密码、头像绝对 URL / `user_id`。
|
||||||
|
|
||||||
|
| Event | 触发 | 可选 params |
|
||||||
|
|---|---|---|
|
||||||
|
| `auth_register` | 账号新建成功(含 OpenLogin 自动建号,`is_new=true`) | `source`: login_page |
|
||||||
|
| `auth_login` | 已有账号登录成功(`is_new=false`) | `source`: login_page |
|
||||||
|
| `auth_logout` | 用户在「我的」点退出且本地 session 已清 | `surface`: mine |
|
||||||
|
| `avatar_sheet_opened` | 「我的」打开更换头像 sheet | `surface`: mine |
|
||||||
|
| `avatar_upload_succeeded` | 头像上传 API 成功且 UI 刷新为新图 | `source`: album \| camera |
|
||||||
|
| `avatar_upload_failed` | 头像上传失败(校验/网络/服务端) | `source`: album \| camera · `reason`: too_large \| bad_type \| network \| server \| unknown |
|
||||||
|
| `nickname_updated` | PATCH 昵称成功 | `surface`: profile |
|
||||||
|
|
||||||
|
`page_view` 对 `/login` · `/mine` 由路由自动采集,本 Spec 不重复定义。
|
||||||
|
|
||||||
|
**实现状态:** 事件名以本表为准;H5 已挂 Login / Mine / Profile(`track` → 自有 ingest + 可选 GA)。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 12. 测试验收标准
|
||||||
|
|
||||||
|
| Given | When | Then |
|
||||||
|
|---|---|---|
|
||||||
|
| 新设备 | 未登录 POST portrait | 401 |
|
||||||
|
| 注册成功 | 建档 | 200 且生成报告包 |
|
||||||
|
| 登录另一设备 | list profiles | 见同一账号数据 |
|
||||||
|
| 已登录设备 | POST logout 后无 Bearer 再 GET /auth/me | 401(设备已解绑,刷新不再显示登录态) |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 13. AI 开发前检查
|
||||||
|
|
||||||
|
- [x] lexicon:登录/注册/账号
|
||||||
|
- [x] 不碰 Admin Auth
|
||||||
|
- [x] 咨询域见 Spec `consult-miniprogram`(ECR-050)
|
||||||
@@ -0,0 +1,148 @@
|
|||||||
|
# Feature Spec: 增长埋点(P1 最小集)
|
||||||
|
|
||||||
|
> Status: `Active` · Map: 横切增长 · Phase: `P1`(切片 A)
|
||||||
|
> 规范:[../feature-design.md](../feature-design.md) · 走查:[P1-PROCESS-REVIEW.md](P1-PROCESS-REVIEW.md)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. 功能定义
|
||||||
|
|
||||||
|
| 字段 | 内容 |
|
||||||
|
|---|---|
|
||||||
|
| Name | 增长埋点最小集 |
|
||||||
|
| Purpose | 用统一 `track()` 采集主漏斗关键节点,支撑转化分析 |
|
||||||
|
| Business Goal | 能量化:建档探索 → 深度版/会员;不阻塞主路径 |
|
||||||
|
|
||||||
|
| In | Out |
|
||||||
|
|---|---|
|
||||||
|
| H5 `track` + GA4(可配 Measurement ID) | 服务端埋点中台 |
|
||||||
|
| 下文 **5 个核心事件** + 自动 `page_view` | 全量 Spec §11 一次接完 |
|
||||||
|
| DEV 可 debug 日志 | 采集生日/答题全文等 PII |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. 用户价值
|
||||||
|
|
||||||
|
1. 用户无感(不改变主流程)。
|
||||||
|
2. 产品可看漏斗掉点。
|
||||||
|
3. 付费:N/A。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. 用户角色
|
||||||
|
|
||||||
|
全部 Visitor/User 路径均可触发;不因埋点失败阻断功能。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. 用户流程
|
||||||
|
|
||||||
|
```text
|
||||||
|
App 启动 → 若配置了 GA ID 则注入 gtag
|
||||||
|
↓
|
||||||
|
路由变化 → page_view
|
||||||
|
↓
|
||||||
|
主漏斗节点 → track(核心事件)
|
||||||
|
↓
|
||||||
|
gtag 不可用 / 未配置 → no-op(可选 console debug)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. 页面设计
|
||||||
|
|
||||||
|
无独立页面。触点:`/` · `/portrait` · `/relation` · 深度版 CTA · pay-mock 成功。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. 页面状态规范
|
||||||
|
|
||||||
|
N/A(横切)。要求:埋点失败不影响 UI。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 7. Business Rules
|
||||||
|
|
||||||
|
| ID | Rule |
|
||||||
|
|---|---|
|
||||||
|
| R1 | 统一经 `apps/user-h5/src/lib/analytics.ts` 的 `track`;页面禁止直接调 `window.gtag` |
|
||||||
|
| R2 | **P1 核心事件仅下表 5 个**(另加自动 `page_view`);其它 Spec §11 事件名保留,后续迭代再挂 |
|
||||||
|
| R3 | 禁止把生日、问答正文、档案 ID 明文作为事件参数(可用 `report_type` 等枚举) |
|
||||||
|
| R4 | `VITE_GA_MEASUREMENT_ID` 为空时 track 为 no-op,应用仍可用 |
|
||||||
|
| R5 | 事件名稳定,snake_case,与下表一致 |
|
||||||
|
|
||||||
|
### P1 核心事件字典(冻结)
|
||||||
|
|
||||||
|
| Event | 触发 | 可选 params |
|
||||||
|
|---|---|---|
|
||||||
|
| `home_cta_portrait` | 首页点「开始」且生日校验通过,即将进画像 | — |
|
||||||
|
| `portrait_completed` | 画像基础结果首次展示成功 | `source`: query\|report_id |
|
||||||
|
| `deep_access_clicked` | 用户点击深度版 CTA(画像/关系/报告) | `surface`: portrait\|relation\|report |
|
||||||
|
| `purchase_completed` | mock 支付成功且刷新后权益生效 | `kind`: deep_access\|membership |
|
||||||
|
| `relation_completed` | 关系理解基础结果展示成功 | — |
|
||||||
|
|
||||||
|
基础设施:
|
||||||
|
|
||||||
|
| Event | 触发 | params |
|
||||||
|
|---|---|---|
|
||||||
|
| `page_view` | 路由 afterEach | `page_path`, `page_title` |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 8. 数据模型影响
|
||||||
|
|
||||||
|
无 DB。配置:`VITE_GA_MEASUREMENT_ID`(H5)。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 9. API 需求
|
||||||
|
|
||||||
|
无后端 API。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 10. 权限设计
|
||||||
|
|
||||||
|
埋点不鉴权;不依赖登录态字段。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 11. 埋点
|
||||||
|
|
||||||
|
见 §7 字典(本 Spec 即权威事件表)。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 12. 测试验收标准
|
||||||
|
|
||||||
|
**Given** 未配置 GA ID
|
||||||
|
**When** 触发 `track('portrait_completed')`
|
||||||
|
**Then** 不抛错、不挡 UI
|
||||||
|
|
||||||
|
**Given** mock `window.gtag`
|
||||||
|
**When** `track('home_cta_portrait')`
|
||||||
|
**Then** gtag 被以 event 名调用
|
||||||
|
|
||||||
|
**Given** 用户完成画像基础结果
|
||||||
|
**When** 页面 Normal
|
||||||
|
**Then** 曾触发 `portrait_completed`(单测或集成对 track mock)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 13. AI 开发前检查
|
||||||
|
|
||||||
|
- [x] Spec 齐全
|
||||||
|
- [x] 仅 5 核心 + page_view
|
||||||
|
- [x] 无 PII 参数
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 14. Implementation Notes
|
||||||
|
|
||||||
|
| 项 | 内容 |
|
||||||
|
|---|---|
|
||||||
|
| Packages | `src/lib/analytics.ts` · `main.ts` · Home/Portrait/Relation/Report/Membership |
|
||||||
|
| Config | `VITE_GA_MEASUREMENT_ID` · `VITE_ANALYTICS_DEBUG`(`apps/user-h5/.env.example`) |
|
||||||
|
| Legacy | 静态站曾用 `G-LVVXH3TL04`,可写入 `.env.local` |
|
||||||
|
| Tests | `analytics.spec.ts` |
|
||||||
|
| Process Review | 切片 A **已实现**(2026-08-02) |
|
||||||
@@ -0,0 +1,184 @@
|
|||||||
|
# Feature Spec: AI 成长助手(问答)
|
||||||
|
|
||||||
|
> Status: `Active` · Map: `§3 问答 [P1]` · Phase: `P1`
|
||||||
|
> 规范:[../feature-design.md](../feature-design.md)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. 功能定义
|
||||||
|
|
||||||
|
| 字段 | 内容 |
|
||||||
|
|---|---|
|
||||||
|
| Name | AI 成长助手 |
|
||||||
|
| Purpose | 结合个人档案,用对话帮助认识自己、理解关系、整理情绪与生活节奏 |
|
||||||
|
| Business Goal | 战略中心 Tab 留存;配额驱动会员 |
|
||||||
|
|
||||||
|
| In | Out |
|
||||||
|
|---|---|
|
||||||
|
| 挂 profile 的多轮对话;场景入口 | 占卜/运势/预测未来 |
|
||||||
|
| DeepSeek(可配)+ 规则引擎降级 | 医疗诊断 |
|
||||||
|
| 免费次数 + 额度包(ask_pack)+ 会员配额 | 无档案空聊(禁止) |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. 用户价值
|
||||||
|
|
||||||
|
1. **为何需要:** 看完画像仍有具体情境问题。
|
||||||
|
2. **完成后获得:** 结合档案的结构化建议与可执行小步骤。
|
||||||
|
3. **为何付费:** 免费次数用尽后可购买问答额度包,或开通成长会员获得更多回复。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. 用户角色
|
||||||
|
|
||||||
|
| Actor | 能力 |
|
||||||
|
|---|---|
|
||||||
|
| Visitor | 有档案则可问;受配额限制 |
|
||||||
|
| VIP | 额外 Ask 配额 |
|
||||||
|
| 无档案 | 仅引导建档,不可消耗成功回复 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. 用户流程
|
||||||
|
|
||||||
|
```text
|
||||||
|
进入 /ask
|
||||||
|
↓
|
||||||
|
无档案? → Empty 引导首页/档案
|
||||||
|
↓
|
||||||
|
选择档案(我 / TA)+ 可选场景
|
||||||
|
↓
|
||||||
|
输入问题 → 检查配额
|
||||||
|
├─ 耗尽 → 引导购买额度包 / 成长会员(mock 支付后立刻加次)
|
||||||
|
└─ 有余 → 创建/续 thread → assistant **SSE 流式**回复(delta → done)
|
||||||
|
↓
|
||||||
|
DeepSeek 失败/无 key → 规则引擎降级(仍按字流式输出)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. 页面设计
|
||||||
|
|
||||||
|
| 路由 | 页面 |
|
||||||
|
|---|---|
|
||||||
|
| `/ask` | AskPage(ChatThread) |
|
||||||
|
|
||||||
|
```text
|
||||||
|
/ask
|
||||||
|
├── 愈心 AI / 顾问 Tab
|
||||||
|
├── 顾问列表 → 顾问专属对话(?advisor=key · 顶栏返回回列表)
|
||||||
|
├── Empty(无档案)
|
||||||
|
├── Loading(发送中)
|
||||||
|
├── Normal(历史 + 输入)
|
||||||
|
├── Error(发送失败可重试)
|
||||||
|
└── Quota Exhausted(额度包 + 会员)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. 页面状态规范
|
||||||
|
|
||||||
|
| 状态 | UI |
|
||||||
|
|---|---|
|
||||||
|
| Empty | 无档案引导 |
|
||||||
|
| Loading | 发送中禁用重复点 |
|
||||||
|
| Error | 失败 + 重试 |
|
||||||
|
| Normal | 消息列表 |
|
||||||
|
| Quota | 明确耗尽文案 + 额度包购买 + `/membership` |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 7. Business Rules
|
||||||
|
|
||||||
|
| ID | Rule |
|
||||||
|
|---|---|
|
||||||
|
| R1 | 每条用户消息必须绑定 `profile_id`(self 或 other) |
|
||||||
|
| R2 | 免费回复次数有上限(实现:如 3);可购 `ask_pack` 加次;会员另计配额 |
|
||||||
|
| R3 | 配额耗尽返回明确业务错误,不生成付费假回复;引导购买额度或会员 |
|
||||||
|
| R7 | 扣次顺序:会员配额 → 已购额度包 → 免费额度(非会员);购买额度不解锁报告深度版 |
|
||||||
|
| R4 | LLM 可选;失败降级规则引擎,仍须 lexicon 安全 |
|
||||||
|
| R5 | 禁止占卜/算命/吉凶恐吓/医疗诊断;可用愈心解码·星座·人格匹配等探索向用语 |
|
||||||
|
| R6 | 回复宜短(约 80–160 字):回应当下 → 1 条档案洞察 → 1–2 条可执行建议;system prompt 须对齐 lexicon 与产品定位 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 8. 数据模型影响
|
||||||
|
|
||||||
|
| 表 | 备注 |
|
||||||
|
|---|---|
|
||||||
|
| `ask_threads` | user_id, profile_id |
|
||||||
|
| `ask_messages` | role, content |
|
||||||
|
| `ask_quotas` / 等价 | 余量 |
|
||||||
|
| `users.ask_paid_quota_left` | 已购额度包余量 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 9. API 需求
|
||||||
|
|
||||||
|
| Method | Path | 意图 |
|
||||||
|
|---|---|---|
|
||||||
|
| GET | `/api/v1/ask/quota` | 余量 |
|
||||||
|
| POST | `/api/v1/ask/threads` | 创建线程(profile_id, scene?) |
|
||||||
|
| POST | `/api/v1/ask/threads/{id}/messages` | 发消息拿回复(默认 JSON) |
|
||||||
|
| POST | `/api/v1/ask/threads/{id}/messages?stream=1` | SSE:`meta` / `delta` / `done` / `error` |
|
||||||
|
| DELETE | `/api/v1/ask/threads/{id}` | 清空该会话(软删除) |
|
||||||
|
| POST | `/api/v1/orders` kind=`ask_pack` | 购买额度包(plan: pack10/pack30/pack100) |
|
||||||
|
| POST | `/api/v1/orders/{id}/pay-mock` | 支付后增加 `ask_paid_quota_left` |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 10. 权限设计
|
||||||
|
|
||||||
|
| 能力 | 无档案 | 有配额 | 配额耗尽 | VIP 有配额 |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| 提问 | ✗ | ✓ | ✗ | ✓ |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 11. 埋点
|
||||||
|
|
||||||
|
| Event | 触发 |
|
||||||
|
|---|---|
|
||||||
|
| `ask_opened` | 进入页 |
|
||||||
|
| `ask_message_sent` | 发送 |
|
||||||
|
| `ask_reply_received` | 成功回复 |
|
||||||
|
| `ask_quota_exhausted` | 耗尽 |
|
||||||
|
| `ask_fallback_rule` | 走规则引擎 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 12. 测试验收标准
|
||||||
|
|
||||||
|
**Given** 有 Self 档案与配额
|
||||||
|
**When** 发送问题
|
||||||
|
**Then** 返回助手消息且含免责;配额减一
|
||||||
|
|
||||||
|
**Given** 配额为 0
|
||||||
|
**When** 再发送
|
||||||
|
**Then** 业务错误引导购买额度/会员,无助手胡编
|
||||||
|
|
||||||
|
**Given** 免费额度耗尽
|
||||||
|
**When** pay-mock `ask_pack` pack10
|
||||||
|
**Then** GET `/ask/quota` remaining ≥ 10,可继续提问
|
||||||
|
|
||||||
|
**Given** 无 DeepSeek key
|
||||||
|
**When** 提问
|
||||||
|
**Then** 规则引擎仍给出档案相关回复
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 13. AI 开发前检查
|
||||||
|
|
||||||
|
- [x] Spec 齐全 · map · lexicon · OpenAPI · 可测
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 14. Implementation Notes
|
||||||
|
|
||||||
|
| 项 | 内容 |
|
||||||
|
|---|---|
|
||||||
|
| Packages | `service/ask` · `internal/ask` · `internal/llm/deepseek` · `AskPage` |
|
||||||
|
| Config | `config.local.yaml` deepseek.* |
|
||||||
|
| Gaps | 长期记忆 P3;顾问预约仅占位;埋点未接 |
|
||||||
|
| Tests | ask reply L1;集成 thread;AskPage.spec |
|
||||||
|
| Process Review | 2026-08-02 [P1-PROCESS-REVIEW](P1-PROCESS-REVIEW.md) · 设计闭合 · 实现 PASS · 测试 PASS |
|
||||||
@@ -0,0 +1,250 @@
|
|||||||
|
# 00 · 测测前端总览(L0 IA · 全功能清单)
|
||||||
|
|
||||||
|
> Evidence: 以 E1 实测为主 · E2/E3 补充 · E6/E7 标明推断
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## STEP 1 — 全局页面组成(App Shell)
|
||||||
|
|
||||||
|
### 1.1 底部导航(五 Tab)✅ E1
|
||||||
|
|
||||||
|
| Tab | 视觉权重 | 入口职责 |
|
||||||
|
|---|---|---|
|
||||||
|
| 首页 | 标准 | 发现 · 工具宫格 · 信息流 · 建档引导 |
|
||||||
|
| 消息 | 标准 | AI/达人/社区/系统/商业通知 |
|
||||||
|
| **问** | **中央突出 + AI 标识** | 战略入口 → 测测 AI(内含真人 1v1 Tab) |
|
||||||
|
| 在线 | 标准 | 达人 Marketplace |
|
||||||
|
| 我的 | 标准 | 账号 · 档案资产 · 会员订单 |
|
||||||
|
|
||||||
|
```text
|
||||||
|
┌─────────────────────────────┐
|
||||||
|
│ 页面内容区 │
|
||||||
|
├──────┬──────┬──────┬────┬───┤
|
||||||
|
│ 首页 │ 消息 │ 问* │在线│我的│
|
||||||
|
└──────┴──────┴──▲───┴────┴───┘
|
||||||
|
│ *中央悬浮突出 + AI 标识
|
||||||
|
```
|
||||||
|
|
||||||
|
### 1.2 全局浮层 / 横切 UI(推导)
|
||||||
|
|
||||||
|
| 元素 | 来源 | 说明 |
|
||||||
|
|---|---|---|
|
||||||
|
| 登录/绑定弹层 | 🟡 E6 | 游客触达付费/发帖时 |
|
||||||
|
| 会员购买半屏 | ✅ E1 商业描述 | 首月/包月/季/年 |
|
||||||
|
| 网络错误 Toast | 🔵 E7 | 全 App |
|
||||||
|
| 权限(相册/麦克风)系统弹窗 | 🔵 E7 | 沙盘/连麦/OCR |
|
||||||
|
| 青少年/合规提示 | 🟡 E6 | 泛心理合规 |
|
||||||
|
| 分享面板(微信/海报) | ✅ E2 裂变叙事 | 测评结果卡 |
|
||||||
|
| 角标(消息未读) | 🟡 E6 | 消息 Tab |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## STEP 2 — 前端功能全清单(Feature Inventory)
|
||||||
|
|
||||||
|
### A. 导航与账号
|
||||||
|
|
||||||
|
| ID | 功能 | 证据 |
|
||||||
|
|---|---|---|
|
||||||
|
| NAV-01 | 五 Tab 切换 | ✅ E1 |
|
||||||
|
| NAV-02 | 「问」战略权重突出 | ✅ E1 |
|
||||||
|
| ACC-01 | 手机/微信/Apple 登录 | ✅ E1 基础信息 |
|
||||||
|
| ACC-02 | 游客 → 注册升级 | 🟡 E6 |
|
||||||
|
| ACC-03 | 账号设置/注销 | 🔵 E7 |
|
||||||
|
|
||||||
|
### B. 生命档案(前端核心资产)
|
||||||
|
|
||||||
|
| ID | 功能 | 证据 |
|
||||||
|
|---|---|---|
|
||||||
|
| PROF-01 | 创建本人档案(生日/时/地/性别) | ✅ E1 |
|
||||||
|
| PROF-02 | 创建关系档案(伴侣/朋友等) | ✅ E1 |
|
||||||
|
| PROF-03 | 多档案切换 | ✅ E1(AI 视角选择器) |
|
||||||
|
| PROF-04 | 首页「输入生日,更加了解 TA」引导 | ✅ E1 |
|
||||||
|
| PROF-05 | 档案编辑/删除 | 🟡 E6 |
|
||||||
|
| PROF-06 | 兴趣/状态标签 | 🟡 E4 |
|
||||||
|
|
||||||
|
### C. 首页工具宫格(快捷入口)✅ E1
|
||||||
|
|
||||||
|
| ID | 入口文案 | 域 |
|
||||||
|
|---|---|---|
|
||||||
|
| GRID-01 | I人E人(MBTI) | 测评 |
|
||||||
|
| GRID-02 | 星座 | 星座内容 |
|
||||||
|
| GRID-03 | 星盘 | 本命/多盘型 |
|
||||||
|
| GRID-04 | 缘分合盘 | 合盘+指数 |
|
||||||
|
| GRID-05 | 沙盘 | 3D 心理沙盘 |
|
||||||
|
| GRID-06 | 陪伴小星 | AI 陪伴子入口 |
|
||||||
|
| GRID-07 | 商城 | 电商 |
|
||||||
|
| GRID-08 | 倾诉 | 咨询/AI |
|
||||||
|
| GRID-09 | AI 玩法广场 | UGC AI 小应用 |
|
||||||
|
| GRID-10 | 更多 | 收纳扩展 |
|
||||||
|
|
||||||
|
「更多」内公开提到(✅ E2):爱情树(依恋类型)、幸运地图、pick 卡等趣味测。
|
||||||
|
|
||||||
|
### D. 「问」AI 与双轨
|
||||||
|
|
||||||
|
| ID | 功能 | 证据 |
|
||||||
|
|---|---|---|
|
||||||
|
| ASK-01 | 测测 AI 对话 | ✅ E1 |
|
||||||
|
| ASK-02 | 顶栏「测测AI ‖ 真人1v1」 | ✅ E1 |
|
||||||
|
| ASK-03 | 视角:星盘维度 | ✅ E1 |
|
||||||
|
| ASK-04 | 对象:自己 / 已建档 TA | ✅ E1 |
|
||||||
|
| ASK-05 | 深度思考模式开关 | ✅ E1 |
|
||||||
|
| ASK-06 | 灵魂伴侣子入口(横向滑动) | ✅ E1 |
|
||||||
|
| ASK-07 | 预置引导问题(星盘向) | ✅ E1 |
|
||||||
|
| ASK-08 | 下拉历史消息 | ✅ E1 |
|
||||||
|
| ASK-09 | AI 心情小镇(多虚拟倾诉师) | ✅ E1/E2 |
|
||||||
|
| ASK-10 | 灵犀/小智(子场景/模式,非并列 Tab) | ✅ E1 纠正 |
|
||||||
|
|
||||||
|
### E. 星座 / 星盘 / 合盘 / 运势
|
||||||
|
|
||||||
|
| ID | 功能 | 证据 |
|
||||||
|
|---|---|---|
|
||||||
|
| AST-01 | 本命星盘展示与档案切换 | ✅ E3 |
|
||||||
|
| AST-02 | 多盘型(报道称可达约 20 种工具盘) | ✅ E3 |
|
||||||
|
| AST-03 | 合盘:比较盘/组合盘/时空盘/马克斯盘等 | ✅ E3 |
|
||||||
|
| AST-04 | 组合推运等推运变体 | ✅ E3 |
|
||||||
|
| AST-05 | 缘分指数(恋爱等) | ✅ E2 |
|
||||||
|
| AST-06 | 日/周/月/年运势 | ✅ E3/E4 |
|
||||||
|
| AST-07 | 附近的人 / 微信好友连线合盘 | 🟡 E3/行业 + 产品常见;【待真机补证】 |
|
||||||
|
|
||||||
|
### F. 测评与神秘学工具
|
||||||
|
|
||||||
|
| ID | 功能 | 证据 |
|
||||||
|
|---|---|---|
|
||||||
|
| TEST-01 | MBTI(修订量表+分享) | ✅ E1/E2 |
|
||||||
|
| TEST-02 | 双人 MBTI/性格关系 | ✅ E2 |
|
||||||
|
| TEST-03 | 塔罗抽牌/提问 | ✅ E3 |
|
||||||
|
| TEST-04 | 八字/紫微/生命数字等 | ✅ E3 |
|
||||||
|
| TEST-05 | 爱情树/幸运地图/pick 卡 | ✅ E2 |
|
||||||
|
| TEST-06 | 50+ 心理测试矩阵 | 🟡 E3 口径 |
|
||||||
|
|
||||||
|
### G. 沉浸体验
|
||||||
|
|
||||||
|
| ID | 功能 | 证据 |
|
||||||
|
|---|---|---|
|
||||||
|
| IMM-01 | 3D 心理沙盘 | ✅ E1/E2 |
|
||||||
|
| IMM-02 | AI 心情小镇(约 6 人设,含「明朗」) | ✅ E1 |
|
||||||
|
|
||||||
|
### H. 社区与内容
|
||||||
|
|
||||||
|
| ID | 功能 | 证据 |
|
||||||
|
|---|---|---|
|
||||||
|
| SOC-01 | 首页信息流(文章/视频/故事/达人) | ✅ E1 |
|
||||||
|
| SOC-02 | 今日运势/热门测试/专家推荐 | ✅ E4 |
|
||||||
|
| SOC-03 | AI 玩法广场 UGC 列表(热度/创作者) | ✅ E1 |
|
||||||
|
| SOC-04 | 赞评关私信 | 🟡 E4 |
|
||||||
|
|
||||||
|
### I. 在线达人
|
||||||
|
|
||||||
|
| ID | 功能 | 证据 |
|
||||||
|
|---|---|---|
|
||||||
|
| EXP-01 | 达人列表/筛选 | ✅ E1 |
|
||||||
|
| EXP-02 | 文字/语音/连麦咨询 | ✅ E1 |
|
||||||
|
| EXP-03 | 评价/复购 | 🟡 E6 |
|
||||||
|
| EXP-04 | 达人约 2.6 万签约口径 | ✅ E1 官方口径 |
|
||||||
|
|
||||||
|
### J. 商业化前端
|
||||||
|
|
||||||
|
| ID | 功能 | 证据 |
|
||||||
|
|---|---|---|
|
||||||
|
| PAY-01 | 会员:首月 9.9 / 续订 25/月;季 58;年 178 | ✅ E1 |
|
||||||
|
| PAY-02 | 报告解锁 / AI 次数 | ✅ E1 |
|
||||||
|
| PAY-03 | 咨询下单支付 | ✅ E1 |
|
||||||
|
| PAY-04 | 商城 | ✅ E1 宫格 |
|
||||||
|
| PAY-05 | 主动压缩干扰广告 | ✅ E1 |
|
||||||
|
|
||||||
|
### K. 增长
|
||||||
|
|
||||||
|
| ID | 功能 | 证据 |
|
||||||
|
|---|---|---|
|
||||||
|
| GRW-01 | 测评结果分享卡 | ✅ E1/E2 |
|
||||||
|
| GRW-02 | 邀请好友测 MBTI | ✅ E2 |
|
||||||
|
| GRW-03 | 签到/积分/勋章 | 🟡 E4 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## STEP 3 — 全局用户流程
|
||||||
|
|
||||||
|
### 3.1 新用户冷启动 ✅ E1 场景
|
||||||
|
|
||||||
|
```text
|
||||||
|
打开 App
|
||||||
|
→(可选登录)首页
|
||||||
|
→ 点宫格 MBTI / 或看信息流
|
||||||
|
→ 完成测评 → 结果页 → 分享/付费墙
|
||||||
|
→ 引导建档(生日)
|
||||||
|
→ 可进入「问」或合盘
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3.2 关系资产飞轮 ✅ E1
|
||||||
|
|
||||||
|
```text
|
||||||
|
首页「了解 TA」/ AI 对象切换
|
||||||
|
→ 录入对方生日建关系档案
|
||||||
|
→ AI 基于 TA 星盘回答 / 合盘
|
||||||
|
→ 分享结果 → 拉新
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3.3 全局失败路径(必须实现)🔵 E7
|
||||||
|
|
||||||
|
| 场景 | 前端表现 |
|
||||||
|
|---|---|
|
||||||
|
| 断网/弱网 | 空态 + 重试;消息/AI 发送失败可重发 |
|
||||||
|
| Token 失效 | 跳登录;草稿保留 |
|
||||||
|
| 接口超时 | Toast + 重试 |
|
||||||
|
| 会员限制 | VIPLocked 半屏 |
|
||||||
|
| 余额不足(咨询) | 充值/支付 |
|
||||||
|
| 审核失败(UGC) | 说明原因 |
|
||||||
|
| 数据为空 | Empty 插画 + CTA |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## STEP 4 — 全局状态机(App Shell)
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
stateDiagram-v2
|
||||||
|
[*] --> Init
|
||||||
|
Init --> Loading: 启动
|
||||||
|
Loading --> GuestHome: 无登录
|
||||||
|
Loading --> AuthedHome: 已登录
|
||||||
|
GuestHome --> LoginRequired: 触达 gated
|
||||||
|
LoginRequired --> AuthedHome: 登录成功
|
||||||
|
AuthedHome --> Offline: 断网
|
||||||
|
Offline --> AuthedHome: 恢复
|
||||||
|
AuthedHome --> VIPLocked: 点深度权益
|
||||||
|
VIPLocked --> AuthedHome: 购买或关闭
|
||||||
|
AuthedHome --> Error: 致命错误
|
||||||
|
Error --> AuthedHome: 重试
|
||||||
|
```
|
||||||
|
|
||||||
|
页面级状态见各 Tab 文档。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 页面路由树(前端逻辑路由 · 推导)
|
||||||
|
|
||||||
|
```text
|
||||||
|
/ 首页
|
||||||
|
/message 消息
|
||||||
|
/ask 问(默认 AI)
|
||||||
|
/ask?mode=human 真人1v1
|
||||||
|
/online 在线达人列表
|
||||||
|
/online/:expertId 达人详情
|
||||||
|
/consult/:sessionId 咨询会话
|
||||||
|
/mine 我的
|
||||||
|
/profile/list 档案列表
|
||||||
|
/profile/edit/:id 档案编辑
|
||||||
|
/tools/mbti MBTI
|
||||||
|
/tools/chart 星盘
|
||||||
|
/tools/synastry 缘分合盘
|
||||||
|
/tools/sandbox 沙盘
|
||||||
|
/tools/plaza AI玩法广场
|
||||||
|
/tools/plaza/:appId 玩法详情
|
||||||
|
/tools/tarot 塔罗
|
||||||
|
/tools/bazi 八字…
|
||||||
|
/membership 会员
|
||||||
|
/orders 订单
|
||||||
|
/shop 商城
|
||||||
|
/mood-town AI心情小镇
|
||||||
|
```
|
||||||
|
|
||||||
|
路径名为 🔵 工程命名;测测真实 Deep Link 【待真机补证】。
|
||||||
@@ -0,0 +1,118 @@
|
|||||||
|
# 01 · Tab「首页」逆向设计
|
||||||
|
|
||||||
|
> Evidence: ✅ E1 实测 · ✅ E2「更多」工具 · 🟡/🔵 补全交互
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## STEP 1 — UI Analysis
|
||||||
|
|
||||||
|
### 区域结构(自上而下)
|
||||||
|
|
||||||
|
| # | 区域 | 可见元素 | 证据 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| H1 | 顶栏 | 可能含搜索/消息入口;「输入生日,更加了解 TA」引导条 | ✅ E1 |
|
||||||
|
| H2 | 用户/档案摘要 | 当前本人档案摘要或未建档 CTA | 🟡 E6 |
|
||||||
|
| H3 | 功能宫格 | I人E人、星座、星盘、缘分合盘、沙盘、陪伴小星、商城、倾诉、AI玩法广场、更多 | ✅ E1 |
|
||||||
|
| H4 | 运营 Banner | 活动/会员/新品 | 🟡 E6 |
|
||||||
|
| H5 | 推荐信息流 | 今日运势、热门测试、AI入口、专家推荐、文章/视频/故事/达人内容 | ✅ E1/E4 |
|
||||||
|
| H6 | 底部 Tab Bar | 全局 | ✅ E1 |
|
||||||
|
|
||||||
|
### 宫格 Icon 全集(不得遗漏)✅ E1
|
||||||
|
|
||||||
|
1. I人E人(MBTI)
|
||||||
|
2. 星座
|
||||||
|
3. 星盘
|
||||||
|
4. 缘分合盘
|
||||||
|
5. 沙盘
|
||||||
|
6. 陪伴小星
|
||||||
|
7. 商城
|
||||||
|
8. 倾诉
|
||||||
|
9. AI玩法广场
|
||||||
|
10. 更多 → 二级页:爱情树、幸运地图、pick卡… ✅ E2
|
||||||
|
|
||||||
|
### AI 玩法广场页内元素 ✅ E1
|
||||||
|
|
||||||
|
- Slogan:「全民手搓创意——精选应用」
|
||||||
|
- 列表卡片:应用名、热度(如 SBTI 305.7 万)、创作者名
|
||||||
|
- 示例:SBTI 测试版、答案之书、三生三世你和 Ta、灵魂伴侣
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## STEP 2 — Feature Analysis(逐元素)
|
||||||
|
|
||||||
|
| 元素 | 作用 | 点击 | 长按/其它 | 权限/VIP | 分享 |
|
||||||
|
|---|---|---|---|---|---|
|
||||||
|
| 了解 TA 引导 | 建关系档案 | 进档案创建表 | — | 登录 | 否 |
|
||||||
|
| MBTI | 拉新测评 | 进量表流程 | — | 部分结果免费 | 结果强分享 |
|
||||||
|
| 星座 | 内容/运势 | 星座频道 | — | 深度会员 | 文章可分享 |
|
||||||
|
| 星盘 | 本命排盘 | 星盘页+档案切换 | — | 多盘型/详解会员 | 海报 |
|
||||||
|
| 缘分合盘 | 双人匹配 | 选 A/B→报告 | — | 指数免费/深文案付费 | 指数卡 |
|
||||||
|
| 沙盘 | 沉浸投射 | 3D 沙盘 | — | 可能次数限制 | 场景图 |
|
||||||
|
| 陪伴小星 | AI 陪伴 | 进子场景/问 | — | AI 次数 | 否 |
|
||||||
|
| 商城 | 电商 | 商品列表 | — | 登录支付 | 商品 |
|
||||||
|
| 倾诉 | 咨询/AI | 分流问/在线 | — | — | 否 |
|
||||||
|
| AI玩法广场 | UGC 应用集市 | 列表→应用 | — | 视应用 | 应用结果 |
|
||||||
|
| 信息流卡片 | 消费/转化 | 详情/达人/测试 | 可能不喜欢 | — | 内容分享 |
|
||||||
|
| 更多 | 收纳 | 二级宫格 | — | — | — |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## STEP 3 — User Flow
|
||||||
|
|
||||||
|
### 主流程:测评拉新
|
||||||
|
|
||||||
|
```text
|
||||||
|
首页 → MBTI → 答题 → Loading → 结果
|
||||||
|
→ 分享 / 解锁完整 / 邀请好友再测
|
||||||
|
→ 失败:网络错误重试;中途退出保存进度【待真机】
|
||||||
|
```
|
||||||
|
|
||||||
|
### 主流程:建 TA 档案
|
||||||
|
|
||||||
|
```text
|
||||||
|
首页引导 → 填写生日/关系类型 → 保存
|
||||||
|
→ 可用于合盘 / AI 对象切换
|
||||||
|
→ 失败:校验生日非法;未登录 → LoginRequired
|
||||||
|
```
|
||||||
|
|
||||||
|
### 主流程:玩法广场
|
||||||
|
|
||||||
|
```text
|
||||||
|
宫格 → 广场列表 → 选应用 → 互动 → 结果 → 热度/分享
|
||||||
|
→ Empty:无应用;审核中不可见 🔵
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## STEP 4 — 状态机
|
||||||
|
|
||||||
|
| 状态 | UI |
|
||||||
|
|---|---|
|
||||||
|
| Init/Loading | 骨架屏 |
|
||||||
|
| Loaded | 宫格+流 |
|
||||||
|
| EmptyFeed | 流空+推荐宫格 |
|
||||||
|
| Offline | 顶条提示 |
|
||||||
|
| LoginRequired | 登录半屏 |
|
||||||
|
| VIPLocked | 会员半屏 |
|
||||||
|
| Error | 重试 |
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
stateDiagram-v2
|
||||||
|
[*] --> Loading
|
||||||
|
Loading --> Loaded
|
||||||
|
Loading --> Error
|
||||||
|
Loaded --> LoginRequired
|
||||||
|
Loaded --> VIPLocked
|
||||||
|
Loaded --> Offline
|
||||||
|
Offline --> Loaded
|
||||||
|
Error --> Loading: 重试
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 页面验收(前端)
|
||||||
|
|
||||||
|
- [ ] 宫格 9+更多与 E1 一致(版本差分记日志)
|
||||||
|
- [ ] 「了解 TA」可达档案创建
|
||||||
|
- [ ] 玩法广场展示热度与创作者
|
||||||
|
- [ ] 信息流可下拉刷新 / 分页 🔵
|
||||||
@@ -0,0 +1,55 @@
|
|||||||
|
# 02 · Tab「消息」逆向设计
|
||||||
|
|
||||||
|
> Evidence: ✅ E1/E4 分类 · 细交互多为 🟡/🔵(【待真机补证】)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## STEP 1 — UI Analysis
|
||||||
|
|
||||||
|
| 区域 | 元素 | 证据 |
|
||||||
|
|---|---|---|
|
||||||
|
| 顶栏 | 标题「消息」· 可能「一键已读」 | 🟡 E6 |
|
||||||
|
| 分类 Tab/分组列表 | AI 消息 · 达人消息 · 社区互动 · 系统 · 商业 | ✅ E4 |
|
||||||
|
| 会话行 | 头像 · 标题 · 摘要 · 时间 · 未读红点 | 🟡 E6 |
|
||||||
|
| 空态 | 插画 +「去问问 AI」CTA | 🔵 E7 |
|
||||||
|
| 底栏 | 全局 Tab,消息角标 | 🟡 E6 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## STEP 2 — Feature Analysis
|
||||||
|
|
||||||
|
| 类型 | 作用 | 点击 | 删除/免扰 | 登录 |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| AI 消息 | 会话提醒/未读 AI | 进「问」对应线程 | 可删会话 🟡 | 是 |
|
||||||
|
| 达人消息 | 咨询回复 | 进咨询会话 | 是 | 是 |
|
||||||
|
| 社区 | 赞评关私信 | 进动态/私信 | 是 | 是 |
|
||||||
|
| 系统 | 公告/合规 | 详情页 | 通常不可删 | 是 |
|
||||||
|
| 商业 | 会员到期/订单/活动 | 会员/订单页 | 是 | 是 |
|
||||||
|
|
||||||
|
长按:删除会话 / 标记已读 / 免打扰 🟡 E6。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## STEP 3 — User Flow
|
||||||
|
|
||||||
|
```text
|
||||||
|
进入消息 → Loading → 列表
|
||||||
|
→ 点 AI 会话 → /ask 历史
|
||||||
|
→ 点达人 → 咨询页(可能支付状态校验)
|
||||||
|
→ 点系统 → H5/原生详情
|
||||||
|
失败:Token 失效登录;离线缓存只读 🔵
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## STEP 4 — 状态机
|
||||||
|
|
||||||
|
Init → Loading → Loaded | Empty | Offline | Error | LoginRequired
|
||||||
|
|
||||||
|
未读数:本地角标 ↔ 服务端 sync 🔵。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 后台推导(摘要 · 详见 08)
|
||||||
|
|
||||||
|
推送通道、消息模板、免打扰时段、达人回复 SLA 监控 🔵。
|
||||||
@@ -0,0 +1,101 @@
|
|||||||
|
# 03 · Tab「问」逆向设计(测测 AI + 真人 1v1)
|
||||||
|
|
||||||
|
> Evidence: ✅ E1 实测最完整 · 核心战略入口
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## STEP 1 — UI Analysis
|
||||||
|
|
||||||
|
### 进入方式
|
||||||
|
|
||||||
|
- 底部中央「问」悬浮大按钮 + AI 标识 ✅ E1
|
||||||
|
|
||||||
|
### 对话页结构 ✅ E1
|
||||||
|
|
||||||
|
| 区域 | 元素 |
|
||||||
|
|---|---|
|
||||||
|
| 顶栏 | Tab:**测测AI** ‖ **真人1v1** |
|
||||||
|
| 提示 | 「下拉可浏览历史消息」 |
|
||||||
|
| 消息区 | 气泡列表 · 引导问题卡片(冷启动) |
|
||||||
|
| 上下文条(输入框上方) | **星盘**(解读维度)· **对象名**(默认「自己」,可切 TA)· **深度思考** |
|
||||||
|
| 右侧滑动 | **灵魂伴侣** 子入口 |
|
||||||
|
| 输入区 | 文本框 · 发送 · 可能语音 🟡 |
|
||||||
|
| 预置问题示例 | 「什么样的朋友适合我」「下周的财富情况如何」「本月在人际上需要注意什么」等(星盘向) |
|
||||||
|
|
||||||
|
### 子场景(非并列 Tab)✅ E1
|
||||||
|
|
||||||
|
- 灵魂伴侣:测测 AI 生态内横向入口
|
||||||
|
- AI 心情小镇:独立沉浸(多从首页/运营进入)· 约 6 位虚拟倾诉师 · OCR/情感识别 · 角色「明朗」等
|
||||||
|
- 灵犀 / 小智:更接近模式或子场景,**不是**与测测 AI 同级的底部入口
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## STEP 2 — Feature Analysis
|
||||||
|
|
||||||
|
| 元素 | 作用 | 点击后 | VIP/次数 | 其它 |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| 测测AI Tab | 免费/限额 AI | 保持 AI 会话 | AI 次数/会员扩容 | — |
|
||||||
|
| 真人1v1 Tab | 达人咨询 | 达人列表或推荐咨询 | 付费 | 可从 AI 低摩擦切换 |
|
||||||
|
| 星盘标签 | 切换解读维度 | 维度面板【待真机】 | — | — |
|
||||||
|
| 对象名称 | 切换档案 | 档案选择器(自己/TA) | 需已建档 | 长按?【待真机】 |
|
||||||
|
| 深度思考 | 更高推理模式 | Toggle;可能耗更多额度 | 可能会员 | — |
|
||||||
|
| 灵魂伴侣 | 子场景 | 进入专项互动 | 视产品 | 可分享 🟡 |
|
||||||
|
| 引导问题 | 冷启动 | 自动填入并发送 | 计次 | — |
|
||||||
|
| 发送 | 提交 | Streaming 回复 | 额度不足 → 会员墙 | 防重复点击 🔵 |
|
||||||
|
| 下拉历史 | 翻旧消息 | 分页加载 | — | ≠ 长期记忆 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## STEP 3 — User Flow
|
||||||
|
|
||||||
|
### AI 主路径
|
||||||
|
|
||||||
|
```text
|
||||||
|
点「问」→ Loading 会话
|
||||||
|
→ 展示引导问题(星盘向)
|
||||||
|
→ 可选:切换对象为 TA(无档案则引导创建)
|
||||||
|
→ 可选:开深度思考
|
||||||
|
→ 发送 → Streaming
|
||||||
|
→ 可切换「真人1v1」升单
|
||||||
|
```
|
||||||
|
|
||||||
|
### 失败 / 边界
|
||||||
|
|
||||||
|
| 场景 | 处理 |
|
||||||
|
|---|---|
|
||||||
|
| 无额度 | VIPLocked / 看广告?【待真机】 |
|
||||||
|
| 敏感内容 | 拒答 + 转介真人/热线 🔵 |
|
||||||
|
| 超时 | 重试气泡 |
|
||||||
|
| 对象无星盘数据 | 引导补全出生信息 |
|
||||||
|
| 中重度心理危机 | 明确边界文案 + 转介 🔵 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## STEP 4 — 状态机
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
stateDiagram-v2
|
||||||
|
[*] --> Loading
|
||||||
|
Loading --> IdleEmpty: 新会话
|
||||||
|
Loading --> IdleWithHistory: 有历史
|
||||||
|
IdleEmpty --> Streaming: 发送/点引导
|
||||||
|
IdleWithHistory --> Streaming
|
||||||
|
Streaming --> IdleWithHistory: 完成
|
||||||
|
Streaming --> Failed: 错误
|
||||||
|
Failed --> Streaming: 重试
|
||||||
|
IdleWithHistory --> LoginRequired
|
||||||
|
IdleWithHistory --> VIPLocked: 额度用尽
|
||||||
|
IdleWithHistory --> HumanRail: 切真人1v1
|
||||||
|
```
|
||||||
|
|
||||||
|
状态枚举:Init · Loading · IdleEmpty · IdleWithHistory · Streaming · Failed · Retrying · Offline · LoginRequired · VIPLocked · HumanRail · PermissionDenied(麦克风)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 差异化要点(产品事实)✅ E1
|
||||||
|
|
||||||
|
1. AI **挂星盘档案**,非通用闲聊
|
||||||
|
2. **对象切换**把「了解自己」扩到「分析关系」
|
||||||
|
3. AI ‖ 真人 **同页双轨**
|
||||||
|
|
||||||
|
已知缺口(公开评价)✅ E1:偏被动触达;跨会话长期记忆不足;引导问题偏运势易被感知为「算命 AI」。
|
||||||
@@ -0,0 +1,57 @@
|
|||||||
|
# 04 · Tab「在线」逆向设计(达人 Marketplace)
|
||||||
|
|
||||||
|
> Evidence: ✅ E1 双边平台描述 · 列表 UI 细节 🟡【待真机】
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## STEP 1 — UI Analysis
|
||||||
|
|
||||||
|
| 区域 | 元素 | 证据 |
|
||||||
|
|---|---|---|
|
||||||
|
| 顶栏 | 搜索达人 · 筛选(领域/价格/好评) | 🟡 E6 |
|
||||||
|
| 运营位 | 推荐达人 Banner | 🟡 E6 |
|
||||||
|
| 列表卡片 | 头像 · 昵称 · 领域标签(星座/塔罗/命理/情感)· 评分 · 价格起 · 在线状态 | ✅ E1 类型 + 🟡 UI |
|
||||||
|
| 详情页 | 简介 · 服务项(文字/语音/连麦)· 评价 · 下单 CTA | ✅ E1 |
|
||||||
|
| 会话页 | 聊天/通话 UI · 倒计时/计费 | 🟡 E6 |
|
||||||
|
|
||||||
|
专家类型 ✅ E1:星座专家 · 塔罗师 · 命理师 · 心理/情感达人。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## STEP 2 — Feature Analysis
|
||||||
|
|
||||||
|
| 元素 | 点击 | 支付 | 评价 | 举报 |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| 达人卡 | 详情 | — | — | — |
|
||||||
|
| 文字咨询 | 下单→会话 | 是 | 结束后 | 是 🔵 |
|
||||||
|
| 语音/连麦 | 权限+下单 | 是 | 是 | 是 🔵 |
|
||||||
|
| 收藏达人 | Toggle | — | — | — 🟡 |
|
||||||
|
| 筛选排序 | 刷新列表 | — | — | — |
|
||||||
|
|
||||||
|
撮合:推荐排序 · 平台抽成 ✅ E1。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## STEP 3 — User Flow
|
||||||
|
|
||||||
|
```text
|
||||||
|
在线 → 浏览/搜索/筛选 → 达人详情
|
||||||
|
→ 选服务方式 → 创建订单 → 支付
|
||||||
|
→ 等待接单 → 服务中 → 结束 → 评价 → 复购
|
||||||
|
失败:支付取消/失败;达人拒单;超时退款;权限拒绝麦克风
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## STEP 4 — 状态机(订单视角)
|
||||||
|
|
||||||
|
Created → Paying → Paid → Matched → InService → Completed → Reviewed
|
||||||
|
旁路:Cancelled · Refunding · Refunded · Dispute
|
||||||
|
|
||||||
|
前端页映射:列表 Loaded/Empty · 详情 · Checkout · Waiting · Chatting · Call · Rate。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 达人供给运营(后台推导)🔵
|
||||||
|
|
||||||
|
入驻审核 · 培训激励 · 测测达人版工具 · 服务质量监控 · 分佣配置。
|
||||||
@@ -0,0 +1,61 @@
|
|||||||
|
# 05 · Tab「我的」逆向设计
|
||||||
|
|
||||||
|
> Evidence: ✅ E1 资产分层 · 菜单项 🟡【待真机补全文案】
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## STEP 1 — UI Analysis
|
||||||
|
|
||||||
|
| 区域 | 元素 | 证据 |
|
||||||
|
|---|---|---|
|
||||||
|
| 头部 | 头像 · 昵称 · 会员标识 · 编辑资料 | ✅ E1 账号体系 |
|
||||||
|
| 资产摘要 | 会员状态 · AI 剩余次数 · 积分/等级 🟡 | ✅ E1 + 🟡 |
|
||||||
|
| 功能列表 | 生命档案 · 测试/报告库 · AI 对话历史 · 订单 · 会员中心 · 收藏 · 设置 · 客服 | ✅ E1 §5 + 🔵 |
|
||||||
|
| 其它 | 达人入驻入口? · 关于/协议 | 🟡 E6 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## STEP 2 — Feature Analysis
|
||||||
|
|
||||||
|
| 入口 | 作用 | 点击 | 编辑/删除 | VIP |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| 生命档案 | Self/Other 管理 | 列表/编辑 | 是 | — |
|
||||||
|
| 测试记录 | 历史量表 | 报告详情 | 可能删 | 深度报告 |
|
||||||
|
| 报告库 | 星盘/合盘/AI 报告 | 打开 | 收藏 | 解锁态 |
|
||||||
|
| AI 历史 | 会话列表 | 进「问」 | 删会话 | — |
|
||||||
|
| 会员中心 | 订阅管理 | 购买/管理自动续费 | — | — |
|
||||||
|
| 订单 | 咨询/商城/解锁 | 详情/退款入口 | — | — |
|
||||||
|
| 设置 | 账号安全/通知/隐私 | 子页 | 注销 | — |
|
||||||
|
| 分享邀请 | 裂变 | 邀请码/海报 | — | — 🟡 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## STEP 3 — User Flow
|
||||||
|
|
||||||
|
```text
|
||||||
|
我的 → 点档案 → 编辑生日/关系
|
||||||
|
我的 → 会员 → 选套餐 → 支付 → 权益生效
|
||||||
|
我的 → 订单 → 售后/发票【待真机】
|
||||||
|
失败:登录态丢失;支付中断;注销二次确认
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## STEP 4 — 状态机
|
||||||
|
|
||||||
|
GuestMine(引导登录)· Loading · Loaded · VIPActive · VIPExpired · Error
|
||||||
|
|
||||||
|
会员角标与首页权益 Tip 联动 🔵。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 会员定价前端展示(必须完整)✅ E1
|
||||||
|
|
||||||
|
| 套餐 | 价格 |
|
||||||
|
|---|---|
|
||||||
|
| 首月 | ¥9.9 |
|
||||||
|
| 续订月 | ¥25/月 |
|
||||||
|
| 连续包季 | ¥58/季(约 ¥19.3/月) |
|
||||||
|
| 连续包年 | ¥178/年(约 ¥14.8/月) |
|
||||||
|
|
||||||
|
权益文案:完整测评报告 · AI 次数扩展 · 专属内容 ·(历史含去广告)✅ E1。
|
||||||
@@ -0,0 +1,104 @@
|
|||||||
|
# 06 · 工具域:星座 · 星盘 · 合盘 · 运势
|
||||||
|
|
||||||
|
> Evidence: ✅ E1/E2 入口与合盘指数 · ✅ E3 盘型列表 · 社交合盘 🟡【待真机】
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## STEP 1 — 页面家族
|
||||||
|
|
||||||
|
| 页面 | 主要 UI | 证据 |
|
||||||
|
|---|---|---|
|
||||||
|
| 星座频道 | 十二星座列表/今日运势流 | ✅ E4 |
|
||||||
|
| 本命星盘 | 圆形星盘 · 行星列表 · 宫位 · 档案切换 · 添加档案 | ✅ E3 操作步骤 |
|
||||||
|
| 盘型选择 | 多盘型工具(报道称对标多软件、约 20 种) | ✅ E3 |
|
||||||
|
| 运势 | 日/周/月/年(及一生类报告) | ✅ E3 |
|
||||||
|
| 缘分合盘 | 双人选择 · 指数 · 多盘型 Tab | ✅ E2/E3 |
|
||||||
|
| 合盘社交 | 附近的人 / 好友连线 | 🟡 E3/行业 |
|
||||||
|
|
||||||
|
### 合盘盘型(前端 Tab 级)✅ E3
|
||||||
|
|
||||||
|
| 盘型 | 说明(产品侧) |
|
||||||
|
|---|---|
|
||||||
|
| 比较盘 | 双盘叠合与跨盘相位 |
|
||||||
|
| 组合盘 | 中点关系盘 |
|
||||||
|
| 时空盘 | 时刻/坐标中点再排盘 |
|
||||||
|
| 马克斯盘(马克思盘) | 时空×本命中点视角 |
|
||||||
|
| 组合推运等 | 次限/推运变体 |
|
||||||
|
|
||||||
|
另:行运盘、三限盘、月亮返照等出现在星盘工具描述中 ✅ E3。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## STEP 2 — Feature Analysis
|
||||||
|
|
||||||
|
| 元素 | 作用 | 交互 | VIP |
|
||||||
|
|---|---|---|---|
|
||||||
|
| 档案切换 | 换本命主体 | 顶栏切换/添加 | — |
|
||||||
|
| 星盘图 | 可视化 | 点行星看释义 | 详解付费 |
|
||||||
|
| 相位表 | 关系动力 | 列表/点击 | 完整表会员 |
|
||||||
|
| 恋爱/友情/婚姻指数 | 缘分量化 | 结果页大数字 | 指数免费/解读付费 🟡 |
|
||||||
|
| 盘型 Tab | 切换算法视图 | 不重复支付同报告 🟡 | 深文案付费 |
|
||||||
|
| 推运日期 | 次限 as_of | 日期选择器 | — |
|
||||||
|
| 分享 | 裂变 | 海报/链接 | — |
|
||||||
|
| 附近的人 | 匹配合盘对象 | 定位授权 | 隐私开关 🔵 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## STEP 3 — User Flow
|
||||||
|
|
||||||
|
### 本命星盘
|
||||||
|
|
||||||
|
```text
|
||||||
|
首页「星盘」→ 默认本人盘
|
||||||
|
→ 右上切换/添加他人档案(生日等)
|
||||||
|
→ 返回切换查看
|
||||||
|
→ 可选盘型/运势/报告解锁
|
||||||
|
```
|
||||||
|
|
||||||
|
### 缘分合盘
|
||||||
|
|
||||||
|
```text
|
||||||
|
首页「缘分合盘」→ 选档案 A/B(或快速建档)
|
||||||
|
→ 生成指数 + 默认比较盘
|
||||||
|
→ Tab 切换组合/时空/马克斯/配对/推运
|
||||||
|
→ 深度解锁 / 分享
|
||||||
|
```
|
||||||
|
|
||||||
|
### 失败
|
||||||
|
|
||||||
|
缺出生时 → 上升/宫位降级提示;定位拒绝 → 仅手动选城;支付失败保留摘要。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## STEP 4 — 状态机(合盘报告页)
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
stateDiagram-v2
|
||||||
|
[*] --> Form
|
||||||
|
Form --> Computing: 提交
|
||||||
|
Computing --> SummaryFree: 成功
|
||||||
|
Computing --> Error
|
||||||
|
SummaryFree --> DeepLocked
|
||||||
|
DeepLocked --> DeepOpen: 支付/会员
|
||||||
|
SummaryFree --> ChartTabSwitch
|
||||||
|
ChartTabSwitch --> SummaryFree
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 数据/算法面(前端依赖)
|
||||||
|
|
||||||
|
| 输入 | 字段 |
|
||||||
|
|---|---|
|
||||||
|
| BirthInfo | date · time · place · lat/lng · tz |
|
||||||
|
| Chart | planets[] · houses · aspects · asc |
|
||||||
|
| SynastryReport | indices · charts{} · as_of |
|
||||||
|
|
||||||
|
星历与宫位制:生产级需 Swiss Ephemeris 等 🔵;Whole Sign / Placidus 等切换【待真机】。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 愈心谷对齐
|
||||||
|
|
||||||
|
已实现方向:`star-profile.md` · Synastry 五主盘+推运 · 附近/邀请。
|
||||||
|
测测「约 20 种盘」未全部落地处:Spec 中保留完整清单,实现按分期标注「未交付」而非删除。
|
||||||
@@ -0,0 +1,115 @@
|
|||||||
|
# 07 · 工具域:测评 · 塔罗 · 沙盘 · 心情小镇 · 趣味玩法
|
||||||
|
|
||||||
|
> Evidence: ✅ E1/E2 · 流程细节 🟡/🔵
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## A. MBTI / I人E人 ✅ E1/E2
|
||||||
|
|
||||||
|
### STEP 1–2
|
||||||
|
|
||||||
|
| UI | 交互 |
|
||||||
|
|---|---|
|
||||||
|
| 介绍页 · 开始测 | 进入答题 |
|
||||||
|
| 题目卡 · 进度条 | 单选;可返回上一题 🟡 |
|
||||||
|
| 结果页:16 型标签 · 维度图 · 解读 | 分享强引导;邀请好友对照关系类型 ✅ E2 |
|
||||||
|
| 付费墙 | 完整报告 |
|
||||||
|
|
||||||
|
学术背书:心言心理组修订量表、期刊《心理学进展》✅ E1(专业性证据,非 UI)。
|
||||||
|
|
||||||
|
### Flow
|
||||||
|
|
||||||
|
```text
|
||||||
|
开始 → N 题 → 提交 → 计分 Loading → 结果 → 分享/解锁/再测/双人对照
|
||||||
|
```
|
||||||
|
|
||||||
|
状态:Answering · Submitting · ResultFree · ResultLocked · ShareSheet。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## B. AI 玩法广场 ✅ E1
|
||||||
|
|
||||||
|
UGC 小应用集市(非官方智能体矩阵)。
|
||||||
|
|
||||||
|
| UI | 说明 |
|
||||||
|
|---|---|
|
||||||
|
| 列表 | 名 · 热度 · 创作者 |
|
||||||
|
| 应用页 | 互动表单/对话 → 结果 |
|
||||||
|
| 创作入口 | 达人/用户「手搓」【待真机是否 C 端开放】 |
|
||||||
|
|
||||||
|
示例应用:SBTI、答案之书、三生三世你和 Ta、灵魂伴侣。
|
||||||
|
|
||||||
|
审核:上架前内容审核 🔵;违规下架。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## C. 3D 心理沙盘 ✅ E1/E2
|
||||||
|
|
||||||
|
| UI | 交互 |
|
||||||
|
|---|---|
|
||||||
|
| 3D 场景画布 | 拖放沙具/排序 |
|
||||||
|
| 主题模板 | 职场焦虑等场景引导 |
|
||||||
|
| AI 投射分析 | 生成解读 |
|
||||||
|
| 保存/分享 | 场景快照 |
|
||||||
|
|
||||||
|
数据:超 1200 万用户口径 ✅ E1。权限:可能陀螺仪/性能降级 🔵。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## D. AI 心情小镇 ✅ E1
|
||||||
|
|
||||||
|
| UI | 交互 |
|
||||||
|
|---|---|
|
||||||
|
| 角色选择 | ~6 人设(知心姐姐、理性学长、明朗…) |
|
||||||
|
| 对话/互动 | OCR · 情感识别 |
|
||||||
|
| 沉浸场景 | 小镇视觉 |
|
||||||
|
|
||||||
|
边界:轻度情绪;中重度转真人/专业机构 ✅ E1。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## E. 塔罗 ✅ E3
|
||||||
|
|
||||||
|
抽牌(单牌/三牌/阵)→ AI/达人解读 → 可提问;可能拍照识牌 🟡。
|
||||||
|
结果页:牌义 · 组合 · 建议 · 付费扩展。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## F. 命理工具箱 ✅ E3
|
||||||
|
|
||||||
|
八字(四柱/五行/大运/流年)· 紫微 · 姓名五格 · 二十八宿 · 生命数字。
|
||||||
|
前端:表单(姓名/生日)→ 盘面/条文 → 解锁。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## G. 「更多」趣味测 ✅ E2
|
||||||
|
|
||||||
|
| 名称 | 用途 |
|
||||||
|
|---|---|
|
||||||
|
| 爱情树 | 依恋类型 |
|
||||||
|
| 幸运地图 | 幸运/桃花城市等 |
|
||||||
|
| pick 卡 | 趣味抽取 |
|
||||||
|
|
||||||
|
Flow 同轻量测评:介绍 → 互动 → 结果 → 分享。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## H. 每日心情 / 打卡 🟡 E1 留存叙述
|
||||||
|
|
||||||
|
入口可能在首页或陪伴场景;打卡日历 · 情绪曲线 · 驱动晚间打开(50% 用户 19:00 后 ✅ E1)。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 统一测评状态机
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
stateDiagram-v2
|
||||||
|
[*] --> Intro
|
||||||
|
Intro --> InProgress
|
||||||
|
InProgress --> Scoring
|
||||||
|
Scoring --> ResultTeaser
|
||||||
|
ResultTeaser --> Paywall
|
||||||
|
Paywall --> ResultFull
|
||||||
|
ResultTeaser --> Share
|
||||||
|
Scoring --> Error
|
||||||
|
```
|
||||||
@@ -0,0 +1,232 @@
|
|||||||
|
# 08 · 横切系统逆向(STEP 5–18)
|
||||||
|
|
||||||
|
> 支撑前端全功能的数据 / API / 后台 / 运营 / 安全推导
|
||||||
|
> 标记:无公开 UI 的条目多为 🟡/🔵,但**禁止省略整类**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## STEP 5 — 数据模型(核心对象)
|
||||||
|
|
||||||
|
| 对象 | 关键字段(类型) | 可空 | 默认 | 来源 | 缓存 | 索引 | 证据 |
|
||||||
|
|---|---|---|---|---|---|---|---|
|
||||||
|
| User | id UUID PK · phone · wx_openid · status · created_at | 部分 | active | 注册 | Redis session | phone unique | ✅ E1 |
|
||||||
|
| Profile | id · user_id · relation(self/other) · display_name · birth_date · birth_time · birth_place · geo_* · tags JSON | time/place 可空 | — | 建档 | 本地+服务端 | user_id | ✅ E1 |
|
||||||
|
| BirthInfo | 可内嵌 Profile | — | tz=CST+8 🟡 | — | — | — | 🟡 |
|
||||||
|
| AstrologyChart | profile_id · jd · planets JSON · houses JSON · system · version | — | — | 计算服务 | 按 profile+ver | profile_id | 🔵 |
|
||||||
|
| SynastryReport | id · profile_a · profile_b · indices JSON · charts JSON · as_of | — | — | 合盘 | 报告缓存 | (a,b) | ✅ E3 |
|
||||||
|
| TestDefinition | slug · title · questions JSON · scoring | — | published | CMS | CDN | slug | ✅ E1 MBTI |
|
||||||
|
| TestRecord | user_id · test_id · answers · result · share_code | — | — | 提交 | — | user_id | ✅ E2 |
|
||||||
|
| AIConversation | id · user_id · profile_ctx_id · mode · messages | — | — | 问 | 热数据 | user_id | ✅ E1 |
|
||||||
|
| AIQuota | user_id · remaining · period | — | 免费额 | 会员 | Redis | user_id | ✅ E1 |
|
||||||
|
| Expert | id · domains[] · price_text · price_voice · score · online | — | — | 达人平台 | 列表缓存 | domain | ✅ E1 |
|
||||||
|
| ConsultOrder | id · user_id · expert_id · mode · amount · status | — | created | 下单 | — | status | ✅ E1 |
|
||||||
|
| Membership | user_id · plan · status · expires_at · auto_renew | — | — | 订阅 | — | expires | ✅ E1 |
|
||||||
|
| Order | id · kind(membership/unlock/consult/shop) · amount_cents · status | — | — | 支付 | — | user_id | ✅ E1 |
|
||||||
|
| Notification | id · user_id · channel · type · payload · read_at | — | — | 推送/站内 | — | user_id,read | ✅ E4 |
|
||||||
|
| PlazaApp | id · creator_id · title · heat · status | — | pending | UGC | 热榜 | heat | ✅ E1 |
|
||||||
|
| Favorite | user_id · target_type · target_id | — | — | 收藏 | — | uniq | 🟡 |
|
||||||
|
| Coupon | id · rules JSON | — | — | 运营 | — | — | 🔵 |
|
||||||
|
| OperationLog | actor · action · meta | — | — | 后台 | 冷存 | time | 🔵 |
|
||||||
|
| ABAssignment | user_id · exp_key · bucket | — | — | 配置 | Redis | — | 🔵 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## STEP 6 — 数据库设计(表清单)
|
||||||
|
|
||||||
|
必表(前端可感知数据):
|
||||||
|
|
||||||
|
`users` · `device_identities` · `profiles` · `growth_reports` / `synastry_reports` · `test_definitions` · `test_records` · `ai_conversations` · `ai_messages` · `ai_quotas` · `experts` · `consult_orders` · `memberships` · `orders` · `payments` · `notifications` · `plaza_apps` · `favorites` · `banners` · `feature_flags` · `audit_logs`
|
||||||
|
|
||||||
|
每表要求:PK UUID · `created_at`/`updated_at` · 软删 `deleted_at` · 外键 ON DELETE 策略明确 🔵。
|
||||||
|
|
||||||
|
合盘邀请示例:`synastry_invites(token unique, host_profile_id, expires_at, report_id)` 🔵(愈心谷已落地相近结构)。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## STEP 7 — API Reverse Engineering(可开发级草案)
|
||||||
|
|
||||||
|
> Path 为 🔵 工程命名;真实测测 Path【待抓包】
|
||||||
|
|
||||||
|
| Method | Path | 权限 | Request | Response 要点 | 错误码 |
|
||||||
|
|---|---|---|---|---|---|
|
||||||
|
| POST | /auth/login | 公网 | phone/wx | token · user | 401 |
|
||||||
|
| GET | /profiles | 登录 | — | items[] | — |
|
||||||
|
| POST | /profiles | 登录 | birth_* · relation | profile | 400 |
|
||||||
|
| PATCH | /profiles/:id | 所有者 | patch | profile | 404 |
|
||||||
|
| POST | /tests/:slug/submit | 登录 | answers | record_teaser · record_id | 429 |
|
||||||
|
| GET | /reports/:id | 所有者 | — | summary · detail? | 403 detail |
|
||||||
|
| POST | /astrology/natal | 登录 | profile_id | chart | 400 |
|
||||||
|
| POST | /astrology/synastry | 登录 | a · b · as_of | report | 400 |
|
||||||
|
| GET | /astrology/nearby | 登录+geo | lat,lng,r | items | 403 |
|
||||||
|
| POST | /ai/chat | 登录+额度 | message · profile_ctx · deep | stream SSE | 402 额度 |
|
||||||
|
| GET | /ai/conversations | 登录 | cursor | list | — |
|
||||||
|
| GET | /experts | 登录 | filter | list | — |
|
||||||
|
| POST | /consult/orders | 登录 | expert · mode | order | 402 |
|
||||||
|
| POST | /consult/orders/:id/pay | 登录 | channel | pay_params | 409 |
|
||||||
|
| GET | /membership/me | 登录 | — | plan · expires | — |
|
||||||
|
| POST | /orders | 登录 | kind · plan/report | order_id | — |
|
||||||
|
| GET | /messages | 登录 | cursor | items · unread | — |
|
||||||
|
| POST | /messages/:id/read | 登录 | — | ok | — |
|
||||||
|
| GET | /plaza/apps | 登录 | sort=heat | apps | — |
|
||||||
|
| POST | /plaza/apps/:id/run | 登录 | input | result | 403 审核 |
|
||||||
|
|
||||||
|
RateLimit:AI/支付严格限流;图表计算按用户 QPS 🔵。
|
||||||
|
Cache:星盘按 profile+ephemeris_ver;广场热榜 Redis ZSET;Banner CDN。
|
||||||
|
Retry:幂等键用于支付与咨询下单。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## STEP 8 — 后台运营系统
|
||||||
|
|
||||||
|
| 模块 | 能力 | 证据 |
|
||||||
|
|---|---|---|
|
||||||
|
| Banner/运营位 | 首页头图、弹窗、闪屏 | 🔵 |
|
||||||
|
| 推荐位 | 达人/测试/文章排序 | 🟡 |
|
||||||
|
| 内容审核 | 广场 UGC、社区帖、达人资质 | 🔵 |
|
||||||
|
| 用户管理 | 封禁、注销、投诉 | 🔵 |
|
||||||
|
| 订单/退款 | 咨询与会员 | ✅ E1 商业 |
|
||||||
|
| 会员配置 | 价格、权益、首月优惠 | ✅ E1 |
|
||||||
|
| 活动配置 | 裂变、优惠券 | 🟡 |
|
||||||
|
| 推送 | 模板、人群包 | 🔵 |
|
||||||
|
| 统计看板 | DAU、转化漏斗、AI 次数 | 🔵 |
|
||||||
|
| AB / 配置中心 | 引导问题文案、价格实验 | 🔵 |
|
||||||
|
| 达人运营 | 入驻审核、分佣、培训 | ✅ E1 达人版 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## STEP 9 — 权限矩阵
|
||||||
|
|
||||||
|
| 角色 | 能 | 不能 |
|
||||||
|
|---|---|---|
|
||||||
|
| 游客 | 浏览部分首页、部分测评 | AI 深度、咨询、发帖 |
|
||||||
|
| 登录用户 | 档案、基础 AI 次数、下单 | 未购深度 detail |
|
||||||
|
| VIP/会员 | 扩容 AI、完整报告、专属内容 | 后台 |
|
||||||
|
| SVIP | 🟡 若存在更高等级 | — |
|
||||||
|
| 达人 | 接单、达人工具 | 改平台分佣 |
|
||||||
|
| 运营 | CMS、活动、推荐 | 直接改支付流水 |
|
||||||
|
| 审核员 | 通过/驳回 UGC/达人 | 财务 |
|
||||||
|
| 客服 | 工单、补发权益 | 删库 |
|
||||||
|
| 管理员 | 配置与账号 | — |
|
||||||
|
| 超管 | 全量 | — |
|
||||||
|
|
||||||
|
前端:`LoginRequired` · `VIPLocked` · `PermissionDenied`。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## STEP 10 — 支付系统
|
||||||
|
|
||||||
|
状态:Created → Paying → Paid / Failed / Cancelled →(退款)Refunding → Refunded
|
||||||
|
场景:重复支付防重 · 补单对账 · 咨询未接单自动退 · 风控限额 · 发票 🔵
|
||||||
|
渠道:IAP / 微信 / 支付宝 🟡【待真机】
|
||||||
|
前端:收银台 · 结果页 · 订单详情入口(我的)。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## STEP 11 — 消息系统
|
||||||
|
|
||||||
|
| 通道 | 用途 |
|
||||||
|
|---|---|
|
||||||
|
| Push | 达人回复、会员到期 |
|
||||||
|
| 站内信 | 消息 Tab |
|
||||||
|
| 短信 | 登录验证码 |
|
||||||
|
| 邮件 | 可选账单 🔵 |
|
||||||
|
| 角标 | Tab 未读聚合 |
|
||||||
|
|
||||||
|
策略:免打扰时段 · 营销推送开关 · AI 主动触达(公开称尚未强做)✅ E1。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## STEP 12 — 埋点
|
||||||
|
|
||||||
|
| 事件 | 触发 |
|
||||||
|
|---|---|
|
||||||
|
| page_view | 各 Tab/工具 |
|
||||||
|
| home_grid_click | 宫格 |
|
||||||
|
| test_start / test_complete / test_share | 测评 |
|
||||||
|
| ask_send / ask_deep_toggle / ask_switch_profile | 问 |
|
||||||
|
| ask_switch_human | 转真人 |
|
||||||
|
| synastry_complete / chart_tab_switch | 合盘 |
|
||||||
|
| expert_view / consult_pay | 在线 |
|
||||||
|
| membership_pay | 会员 |
|
||||||
|
| plaza_app_open | 广场 |
|
||||||
|
| error_api | 异常 |
|
||||||
|
|
||||||
|
漏斗:曝光 → 建档 → AI → 会员 → 咨询。停留时长、次日留存 🔵。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## STEP 13 — 配置系统
|
||||||
|
|
||||||
|
| 项 | 后台可配 | 写死 | 远程/灰度/AB |
|
||||||
|
|---|---|---|---|
|
||||||
|
| 宫格顺序/显隐 | ✓ | — | 灰度 |
|
||||||
|
| AI 引导问题 | ✓ | — | 按来源 AB ✅ E1 建议 |
|
||||||
|
| 会员价格 | ✓ | — | AB |
|
||||||
|
| 星历版本 | — | 逻辑 | 远程 flag |
|
||||||
|
| 审核词库 | ✓ | — | — |
|
||||||
|
| 功能开关(沙盘) | ✓ | — | 灰度 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## STEP 14 — 缓存策略
|
||||||
|
|
||||||
|
| 层 | 内容 |
|
||||||
|
|---|---|
|
||||||
|
| 本地 | 档案草稿、会话草稿、最近报告摘要 |
|
||||||
|
| Redis | Session、AI 额度、热榜、限流 |
|
||||||
|
| CDN | 图片、静态运营配置 |
|
||||||
|
| 计算缓存 | 同档案星盘 TTL |
|
||||||
|
| 分页 | 信息流 cursor |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## STEP 15 — 异常处理(前端必达)
|
||||||
|
|
||||||
|
断网 · 弱网 · 超时 · 重复点击(按钮 loading)· Token 失效 · 本地数据损坏清缓存 · 强制升级 · 审核失败文案 · 404 资源 · 支付结果未知查单 · SSE 中断续传 🔵。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## STEP 16 — 日志
|
||||||
|
|
||||||
|
用户行为(隐私脱敏)· 前端错误 JS · API access · 支付 · 审核 · 运营操作 · 安全(登录失败/风控)🔵。
|
||||||
|
保留与销毁策略合规 🔵。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## STEP 17 — 安全
|
||||||
|
|
||||||
|
| 项 | 要求 |
|
||||||
|
|---|---|
|
||||||
|
| 权限 | 服务端强制 detail 剥离(不仅藏 UI) |
|
||||||
|
| 注入/XSS | 内容安全渲染 |
|
||||||
|
| CSRF/重放 | 支付与关键写接口 |
|
||||||
|
| 验证码 | 登录/敏感操作 |
|
||||||
|
| 风控 | 刷单、恶意咨询 |
|
||||||
|
| 设备 | device_key / 绑定 |
|
||||||
|
| 隐私 | geo 默认不可见;档案分享最小化 |
|
||||||
|
| 心理边界 | 危机话术与转介 |
|
||||||
|
|
||||||
|
遵守应用商店与网信/心理相关合规 🔵。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## STEP 18 — 可扩展性
|
||||||
|
|
||||||
|
| 方向 | 策略 |
|
||||||
|
|---|---|
|
||||||
|
| 新盘型 | charts 插件注册,API 加 mode |
|
||||||
|
| 新测评 | TestDefinition 配置化 |
|
||||||
|
| 新 AI 子场景 | Ask 内 slot,避免新 Tab |
|
||||||
|
| 多端 | 同一 BFF;小程序裁剪 Marketplace |
|
||||||
|
| API 兼容 | summary schema version 字段 |
|
||||||
|
| 模块解耦 | 计算服务与业务 API 分离 |
|
||||||
|
| 硬件(巴布) | 独立产品线,账号体系统一 ✅ E1 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Completeness 自检(STEP 5–18)
|
||||||
|
|
||||||
|
- [x] 数据模型 / 库表 / API 草案
|
||||||
|
- [x] 后台 / 权限 / 支付 / 消息 / 埋点
|
||||||
|
- [x] 配置 / 缓存 / 异常 / 日志 / 安全 / 扩展
|
||||||
|
- [ ] 真实抓包字段级对齐【待补证】
|
||||||
@@ -0,0 +1,90 @@
|
|||||||
|
# 测测 App 前端逆向工程设计文档(V1.0)
|
||||||
|
|
||||||
|
> Status: `Active` · Method: [reverse-engineering-spec.md](../../../design/reverse-engineering-spec.md)
|
||||||
|
> Scope: **前端可见能力 + 为支撑前端所必需的后台/数据/运营推导**
|
||||||
|
> 目标:Production / Enterprise / Feature Complete 级设计输入(非 Demo)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 0. 任务声明
|
||||||
|
|
||||||
|
| 项 | 内容 |
|
||||||
|
|---|---|
|
||||||
|
| 身份 | Senior Reverse Engineering Architect |
|
||||||
|
| 目标 App | 测测(CeCe / 测测星盘,心言集团) |
|
||||||
|
| 方法 | 逆向工程,非「设计一个类似 App」 |
|
||||||
|
| 禁止 | Demo · MVP 终态 · 「略 / TODO / 以后再做」糊弄 |
|
||||||
|
|
||||||
|
**落地到愈心谷时**:能力可完整对标;用户可见命名与禁词服从 [`lexicon.md`](../../lexicon.md);禁止自称「测测」、照搬商标视觉。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. 证据来源总表(Evidence First)
|
||||||
|
|
||||||
|
| ID | 来源 | 类型 | 日期/版本线索 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| E1 | [人人都是产品经理 · 测测深度体验报告](https://www.woshipm.com/evaluating/6391148.html) | ✅ UI/行为证据(含实测截图描述) | 2026-05-09 |
|
||||||
|
| E2 | [中华网 · 测测功能图谱](https://tech.china.com/articles/20250417/202504171661508.html) | ✅ 行为/产品证据 + 🟡 运营口径 | 2025-04 |
|
||||||
|
| E3 | 应用商店/下载站功能介绍(星盘工具列表等) | ✅ 功能列表证据(版本可能滞后) | ~10.x 描述 |
|
||||||
|
| E4 | 本仓 [`cece-feature-map.md`](../../cece-feature-map.md) | 🟡 既有归纳 | 持续 |
|
||||||
|
| E5 | 本仓 [`apps/docs/analysis/cece-teardown.md`](../../../../apps/docs/analysis/cece-teardown.md) | 🟡 映射分析 | 历史 |
|
||||||
|
| E6 | 行业惯例 / 同类 App | 🟡 推断 | — |
|
||||||
|
| E7 | 工程完整性补充 | 🔵 工程建议 | — |
|
||||||
|
| E8 | 安卓模拟器 AVD `YuXinGu_API34` + APK 10.50.0 截图/UI dump | ✅ 真机 UI 证据 | 2026-08-03 |
|
||||||
|
|
||||||
|
> **局限**:无未公开 DAU/后台;HTTPS 抓包未做。E8 明细见 [complete-design/evidence-20260803.md](complete-design/evidence-20260803.md)。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. 文档地图
|
||||||
|
|
||||||
|
| 文档 | 内容 | Workflow 覆盖 |
|
||||||
|
|---|---|---|
|
||||||
|
| [00-overview.md](00-overview.md) | L0 IA · 全功能清单 · 全局状态 · 导航 | STEP 1–4 全局 |
|
||||||
|
| [01-tab-home.md](01-tab-home.md) | 首页(宫格/信息流/建档/玩法广场) | STEP 1–4 |
|
||||||
|
| [02-tab-message.md](02-tab-message.md) | 消息 | STEP 1–4 |
|
||||||
|
| [03-tab-ask.md](03-tab-ask.md) | 「问」测测 AI + 真人 1v1 | STEP 1–4 |
|
||||||
|
| [04-tab-online.md](04-tab-online.md) | 在线(达人 Marketplace) | STEP 1–4 |
|
||||||
|
| [05-tab-mine.md](05-tab-mine.md) | 我的 | STEP 1–4 |
|
||||||
|
| [06-tools-astrology.md](06-tools-astrology.md) | 星座 · 星盘 · 合盘 · 运势 | STEP 1–4 + 算法面 |
|
||||||
|
| [07-tools-tests-psych.md](07-tools-tests-psych.md) | MBTI · 塔罗 · 沙盘 · 心情小镇 · 趣味测 | STEP 1–4 |
|
||||||
|
| [08-systems.md](08-systems.md) | 数据/库/API/后台/权限/支付/消息/埋点/配置/缓存/异常/日志/安全/扩展 | STEP 5–18 |
|
||||||
|
| **[complete-design/](complete-design/README.md)** | **完整产品设计包(Design Complete)** — 实现与模拟器校验前的唯一前端设计输入 | 定稿升格 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. Completeness Checklist(套件级)
|
||||||
|
|
||||||
|
- [x] 五 Tab 页面拆解
|
||||||
|
- [x] 首页宫格与「更多」工具域
|
||||||
|
- [x] AI / 达人双轨
|
||||||
|
- [x] 星盘与合盘工具面
|
||||||
|
- [x] 测评 / 沉浸体验
|
||||||
|
- [x] 横切系统 STEP 5–18
|
||||||
|
- [ ] 【待真机补证】逐按钮热区坐标与最新版 UI 差分
|
||||||
|
- [ ] 【待抓包补证】真实 API Path / 字段级 Response
|
||||||
|
|
||||||
|
套件可结束条件:上表「真机/抓包」两项未完成时,仍可作为 **Feature Complete 设计底稿**;实现前须补证据或接受 🟡/🔵 风险。
|
||||||
|
|
||||||
|
**完整设计定稿:** [complete-design/](complete-design/README.md) 已将 🟡/🔵 升格为设计定稿(D);真机/模拟器差分按 [99-emulator-validation.md](complete-design/99-emulator-validation.md) 回填。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. 愈心谷映射入口
|
||||||
|
|
||||||
|
| 测测前端域 | 愈心谷当前落地 | Spec |
|
||||||
|
|---|---|---|
|
||||||
|
| 档案 / 了解 TA | Profile | `profile.md` |
|
||||||
|
| 问 / AI | Ask | `ask.md` |
|
||||||
|
| 星座 / 星盘 / 合盘 | Star + Synastry | `star-profile.md` |
|
||||||
|
| 测评 | Explore / Scale | `explore-test.md` |
|
||||||
|
| 会员 | Membership | `membership.md` |
|
||||||
|
| 消息 / 在线达人 | 分期后置 | feature-map `[P3]/`/`[No]` |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. 维护
|
||||||
|
|
||||||
|
- 版本变更:在各文档顶部追加「差分日志」
|
||||||
|
- 真机补证:把 ✅ 行从 E1 升级为「真机 YYYY-MM-DD + 版本号」
|
||||||
|
- 与 [`cece-feature-map.md`](../../cece-feature-map.md) 保持 L0 一致;冲突时以本套件 + 更新证据为准
|
||||||
@@ -0,0 +1,150 @@
|
|||||||
|
# 00 · 设计圣经(全局)
|
||||||
|
|
||||||
|
> Design ID: `CECE-FE-BIBLE-V1` · 定稿 · 待模拟器校验项见文末
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. 产品一句话
|
||||||
|
|
||||||
|
以趣味测评与星盘档案为入口,以「问」Tab 级 AI(挂档案)为战略核心,以达人咨询为高客单转化,以会员订阅为主营收的泛心理情感陪伴 App。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. 信息架构(冻结)
|
||||||
|
|
||||||
|
### 2.1 底部五 Tab(D 定稿)
|
||||||
|
|
||||||
|
| 序 | Tab | 路由 key | 视觉(✅ E8 10.50.0) | 战略 |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| 1 | 首页 | `home` | 标准 | 发现与工具分发 |
|
||||||
|
| 2 | 消息 | `message` | 标准 + 未读数字角标 | 触达与会话入口 |
|
||||||
|
| 3 | **问** | `ask` | **中央大圆突出 + AI 角标** | 唯一 Tab 级官方 AI |
|
||||||
|
| 4 | 在线 | `online` | 标准 + 运营角标「限免」(可配) | 达人 Marketplace |
|
||||||
|
| 5 | 我的 | `mine` | 标准;游客文案「未登录」 | 资产与商业 |
|
||||||
|
|
||||||
|
规则:
|
||||||
|
- 禁止再增加第 6 个主 Tab。
|
||||||
|
- 灵犀/小智/灵魂伴侣/心情小镇 **不得**升为底部 Tab;一律挂「问」或首页宫格。
|
||||||
|
- 「问」内顶栏固定双轨:`测测AI` | `真人1v1`。
|
||||||
|
|
||||||
|
### 2.2 全局导航栈
|
||||||
|
|
||||||
|
```text
|
||||||
|
RootTabNavigator
|
||||||
|
├── HomeStack
|
||||||
|
├── MessageStack
|
||||||
|
├── AskStack ← 中央按钮切到此栈
|
||||||
|
├── OnlineStack
|
||||||
|
└── MineStack
|
||||||
|
|
||||||
|
Modal 层:Login · MembershipPaywall · ShareSheet · SystemPermission · ForceUpdate
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. 全局组件目录(前端必须实现)
|
||||||
|
|
||||||
|
| 组件 | 职责 | 出现位置 |
|
||||||
|
|---|---|---|
|
||||||
|
| `AppTabBar` | 五 Tab;问中间凸起 | 全局 |
|
||||||
|
| `ProfileSwitcher` | 自己/TA 档案切换 | 问、星盘、合盘 |
|
||||||
|
| `BirthArchiveForm` | 生日/时/地/关系类型 | 建档、了解TA |
|
||||||
|
| `PaywallSheet` | 会员/单次解锁 | 报告、AI 额度 |
|
||||||
|
| `SharePosterSheet` | 结果卡分享 | 测评、合盘、星盘 |
|
||||||
|
| `NetworkBanner` | 离线/弱网 | 全局 |
|
||||||
|
| `EmptyState` | 空列表 CTA | 消息、订单、档案 |
|
||||||
|
| `ErrorRetry` | 失败重试 | 全局 |
|
||||||
|
| `StreamingBubble` | AI 流式回复 | 问 |
|
||||||
|
| `ExpertCard` | 达人列表项 | 在线 |
|
||||||
|
| `ChartWheel` | 圆形星盘 | 星盘/合盘 |
|
||||||
|
| `IndexScoreRow` | 恋爱/友情/婚姻指数 | 合盘 |
|
||||||
|
| `GridIcon` | 首页宫格 | 首页 |
|
||||||
|
| `FeedCard` | 信息流卡片 | 首页 |
|
||||||
|
| `PlazaAppCard` | 玩法广场项 | 广场 |
|
||||||
|
| `UnreadBadge` | 角标 | 消息 Tab |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. 全局状态机(App)
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
stateDiagram-v2
|
||||||
|
[*] --> ColdStart
|
||||||
|
ColdStart --> Bootstrap
|
||||||
|
Bootstrap --> GuestSession
|
||||||
|
Bootstrap --> AuthedSession
|
||||||
|
GuestSession --> AuthModal: gated action
|
||||||
|
AuthModal --> AuthedSession: success
|
||||||
|
AuthedSession --> Offline
|
||||||
|
Offline --> AuthedSession
|
||||||
|
AuthedSession --> ForceUpdate: version low
|
||||||
|
AuthedSession --> Paywall: vip gate
|
||||||
|
Paywall --> AuthedSession
|
||||||
|
```
|
||||||
|
|
||||||
|
全局枚举:`ColdStart` · `Bootstrap` · `GuestSession` · `AuthedSession` · `AuthModal` · `Offline` · `ForceUpdate` · `Paywall` · `FatalError`。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. 设计令牌(结构约定 · 非抄视觉品牌)
|
||||||
|
|
||||||
|
> 模拟器采集后可替换为实测色值;此处只定 **语义角色**。
|
||||||
|
|
||||||
|
| Token | 角色 |
|
||||||
|
|---|---|
|
||||||
|
| `--color-brand` | 主操作/问 Tab 强调 |
|
||||||
|
| `--color-ai` | AI 标识色 |
|
||||||
|
| `--color-vip` | 会员金色系 |
|
||||||
|
| `--color-danger` | 错误/删除 |
|
||||||
|
| `--color-surface` | 卡片底 |
|
||||||
|
| `--color-feed-bg` | 信息流底 |
|
||||||
|
| `--radius-card` | 12–16 |
|
||||||
|
| `--tab-ask-size` | 中央按钮直径 > 其它 Tab |
|
||||||
|
|
||||||
|
动效:Tab 切换 200ms;AI 流式打字;宫格按下缩放 0.96。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. 档案为中心的产品定律(D 定稿)
|
||||||
|
|
||||||
|
1. 所有深度解读默认绑定 **当前 Profile**。
|
||||||
|
2. 「问」必须支持切换到 **关系档案 TA**。
|
||||||
|
3. 首页持续引导「了解 TA」建档。
|
||||||
|
4. 合盘/匹配最少需要 2 份档案(可快速创建)。
|
||||||
|
5. 无出生时:上升/宫位降级提示,不阻断太阳解读。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 7. 商业门禁(前端表现)
|
||||||
|
|
||||||
|
| 能力 | 游客 | 登录免费 | 会员/深购 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| 浏览首页/部分测评 | ✓ | ✓ | ✓ |
|
||||||
|
| 完整测评报告 | teaser | teaser | ✓ |
|
||||||
|
| AI 对话 | 登录后有限次 | 有限次 | 扩容 |
|
||||||
|
| 合盘指数 | — | ✓ | ✓ |
|
||||||
|
| 合盘完整相位/推运文案 | — | teaser | ✓ |
|
||||||
|
| 达人咨询 | — | 可下单 | 可下单 |
|
||||||
|
| 玩法广场基础 | ✓ | ✓ | 视应用 |
|
||||||
|
|
||||||
|
价格文案(展示用,采集后校验):首月 ¥9.9 · 月 ¥25 · 季 ¥58 · 年 ¥178。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 8. 文案与合规(前端)
|
||||||
|
|
||||||
|
- 危机内容:拒答模板 + 热线/转真人。
|
||||||
|
- 免责:探索/娱乐向声明(具体措辞模拟器采集竞品后对齐,愈心谷落地另走 lexicon)。
|
||||||
|
- 未成年人:系统账号年龄门 + 功能裁剪(D:咨询与付费加强校验)。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 9. 待模拟器校验清单(圣经级)
|
||||||
|
|
||||||
|
| ID | 校验项 |
|
||||||
|
|---|---|
|
||||||
|
| V-B01 | 五 Tab 文案与「问」视觉权重 |
|
||||||
|
| V-B02 | 全局弹层种类(登录/会员/分享) |
|
||||||
|
| V-B03 | 会员价与权益文案 |
|
||||||
|
| V-B04 | 主色/AI 色实测 |
|
||||||
|
| V-B05 | 游客可点范围 |
|
||||||
@@ -0,0 +1,199 @@
|
|||||||
|
# 10 · 首页完整设计
|
||||||
|
|
||||||
|
> Route: `/home` · Tab: 首页 · Design Complete
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. 页面目标
|
||||||
|
|
||||||
|
1. 分发工具(宫格)
|
||||||
|
2. 推动建档(了解 TA)
|
||||||
|
3. 消费信息流 / 转化测评与会员
|
||||||
|
4. 承接 UGC 玩法广场
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. UI 完整清单(分区)
|
||||||
|
|
||||||
|
### 2.1 顶区 `HomeHeader`(✅ E8)
|
||||||
|
|
||||||
|
| 元素 ID | 类型 | 文案/内容 | 行为 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| H-HDR-CHECKIN | IconBtn | 签到 | → 签到/每日福利 |
|
||||||
|
| H-HDR-SEARCH | Search | 运营占位轮播(例「锐评十二星座」) | → 全局搜索 |
|
||||||
|
| H-HDR-PLUS | IconBtn | `+` | → 发布/快捷创建(待子页核对) |
|
||||||
|
| H-BANNER-TA | 条 | 「输入生日,更加了解TA」 | → 建档 other |
|
||||||
|
|
||||||
|
### 2.2 自己卡片 `HomeSelfCard`(✅ E8 · 原「档案条」升格)
|
||||||
|
|
||||||
|
| 元素 | 行为 |
|
||||||
|
|---|---|
|
||||||
|
| 标题「自己」+「更多」 | 更多 → 档案/运势详情 |
|
||||||
|
| 今日心情分数 + 短解读 | 点卡片进入心情/运势 |
|
||||||
|
| 五维条:爱情 / 财富 / 事业 / 学习 / 人际 | 展示型;点击进详情(待核) |
|
||||||
|
|
||||||
|
### 2.3 宫格 `HomeToolGrid`(✅ E8 真机 10.50.0 定稿)
|
||||||
|
|
||||||
|
横向两行可滑宫格(非 3×3):
|
||||||
|
|
||||||
|
| 行 | 序 | key | 标题 | 备注 |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| 1 | 1 | mbti | I人E人 | |
|
||||||
|
| 1 | 2 | star_sign | 星座 | |
|
||||||
|
| 1 | 3 | natal | 星盘 | |
|
||||||
|
| 1 | 4 | bazi | 生辰 | |
|
||||||
|
| 1 | 5 | synastry | 缘分合盘 | |
|
||||||
|
| 1 | 6 | ziwei | 紫微 | 滑出可见 |
|
||||||
|
| 2 | 7 | companion_star | 陪伴小星 | |
|
||||||
|
| 2 | 8 | confide | 倾诉 | |
|
||||||
|
| 2 | 9 | wisdom_card | 智慧卡 | |
|
||||||
|
| 2 | 10 | natal_report | 星盘报告 | 角标 New |
|
||||||
|
| 2 | 11 | bazi_cal | 生辰历 | |
|
||||||
|
| 2 | 12 | soulmate | 灵魂伴侣 | 滑出可见 |
|
||||||
|
|
||||||
|
宫格下方运营双卡(非第十格):
|
||||||
|
|
||||||
|
| key | 标题 | 说明 |
|
||||||
|
|---|---|---|
|
||||||
|
| plaza | AI玩法广场 | 大卡 + 运营副文案 |
|
||||||
|
| shop_promo | 商城运营卡 | 例:水晶手串 |
|
||||||
|
| ai_disclaimer | 脚注 | 「部分标题由AI生成,仅供参考」 |
|
||||||
|
|
||||||
|
「更多」入口:在「自己」卡片标题旁 / 工具二级页(见 `free2/tools/更多.png`);沙盘等未进首屏宫格的工具收入更多页。
|
||||||
|
|
||||||
|
### 2.3.1 「更多」页条目(✅ E8 `free2/tools/更多.labels.txt`)
|
||||||
|
|
||||||
|
分组实机可见(不完全等于 UI 分区文案):
|
||||||
|
|
||||||
|
| 类 | 条目 |
|
||||||
|
|---|---|
|
||||||
|
| 内容/玩法 | 推荐 · 测试 · 心情小镇 · 幸运地图 · 爱情树 · 聊天分析 · 关系网 · 解读 · 沙盘 · 星骰 · 智慧卡 · 日历 |
|
||||||
|
| 命理工具 | 星盘 · 星盘报告 · 缘分合盘 · 星座 · 生辰 · 生辰历 · 紫微 · 紫微历 · 星宿 · 政余 · 政余历 · 灵数 · 生肖 · 玛雅图腾 · 人类图 |
|
||||||
|
| 社交/商业 | 倾诉 · 灵魂伴侣 · 商城 |
|
||||||
|
|
||||||
|
### 2.4 运营位 `HomePromo`
|
||||||
|
|
||||||
|
- 最多 1 个大 Banner(可关闭,24h 不再展示,本地记录)
|
||||||
|
- 配置来自后台 `banners`
|
||||||
|
|
||||||
|
### 2.5 信息流 `HomeFeed`
|
||||||
|
|
||||||
|
| 卡片类型 | 字段 | 点击 |
|
||||||
|
|---|---|---|
|
||||||
|
| fortune_today | 标题、摘要、分数 | 运势详情 |
|
||||||
|
| hot_test | 封面、标题、人数 | 测评 |
|
||||||
|
| expert | 达人卡 | 达人详情 |
|
||||||
|
| article | 封面、标题 | 文章 |
|
||||||
|
| video | 封面 | 播放 |
|
||||||
|
| plaza_hot | 应用名、热度 | 广场应用 |
|
||||||
|
| ai_entry | 文案 | → 问 |
|
||||||
|
|
||||||
|
交互:下拉刷新 · 上拉分页(cursor)· 负反馈「不感兴趣」(可选)。
|
||||||
|
|
||||||
|
### 2.6 「更多」二级页 `ToolsMorePage`
|
||||||
|
|
||||||
|
固定收录(可后台排序):爱情树、幸运地图、pick卡、塔罗、八字、紫微、生命数字、姓名分析…
|
||||||
|
每项:Icon · 标题 · 副标题 · 角标(热/新)。
|
||||||
|
|
||||||
|
### 2.7 AI 玩法广场 `PlazaPage`
|
||||||
|
|
||||||
|
| 元素 | 说明 |
|
||||||
|
|---|---|
|
||||||
|
| 标题区 | Slogan:「全民手搓创意——精选应用」 |
|
||||||
|
| 排序 | 热度 / 最新 |
|
||||||
|
| AppCard | 名、热度、创作者、封面 |
|
||||||
|
| 点击 | → `PlazaAppRuntime` |
|
||||||
|
| 空态 | 「暂无应用」 |
|
||||||
|
| 审核中 | 创作者端可见,C 端不可见 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. 交互细则
|
||||||
|
|
||||||
|
| 手势 | 对象 | 结果 |
|
||||||
|
|---|---|---|
|
||||||
|
| Tap | 宫格 | 路由跳转,埋点 `home_grid_click` |
|
||||||
|
| Tap | 了解 TA | 打开建档;未登录先 Auth |
|
||||||
|
| LongPress | 宫格 | (D)无菜单,防误触 |
|
||||||
|
| Pull | Feed | 刷新 |
|
||||||
|
| Tap | Feed 负反馈 | 减少同类(需登录) |
|
||||||
|
|
||||||
|
倾诉点击:弹出 ActionSheet「和 AI 聊」/「找达人」→ ask / online。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. 状态机
|
||||||
|
|
||||||
|
| 状态 | UI |
|
||||||
|
|---|---|
|
||||||
|
| Loading | Header 骨架 + 宫格骨架 + Feed 骨架 |
|
||||||
|
| Ready | 全量 |
|
||||||
|
| FeedEmpty | 宫格在,Feed EmptyState |
|
||||||
|
| Offline | NetworkBanner,缓存宫格可点 |
|
||||||
|
| Error | 全页 Retry |
|
||||||
|
| AuthRequired | AuthModal |
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
stateDiagram-v2
|
||||||
|
[*] --> Loading
|
||||||
|
Loading --> Ready
|
||||||
|
Loading --> Error
|
||||||
|
Ready --> AuthRequired
|
||||||
|
Ready --> Offline
|
||||||
|
Offline --> Ready
|
||||||
|
Error --> Loading
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. 接口契约(本页)
|
||||||
|
|
||||||
|
| 调用时机 | API |
|
||||||
|
|---|---|
|
||||||
|
| 进入 | `GET /v1/home/bootstrap` → grid_config · banners · profile_summary |
|
||||||
|
| Feed | `GET /v1/home/feed?cursor=` |
|
||||||
|
| 负反馈 | `POST /v1/home/feed/{id}/dismiss` |
|
||||||
|
| 广场 | `GET /v1/plaza/apps?sort=heat` |
|
||||||
|
|
||||||
|
`home/bootstrap` Response(定稿):
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"profile_summary": {"id":"","name":"","sun_sign":"","has_birth_time":false},
|
||||||
|
"grid": [{"key":"mbti","title":"I人E人","badge":null,"enabled":true}],
|
||||||
|
"banners": [{"id":"","image_url":"","link":"","closable":true}],
|
||||||
|
"ta_guide_visible": true
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. 异常
|
||||||
|
|
||||||
|
| 场景 | 处理 |
|
||||||
|
|---|---|
|
||||||
|
| bootstrap 失败 | 使用本地默认宫格(写死上表 10 项)+ Error toast |
|
||||||
|
| feed 失败 | 保留宫格,Feed 区 Retry |
|
||||||
|
| 配置缺宫格 | 合并默认,不丢星盘/合盘/问相关入口 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 7. 埋点
|
||||||
|
|
||||||
|
`home_expose` · `home_grid_click{key}` · `home_ta_guide_click` · `home_feed_click{type}` · `home_feed_refresh` · `plaza_open` · `plaza_app_click`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 8. 模拟器校验 ID
|
||||||
|
|
||||||
|
| ID | 项 | 状态 |
|
||||||
|
|---|---|---|
|
||||||
|
| V-H01 | 宫格文案与顺序 | ✅ E8 已按上表改稿 |
|
||||||
|
| V-H02 | 了解TA 文案 | ✅ 「输入生日,更加了解TA」 |
|
||||||
|
| V-H03 | 广场形态 | ✅ 首页双大卡而非 slogan 条 |
|
||||||
|
| V-H04 | Feed / 达人卡 | 🟡 采集中 `free/home/*` |
|
||||||
|
| V-H05 | 更多页条目 | 🟡 采集中 `free/tools/更多*` |
|
||||||
|
| V-H06 | 自己卡片五维 | ✅ 爱情财富事业学习人际 |
|
||||||
|
| V-H07 | 门禁弹层 | ✅ 未成年 / 每日领取 |
|
||||||
|
|
||||||
|
差分总表:[evidence-20260803.md](evidence-20260803.md)
|
||||||
@@ -0,0 +1,117 @@
|
|||||||
|
# 11 · 消息完整设计
|
||||||
|
|
||||||
|
> Route: `/message` · Design Complete
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. 目标
|
||||||
|
|
||||||
|
聚合 AI / 达人 / 社区 / 系统 / 商业通知;驱动回到「问」或咨询会话。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. UI 清单
|
||||||
|
|
||||||
|
### 2.1 顶栏(✅ E8)
|
||||||
|
|
||||||
|
| ID | 元素 | 行为 |
|
||||||
|
|---|---|---|
|
||||||
|
| M-TITLE | 「消息」 | — |
|
||||||
|
| M-SEARCH | 搜索图标 | 搜会话/通知 |
|
||||||
|
| M-CLEAR | 扫帚图标 | 清理/标记已读(无「全部已读」文案) |
|
||||||
|
|
||||||
|
### 2.2 列表形态(✅ E8 · 无顶部分段)
|
||||||
|
|
||||||
|
**无** `全部|AI|达人|互动|系统` Segment;为**分组会话列表**:
|
||||||
|
|
||||||
|
| 行类型 | 示例 | 角标 |
|
||||||
|
|---|---|---|
|
||||||
|
| 系统通知 | 「检测到新的登录行为…」 | 未读数字 |
|
||||||
|
| AI 助手 | 「小星」+ AI 角标 | 未读数字 |
|
||||||
|
| (登录后)达人/互动 | 待更多账号补证 | — |
|
||||||
|
|
||||||
|
底部可出系统通知引导条:「开启系统通知…」+「去开启」+ 关闭。
|
||||||
|
|
||||||
|
### 2.3 会话行 `MessageRow`
|
||||||
|
|
||||||
|
| 字段 | 说明 |
|
||||||
|
|---|---|
|
||||||
|
| avatar | 系统铃铛 / 小星 IP / 达人头像 |
|
||||||
|
| title | 会话名 |
|
||||||
|
| preview | 最后一条摘要 |
|
||||||
|
| time | 相对时间(今天时刻 / 昨天) |
|
||||||
|
| badge | 未读数 |
|
||||||
|
|
||||||
|
### 2.4 系统通知详情(✅ E8)
|
||||||
|
|
||||||
|
路由级页「系统通知」:时间分隔 + 卡片列表(纯文本 / 链接「点击查看」/ 运营富媒体)。
|
||||||
|
|
||||||
|
### 2.5 空态
|
||||||
|
|
||||||
|
插画 + 引导回「问」(未在本版截到空态)。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. 交互
|
||||||
|
|
||||||
|
| 操作 | 结果 |
|
||||||
|
|---|---|
|
||||||
|
| Tap 行 | AI→Ask 线程;达人→ConsultSession;互动→动态/私信;系统→详情 H5;商业→会员/订单 |
|
||||||
|
| LongPress | 置顶 / 免打扰 / 删除 |
|
||||||
|
| 左滑 | 删除(iOS 风格);Android 长按菜单 |
|
||||||
|
| 下拉 | 刷新 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. 状态机
|
||||||
|
|
||||||
|
`Loading` · `Ready` · `Empty` · `Offline` · `Error` · `AuthRequired`
|
||||||
|
|
||||||
|
未读角标:`GET /v1/messages/unread_count` 与 TabBar 同步;前台 30s 轮询或 WS 推送(D:优先 WS,降级轮询)。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. API
|
||||||
|
|
||||||
|
| API | 说明 |
|
||||||
|
|---|---|
|
||||||
|
| `GET /v1/messages?type=&cursor=` | 列表 |
|
||||||
|
| `POST /v1/messages/{id}/read` | 已读 |
|
||||||
|
| `POST /v1/messages/read_all` | 全读 |
|
||||||
|
| `DELETE /v1/messages/{id}` | 删会话 |
|
||||||
|
| `POST /v1/messages/{id}/mute` | 免打扰 |
|
||||||
|
| `GET /v1/messages/unread_count` | 角标 |
|
||||||
|
|
||||||
|
Message DTO:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"id": "uuid",
|
||||||
|
"type": "ai|expert|social|system|commerce",
|
||||||
|
"title": "",
|
||||||
|
"preview": "",
|
||||||
|
"avatar_url": "",
|
||||||
|
"unread": 0,
|
||||||
|
"muted": false,
|
||||||
|
"ref": {"kind":"conversation|consult|url","id":""},
|
||||||
|
"updated_at": "ISO8601"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. 异常
|
||||||
|
|
||||||
|
推送权限拒绝:仅站内;首次提示去设置。
|
||||||
|
Token 失效:清列表进 Auth。
|
||||||
|
删除失败:Toast 回滚 UI。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 7. 埋点
|
||||||
|
|
||||||
|
`message_tab_expose` · `message_open{type}` · `message_read_all` · `message_delete` · `message_mute`
|
||||||
|
|
||||||
|
## 8. 校验 ID
|
||||||
|
|
||||||
|
`V-M01` 分类形态 · `V-M02` 行字段 · `V-M03` 长按菜单项 · `V-M04` 角标规则
|
||||||
@@ -0,0 +1,154 @@
|
|||||||
|
# 12 ·「问」完整设计(测测 AI + 真人 1v1)
|
||||||
|
|
||||||
|
> Route: `/ask` · Design Complete · 战略核心页
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. 目标
|
||||||
|
|
||||||
|
1. 以星盘档案为底座的垂直 AI 对话
|
||||||
|
2. 同页低摩擦切换真人咨询
|
||||||
|
3. 对象切换(自己/TA)扩展关系场景
|
||||||
|
4. 深度思考与子场景(灵魂伴侣等)承载差异化
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. UI 完整清单
|
||||||
|
|
||||||
|
### 2.1 顶栏 `AskTopBar`(✅ E8)
|
||||||
|
|
||||||
|
| ID | 元素 | 行为 |
|
||||||
|
|---|---|---|
|
||||||
|
| A-BACK | 返回 | 回上一页/首页 |
|
||||||
|
| A-TAB-AI | 「测测AI」 | 默认选中 |
|
||||||
|
| A-TAB-HUMAN | 「真人1v1」 | 角标「新客半价」(运营可配) |
|
||||||
|
| A-MENU | 汉堡菜单 | 历史/设置;可带红点 |
|
||||||
|
|
||||||
|
### 2.2 AI 轨首屏(✅ E8 · 非纯聊天空态)
|
||||||
|
|
||||||
|
冷启动为**引导页 + 转化区**,而非空白线程:
|
||||||
|
|
||||||
|
| 区块 | 内容 |
|
||||||
|
|---|---|
|
||||||
|
| 人设问候 | 猫头鹰 IP +「Hi~我是测测AI / 最近有什么事…」 |
|
||||||
|
| 引导问题 ×4 | 整行按钮(非小芯片) |
|
||||||
|
| 真人咨询导流 | 「也可以选择真人咨询…」+「228位测测达人在线」+「去提问」 |
|
||||||
|
| 达人数量卡 | 1/3/8/15 位;「新客6折」等角标 |
|
||||||
|
| 底栏快捷 | **工具** · **语音通话** · **深度解读** · **灵魂伴侣** |
|
||||||
|
| 输入框 | placeholder「让我来解答你的问题吧」 |
|
||||||
|
| 免责声明 | 「内容由AI生成,仅供娱乐…」 |
|
||||||
|
|
||||||
|
**实测引导问题(✅ 替换原草稿)**
|
||||||
|
|
||||||
|
1. 有哪些适合我的财富建议?
|
||||||
|
2. 这份工作有发展吗?
|
||||||
|
3. 我有什么性格弱点吗?
|
||||||
|
4. 我和Ta会复合吗?
|
||||||
|
|
||||||
|
### 2.3 上下文/能力入口(✅ E8 落在底栏快捷)
|
||||||
|
|
||||||
|
| ID | 元素 | 行为 |
|
||||||
|
|---|---|---|
|
||||||
|
| A-TOOLS | 「工具」 | Sheet:星盘等工具入口 |
|
||||||
|
| A-VOICE | 「语音通话」 | 语音;可红点 |
|
||||||
|
| A-DEEP | 「深度解读」 | 深度能力(可能付费) |
|
||||||
|
| A-SOUL | 「灵魂伴侣」 | 子场景 |
|
||||||
|
|
||||||
|
对象切换/星盘维度:在工具 Sheet 或对话上下文中(待 `ask/tools-sheet` 截图补全)。
|
||||||
|
|
||||||
|
### 2.4 输入区 `AskComposer`
|
||||||
|
|
||||||
|
| 元素 | 行为 |
|
||||||
|
|---|---|
|
||||||
|
| 文本框 | placeholder 见上 |
|
||||||
|
| 发送 | 输入后出现 |
|
||||||
|
| 语音 | 底栏「语音通话」独立入口 |
|
||||||
|
|
||||||
|
### 2.5 真人轨 `AskHumanRail`
|
||||||
|
|
||||||
|
顶栏切「真人1v1」(角标「新客半价」);同页亦嵌入 AI 轨中部的达人导流卡。
|
||||||
|
|
||||||
|
### 2.6 子页
|
||||||
|
|
||||||
|
- `/ask/soulmate` 灵魂伴侣
|
||||||
|
- `/ask/history` 会话历史
|
||||||
|
- Profile 创建嵌入式 Modal
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. 交互与业务规则
|
||||||
|
|
||||||
|
| 规则 ID | 规则 |
|
||||||
|
|---|---|
|
||||||
|
| R-ASK-01 | 每条用户消息消耗 1 次额度;深度思考 ×2 |
|
||||||
|
| R-ASK-02 | 额度=0 → PaywallSheet(会员优先) |
|
||||||
|
| R-ASK-03 | 切换对象后下一条消息带新 `profile_ctx_id` |
|
||||||
|
| R-ASK-04 | 对象无档案 → 强制建档流,不可发送 |
|
||||||
|
| R-ASK-05 | 流式中再次发送:排队或禁用(D:禁用) |
|
||||||
|
| R-ASK-06 | 敏感意图 → 危机卡片,不计成功陪伴文案 |
|
||||||
|
| R-ASK-07 | 切「真人1v1」不清除 AI 历史 |
|
||||||
|
| R-ASK-08 | 下拉加载更早消息,page_size=20 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. 状态机
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
stateDiagram-v2
|
||||||
|
[*] --> Boot
|
||||||
|
Boot --> IdleFresh: 无历史
|
||||||
|
Boot --> IdleHistory: 有历史
|
||||||
|
IdleFresh --> Streaming: send/chip
|
||||||
|
IdleHistory --> Streaming
|
||||||
|
Streaming --> IdleHistory: done
|
||||||
|
Streaming --> StreamError: fail
|
||||||
|
StreamError --> Streaming: retry
|
||||||
|
IdleFresh --> NeedProfile: 选TA无档
|
||||||
|
NeedProfile --> IdleFresh: 建档完成
|
||||||
|
IdleHistory --> QuotaEmpty
|
||||||
|
QuotaEmpty --> Paywall
|
||||||
|
IdleHistory --> HumanRail: tab
|
||||||
|
HumanRail --> IdleHistory: tab AI
|
||||||
|
```
|
||||||
|
|
||||||
|
全量状态:`Boot` · `IdleFresh` · `IdleHistory` · `Streaming` · `StreamError` · `NeedProfile` · `QuotaEmpty` · `Paywall` · `HumanRail` · `Offline` · `AuthRequired` · `DeepOn`(正交 flag)。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. API
|
||||||
|
|
||||||
|
| API | 说明 |
|
||||||
|
|---|---|
|
||||||
|
| `GET /v1/ai/bootstrap` | 额度、默认 profile、引导问题、deep 是否可用 |
|
||||||
|
| `GET /v1/ai/conversations` | 列表 |
|
||||||
|
| `GET /v1/ai/conversations/{id}/messages?cursor=` | 历史 |
|
||||||
|
| `POST /v1/ai/chat` | body: `{conversation_id?, content, profile_ctx_id, dimension, deep}` → **SSE** |
|
||||||
|
| `POST /v1/ai/conversations` | 新建 |
|
||||||
|
| `GET /v1/ai/quota` | remaining |
|
||||||
|
|
||||||
|
SSE 事件:`meta` · `delta` · `suggest` · `usage` · `error` · `done`。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. 异常矩阵
|
||||||
|
|
||||||
|
| 场景 | UI |
|
||||||
|
|---|---|
|
||||||
|
| SSE 中断 | 气泡「已中断」+ 重试 |
|
||||||
|
| 402 额度 | Paywall |
|
||||||
|
| 400 无档案 | NeedProfile |
|
||||||
|
| 403 内容安全 | 固定拒答 |
|
||||||
|
| 超时 30s | StreamError |
|
||||||
|
| 离线 | 禁用发送 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 7. 埋点
|
||||||
|
|
||||||
|
`ask_open` · `ask_send` · `ask_chip_click` · `ask_deep_toggle` · `ask_profile_switch` · `ask_dimension_change` · `ask_soulmate_open` · `ask_human_tab` · `ask_paywall_show` · `ask_stream_error`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 8. 校验 ID
|
||||||
|
|
||||||
|
`V-A01` 顶栏双 Tab · `V-A02` 上下文三控件+灵魂伴侣 · `V-A03` 引导问题原文 · `V-A04` 下拉历史 Tip · `V-A05` 深度思考是否耗额度 · `V-A06` 流式表现
|
||||||
@@ -0,0 +1,75 @@
|
|||||||
|
# 13 · 在线完整设计(达人 Marketplace)
|
||||||
|
|
||||||
|
> Route: `/online` · Design Complete
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. 目标
|
||||||
|
|
||||||
|
达人发现 → 下单 → 文字/语音/连麦服务 → 评价 → 复购。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. UI 清单
|
||||||
|
|
||||||
|
### 2.1 列表页(✅ E8 部分 · 与「问·真人1v1」同构)
|
||||||
|
|
||||||
|
底栏「在线」带运营角标 **「限免」**;新客链路易**直达「向TA提问」收银页**(券弹层「我知道了」),列表本体与问-真人轨共用筛选:
|
||||||
|
|
||||||
|
| 区 | 元素 |
|
||||||
|
|---|---|
|
||||||
|
| 顶栏双轨残留 | 若从问切入可仍见「测测AI / 真人1v1」 |
|
||||||
|
| 筛选 | 综合排序 · 全部工具 · 筛选 · 新客半价 |
|
||||||
|
| ExpertCard | 头像、活跃、好评率、测友推荐、价格/次 |
|
||||||
|
| 限免漏斗 | 点进 → 向TA提问(文字/语音/合盘/星盘…)+ 测测币/卡券/VIP 折扣 |
|
||||||
|
|
||||||
|
### 2.2 详情页 `/online/experts/{id}`
|
||||||
|
|
||||||
|
简介 · 资质标 · 服务 SKU(文字/语音/连麦+单价+时长)· 评价列表 · 底部「立即咨询」· 收藏。
|
||||||
|
|
||||||
|
### 2.3 下单确认 Sheet
|
||||||
|
|
||||||
|
SKU · 优惠券 · 协议勾选 · 应付金额 · 去支付。
|
||||||
|
|
||||||
|
### 2.4 会话页 `/consult/{orderId}`
|
||||||
|
|
||||||
|
| 模式 | UI |
|
||||||
|
|---|---|
|
||||||
|
| 文字 | 聊天 + 剩余时长/条数 |
|
||||||
|
| 语音 | 语音条 |
|
||||||
|
| 连麦 | 通话 UI + 权限 |
|
||||||
|
|
||||||
|
结束:评价 1–5 星 + 标签 + 文字。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. 订单状态机(前端必须渲染)
|
||||||
|
|
||||||
|
`Created` → `Paying` → `Paid` → `WaitingAccept` → `InService` → `Completed` → `Reviewed`
|
||||||
|
旁路:`Cancelled` · `Rejected` · `Refunding` · `Refunded` · `Expired`
|
||||||
|
|
||||||
|
超时:Paid 后 N 分钟未接单自动退款(N 后台配,默认 15)。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. API
|
||||||
|
|
||||||
|
`GET /v1/experts` · `GET /v1/experts/{id}` · `POST /v1/consult/orders` · `POST /v1/consult/orders/{id}/pay` · `GET /v1/consult/orders/{id}` · `POST /v1/consult/orders/{id}/cancel` · `POST /v1/consult/orders/{id}/review` · 消息走 IM 通道(WS)。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. 权限与安全
|
||||||
|
|
||||||
|
麦克风/相机权限拒绝 → 引导设置,降级文字。
|
||||||
|
举报入口:会话内 · 详情页。
|
||||||
|
未成年人:禁止连麦(D)。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. 埋点
|
||||||
|
|
||||||
|
`online_expose` · `expert_click` · `consult_sku_select` · `consult_pay_success` · `consult_review_submit`
|
||||||
|
|
||||||
|
## 7. 校验 ID
|
||||||
|
|
||||||
|
`V-O01` 筛选维度 · `V-O02` SKU 种类 · `V-O03` 价格展示 · `V-O04` 评价表单
|
||||||
@@ -0,0 +1,90 @@
|
|||||||
|
# 14 · 我的完整设计
|
||||||
|
|
||||||
|
> Route: `/mine` · Design Complete
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. UI 清单
|
||||||
|
|
||||||
|
### 1.1 头部 `MineHeader`
|
||||||
|
|
||||||
|
头像(可换)· 昵称 · 会员徽章(非会员显示「开通会员」)· 编辑资料箭头。
|
||||||
|
|
||||||
|
### 1.2 资产条 `MineAssets`
|
||||||
|
|
||||||
|
| 格 | 内容 | 点击 |
|
||||||
|
|---|---|---|
|
||||||
|
| 会员 | 到期日/未开通 | `/membership` |
|
||||||
|
| AI 次数 | remaining | `/ask` 或 Paywall |
|
||||||
|
| 优惠券 | 张数 | `/coupons` |
|
||||||
|
| 积分 | 余额(若无则隐藏整格 · 模拟器校验) | `/points` |
|
||||||
|
|
||||||
|
### 1.3 功能列表(分组定稿)
|
||||||
|
|
||||||
|
**档案与内容**
|
||||||
|
|
||||||
|
1. 生命档案 → `/profile`
|
||||||
|
2. 我的测试 → `/mine/tests`
|
||||||
|
3. 我的报告 → `/mine/reports`
|
||||||
|
4. AI 对话记录 → `/ask/history`
|
||||||
|
5. 我的收藏 → `/mine/favorites`
|
||||||
|
|
||||||
|
**订单与商业**
|
||||||
|
|
||||||
|
6. 会员中心 → `/membership`
|
||||||
|
7. 我的订单 → `/mine/orders`
|
||||||
|
8. 咨询订单 → `/mine/consult-orders`
|
||||||
|
9. 商城订单 → `/shop/orders`
|
||||||
|
|
||||||
|
**其它**
|
||||||
|
|
||||||
|
10. 邀请好友 → 分享
|
||||||
|
11. 消息通知设置 → `/settings/notifications`
|
||||||
|
12. 账号与安全 → `/settings/account`
|
||||||
|
13. 客服与帮助 → `/help`
|
||||||
|
14. 关于 → `/about`(协议/隐私/注销入口)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. 子页要点
|
||||||
|
|
||||||
|
| 页 | 关键交互 |
|
||||||
|
|---|---|
|
||||||
|
| 生命档案列表 | Self 置顶;Other 按更新;新建;滑动删除 |
|
||||||
|
| 报告库 | 类型筛选:星盘/合盘/测评/AI;锁态角标 |
|
||||||
|
| 订单 | 状态 Tab;详情;申请退款 |
|
||||||
|
| 会员中心 | 套餐卡:9.9/25/58/178;权益表;自动续费管理 |
|
||||||
|
| 注销 | 二次确认 + 冷却期说明 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. 状态
|
||||||
|
|
||||||
|
`Guest`(显示登录大按钮)· `Loading` · `Ready` · `VipActive` · `VipExpired` · `Error`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. API
|
||||||
|
|
||||||
|
`GET /v1/me` · `GET /v1/membership/me` · `GET /v1/ai/quota` · `GET /v1/orders` · `POST /v1/auth/logout` · `POST /v1/account/delete`
|
||||||
|
|
||||||
|
`GET /v1/me`:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"user": {"id":"","nickname":"","avatar_url":""},
|
||||||
|
"membership": {"active":false,"plan":null,"expires_at":null},
|
||||||
|
"quota": {"ai_remaining":0},
|
||||||
|
"counts": {"coupons":0,"favorites":0,"reports":0}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. 埋点
|
||||||
|
|
||||||
|
`mine_expose` · `mine_item_click{key}` · `membership_open` · `invite_click`
|
||||||
|
|
||||||
|
## 6. 校验 ID
|
||||||
|
|
||||||
|
`V-U01` 列表项集合 · `V-U02` 会员价展示 · `V-U03` 资产条格子 · `V-U04` 注销路径
|
||||||
@@ -0,0 +1,126 @@
|
|||||||
|
# 20 · 星座工具完整设计(星盘 / 合盘 / 运势)
|
||||||
|
|
||||||
|
> Design Complete · 愈心谷落地时命名走 STRATEGY / 词表
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. 信息架构
|
||||||
|
|
||||||
|
```
|
||||||
|
工具入口(首页/广场)
|
||||||
|
├── 星盘(本命)
|
||||||
|
│ ├── 档案选择 / 新建
|
||||||
|
│ ├── 概览(太阳/月亮/上升 + 象限)
|
||||||
|
│ ├── 行星列表
|
||||||
|
│ ├── 宫位列表
|
||||||
|
│ ├── 相位表
|
||||||
|
│ ├── 深度解读(付费锁)
|
||||||
|
│ └── 分享卡片
|
||||||
|
├── 合盘
|
||||||
|
│ ├── 双档案选择
|
||||||
|
│ ├── 关系类型(恋爱/友情/亲子…)
|
||||||
|
│ ├── 五图 + 推运(as_of)
|
||||||
|
│ ├── 维度评分
|
||||||
|
│ ├── 深度报告(付费)
|
||||||
|
│ ├── 邀请合盘(token)
|
||||||
|
│ └── 附近的人(geo)
|
||||||
|
└── 今日运势
|
||||||
|
├── 日运卡片
|
||||||
|
├── 周/月切换
|
||||||
|
└── 推送订阅
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. 星盘页 `NatalChartPage`
|
||||||
|
|
||||||
|
### 2.1 Route
|
||||||
|
|
||||||
|
`/tools/natal` · query: `profile_id?`
|
||||||
|
|
||||||
|
### 2.2 UI
|
||||||
|
|
||||||
|
| 区块 | 说明 |
|
||||||
|
|---|---|
|
||||||
|
| `ProfilePicker` | Self 默认;可切 Other |
|
||||||
|
| `ChartWheel` | 外圈宫位 + 行星 glyph;可缩放旋转(定稿:双指缩放) |
|
||||||
|
| `BigThree` | 日/月/升 三卡 |
|
||||||
|
| `Tabs` | 概览 / 行星 / 宫位 / 相位 / 解读 |
|
||||||
|
| `PaywallBanner` | 深度解读锁态 |
|
||||||
|
|
||||||
|
### 2.3 状态
|
||||||
|
|
||||||
|
`NeedProfile` → `Computing` → `Ready` → `Paywalled` / `Unlocked` · `Error`
|
||||||
|
|
||||||
|
### 2.4 API
|
||||||
|
|
||||||
|
- `GET /v1/profiles` · `POST /v1/profiles`
|
||||||
|
- `POST /v1/reports/natal` body: `{ "profile_id": "" }`
|
||||||
|
- 响应:`summary`(免费)+ `detail`(锁字段)+ `charts.natal`
|
||||||
|
|
||||||
|
### 2.5 校验
|
||||||
|
|
||||||
|
`V-N01` 轮盘交互 · `V-N02` 深度锁点 · `V-N03` 分享卡片字段
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. 合盘页 `SynastryPage`(对齐已实现能力)
|
||||||
|
|
||||||
|
### 3.1 Route
|
||||||
|
|
||||||
|
`/tools/synastry` · `/synastry/invite/:token`
|
||||||
|
|
||||||
|
### 3.2 UI 定稿
|
||||||
|
|
||||||
|
| 区块 | 说明 |
|
||||||
|
|---|---|
|
||||||
|
| 双人档案条 | A/B 头像昵称 + 换人 |
|
||||||
|
| 关系类型 Chip | 恋爱默认 |
|
||||||
|
| 五图 Tab | 比较盘/组合盘/组合中点/时空中点/组合星座 — 与 API `charts` 对齐 |
|
||||||
|
| 推运 | `as_of` 日期选择;Progressed 说明文案 |
|
||||||
|
| 维度雷达/条 | 吸引/沟通/信任/长期… |
|
||||||
|
| 深度报告 CTA | 会员或单次解锁 |
|
||||||
|
| 社交 | 「邀请合盘」「附近的人」 |
|
||||||
|
|
||||||
|
### 3.3 附近的人
|
||||||
|
|
||||||
|
- 需用户显式打开 `geo_visible`
|
||||||
|
- 列表:距离档位 + 合盘入口
|
||||||
|
- 隐私:不暴露精确坐标给对方客户端
|
||||||
|
|
||||||
|
### 3.4 API(已有契约优先)
|
||||||
|
|
||||||
|
- `POST /v1/reports/synastry` `{ profile_id_a, profile_id_b, as_of? }`
|
||||||
|
- `GET /v1/synastry/nearby`
|
||||||
|
- `POST /v1/synastry/invites` · `GET /v1/synastry/invites/:token` · `POST .../accept`
|
||||||
|
|
||||||
|
### 3.5 校验
|
||||||
|
|
||||||
|
`V-S01` 五图 Tab 文案与顺序 · `V-S02` 邀请链路 · `V-S03` 附近隐私开关默认
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. 今日运势 `DailyFortunePage`
|
||||||
|
|
||||||
|
### 4.1 UI
|
||||||
|
|
||||||
|
日期头 · 综合分 · 爱情/事业/财运/健康四格 · 短建议 ·「查看完整」(会员)
|
||||||
|
|
||||||
|
### 4.2 API
|
||||||
|
|
||||||
|
`GET /v1/fortune/daily?profile_id=&date=`
|
||||||
|
|
||||||
|
### 4.3 校验
|
||||||
|
|
||||||
|
`V-F01` 分数字段 · `V-F02` 完整内容锁点
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. 埋点统一
|
||||||
|
|
||||||
|
`tool_open{tool}` · `chart_tab{name}` · `synastry_generate` · `synastry_unlock` · `fortune_expose` · `invite_share` · `nearby_open`
|
||||||
|
|
||||||
|
## 6. 愈心谷落地备注
|
||||||
|
|
||||||
|
- UI 禁用「占卜/算命」;可用运势/合盘/匹配/解读
|
||||||
|
- 星历计算依赖与 AGPL 风险见 API README;设计层不绑定具体库
|
||||||
+119
@@ -0,0 +1,119 @@
|
|||||||
|
# 21 · 测评与沉浸式玩法完整设计
|
||||||
|
|
||||||
|
> Design Complete · MBTI / 广场 / 沙盘 / 心情小镇 / 塔罗
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. 测评中心 `TestsHub`
|
||||||
|
|
||||||
|
### 1.1 Route
|
||||||
|
|
||||||
|
`/tests` · `/tests/:slug`
|
||||||
|
|
||||||
|
### 1.2 UI
|
||||||
|
|
||||||
|
- 分类 Chip:人格 / 情感 / 压力 / 趣味
|
||||||
|
- 卡片:封面 · 标题 · 题量 · 预计时长 · 热度 · 免费/付费角标
|
||||||
|
- 搜索(可选,二期)
|
||||||
|
|
||||||
|
### 1.3 答题流 `TestPlayer`
|
||||||
|
|
||||||
|
| 步骤 | 说明 |
|
||||||
|
|---|---|
|
||||||
|
| Intro | 说明用途、隐私、预计时长、开始 |
|
||||||
|
| Question | 单选为主;进度条;可上一题 |
|
||||||
|
| Submit | Loading → 结果 |
|
||||||
|
| Result | 类型码/分数 + 摘要 + 分享 +「深度报告」锁 |
|
||||||
|
|
||||||
|
状态:`Intro` · `Answering` · `Submitting` · `ResultFree` · `ResultPaywalled` · `Error`
|
||||||
|
|
||||||
|
API:
|
||||||
|
|
||||||
|
- `GET /v1/tests` · `GET /v1/tests/:slug`
|
||||||
|
- `POST /v1/tests/:slug/sessions` → `session_id`
|
||||||
|
- `POST /v1/tests/sessions/:id/answer`
|
||||||
|
- `POST /v1/tests/sessions/:id/submit`
|
||||||
|
- `GET /v1/tests/sessions/:id/report`
|
||||||
|
|
||||||
|
校验:`V-T01` 进度可回退 · `V-T02` 结果锁点 · `V-T03` 历史入库「我的测试」
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. 心理广场 `PsychPlaza`
|
||||||
|
|
||||||
|
Route: `/plaza`
|
||||||
|
|
||||||
|
| 区块 | 设计定稿 |
|
||||||
|
|---|---|
|
||||||
|
| Feed | 图文/话题卡;点赞评论 |
|
||||||
|
| Topic | 官方话题置顶 |
|
||||||
|
| Publish | 发帖(需登录);敏感词过滤 |
|
||||||
|
| Detail | 评论树一级 + 楼中楼 |
|
||||||
|
|
||||||
|
API:`GET /v1/plaza/feed` · `POST /v1/plaza/posts` · `POST .../like`
|
||||||
|
|
||||||
|
注意:UGC 审核队列进运营后台(见 40)。
|
||||||
|
|
||||||
|
校验:`V-P01` Feed 排序 · `V-P02` 发帖门槛
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. 沙盘 `Sandbox`
|
||||||
|
|
||||||
|
Route: `/sandbox`
|
||||||
|
|
||||||
|
定稿流程:
|
||||||
|
|
||||||
|
1. 空场景 + 道具架(人物/物品/自然)
|
||||||
|
2. 拖拽摆放;缩放旋转
|
||||||
|
3. 完成 → 生成解读摘要(AI 或模板)
|
||||||
|
4. 保存作品到「我的」;可分享静态图
|
||||||
|
|
||||||
|
状态:`Editing` · `Generating` · `Saved` · `Paywalled`(深度解读)
|
||||||
|
|
||||||
|
API:`POST /v1/sandbox/sessions` · `POST .../complete` · `GET .../report`
|
||||||
|
|
||||||
|
校验:`V-B01` 道具集 · `V-B02` 解读是否 AI
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. 心情小镇 `MoodTown`
|
||||||
|
|
||||||
|
Route: `/mood-town`
|
||||||
|
|
||||||
|
定稿:
|
||||||
|
|
||||||
|
- 地图节点:今日心情打卡 · 小任务 · 收集物
|
||||||
|
- 打卡:情绪滑杆 + 可选日记
|
||||||
|
- 连续打卡奖励(积分/优惠券,与会员解耦)
|
||||||
|
|
||||||
|
API:`POST /v1/mood/checkin` · `GET /v1/mood/calendar` · `GET /v1/mood/town-state`
|
||||||
|
|
||||||
|
校验:`V-M01` 节点集合 · `V-M02` 奖励规则
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. 塔罗 `Tarot`
|
||||||
|
|
||||||
|
Route: `/tarot`
|
||||||
|
|
||||||
|
定稿(合规表述:牌阵洞察 / 自我反思,非「算命」):
|
||||||
|
|
||||||
|
| 模式 | 说明 |
|
||||||
|
|---|---|
|
||||||
|
| 单牌 | 日签 |
|
||||||
|
| 三牌 | 过去/现在/未来(表述可改为 课题/现状/行动) |
|
||||||
|
| 牌阵库 | 恋爱/决策等模板 |
|
||||||
|
|
||||||
|
流程:选牌阵 → 洗牌动画 → 抽牌 → 正逆位 → 牌义摘要 → 深度(付费)
|
||||||
|
|
||||||
|
API:`POST /v1/tarot/draw` `{ spread, seed? }` · `GET /v1/tarot/history`
|
||||||
|
|
||||||
|
校验:`V-R01` 牌阵列表 · `V-R02` 深度锁 · `V-R03` 文案是否触发词表禁词(实现闸)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. 统一商业与埋点
|
||||||
|
|
||||||
|
- 深度结果统一走 `PaywallSheet`(会员优先 / 单次次之)
|
||||||
|
- 埋点:`test_start` · `test_complete` · `plaza_post` · `sandbox_complete` · `mood_checkin` · `tarot_draw` · `immersive_unlock`
|
||||||
@@ -0,0 +1,179 @@
|
|||||||
|
# 30 · 完整数据模型 · API · 错误 · 缓存
|
||||||
|
|
||||||
|
> Design Complete · 路径前缀统一 `/api/v1`(下文简称 `/v1`)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. 领域实体(逻辑模型)
|
||||||
|
|
||||||
|
```
|
||||||
|
User ──< Profile (self|other)
|
||||||
|
User ── Membership
|
||||||
|
User ── AiQuota
|
||||||
|
User ──< Order ── OrderItem
|
||||||
|
User ──< Coupon
|
||||||
|
User ── DevicePush
|
||||||
|
User ──< Conversation ──< Message
|
||||||
|
User ──< ConsultOrder ── Consultant
|
||||||
|
User ──< TestSession ── TestReport
|
||||||
|
User ──< NatalReport / SynastryReport
|
||||||
|
User ──< TarotDraw / SandboxWork / MoodCheckin
|
||||||
|
User ── GeoPref (geo_visible, lat, lng, updated_at)
|
||||||
|
SynastryInvite (token, host_user, guest?, status)
|
||||||
|
PlazaPost ──< Comment
|
||||||
|
```
|
||||||
|
|
||||||
|
### 1.1 关键字段定稿
|
||||||
|
|
||||||
|
| 实体 | 必填字段 |
|
||||||
|
|---|---|
|
||||||
|
| Profile | id, user_id, kind, name, gender?, birth_date, birth_time?, birth_place, lat, lng, tz |
|
||||||
|
| Membership | user_id, plan(enum), status, starts_at, expires_at, auto_renew |
|
||||||
|
| Order | id, user_id, channel, amount_fen, status, product_type, product_ref |
|
||||||
|
| Conversation | id, user_id, mode(ai\|human), status, consultant_id? |
|
||||||
|
| SynastryReport | id, profile_a, profile_b, as_of?, summary_json, detail_json, unlocked |
|
||||||
|
| AiQuota | user_id, remaining, reset_at, source |
|
||||||
|
|
||||||
|
计划枚举:`trial_9_9` · `month_25` · `season_58` · `year_178`(展示价,分单位存储另表)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. API 目录(完整设计表)
|
||||||
|
|
||||||
|
### 2.1 账号
|
||||||
|
|
||||||
|
| Method | Path | 说明 |
|
||||||
|
|---|---|---|
|
||||||
|
| POST | `/v1/auth/sms/send` | 发码 |
|
||||||
|
| POST | `/v1/auth/sms/login` | 登录/注册 |
|
||||||
|
| POST | `/v1/auth/logout` | 登出 |
|
||||||
|
| GET | `/v1/me` | 我的聚合 |
|
||||||
|
| PATCH | `/v1/me` | 改昵称头像 |
|
||||||
|
| POST | `/v1/account/delete` | 注销申请 |
|
||||||
|
|
||||||
|
### 2.2 档案
|
||||||
|
|
||||||
|
| Method | Path | 说明 |
|
||||||
|
|---|---|---|
|
||||||
|
| GET/POST | `/v1/profiles` | 列表/创建 |
|
||||||
|
| PATCH/DELETE | `/v1/profiles/:id` | 更新/删 |
|
||||||
|
| PATCH | `/v1/me/geo` | `{visible,lat?,lng?}` |
|
||||||
|
|
||||||
|
### 2.3 内容与报告
|
||||||
|
|
||||||
|
| Method | Path | 说明 |
|
||||||
|
|---|---|---|
|
||||||
|
| POST | `/v1/reports/natal` | 本命 |
|
||||||
|
| POST | `/v1/reports/synastry` | 合盘 |
|
||||||
|
| GET | `/v1/fortune/daily` | 日运 |
|
||||||
|
| GET | `/v1/reports` | 我的报告库 |
|
||||||
|
| GET | `/v1/reports/:id` | 单份(含锁态) |
|
||||||
|
|
||||||
|
### 2.4 合盘社交
|
||||||
|
|
||||||
|
| Method | Path | 说明 |
|
||||||
|
|---|---|---|
|
||||||
|
| POST | `/v1/synastry/invites` | 创建邀请 |
|
||||||
|
| GET | `/v1/synastry/invites/:token` | 预览(无 host_profile_id 泄露) |
|
||||||
|
| POST | `/v1/synastry/invites/:token/accept` | 接受 |
|
||||||
|
| GET | `/v1/synastry/nearby` | 附近 |
|
||||||
|
|
||||||
|
### 2.5 AI / 咨询
|
||||||
|
|
||||||
|
| Method | Path | 说明 |
|
||||||
|
|---|---|---|
|
||||||
|
| GET | `/v1/ai/quota` | 余量 |
|
||||||
|
| POST | `/v1/ask/conversations` | 开聊 |
|
||||||
|
| GET | `/v1/ask/conversations` | 历史 |
|
||||||
|
| POST | `/v1/ask/conversations/:id/messages` | 发消息(流式可选 SSE) |
|
||||||
|
| GET | `/v1/consultants` | 达人列表 |
|
||||||
|
| POST | `/v1/consult/orders` | 下咨询单 |
|
||||||
|
| POST | `/v1/consult/orders/:id/cancel` | 取消 |
|
||||||
|
|
||||||
|
### 2.6 测评与沉浸
|
||||||
|
|
||||||
|
| Method | Path | 说明 |
|
||||||
|
|---|---|---|
|
||||||
|
| GET | `/v1/tests` | 列表 |
|
||||||
|
| * | `/v1/tests/...` | 见 21 |
|
||||||
|
| * | `/v1/plaza/...` | 见 21 |
|
||||||
|
| * | `/v1/sandbox/...` | 见 21 |
|
||||||
|
| * | `/v1/mood/...` | 见 21 |
|
||||||
|
| * | `/v1/tarot/...` | 见 21 |
|
||||||
|
|
||||||
|
### 2.7 商业
|
||||||
|
|
||||||
|
| Method | Path | 说明 |
|
||||||
|
|---|---|---|
|
||||||
|
| GET | `/v1/membership/plans` | 套餐 |
|
||||||
|
| POST | `/v1/pay/orders` | 创建支付单 |
|
||||||
|
| POST | `/v1/pay/mock/confirm` | 仅开发 mock |
|
||||||
|
| GET | `/v1/orders` | 订单列表 |
|
||||||
|
| GET | `/v1/coupons` | 优惠券 |
|
||||||
|
| POST | `/v1/pay/orders/:id/refund` | 申请退款 |
|
||||||
|
|
||||||
|
### 2.8 消息与配置
|
||||||
|
|
||||||
|
| Method | Path | 说明 |
|
||||||
|
|---|---|---|
|
||||||
|
| GET | `/v1/inbox` | 站内信聚合 |
|
||||||
|
| POST | `/v1/inbox/:id/read` | 已读 |
|
||||||
|
| GET | `/v1/home/feed` | 首页聚合 |
|
||||||
|
| GET | `/v1/config/app` | 开关/词表版本/审核模式 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. 统一响应与错误
|
||||||
|
|
||||||
|
### 3.1 成功包络
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"code": 0,
|
||||||
|
"message": "ok",
|
||||||
|
"data": {},
|
||||||
|
"request_id": "..."
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3.2 错误码定稿
|
||||||
|
|
||||||
|
| code | HTTP | 含义 | 客户端 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| 0 | 200 | 成功 | — |
|
||||||
|
| 40101 | 401 | 未登录 | 跳登录 |
|
||||||
|
| 40301 | 403 | 无权限/未解锁 | Paywall |
|
||||||
|
| 40302 | 403 | 会员权益不足 | Membership |
|
||||||
|
| 40401 | 404 | 资源不存在 | Toast |
|
||||||
|
| 40901 | 409 | 冲突(重复提交) | 忽略/提示 |
|
||||||
|
| 42201 | 422 | 参数错误 | 字段红字 |
|
||||||
|
| 42901 | 429 | 限流 | 稍后重试 |
|
||||||
|
| 40201 | 402/403 | 配额用尽 | 次数 Paywall |
|
||||||
|
| 50000 | 500 | 内部错误 | 通用错误页 |
|
||||||
|
|
||||||
|
锁态内容:**不**靠藏路由;返回 `unlocked:false` + `teaser`,完整 `detail` 仅解锁后下发(或同接口按 entitlement 裁剪)。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. 缓存与一致性
|
||||||
|
|
||||||
|
| 数据 | 策略 |
|
||||||
|
|---|---|
|
||||||
|
| 首页 feed | CDN/边缘 60s;登录个性化部分 API 直出 |
|
||||||
|
| 日运 | 按 `profile_id+date` 缓存 1h |
|
||||||
|
| 本命/合盘计算结果 | 按档案哈希 + as_of 缓存;档案变更失效 |
|
||||||
|
| 我的聚合 `/me` | 客户端短缓存 30s;支付成功强制失效 |
|
||||||
|
| Inbox 未读 | 推送 + 轮询 60s(前台) |
|
||||||
|
| 词表/开关 | `/config/app` ETag;启动拉取 |
|
||||||
|
|
||||||
|
离线:仅缓存已解锁报告摘要;敏感档案不同步到未加密存储。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. 分页约定
|
||||||
|
|
||||||
|
`?cursor=&limit=20` · 响应 `{ items, next_cursor }`
|
||||||
|
|
||||||
|
## 6. 与模拟器校验的关系
|
||||||
|
|
||||||
|
抓包对照本章路径与字段;差异记入 `99-emulator-validation.md` 的 Diff 表,再回写 OpenAPI。
|
||||||
@@ -0,0 +1,109 @@
|
|||||||
|
# 40 · 运营 · 商业 · 推送 · 埋点 · 安全
|
||||||
|
|
||||||
|
> Design Complete
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. 运营后台模块(信息架构)
|
||||||
|
|
||||||
|
```
|
||||||
|
Admin
|
||||||
|
├── 内容:首页运营位 / 工具配置 / 测评上下架 / 话题
|
||||||
|
├── UGC:广场审核队列 / 举报处理
|
||||||
|
├── 达人:入驻审核 / 排班 / 分成配置
|
||||||
|
├── 商业:套餐 / 优惠券 / 订单 / 退款
|
||||||
|
├── 用户:检索 / 封禁 / 注销工单
|
||||||
|
├── 消息:站内信模板 / 推送任务
|
||||||
|
└── 系统:开关 / 词表版本 / 审计日志
|
||||||
|
```
|
||||||
|
|
||||||
|
权限:超级管理员 · 运营 · 审核 · 客服(只读订单+工单)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. 支付与会员
|
||||||
|
|
||||||
|
### 2.1 商品类型
|
||||||
|
|
||||||
|
| product_type | 说明 | 履约 |
|
||||||
|
|---|---|---|
|
||||||
|
| `membership` | 会员套餐 | 写 Membership + 可能赠 AI 次 |
|
||||||
|
| `ai_pack` | AI 次包 | AiQuota += n |
|
||||||
|
| `report_unlock` | 单次报告 | report.unlocked=true |
|
||||||
|
| `consult` | 咨询时长/次 | ConsultOrder paid |
|
||||||
|
| `shop` | 实物/虚拟商品 | 履约状态机 |
|
||||||
|
|
||||||
|
### 2.2 支付状态机
|
||||||
|
|
||||||
|
`created` → `paying` → `paid` → (`refunding` → `refunded`) · `closed`
|
||||||
|
|
||||||
|
客户端:统一 `PaySheet`(渠道:微信/支付宝/IAP 占位;开发 `pay-mock`)。
|
||||||
|
|
||||||
|
### 2.3 价格展示(✅ E8 `free2/mine/会员.png`)
|
||||||
|
|
||||||
|
| 档 | 展示价 | 划线/备注 |
|
||||||
|
|---|---|---|
|
||||||
|
| 连续包月(首月) | ¥9.9 | 后续 ¥25 自动续费 |
|
||||||
|
| 连续包月 | ¥25 | |
|
||||||
|
| 连续包季 | ¥58 | 划线例 ¥90 |
|
||||||
|
| 连续包年 | ¥178 | 划线例 ¥360 |
|
||||||
|
| 12个月套餐 | ¥368 | 年卡x水晶等运营 SKU |
|
||||||
|
|
||||||
|
自动续费:会员中心「记录」可关;文案含解除说明。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. 推送
|
||||||
|
|
||||||
|
| 场景 | 通道 | 触发 |
|
||||||
|
|---|---|---|
|
||||||
|
| 日运提醒 | Push | 用户订阅 + 本地时区早晨 |
|
||||||
|
| 咨询回复 | Push + Inbox | 达人新消息 |
|
||||||
|
| 系统通知 | Inbox | 运营任务 |
|
||||||
|
| 支付成功 | Inbox | 履约完成 |
|
||||||
|
| 合盘邀请被接受 | Push | AcceptInvite |
|
||||||
|
|
||||||
|
开关:`/settings/notifications` 分项;系统级权限引导一次。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. 埋点字典(核心)
|
||||||
|
|
||||||
|
| event | 必填属性 |
|
||||||
|
|---|---|
|
||||||
|
| `app_open` | cold/warm, app_ver |
|
||||||
|
| `tab_view` | tab |
|
||||||
|
| `tool_open` | tool |
|
||||||
|
| `paywall_expose` | scene, product_hint |
|
||||||
|
| `pay_click` | product_type, amount_fen |
|
||||||
|
| `pay_success` | order_id, product_type |
|
||||||
|
| `ask_send` | mode, conversation_id |
|
||||||
|
| `synastry_generate` | relation_type |
|
||||||
|
| `test_complete` | slug |
|
||||||
|
| `membership_open` | from |
|
||||||
|
|
||||||
|
实现:客户端 SDK 批量上报;`request_id` 可关联 API 日志。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. 安全与合规
|
||||||
|
|
||||||
|
| 项 | 定稿 |
|
||||||
|
|---|---|
|
||||||
|
| 词表 | 硬禁「占卜」「算命」等;启动拉 `/config/app` |
|
||||||
|
| 未成年 | 支付与深度内容年龄门(策略开关) |
|
||||||
|
| 隐私 | 协议版本强更;geo 默认关;注销冷却 |
|
||||||
|
| 鉴权 | Bearer;刷新策略另开;后台操作审计 |
|
||||||
|
| 限流 | 登录/发帖/AI 分桶 |
|
||||||
|
| 支付 | 验签;幂等 `out_trade_no`;mock 仅非生产 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. 客服与工单
|
||||||
|
|
||||||
|
入口:我的 → 帮助;订单详情 → 申请退款。
|
||||||
|
工单状态:`open` · `processing` · `resolved` · `rejected`。
|
||||||
|
|
||||||
|
## 7. 校验 ID
|
||||||
|
|
||||||
|
`V-O01` 套餐价 · `V-O02` 支付渠道集合 · `V-O03` 推送分项 · `V-O04` 审核后台字段(无 App 内证,后台自建)
|
||||||
@@ -0,0 +1,131 @@
|
|||||||
|
# 99 · 安卓模拟器采集验证协议
|
||||||
|
|
||||||
|
> 设计已定稿;本文件规定**如何用模拟器把 🟡/待证项变成 ✅ 或 Diff 回写**。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. 目标
|
||||||
|
|
||||||
|
1. 对照 `complete-design` 各页的 **校验 ID(V-\*)** 采集证据。
|
||||||
|
2. 差异写入 Diff 表 → 回写对应设计文档 / OpenAPI。
|
||||||
|
3. 不阻塞当前 Feature Complete:未验证项保持「设计定稿 (D) + 待模拟器」。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. 环境准备
|
||||||
|
|
||||||
|
| 项 | 建议 |
|
||||||
|
|---|---|
|
||||||
|
| 模拟器 | Android Emulator API 33+,安装官方测测 APK(或应用商店包) |
|
||||||
|
| 代理 | mitmproxy / Charles;模拟器 Wi‑Fi 代理指向宿主机 |
|
||||||
|
| HTTPS | 安装 user CA;若 SSL Pinning 失败则改用 UI 录屏 + 布局层次(uiautomator) |
|
||||||
|
| 账号 | 新号 + 会员号各一;记录手机号不入库文档 |
|
||||||
|
| 录制 | 每条 V-\* 至少:截图 1 +(可选)HAR 片段 + 操作步骤 |
|
||||||
|
|
||||||
|
### 2.1 本机已装(2026-08)
|
||||||
|
|
||||||
|
| 项 | 路径 / 名称 |
|
||||||
|
|---|---|
|
||||||
|
| SDK | `ANDROID_HOME=/opt/homebrew/share/android-commandlinetools` |
|
||||||
|
| AVD | `YuXinGu_API34`(Pixel 7 / API 34 / google_apis / arm64) |
|
||||||
|
| Agent Skill | `/Users/jack/tools/android-adb-skill` → `./tools/android` + `~/.claude/skills/android-*` |
|
||||||
|
| Cursor Rule | `.cursor/rules/android-adb.mdc` |
|
||||||
|
| 冒烟截图 | `.tmp/cece-validation/smoke/screen.png` |
|
||||||
|
|
||||||
|
启动与截图:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
emulator -avd YuXinGu_API34 -no-audio -gpu auto &
|
||||||
|
adb wait-for-device
|
||||||
|
./tools/android screenshot --out .tmp/cece-validation/smoke/screen.png --json
|
||||||
|
```
|
||||||
|
|
||||||
|
> 测测 APK 仍需另行安装后,才能跑 Batch A–D。
|
||||||
|
|
||||||
|
证据目录建议(本地,勿强求进 git):
|
||||||
|
|
||||||
|
```
|
||||||
|
.tmp/cece-validation/
|
||||||
|
YYYYMMDD/
|
||||||
|
V-H01/
|
||||||
|
steps.md
|
||||||
|
screen.png
|
||||||
|
traffic.har # 可选
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. 采集步骤(单条 V-\*)
|
||||||
|
|
||||||
|
1. 打开设计文档中的校验 ID 定义(预期 UI/文案/API)。
|
||||||
|
2. 冷启动 App → 按步骤复现到目标屏。
|
||||||
|
3. 截图;若可抓包,过滤 host,保存相关 request/response。
|
||||||
|
4. 填写结果:`PASS` / `DIFF` / `BLOCKED`(如 pinning、地区限制)。
|
||||||
|
5. `DIFF` 必须写:期望(设计)vs 实际 + 建议改设计或改实现。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. 优先级批次
|
||||||
|
|
||||||
|
### Batch A — 五 Tab 骨架(先做)
|
||||||
|
|
||||||
|
| ID | 主题 | 文档 |
|
||||||
|
|---|---|---|
|
||||||
|
| V-H01~ | 首页楼层顺序与运营位 | `10-page-home` |
|
||||||
|
| V-G01~ | 消息分类与未读 | `11-page-message` |
|
||||||
|
| V-A01~ | 问一问 AI/人工切换 | `12-page-ask` |
|
||||||
|
| V-L01~ | 连麦/在线列表 | `13-page-online` |
|
||||||
|
| V-U01~ | 我的列表与资产条 | `14-page-mine` |
|
||||||
|
|
||||||
|
### Batch B — 星座与合盘
|
||||||
|
|
||||||
|
| ID | 主题 | 文档 |
|
||||||
|
|---|---|---|
|
||||||
|
| V-N01~ | 本命轮盘与锁点 | `20-module-astrology` |
|
||||||
|
| V-S01~ | 五图顺序、邀请、附近默认 | 同上 |
|
||||||
|
| V-F01~ | 日运字段 | 同上 |
|
||||||
|
|
||||||
|
### Batch C — 测评与沉浸
|
||||||
|
|
||||||
|
| ID | 主题 | 文档 |
|
||||||
|
|---|---|---|
|
||||||
|
| V-T01~ | 测评进度与结果锁 | `21-module-tests-immersive` |
|
||||||
|
| V-P01~ | 广场 | 同上 |
|
||||||
|
| V-B01~ / V-M01~ / V-R01~ | 沙盘/小镇/塔罗 | 同上 |
|
||||||
|
|
||||||
|
### Batch D — 商业与系统
|
||||||
|
|
||||||
|
| ID | 主题 | 文档 |
|
||||||
|
|---|---|---|
|
||||||
|
| V-O01~ | 会员价与支付 | `40-ops-commerce` |
|
||||||
|
| 路径对照 | API 与 30 章一致性 | `30-data-api` |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. Diff 登记表(模板)
|
||||||
|
|
||||||
|
复制到当次验证笔记:
|
||||||
|
|
||||||
|
| ID | 结果 | 期望(设计) | 实际(模拟器) | 处置 | 回写文件 |
|
||||||
|
|---|---|---|---|---|---|
|
||||||
|
| V-S01 | DIFF | 五图顺序 A-B-C… | 顺序为… | 改设计 / 改实现 | `20-module-astrology.md` |
|
||||||
|
|
||||||
|
处置约定:
|
||||||
|
|
||||||
|
- **改设计**:以竞品真机为准,更新 complete-design,证据链加 E\*。
|
||||||
|
- **改实现**:愈心谷已按设计开发则排期对齐。
|
||||||
|
- **忽略**:明确合规/品牌差异(词表),在文档标「刻意差异」。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. 与 Evidence First 的衔接
|
||||||
|
|
||||||
|
- 模拟器截图/HAR → 记入 `cece-frontend-re/README.md` 证据表新行(E8+)。
|
||||||
|
- 原 🟡 项验证通过后改为 ✅,去掉「仅设计定稿」标注。
|
||||||
|
- 完整设计包门禁:**不**因未跑模拟器而撤销 Design Complete。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 7. 愈心谷侧注意
|
||||||
|
|
||||||
|
验证测测时允许看到其原生产物用词;**落地愈心谷 UI 时仍走词表**,Diff 中单独列「合规替换」列,避免把禁词写进产品文案。
|
||||||
@@ -0,0 +1,64 @@
|
|||||||
|
# 测测前端 · 完整产品设计包(Design Complete V1.0)
|
||||||
|
|
||||||
|
> Status: **Design Complete(设计定稿)** · 实现与模拟器校验前的唯一前端设计输入
|
||||||
|
> 上游逆向底稿:[../README.md](../README.md)
|
||||||
|
> 方法:[reverse-engineering-spec.md](../../../../design/reverse-engineering-spec.md)
|
||||||
|
> 校验计划:安卓模拟器采集验证(见 [99-emulator-validation.md](99-emulator-validation.md))
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 0. 本包定位
|
||||||
|
|
||||||
|
| 项 | 说明 |
|
||||||
|
|---|---|
|
||||||
|
| 是什么 | 基于公开实测 + 逆向推导的 **Feature Complete 设计说明书** |
|
||||||
|
| 不是什么 | 不是 Demo;不是「以后再补」的大纲 |
|
||||||
|
| 证据策略 | ✅ 已证实写死;🟡/🔵 在本包中升格为 **设计定稿(D)**,并列入模拟器校验清单 |
|
||||||
|
| 品牌 | 本文用「测测」指称竞品对象;愈心谷落地时过 lexicon,禁止自称测测 |
|
||||||
|
|
||||||
|
**冻结规则**:未经验证通过前,工程实现以本包为准;模拟器发现差分时,先改本包再改代码。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. 文档地图
|
||||||
|
|
||||||
|
| 文档 | 内容 |
|
||||||
|
|---|---|
|
||||||
|
| [00-design-bible.md](00-design-bible.md) | 产品目标 · IA · 全局组件 · 全局状态 · 设计令牌约定 |
|
||||||
|
| [10-page-home.md](10-page-home.md) | 首页完整设计 |
|
||||||
|
| [11-page-message.md](11-page-message.md) | 消息完整设计 |
|
||||||
|
| [12-page-ask.md](12-page-ask.md) | 「问」完整设计 |
|
||||||
|
| [13-page-online.md](13-page-online.md) | 在线完整设计 |
|
||||||
|
| [14-page-mine.md](14-page-mine.md) | 我的完整设计 |
|
||||||
|
| [20-module-astrology.md](20-module-astrology.md) | 星座/星盘/合盘/运势完整设计 |
|
||||||
|
| [21-module-tests-immersive.md](21-module-tests-immersive.md) | 测评/广场/沙盘/心情小镇/塔罗 |
|
||||||
|
| [30-data-api.md](30-data-api.md) | 数据模型 · 表 · API · 错误码 · 缓存 |
|
||||||
|
| [40-ops-commerce.md](40-ops-commerce.md) | 后台 · 权限 · 支付 · 消息 · 埋点 · 配置 · 安全 |
|
||||||
|
| [99-emulator-validation.md](99-emulator-validation.md) | 安卓模拟器采集与差分回填协议 |
|
||||||
|
| [evidence-20260803.md](evidence-20260803.md) | **E8 真机 Diff**(10.50.0 模拟器) |
|
||||||
|
| [STATUS-overnight.md](STATUS-overnight.md) | 夜间采集结果摘要(起床看) |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. 设计完成度门禁
|
||||||
|
|
||||||
|
| 门禁 | 标准 |
|
||||||
|
|---|---|
|
||||||
|
| Design Complete | 本包各文档无「略/TODO」;每页含 UI 清单、交互、状态机、接口、异常、埋点 |
|
||||||
|
| Validation Ready | `99-emulator-validation.md` 用例可执行 |
|
||||||
|
| Impl Ready | `30-data-api` + 页面契约可直接开工 |
|
||||||
|
| Parity Verified | 模拟器采集后差分关闭(后续) |
|
||||||
|
|
||||||
|
当前:**Design Complete + Validation Ready**。Parity Verified = 待模拟器。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. 与逆向底稿关系
|
||||||
|
|
||||||
|
```text
|
||||||
|
../00–08 逆向分析(Evidence First)
|
||||||
|
↓ 升格定稿
|
||||||
|
complete-design/* 完整设计(本包)
|
||||||
|
↓ 模拟器采集
|
||||||
|
差分回填 → 修订本包 → 再实现/再验
|
||||||
|
```
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
# 夜间采集状态(给你起床看)
|
||||||
|
|
||||||
|
> 时间:2026-08-03 凌晨 · APK 10.50.0 · 已登录账号
|
||||||
|
|
||||||
|
## 结论
|
||||||
|
|
||||||
|
**免付费主路径大部分已截到**,设计 Diff 已写入 `evidence-20260803.md` + 首页/消息/问文档。
|
||||||
|
工具宫格与「更多」清单已采;「我的」子页与部分在线列表曾被 SVIP/向TA提问 收银页干扰,需醒来后补一轮。
|
||||||
|
|
||||||
|
## 截图目录(本地)
|
||||||
|
|
||||||
|
| 目录 | 内容 |
|
||||||
|
|---|---|
|
||||||
|
| `.tmp/cece-validation/20260803/free2/` | **主成果**(包名校验后) |
|
||||||
|
| `free2/01-home.png` 等 `0x-tab-*.png` | 五 Tab / 问双轨 |
|
||||||
|
| `free2/tools/*.png` | 宫格落地:星座/星盘/合盘/紫微/陪伴小星/倾诉/智慧卡/报告/生辰历/灵魂伴侣/广场/更多… |
|
||||||
|
| `free2/tools/more/*.png` | 更多页子项 |
|
||||||
|
| `free2/manifest.json` | 清单(脚本结束后生成) |
|
||||||
|
|
||||||
|
## 已回写设计
|
||||||
|
|
||||||
|
- `00-design-bible.md` 底栏角标
|
||||||
|
- `10-page-home.md` 宫格顺序 / 自己卡片五维
|
||||||
|
- `11-page-message.md` 列表形态
|
||||||
|
- `12-page-ask.md` AI 引导题与底栏快捷
|
||||||
|
- `evidence-20260803.md` E8
|
||||||
|
|
||||||
|
## 「更多」实机条目(✅ labels)
|
||||||
|
|
||||||
|
推荐 · 星盘报告 · 测试 · 倾诉 · 心情小镇 · 幸运地图 · 星宿 · 爱情树 · 灵魂伴侣 · 聊天分析 · 关系网 · 商城 · 解读 · 沙盘 · 缘分合盘 · 星座 · 生辰 · 紫微 · 政余 · 灵数 · 生肖 · 玛雅图腾 · 人类图 · 星盘 · 生辰历 · 紫微历 · 政余历 · 星骰 · 智慧卡 · 日历
|
||||||
|
|
||||||
|
## 醒来建议(可选 10 分钟)
|
||||||
|
|
||||||
|
1. 确认模拟器还在:`adb devices`
|
||||||
|
2. 打开测测,关掉任何 SVIP/向TA提问弹层
|
||||||
|
3. 说「继续补我的和在线列表」——我只补这两块
|
||||||
|
|
||||||
|
## 脚本
|
||||||
|
|
||||||
|
- `tools/cece_capture_free.py`(初版)
|
||||||
|
- 夜间实际用的是内联 package-guard 流程;稳定版可再收束进脚本
|
||||||
@@ -0,0 +1,92 @@
|
|||||||
|
# 真机证据 Diff · 2026-08-03(模拟器 · 测测 10.50.0)
|
||||||
|
|
||||||
|
> Evidence ID: **E8** · AVD `YuXinGu_API34` · package `com.xxwolo.cc5` · APK `bird-xxdoc-android-release-xxwolo-10.50.0`
|
||||||
|
> 截图根目录:`.tmp/cece-validation/20260803/`(本地,未入库)
|
||||||
|
> 主成果:`free2/`(34 张)· 说明:[STATUS-overnight.md](STATUS-overnight.md)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. 冷启动 / 门禁
|
||||||
|
|
||||||
|
| 屏 | 证据 | 定稿结论 |
|
||||||
|
|---|---|---|
|
||||||
|
| 温馨提示 | `onboarding/10-start.png` | 同意 / 不同意→游客;披露位置·麦克风·设备信息 |
|
||||||
|
| 游客首页 | `V-H01/home.png` | 底栏右端为「未登录」;中间「问」+ AI 角标 |
|
||||||
|
| 登录页 | 点「同意」后 | 手机号+验证码 / 密码登录 / 其他方式;协议勾选 |
|
||||||
|
| 未成年人模式 | `logged/00-current.png` | 开启未成年人模式 / **不再提醒** |
|
||||||
|
| 每日登录领好礼 | 遮罩态截图 | 回归福利七日;立即领取;下方 X 关闭 |
|
||||||
|
| 隐私政策更新 | 登录后偶发 | 同意 / 不同意并退出 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. 底栏五 Tab(已登录 · ✅)
|
||||||
|
|
||||||
|
| 序 | 文案 | 角标/形态 | Diff vs 原设计 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| 1 | 首页 | 选中态房子图标 | 一致 |
|
||||||
|
| 2 | 消息 | 红点数字 | 一致 |
|
||||||
|
| 3 | **问** | **中央大圆 + AI 角标** | 一致;无障碍树常无「问」文本 |
|
||||||
|
| 4 | 在线 | 红标「限免」 | **新增运营角标**;易直达向TA提问 |
|
||||||
|
| 5 | 我的 | 红点 | 游客态文案为「未登录」 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. 首页结构(已登录 · ✅ V-H01)
|
||||||
|
|
||||||
|
### 3.1 顶区
|
||||||
|
|
||||||
|
签到 · 搜索运营占位轮播 · `+` · 「输入生日,更加了解TA」
|
||||||
|
|
||||||
|
### 3.2 自己卡片
|
||||||
|
|
||||||
|
今日心情分 + 五维:**爱情 / 财富 / 事业 / 学习 / 人际**
|
||||||
|
|
||||||
|
### 3.3 宫格
|
||||||
|
|
||||||
|
**第一行:** I人E人 · 星座 · 星盘 · 生辰 · 缘分合盘 · 紫微
|
||||||
|
**第二行:** 陪伴小星 · 倾诉 · 智慧卡 · 星盘报告(New) · 生辰历 · 灵魂伴侣
|
||||||
|
|
||||||
|
宫格下:AI玩法广场大卡 + 商城运营卡;脚注「部分标题由AI生成,仅供参考」。
|
||||||
|
|
||||||
|
### 3.4 更多页条目(✅)
|
||||||
|
|
||||||
|
见 `10-page-home.md` §2.3.1;含沙盘/心情小镇/幸运地图/爱情树/人类图等。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. 截图清单(`free2/`)
|
||||||
|
|
||||||
|
| 路径 | 说明 |
|
||||||
|
|---|---|
|
||||||
|
| `01-home` · `02-tab-home` | 首页 |
|
||||||
|
| `03-tab-message` | 消息 |
|
||||||
|
| `04-tab-ask*` | 问 · AI / 真人1v1 |
|
||||||
|
| `05-tab-online` | 在线(注意限免漏斗) |
|
||||||
|
| `06-tab-mine*` | 我的 |
|
||||||
|
| `tools/*` | 宫格落地免付费页 |
|
||||||
|
| `tools/more/*` | 更多子项 |
|
||||||
|
| `mine/{root,会员,档案,测试,报告}` | 我的子页;会员价 ✅ |
|
||||||
|
| `manifest.json` | 34 张索引 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. 「问」轨 Diff(✅)
|
||||||
|
|
||||||
|
- 顶栏:`测测AI` | `真人1v1`(「新客半价」)
|
||||||
|
- 引导题:财富建议 / 工作发展 / 性格弱点 / 复合(及变体)
|
||||||
|
- 底栏:工具 · 语音通话 · 深度解读 · 灵魂伴侣
|
||||||
|
- 免责声明固定底
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. 会员价(✅)
|
||||||
|
|
||||||
|
连续包月首月 ¥9.9 → ¥25;季 ¥58;年 ¥178(见 `40-ops-commerce.md`)。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 7. 愈心谷落地注意
|
||||||
|
|
||||||
|
- 竞品文案含「测测」;落地过 lexicon。
|
||||||
|
- 游客 / 未成年人 / 每日领取 / 隐私更新 为必做门禁。
|
||||||
|
- 「向TA提问」为高意图收银,列表浏览需可退回。
|
||||||
@@ -0,0 +1,152 @@
|
|||||||
|
# Feature Spec: 陪伴(节气壳)
|
||||||
|
|
||||||
|
> Status: `Active` · Map: `§4 陪伴 [P2]` · Phase: `P2 Complete`
|
||||||
|
> 规范:[../feature-design.md](../feature-design.md)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. 功能定义
|
||||||
|
|
||||||
|
| 字段 | 内容 |
|
||||||
|
|---|---|
|
||||||
|
| Name | 陪伴 |
|
||||||
|
| Purpose | 日常留存:节气生活建议与心情记录 |
|
||||||
|
| Business Goal | Tab 占位完整;P2 做深留存 |
|
||||||
|
|
||||||
|
| In(P1 壳) | Out(P1) |
|
||||||
|
|---|---|
|
||||||
|
| 今日节气展示(本地/轻 API) | 完整心情 OS |
|
||||||
|
| 生活建议(非运势) | 疗效承诺 |
|
||||||
|
| 路由与 Tab 可达 | 强制日记社交 |
|
||||||
|
|
||||||
|
| In(P2) | |
|
||||||
|
|---|---|
|
||||||
|
| 心情记录落库、成长记录 | |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. 用户价值
|
||||||
|
|
||||||
|
1. **为何需要:** 需要轻量每日触达,不只是一次性测试。
|
||||||
|
2. **P1 获得:** 今日节气与建议壳。
|
||||||
|
3. **付费:** N/A(P1)。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. 用户角色
|
||||||
|
|
||||||
|
| Actor | P1 |
|
||||||
|
|---|---|
|
||||||
|
| Visitor | 可打开陪伴页看节气壳 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. 用户流程
|
||||||
|
|
||||||
|
```text
|
||||||
|
Tab 陪伴 → /companion
|
||||||
|
↓
|
||||||
|
展示今日节气 + 生活建议文案
|
||||||
|
↓
|
||||||
|
(P2)记录心情 → POST /moods
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. 页面设计
|
||||||
|
|
||||||
|
| 路由 | 页面 |
|
||||||
|
|---|---|
|
||||||
|
| `/companion` | CompanionPage |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. 页面状态规范
|
||||||
|
|
||||||
|
| 状态 | UI |
|
||||||
|
|---|---|
|
||||||
|
| Loading | 拉节气 |
|
||||||
|
| Normal | 节气 + 建议 |
|
||||||
|
| Error | 降级本地文案或重试 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 7. Business Rules
|
||||||
|
|
||||||
|
| ID | Rule |
|
||||||
|
|---|---|
|
||||||
|
| R1 | 文案为「生活建议 / 节气」,禁止「今日运势」 |
|
||||||
|
| R2 | P1 不宣称完整陪伴 OS 已交付 |
|
||||||
|
| R3 | 心情 API 若暴露须鉴权;P1 可不接 UI |
|
||||||
|
| R4 | 扩行为前必须把本 Spec Phase 与 In Scope 升为 P2 并补验收 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 8. 数据模型影响
|
||||||
|
|
||||||
|
| 表 | P1 | P2 |
|
||||||
|
|---|---|---|
|
||||||
|
| solar term | 只读 API/本地 | |
|
||||||
|
| `moods` | 可有 API | UI 写入 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 9. API 需求
|
||||||
|
|
||||||
|
| Method | Path | 意图 |
|
||||||
|
|---|---|---|
|
||||||
|
| GET | `/api/v1/solar-terms/today` | 今日节气 |
|
||||||
|
| POST | `/api/v1/moods` | P2 心情 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 10. 权限设计
|
||||||
|
|
||||||
|
| 能力 | Visitor |
|
||||||
|
|---|---|
|
||||||
|
| 看节气壳 | ✓ |
|
||||||
|
| 写心情 | P2 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 11. 埋点
|
||||||
|
|
||||||
|
| Event | 触发 | 可选 params |
|
||||||
|
|---|---|---|
|
||||||
|
| `companion_viewed` | 打开 `/companion` | — |
|
||||||
|
| `mood_saved` | 心情保存成功 | `score`(整数分,非正文) |
|
||||||
|
| `growth_plan_viewed` | 打开 `/growth-plan` 且列表加载结束 | — |
|
||||||
|
| `growth_plan_created` | 创建计划成功 | — |
|
||||||
|
| `growth_plan_checkin` | 今日打卡成功 | — |
|
||||||
|
|
||||||
|
禁止参数含计划 title/focus/note 明文。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 12. 测试验收标准
|
||||||
|
|
||||||
|
**Given** P1
|
||||||
|
**When** 打开陪伴
|
||||||
|
**Then** 页面可达且无运势禁用词;不因未做心情而崩溃
|
||||||
|
|
||||||
|
**Given** 要将心情做进 P1
|
||||||
|
**When** —
|
||||||
|
**Then** **禁止**在未改 Spec/map 分期前实现
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 13. AI 开发前检查
|
||||||
|
|
||||||
|
- [x] 壳范围已标明 · 禁止超 scope
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 14. Implementation Notes
|
||||||
|
|
||||||
|
| 项 | 内容 |
|
||||||
|
|---|---|
|
||||||
|
| Packages | `CompanionPage` · `internal/companion` · moods 表 |
|
||||||
|
| 实现 | GET `/solar-terms/today` · POST `/moods` · GET `/moods/today` · H5 心情 UI |
|
||||||
|
| Gaps | 推送(后置 / Ops-E) |
|
||||||
|
| Label | Feature Complete(P2:节气 + 心情 + 近七日轨迹;成长计划见 `/growth-plan`) |
|
||||||
|
| Process Review | 2026-08-02 [P1-PROCESS-REVIEW](P1-PROCESS-REVIEW.md) · 心情已按产品「其他先做」落地 |
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
# Feature Spec: 小程序咨询域(原生 Go)
|
||||||
|
|
||||||
|
> Status: `Active` · ECR-050
|
||||||
|
|
||||||
|
## 1. 功能定义
|
||||||
|
|
||||||
|
小程序首页/咨询/测评/订单/我的资料不再打 Java。Go 用 PostgreSQL 提供与原 `/psychic/*` 相同的字段合同。
|
||||||
|
|
||||||
|
## 2. Business Rules
|
||||||
|
|
||||||
|
| ID | Rule |
|
||||||
|
|---|---|
|
||||||
|
| C1 | 未登录可看 banner、资讯、测评列表、咨询师、档期、协议 |
|
||||||
|
| C2 | 登录后才能交卷、关注、下单、改资料、反馈 |
|
||||||
|
| C3 | 下单锁时段;取消未支付订单释放时段 |
|
||||||
|
| C4 | 金额单位:分;支付 openid = `users.wx_openid` |
|
||||||
|
| C5 | 测评仅单选计分,按分数区间匹配结果 |
|
||||||
|
| C6 | 协议路径保持历史拼写 `procotol` |
|
||||||
|
|
||||||
|
## 3. API
|
||||||
|
|
||||||
|
全部挂在 `/api/v1/psychic/*`,字段与原 Java App VO 一致(见 ECR-050 BD)。
|
||||||
@@ -0,0 +1,223 @@
|
|||||||
|
# Feature Spec: 探索测试
|
||||||
|
|
||||||
|
> Status: `Active` · Map: `2.2 人格测评 [P1]` · Phase: `P1`
|
||||||
|
> 规范:[../feature-design.md](../feature-design.md)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. 功能定义
|
||||||
|
|
||||||
|
| 字段 | 内容 |
|
||||||
|
|---|---|
|
||||||
|
| Name | 探索测试 |
|
||||||
|
| Purpose | 通过短量表帮助用户了解沟通方式、情感模式等偏好 |
|
||||||
|
| Business Goal | 丰富探索中心;结果导流关系理解与问答;可分享 |
|
||||||
|
|
||||||
|
| In | Out |
|
||||||
|
|---|---|
|
||||||
|
| 已发布量表列表、答题、计分、丰富结果 | 伪 MBTI 版权侵权内容 |
|
||||||
|
| ≥1 热门测试(P1:沟通方式 + 情感模式) | 医疗量表诊断 |
|
||||||
|
| 分享结果卡 | 未定义的「深度付费层」若未实现则标 Gap |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. 用户价值
|
||||||
|
|
||||||
|
1. **为何需要:** 比生日画像更场景化的自我标签。
|
||||||
|
2. **完成后获得:** 风格标签、概述、维度、建议、话术、成长计划。
|
||||||
|
3. **付费:** P1 结果全量返回(免费);深度会员导流为软转化(非强制锁结果)。`Gap:` 若产品后续要对部分结果上锁,须先更新本 Spec。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. 用户角色
|
||||||
|
|
||||||
|
| Actor | 能力 |
|
||||||
|
|---|---|
|
||||||
|
| Visitor | 浏览列表;提交需 Self Profile |
|
||||||
|
| 无档案 | 可看题,提交前引导建档 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. 用户流程
|
||||||
|
|
||||||
|
```text
|
||||||
|
/explore 测试列表
|
||||||
|
↓
|
||||||
|
进入 /scales/:slug
|
||||||
|
↓
|
||||||
|
已有结果? → 直接展示最近结果 +「重新测试」
|
||||||
|
↓(无结果 / 点重测)
|
||||||
|
加载题目 · 逐题作答(须全部完成)
|
||||||
|
↓
|
||||||
|
无 Self? → 引导建档
|
||||||
|
↓
|
||||||
|
POST result → 展示丰富结果
|
||||||
|
↓
|
||||||
|
分享 / 去关系理解 / 去问答
|
||||||
|
```
|
||||||
|
|
||||||
|
### 子能力展开
|
||||||
|
|
||||||
|
| 子能力 | P1 |
|
||||||
|
|---|---|
|
||||||
|
| 测试入口(探索 Tab · 首页宫格) | ✓ · 产品向 `mbti-lite`;探索主路径为 curated 题库(A 集) |
|
||||||
|
| 测试列表 | ✓ · 探索「题库精选」宫格(每类 1~2)+「题库分类」;分类页 `/explore/bank/:key` |
|
||||||
|
| 题库范围(A) | ✓ 人格 / 情绪能力 / 智能 / 生活与关系;**不含**抑郁焦虑强迫躁狂双相等临床筛查 |
|
||||||
|
| 问题流程 | ✓ |
|
||||||
|
| 答题保存(服务端结果落库) | ✓ |
|
||||||
|
| 最近结果回看 | ✓ GET `/scales/{slug}/result`;有结果进页不重复作答 |
|
||||||
|
| 重新测试 | ✓ 结果页按钮 → 清空草稿再答;新结果落库并覆盖展示 |
|
||||||
|
| 中断恢复 | ✓ localStorage 草稿(`scaleDraft`);提交后清除 |
|
||||||
|
| 结果生成(丰富结构) | ✓ |
|
||||||
|
| 免费层 | ✓ 全量 result |
|
||||||
|
| 深度层 | N/A(当前不锁) |
|
||||||
|
| 分享 | ✓ ShareSheet |
|
||||||
|
| AI 解释 | 软链 `/ask` |
|
||||||
|
| 数据统计 | 埋点名定义;SDK `Gap` |
|
||||||
|
| 验收标准 | §12 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. 页面设计
|
||||||
|
|
||||||
|
| 路由 | 页面 |
|
||||||
|
|---|---|
|
||||||
|
| `/explore` | ExplorePage(题库精选宫格 + 题库分类 + 其它工具) |
|
||||||
|
| `/explore/bank/:category` | ExploreBankCategoryPage · curated 题库分类列表 |
|
||||||
|
| `/explore/:category` | ExploreCategoryPage · 产品工具分类(解码/星座等) |
|
||||||
|
| `/scales/:slug` | ScalePage(含 bank slug) |
|
||||||
|
|
||||||
|
```text
|
||||||
|
/scales/:slug
|
||||||
|
├── Loading(题目)
|
||||||
|
├── Normal(答题中)
|
||||||
|
├── Empty/NeedProfile(提交前无档案)
|
||||||
|
├── Error
|
||||||
|
└── Result(完成后)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. 页面状态规范
|
||||||
|
|
||||||
|
| 状态 | UI |
|
||||||
|
|---|---|
|
||||||
|
| Loading | 加载题目 |
|
||||||
|
| Error | 重试 |
|
||||||
|
| Normal | 进度 + 单选题 |
|
||||||
|
| NeedProfile | 引导首页 |
|
||||||
|
| Result | ReportRich 结构展示 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 7. Business Rules
|
||||||
|
|
||||||
|
| ID | Rule |
|
||||||
|
|---|---|
|
||||||
|
| R1 | 仅 `published` 量表可列表/作答 |
|
||||||
|
| R2 | 提交前答案覆盖全部题目 |
|
||||||
|
| R3 | 必须绑定用户 Self `profile_id` |
|
||||||
|
| R4 | 计分:多数选项 → style;结果文案 lexicon 安全 |
|
||||||
|
| R5 | result 含 label/summary/overview/dimensions/tips/scripts/growth_plan/faq |
|
||||||
|
| R6 | 结果「不是固定标签」需在文案中提示 |
|
||||||
|
| R7 | 作答过程写入本地草稿(按 slug);提交成功后清除;刷新可恢复未提交答案 |
|
||||||
|
| R8 | 同一用户同一 slug(含 curated 题库 slug)若已有 `scale_results`,再次进入直接展示**最近一次**结果,并提供「重新测试」;未点重测不得自动进入答题 |
|
||||||
|
| R9 | `mbti-lite` 产品展示名统一为「MBTI测试」(首页宫格 / 探索入口 / 量表 title) |
|
||||||
|
| R10 | **标准版 `mbti-lite`**:开源 OEJTS 1.2 · **32 题**(四维各 8)· 双极 1–5 Likert;按维累加,阈值判出 E/I·S/N·T/F·J/P 一侧,合成四字母类型;**免费** |
|
||||||
|
| R11 | **完整版 `mbti-full`**:60 题(四维各 15)· 须**成长会员**;未开通时 GET 返回 `locked=true` 且无题目;提交返回 403 |
|
||||||
|
| R12 | 禁止使用官方 MBTI® 版权题干;结果须提示「不是固定标签」;题库重大更新须 soft-delete 旧 `scale_results` |
|
||||||
|
| R13 | curated 题库(`scalebank`)仅含 A 集非临床探索量表;文案须声明「非诊断」;临床类(抑郁/焦虑/强迫等)不得进入 C 端 |
|
||||||
|
| R14 | curated 题库作答走同一 `/scales/:slug`;完成后再次点击入口须遵守 R8(只看结果或显式重测),不得每次从头作答 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 8. 数据模型影响
|
||||||
|
|
||||||
|
| 表 | 备注 |
|
||||||
|
|---|---|
|
||||||
|
| `scales` / `scale_questions` | seed |
|
||||||
|
| `scale_results` | answers + result jsonb |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 9. API 需求
|
||||||
|
|
||||||
|
| Method | Path | 意图 |
|
||||||
|
|---|---|---|
|
||||||
|
| GET | `/api/v1/scales` | 列表 |
|
||||||
|
| GET | `/api/v1/scales/{slug}` | 题目 |
|
||||||
|
| GET | `/api/v1/scales/{slug}/result` | 当前用户该量表最近一次结果;无则 404 |
|
||||||
|
| POST | `/api/v1/scales/{slug}/result` | 提交计分 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 10. 权限设计
|
||||||
|
|
||||||
|
| 能力 | Visitor 无档案 | Visitor 有 Self |
|
||||||
|
|---|---|---|
|
||||||
|
| 看列表/题目 | ✓ | ✓ |
|
||||||
|
| 提交结果 | ✗ | ✓ |
|
||||||
|
| `mbti-full` 作答 | ✗(须成长会员) | ✓(会员 active) |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 11. 埋点
|
||||||
|
|
||||||
|
经统一 `track()`;非 P1 核心 5 事件。禁止参数含题干全文、答案明文、档案 ID。
|
||||||
|
|
||||||
|
| Event | 触发 | 可选 params |
|
||||||
|
|---|---|---|
|
||||||
|
| `scale_list_viewed` | 打开 `/explore` 且题库 catalog 加载成功 | — |
|
||||||
|
| `scale_bank_category_viewed` | 打开 `/explore/bank/:category` 且分类加载成功 | `category`(key) |
|
||||||
|
| `scale_started` | 用户点开始进入作答(含「重新测试」后再开始) | `slug` · `access`: free\|member |
|
||||||
|
| `scale_completed` | 提交计分成功并展示结果 | `slug` · `access`: free\|member |
|
||||||
|
| `scale_result_reopened` | 再次进入已有结果直接展示(R8,未重测) | `slug` |
|
||||||
|
| `scale_retake_clicked` | 点「重新测试」 | `slug` |
|
||||||
|
| `scale_locked_viewed` | 会员锁页展示(如 mbti-full) | `slug` |
|
||||||
|
| `scale_share_clicked` | 结果页打开分享 | `slug` |
|
||||||
|
| `scale_cta_relation` / `scale_cta_ask` | 结果导流(若 UI 有) | `slug` |
|
||||||
|
|
||||||
|
`page_view` 对 `/explore` · `/explore/bank/*` · `/scales/*` 由路由自动采集。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 12. 测试验收标准
|
||||||
|
|
||||||
|
**Given** published 量表与 Self
|
||||||
|
**When** 答完提交
|
||||||
|
**Then** 返回 label 与 overview/tips 等丰富字段
|
||||||
|
|
||||||
|
**Given** 已提交过结果
|
||||||
|
**When** 再次进入 `/scales/{slug}`
|
||||||
|
**Then** 直接展示最近结果与「重新测试」;不进入答题
|
||||||
|
|
||||||
|
**Given** 结果页点「重新测试」并完成提交
|
||||||
|
**When** 再次进入
|
||||||
|
**Then** 展示新结果
|
||||||
|
|
||||||
|
**Given** 未答完
|
||||||
|
**When** 提交
|
||||||
|
**Then** 前端拦截;不成功落库
|
||||||
|
|
||||||
|
**Given** 无 Self
|
||||||
|
**When** 提交
|
||||||
|
**Then** 引导建档
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 13. AI 开发前检查
|
||||||
|
|
||||||
|
- [x] Spec 齐全 · 子能力已展开 · map · lexicon · OpenAPI · 可测
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 14. Implementation Notes
|
||||||
|
|
||||||
|
| 项 | 内容 |
|
||||||
|
|---|---|
|
||||||
|
| Packages | `internal/scale` · `service/scale` · `ExplorePage` · `ScalePage` |
|
||||||
|
| Seeds | communication-style · emotion-pattern · **mbti-lite(OEJTS 32)** · **mbti-full(60·会员)** |
|
||||||
|
| Gaps | 结果付费墙若要做须先改 Spec;全量 §11 埋点未挂(核心漏斗见 analytics) |
|
||||||
|
| Tests | score/result L1;`ScoreJungian`;`scaleDraft.spec`;Scale 流程组件测 |
|
||||||
|
| Process Review | OEJTS 标准/完整双轨 · 最近结果回看 · P1 收口 |
|
||||||
|
| Credit | OEJTS / Open Psychometrics · openjung MIT |
|
||||||
@@ -0,0 +1,177 @@
|
|||||||
|
# Feature Spec: 首页(发现与入口)
|
||||||
|
|
||||||
|
> Status: `Active` · Map: `§1 首页 [P1]` · Phase: `P1`
|
||||||
|
> 规范:[../feature-design.md](../feature-design.md)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. 功能定义
|
||||||
|
|
||||||
|
| 字段 | 内容 |
|
||||||
|
|---|---|
|
||||||
|
| Name | 首页 |
|
||||||
|
| Purpose | 品牌露出 + 建档/性格探索主 CTA + 功能入口分发 |
|
||||||
|
| Business Goal | 新用户进入 Step 1–3;品牌第一屏可识别 |
|
||||||
|
|
||||||
|
| In | Out |
|
||||||
|
|---|---|
|
||||||
|
| 建档生日表单 → 画像;九宫格/入口 | 运势 Feed 主路径 |
|
||||||
|
| 推荐区静态/轻运营即可 | Dashboard 式状态墙(如「API 已连接」勿对用户展示) |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. 用户价值
|
||||||
|
|
||||||
|
1. **为何需要:** 知道从哪开始认识自己。
|
||||||
|
2. **完成后获得:** 一键进入画像主路径或其它 Tab。
|
||||||
|
3. **付费:** N/A。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. 用户角色
|
||||||
|
|
||||||
|
| Actor | 能力 |
|
||||||
|
|---|---|
|
||||||
|
| 新 Visitor | 见品牌 + 建档 CTA |
|
||||||
|
| 老用户 | 同样入口;可去「我的」看资产 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. 用户流程
|
||||||
|
|
||||||
|
```text
|
||||||
|
打开 /
|
||||||
|
↓
|
||||||
|
看到品牌 + 主 CTA(生日/探索)
|
||||||
|
↓
|
||||||
|
提交生日 → 创建档案 → /portrait
|
||||||
|
或
|
||||||
|
点入口 → /explore /relation /ask /membership …
|
||||||
|
```
|
||||||
|
|
||||||
|
设计约束(前端):品牌英雄级信号;移动优先;文案 lexicon。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. 页面设计
|
||||||
|
|
||||||
|
| 路由 | 页面 |
|
||||||
|
|---|---|
|
||||||
|
| `/` | HomePage |
|
||||||
|
| 全局 | AppHeader · TabBar |
|
||||||
|
|
||||||
|
```text
|
||||||
|
/
|
||||||
|
├── 全局顶栏:透明愈心谷 Logo(AppHeader,全站)
|
||||||
|
├── 「自己」卡片标题展示账号昵称(默认意象词+场景词;档案页可改)
|
||||||
|
├── 穿衣指数 · 颜色搭配 · 养生推荐
|
||||||
|
├── 功能入口(4 列固定网格 · 多行换行 · 禁止横向滑动)
|
||||||
|
└── (可选)推荐内容
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. 页面状态规范
|
||||||
|
|
||||||
|
| 状态 | UI |
|
||||||
|
|---|---|
|
||||||
|
| Normal | 主路径可见 |
|
||||||
|
| Error | 建档/跳转失败可感知 |
|
||||||
|
| Loading | 提交建档时按钮态 |
|
||||||
|
|
||||||
|
Empty:首页本身是入口,不因无档案空白死页。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 7. Business Rules
|
||||||
|
|
||||||
|
| ID | Rule |
|
||||||
|
|---|---|
|
||||||
|
| R1 | 主 CTA 必须通向建档或画像,而非死链 |
|
||||||
|
| R2 | 不展示内部运维信息(API 连接状态等) |
|
||||||
|
| R3 | 入口文案符合 lexicon(个人画像/关系理解/成长会员…) |
|
||||||
|
| R4 | Tab 五名冻结:首页·探索·问答·陪伴·我的 |
|
||||||
|
| R5 | 「自己」卡片:穿衣指数 / 颜色搭配 / 养生推荐;有 Self 生日时按生日+**本地日历**+**十二时辰**易经种子生成;**每一时辰准点切换**;无档案或 LLM 不可用则本地回退 |
|
||||||
|
| R6 | 文案禁止占卜/算命恐吓与医疗疗效承诺;卦象仅作节律意象 |
|
||||||
|
| R7 | 贴士按 `user × 时辰起点` 持久缓存;GET 优先读缓存**即时返回**;缓存未命中时先回退/旧值,后台异步生成写入,禁止每次打开同步等 LLM |
|
||||||
|
| R8 | 响应含 `shichen` / `shichen_name` / `valid_until`(下一时辰起点);前端在 `valid_until` 自动静默刷新 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 8. 数据模型影响
|
||||||
|
|
||||||
|
经首页建档时写 `profiles`。`home_daily_tips(user_id, shichen_start, tips jsonb)` 缓存时辰贴士。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 9. API 需求
|
||||||
|
|
||||||
|
| Method | Path | 说明 |
|
||||||
|
|---|---|---|
|
||||||
|
| GET | `/api/v1/home/tools` | 宫格(已有) |
|
||||||
|
| GET | `/api/v1/home/daily-tips` | 自己卡片贴士(读缓存;含 valid_until) |
|
||||||
|
| — | 复用 | `POST /profiles`、`POST /reports/portrait` |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 10. 权限设计
|
||||||
|
|
||||||
|
| 能力 | Visitor | User |
|
||||||
|
|---|---|---|
|
||||||
|
| 浏览首页 | ✓ | ✓ |
|
||||||
|
| 建档并生成画像 | 需登录 | ✓ |
|
||||||
|
| daily-tips(个性化) | 回退文案 | 有 Self 生日则 LLM |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 11. 埋点
|
||||||
|
|
||||||
|
| Event | 触发 |
|
||||||
|
|---|---|
|
||||||
|
| `home_viewed` | 打开 |
|
||||||
|
| `home_cta_portrait` | 主 CTA |
|
||||||
|
| `home_entry_click` | 九宫格项(带 name) |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 12. 测试验收标准
|
||||||
|
|
||||||
|
**Given** 新用户
|
||||||
|
**When** 打开首页
|
||||||
|
**Then** 可见品牌与建档/探索入口
|
||||||
|
|
||||||
|
**Given** 合法生日
|
||||||
|
**When** 提交主 CTA
|
||||||
|
**Then** 进入画像基础结果路径
|
||||||
|
|
||||||
|
**Given** 已登录且有 Self 生日、该时辰已有缓存
|
||||||
|
**When** GET `/home/daily-tips`
|
||||||
|
**Then** 立即返回缓存(含 clothing/palette/wellness / valid_until),不阻塞 LLM
|
||||||
|
|
||||||
|
**Given** 时辰切换到点
|
||||||
|
**When** 前端到达 `valid_until`
|
||||||
|
**Then** 静默刷新;穿衣/颜色/养生随新时辰更新
|
||||||
|
|
||||||
|
**Given** 无档案或无 LLM
|
||||||
|
**When** GET `/home/daily-tips`
|
||||||
|
**Then** `source=fallback` 且页面不白屏
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 13. AI 开发前检查
|
||||||
|
|
||||||
|
- [x] lexicon
|
||||||
|
- [x] 不恐吓 / 不算命话术
|
||||||
|
- [x] OpenAPI 已登记 `/home/daily-tips`
|
||||||
|
|
||||||
|
- [x] Spec 齐全
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 14. Implementation Notes
|
||||||
|
|
||||||
|
| 项 | 内容 |
|
||||||
|
|---|---|
|
||||||
|
| Packages | `HomePage` · `App.vue` shell |
|
||||||
|
| Gaps | 推荐 Feed 运营位可静态;埋点未接 |
|
||||||
|
| Process Review | 2026-08-02 [P1-PROCESS-REVIEW](P1-PROCESS-REVIEW.md) · 设计闭合 · 实现 PASS · 测试 PARTIAL |
|
||||||
@@ -0,0 +1,186 @@
|
|||||||
|
# Feature Spec: 意象卡片
|
||||||
|
|
||||||
|
> Status: `Active` · Map: `2.8 意象卡片 [P2]` · Phase: `P2 Complete`
|
||||||
|
> 规范:[../feature-design.md](../feature-design.md) · 队列:[P2-BACKLOG.md](P2-BACKLOG.md)
|
||||||
|
> 竞品对照:塔罗体系(能力同构;**UI 禁止「塔罗」入口名**)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. 功能定义
|
||||||
|
|
||||||
|
| 字段 | 内容 |
|
||||||
|
|---|---|
|
||||||
|
| Name | 意象卡片 |
|
||||||
|
| Purpose | 通过抽取 1~3 张意象卡,对当下议题做投射反思,并给出结构化反思题与行动建议 |
|
||||||
|
| Business Goal | 高趣味探索与分享;免费次数 + 深度解读转化 |
|
||||||
|
|
||||||
|
| In | Out |
|
||||||
|
|---|---|
|
||||||
|
| 场景选题 · 抽卡 · 探索摘要 · 深度组合解读 | 吉凶判定、神谕、恐吓 |
|
||||||
|
| 卡面内容库(seed) | UI 文案「塔罗」「牌阵占卜」 |
|
||||||
|
| 每日免费次数规则 | 宿命叙事 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. 用户价值
|
||||||
|
|
||||||
|
1. **为何需要:** 卡住时需要一个轻量的外在意象帮助整理感受。
|
||||||
|
2. **完成后获得:** 卡片意象说明、反思问题、可执行小建议;深度版含组合解读与练习。
|
||||||
|
3. **为何付费:** 多卡组合与完整练习路径。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. 用户角色
|
||||||
|
|
||||||
|
| Actor | 能力 |
|
||||||
|
|---|---|
|
||||||
|
| Visitor | 每日免费 N 次基础抽卡(N 实现时定数,建议 1~3) |
|
||||||
|
| DeepAccess(本结果)/ VIP | 深度组合解读 |
|
||||||
|
| 可选挂档案 | 有档案时文案可轻微个性化(非必须) |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. 用户流程
|
||||||
|
|
||||||
|
```text
|
||||||
|
/cards
|
||||||
|
↓
|
||||||
|
选择场景:情绪整理 / 关系 / 选择 / 自我
|
||||||
|
↓
|
||||||
|
检查今日免费次数
|
||||||
|
├─ 耗尽 → 引导会员或明日再来(可看历史)
|
||||||
|
└─ 有余 → 抽 1 张(免费)或解锁 3 张组合(深度)
|
||||||
|
↓
|
||||||
|
展示意象 + 反思题 + 建议
|
||||||
|
↓
|
||||||
|
分享(积极、非恐吓视觉)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. 页面设计
|
||||||
|
|
||||||
|
| 路由 | 页面 |
|
||||||
|
|---|---|
|
||||||
|
| `/cards` | ImageCardPage(P2 draft) |
|
||||||
|
| `/explore` | 入口「意象卡片」 |
|
||||||
|
| `/reports/:id` 或结果页内 | 深度结果沉淀(可选) |
|
||||||
|
|
||||||
|
```text
|
||||||
|
/cards
|
||||||
|
├── Scene picker
|
||||||
|
├── Loading(抽卡动画,克制)
|
||||||
|
├── Normal(单卡摘要)
|
||||||
|
├── Locked(组合深度)
|
||||||
|
├── Quota empty
|
||||||
|
└── Error
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. 页面状态规范
|
||||||
|
|
||||||
|
| 状态 | UI |
|
||||||
|
|---|---|
|
||||||
|
| Loading | 抽卡中 |
|
||||||
|
| Normal | 意象说明 + 反思 |
|
||||||
|
| Locked | 组合解读墙 |
|
||||||
|
| Quota empty | 次数用尽说明 + 会员 CTA |
|
||||||
|
| Error | 重试 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 7. Business Rules
|
||||||
|
|
||||||
|
| ID | Rule |
|
||||||
|
|---|---|
|
||||||
|
| R1 | 用户可见文案**不得**出现「塔罗」;用「意象卡片」「探索」「反思」 |
|
||||||
|
| R2 | **禁止**吉凶、神谕式断言、恐吓(如「大难」) |
|
||||||
|
| R3 | 输出必须含:意象描述 · 至少 1 个反思问题 · 1 条可执行建议 |
|
||||||
|
| R4 | 免费:每日有限次单卡摘要;深度:3 卡组合 + 练习(Membership 或单次 DeepAccess) |
|
||||||
|
| R5 | 抽卡随机可接受,但卡面文案来自审核过的内容库(非模型现场胡编吉凶) |
|
||||||
|
| R6 | 分享卡不得含恐吓图文;过 lexicon |
|
||||||
|
| R7 | 次数与权益 **Server** 判定 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 8. 数据模型影响
|
||||||
|
|
||||||
|
| 项 | 说明 |
|
||||||
|
|---|---|
|
||||||
|
| 内容库 | `image_cards` 表或 seed JSON(id, title, image_key, explore_text, prompts[]) |
|
||||||
|
| 结果 | `growth_reports.type=image_card` **或** `scale_results` 变体(实现时二选一,写 OpenAPI) |
|
||||||
|
| 配额 | 用户日维度计数(表或 Redis);实现时定 |
|
||||||
|
|
||||||
|
禁止:`tarot_*` 作用户可见 API 路径名(对内包名用 `imagecard`)。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 9. API 需求(草案)
|
||||||
|
|
||||||
|
| Method | Path | 意图 |
|
||||||
|
|---|---|---|
|
||||||
|
| GET | `/api/v1/image-cards/scenes` | 场景列表 |
|
||||||
|
| POST | `/api/v1/image-cards/draw` | scene → 抽卡结果(扣免费次) |
|
||||||
|
| GET | `/api/v1/image-cards/quota` | 今日剩余 |
|
||||||
|
| GET | `/api/v1/reports/{id}` | 若沉淀为报告 |
|
||||||
|
|
||||||
|
深度组合可同 draw 参数 `depth=true` + 权益校验。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 10. 权限设计
|
||||||
|
|
||||||
|
| 能力 | 免费额度内 | 额度外 | 深度权益 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| 单卡摘要 | ✓ | ✗ | ✓ |
|
||||||
|
| 三卡组合解读 | ✗ | ✗ | ✓ |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 11. 埋点
|
||||||
|
|
||||||
|
| Event | 触发 |
|
||||||
|
|---|---|
|
||||||
|
| `cards_scene_selected` | 选场景 |
|
||||||
|
| `cards_drawn` | 抽卡成功 |
|
||||||
|
| `cards_quota_exhausted` | 次数用尽 |
|
||||||
|
| `deep_access_clicked` | surface=cards |
|
||||||
|
| `cards_share_clicked` | 分享 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 12. 测试验收标准
|
||||||
|
|
||||||
|
**Given** 有免费次数
|
||||||
|
**When** 抽卡
|
||||||
|
**Then** 返回意象+反思题+建议;响应与 UI 无「塔罗」「吉凶」
|
||||||
|
|
||||||
|
**Given** 次数为 0
|
||||||
|
**When** 再抽
|
||||||
|
**Then** 业务错误,不生成假深度
|
||||||
|
|
||||||
|
**Given** 无深度权益
|
||||||
|
**When** 请求组合解读
|
||||||
|
**Then** Locked / 剥离
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 13. AI 开发前检查
|
||||||
|
|
||||||
|
- [x] Spec 齐全 · 禁用塔罗入口已写清
|
||||||
|
- [x] lexicon ImageCard
|
||||||
|
- [x] 内容库 seed 与 OpenAPI(编码时)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 14. Implementation Notes
|
||||||
|
|
||||||
|
| 项 | 内容 |
|
||||||
|
|---|---|
|
||||||
|
| 复用 | ShareSheet · membership/orders · Explore 入口 |
|
||||||
|
| 工作量 | 卡面文案/视觉资产最大;宜先 22~78 张小库 MVP |
|
||||||
|
| Packages | `internal/imagecard` · `ImageCardPage` `/cards` |
|
||||||
|
| 实现 | scenes/quota/draw API · 报告 type=`image_card` · 日配额 · ≥78 牌(手写底稿+确定性扩容)· ≥8 场景 |
|
||||||
|
| Gaps | 全手写美术资产;推送 |
|
||||||
|
| Label | Feature Complete(P2) |
|
||||||
@@ -0,0 +1,123 @@
|
|||||||
|
# Feature Spec: 用户文字输入合规校验
|
||||||
|
|
||||||
|
> Status: `Active` · Map: `横切 · 安全/合规` · Phase: `P2`
|
||||||
|
> 关联:[lexicon.md](../lexicon.md) · [.ai/security.md](../../security.md) · account-auth / profile / ask / companion
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. 功能定义
|
||||||
|
|
||||||
|
| 字段 | 内容 |
|
||||||
|
|---|---|
|
||||||
|
| Name | 文字输入合规(Text Compliance) |
|
||||||
|
| Purpose | 所有用户提交的**自由文字**在服务端统一做合法性/合规校验;前端可做即时提示,**以后端拒绝为准** |
|
||||||
|
| Business Goal | 降低 XSS/注入、恐吓与医疗疗效话术、垃圾刷屏进入 DB 与模型上下文的风险 |
|
||||||
|
|
||||||
|
| In | Out |
|
||||||
|
|---|---|
|
||||||
|
| 昵称 · 档案显示名 · 问答 content · 心情/打卡 note · 成长计划 title/focus · 邀请 display_name · 意象场景自填 | 纯数字字段(生日年月日、分数、经纬度) |
|
||||||
|
| 长度 · 格式清洗 · XSS/控制字符 · lexicon 硬禁止 · 简易刷屏特征 | 完整内容审核平台 / 人工审 / 语音 |
|
||||||
|
| 错误码统一 | 改开放登录策略本身 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. 用户价值
|
||||||
|
|
||||||
|
1. 避免有害/违规文案入库与进模型。
|
||||||
|
2. 提交失败时得到可读中文原因。
|
||||||
|
3. N/A(安全横切,非付费面)。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. 用户角色
|
||||||
|
|
||||||
|
Visitor / User / Admin 凡提交自由文字均适用(Admin 运营文案可后续加强;本 Spec **先 C 端用户 API**)。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. 用户流程
|
||||||
|
|
||||||
|
```text
|
||||||
|
用户输入文字 →(可选)前端即时校验
|
||||||
|
→ API Handler/Service 调用 textsafe.Check(kind, text)
|
||||||
|
→ OK:规范化后入库/进模型
|
||||||
|
→ 拒绝:HTTP 400 · code 40060 · message 可读原因
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5–6. 页面 / 状态
|
||||||
|
|
||||||
|
各既有表单;Error 态展示 `message`。无新页面。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 7. Business Rules
|
||||||
|
|
||||||
|
| ID | Rule |
|
||||||
|
|---|---|
|
||||||
|
| R1 | **后端必须校验**所有用户自由文字;前端校验不得替代后端 |
|
||||||
|
| R2 | 种类与上限(rune):`nickname` 1–16;`display_name` 1–24;`ask_content` 1–2000;`note` 0–200;`title` 1–40;`focus` 0–40;`scene` 1–80 |
|
||||||
|
| R3 | 拒绝控制字符(允许消息内 `\n` `\t`);拒绝 HTML/脚本片段(如 `<script`、`javascript:`) |
|
||||||
|
| R4 | 命中 lexicon 硬禁止子串(占卜/算命/改命恐吓/疗效承诺/「测测」品牌自称等)→ 拒绝 |
|
||||||
|
| R5 | 刷屏特征:连续相同字 ≥8,或可见字符全相同且长度 ≥6 → 拒绝 |
|
||||||
|
| R6 | 密码字段不做 lexicon,仅拒空字节;手机号走既有数字规则 |
|
||||||
|
| R7 | 校验通过后写库的是 **Normalize** 后的文本(Trim;压缩首尾空白) |
|
||||||
|
| R8 | 错误码:`40060`;文案过 lexicon(勿用恐吓语气) |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 8. 数据模型
|
||||||
|
|
||||||
|
无新表。进程内可选短时计数(本版刷屏以内容特征为主,不做跨请求配额表)。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 9. API
|
||||||
|
|
||||||
|
既有写接口;拒绝时统一:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{ "code": 40060, "message": "文案不合规:…", "data": null }
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 10. 权限
|
||||||
|
|
||||||
|
同各业务接口鉴权;校验在鉴权之后、写库之前。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 11. 埋点
|
||||||
|
|
||||||
|
可选:`text_rejected{kind}`(本版可不接)。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 12. 验收
|
||||||
|
|
||||||
|
| Given | When | Then |
|
||||||
|
|---|---|---|
|
||||||
|
| nickname 含「算命」 | PATCH /auth/me | 40060 |
|
||||||
|
| ask content 含 `<script` | POST messages | 40060 |
|
||||||
|
| display_name 正常「小愈」 | POST profile | 200 |
|
||||||
|
| note=`啊啊啊啊啊啊啊啊` | POST mood | 40060 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 13. AI 检查
|
||||||
|
|
||||||
|
- [x] lexicon
|
||||||
|
- [x] 后端权威
|
||||||
|
- [x] 不扩开放登录
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 14. Implementation
|
||||||
|
|
||||||
|
| 项 | 内容 |
|
||||||
|
|---|---|
|
||||||
|
| Package | `apps/api/internal/textsafe` |
|
||||||
|
| Mirror | `@yuxingu/utils` `validateUserText`(即时提示) |
|
||||||
|
| Wire | auth · profile · ask · companion · growth · synastry accept |
|
||||||
@@ -0,0 +1,189 @@
|
|||||||
|
# Feature Spec: 身心节律
|
||||||
|
|
||||||
|
> Status: `Active` · Map: `2.7 身心节律 [P2]`(= `2.5 身心探索` 产品化主入口)· Phase: `P2 Complete`
|
||||||
|
> 规范:[../feature-design.md](../feature-design.md) · 队列:[P2-BACKLOG.md](P2-BACKLOG.md)
|
||||||
|
> 竞品对照:命理体系之生活向(能力同构,禁止算命/流年吉凶叙事)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. 功能定义
|
||||||
|
|
||||||
|
| 字段 | 内容 |
|
||||||
|
|---|---|
|
||||||
|
| Name | 身心节律 |
|
||||||
|
| Purpose | 基于出生信息给出五行/体质倾向隐喻与作息·饮食·运动等生活建议 |
|
||||||
|
| Business Goal | 差异化护城河(数字性格 × 身心);导流节气陪伴与会员 |
|
||||||
|
|
||||||
|
| In | Out |
|
||||||
|
|---|---|
|
||||||
|
| 元素平衡、体质倾向、本周生活建议 | 流年吉凶、改命、疗效/治病承诺 |
|
||||||
|
| 与节气生活联动 | 八字/紫微作恐吓主标题 |
|
||||||
|
| GrowthReport 或 Constitution 聚合 | 医疗诊断 |
|
||||||
|
|
||||||
|
**与 2.5:** 本 Spec 为身心探索的**唯一产品化主入口**;map 上 2.5 保留能力描述,入口文案统一「身心节律」。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. 用户价值
|
||||||
|
|
||||||
|
1. **为何需要:** 想知道如何按自己的节奏安排生活,而不只是性格标签。
|
||||||
|
2. **完成后获得:** 节律概览、元素倾向、今日/本周生活建议;深度版含分维习惯方案。
|
||||||
|
3. **为何付费:** 完整习惯方案与长期节律计划。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. 用户角色
|
||||||
|
|
||||||
|
| Actor | 能力 |
|
||||||
|
|---|---|
|
||||||
|
| Visitor+档案 | 基础节律报告 |
|
||||||
|
| DeepAccess/VIP | detail |
|
||||||
|
| 无档案 | 引导建档 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. 用户流程
|
||||||
|
|
||||||
|
```text
|
||||||
|
/rhythm 或探索入口
|
||||||
|
↓
|
||||||
|
确认 Profile
|
||||||
|
↓
|
||||||
|
生成节律报告(元素 · 倾向 · 生活建议)
|
||||||
|
↓
|
||||||
|
基础 summary → 深度 detail(会员/深度版)
|
||||||
|
↓
|
||||||
|
CTA:节气陪伴 / 问答「生活节奏」/ 分享
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. 页面设计
|
||||||
|
|
||||||
|
| 路由 | 页面 |
|
||||||
|
|---|---|
|
||||||
|
| `/rhythm` | LifeRhythmPage(P2 draft) |
|
||||||
|
| `/companion` | 节气联动出口 |
|
||||||
|
| `/reports/:id` | type=rhythm 详情 |
|
||||||
|
|
||||||
|
```text
|
||||||
|
/rhythm
|
||||||
|
├── Empty / Loading / Error
|
||||||
|
├── Normal(基础节律 + 生活建议)
|
||||||
|
└── Locked
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. 页面状态规范
|
||||||
|
|
||||||
|
| 状态 | UI |
|
||||||
|
|---|---|
|
||||||
|
| Loading | 分析中 |
|
||||||
|
| Empty | 无档案引导 |
|
||||||
|
| Error | 重试 |
|
||||||
|
| Normal | 维度 + 本周建议 |
|
||||||
|
| Locked | 深度版 CTA |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 7. Business Rules
|
||||||
|
|
||||||
|
| ID | Rule |
|
||||||
|
|---|---|
|
||||||
|
| R1 | 绑定 Profile;birth_date 必填 |
|
||||||
|
| R2 | 确定性引擎(可参考遗留 yangsheng 思路,**新代码进 monorepo**) |
|
||||||
|
| R3 | summary/detail 权益同画像(Membership ∨ DeepAccess) |
|
||||||
|
| R4 | **禁止**:疗效、改善疾病、流年吉凶、改命、算命 |
|
||||||
|
| R5 | 推荐用语:体质倾向、生活建议、节律、平衡 |
|
||||||
|
| R6 | 可展示五行隐喻,须标注探索/非医疗 |
|
||||||
|
| R7 | 与星象性格、个人画像内容可互相链,不互相覆盖主路径 |
|
||||||
|
| R8 | **体质/五行倾向**随生日确定;**今日/本周生活建议**按**自然日(CST)**刷新(本周焦点随星期变) |
|
||||||
|
| R9 | GET `/reports/latest` 与 GET `/reports/{id}`(type=rhythm):`as_of` ≠ 当日则**原 id 原地更新**时效段并落库;同日即时返回 |
|
||||||
|
| R10 | `summary` 含 `as_of` · `valid_until`(次日 00:00 CST);前端到点静默刷新;**不按十二时辰** |
|
||||||
|
| R11 | `summary.wuxing` 必含五行分布 `bars`(与愈心解码同源算法)及主/辅倾向;缺字段时 GET 原地补全 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 8. 数据模型影响
|
||||||
|
|
||||||
|
| 项 | 说明 |
|
||||||
|
|---|---|
|
||||||
|
| `growth_reports.type` | `rhythm` / `life_rhythm` |
|
||||||
|
| 或 Constitution 专用表 | 若需独立聚合,实现时 ADR |
|
||||||
|
| 禁止 | `luck_score`、病名诊断字段 |
|
||||||
|
| 报告 JSON | `as_of` · `valid_until` · `today_tip` · `week_focus` |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 9. API 需求(草案)
|
||||||
|
|
||||||
|
| Method | Path | 意图 |
|
||||||
|
|---|---|---|
|
||||||
|
| POST | `/api/v1/reports/rhythm` | profile_id → 报告 |
|
||||||
|
| GET | `/api/v1/reports/{id}` | 复用 |
|
||||||
|
| GET | `/api/v1/solar-terms/today` | 页内联动展示(已有) |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 10. 权限设计
|
||||||
|
|
||||||
|
| 能力 | 有档案 | 深度权益 |
|
||||||
|
|---|---|---|
|
||||||
|
| summary | ✓ | ✓ |
|
||||||
|
| detail | ✗ | ✓ |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 11. 埋点
|
||||||
|
|
||||||
|
| Event | 触发 |
|
||||||
|
|---|---|
|
||||||
|
| `rhythm_started` | 开始生成 |
|
||||||
|
| `rhythm_completed` | 基础结果 |
|
||||||
|
| `deep_access_clicked` | surface=rhythm |
|
||||||
|
| `rhythm_to_companion` | 去节气 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 12. 测试验收标准
|
||||||
|
|
||||||
|
**Given** 有生日档案
|
||||||
|
**When** 生成身心节律
|
||||||
|
**Then** 含生活建议;无「吉凶」「疗效」「算命」
|
||||||
|
|
||||||
|
**Given** 无权益
|
||||||
|
**When** GET detail
|
||||||
|
**Then** 剥离
|
||||||
|
|
||||||
|
**Given** 文案审查
|
||||||
|
**When** 扫 summary+detail
|
||||||
|
**Then** 符合 lexicon
|
||||||
|
|
||||||
|
**Given** 已有 rhythm 报告且 `as_of` 为昨日
|
||||||
|
**When** GET latest
|
||||||
|
**Then** `today_tip` / `week_focus` 按今日更新;报告 `id` 不变
|
||||||
|
|
||||||
|
**Given** 用户停留在 `/rhythm` 跨自然日
|
||||||
|
**When** 到达 `valid_until`
|
||||||
|
**Then** 前端静默刷新建议文案
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 13. AI 开发前检查
|
||||||
|
|
||||||
|
- [x] Spec 齐全 · 与 2.5 关系已写清
|
||||||
|
- [x] lexicon LifeRhythm
|
||||||
|
- [x] OpenAPI/erd(编码时)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 14. Implementation Notes
|
||||||
|
|
||||||
|
| 项 | 内容 |
|
||||||
|
|---|---|
|
||||||
|
| 复用 | ReportRich · membership · companion 节气 · 立项中医体质方向 |
|
||||||
|
| 参考勿迁 | 根目录 `yangsheng.html` 仅思路参考 |
|
||||||
|
| Packages | `internal/rhythm` · `LifeRhythmPage` `/rhythm` |
|
||||||
|
| 实现 | `POST /reports/rhythm` · OpenAPI 已登记 |
|
||||||
|
| 编码顺序 | P2-BACKLOG 切片 2 Done |
|
||||||
@@ -0,0 +1,187 @@
|
|||||||
|
# Feature Spec: 深度版与成长会员
|
||||||
|
|
||||||
|
> Status: `Active` · Map: `§6 商业体系 · §5.3 会员中心 [P1]` · Phase: `P1`
|
||||||
|
> 规范:[../feature-design.md](../feature-design.md)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. 功能定义
|
||||||
|
|
||||||
|
| 字段 | 内容 |
|
||||||
|
|---|---|
|
||||||
|
| Name | 深度版成长报告 + 成长会员 |
|
||||||
|
| Purpose | 用可理解的权益换取付费;解锁完整分析与更高 Ask 配额 |
|
||||||
|
| Business Goal | ARPU;验证付费墙与 mock 支付闭环 |
|
||||||
|
|
||||||
|
| In | Out |
|
||||||
|
|---|---|
|
||||||
|
| 单报告 DeepAccess | 广告干扰主路径 |
|
||||||
|
| 订阅 Membership(月/季/年 mock) | 塔罗商城 |
|
||||||
|
| 问答额度包 ask_pack(mock) | 与会员深度权益混绑(额度包不加深度版) |
|
||||||
|
| Server 侧权益生效 | 纯前端「解锁」 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. 用户价值
|
||||||
|
|
||||||
|
1. **为何需要:** 基础结果不够用时需要完整分析 / 更多问答。
|
||||||
|
2. **完成后获得:** 该报告 detail;或会员期内全部报告深度 + Ask 额度提升。
|
||||||
|
3. **为何付费:** 明确权益清单(完整分析、AI 次数、专属内容占位)。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. 用户角色
|
||||||
|
|
||||||
|
| Actor | 能力 |
|
||||||
|
|---|---|
|
||||||
|
| Visitor | 可下单 mock 支付 |
|
||||||
|
| DeepAccess 持有者 | 指定 report 的 detail |
|
||||||
|
| VIP | 会员期内全局深度 + Ask 配额规则 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. 用户流程
|
||||||
|
|
||||||
|
### 深度版(报告内)
|
||||||
|
|
||||||
|
```text
|
||||||
|
报告页 Locked CTA
|
||||||
|
↓
|
||||||
|
POST /orders { kind: deep_access, report_id }
|
||||||
|
↓
|
||||||
|
POST /orders/{id}/pay-mock
|
||||||
|
↓
|
||||||
|
写入 deep_access → 刷新报告 detail 可见
|
||||||
|
```
|
||||||
|
|
||||||
|
### 成长会员
|
||||||
|
|
||||||
|
```text
|
||||||
|
/membership 查看套餐与当前状态
|
||||||
|
↓
|
||||||
|
下单 kind=membership + plan
|
||||||
|
↓
|
||||||
|
pay-mock → memberships 行 active + expires_at
|
||||||
|
↓
|
||||||
|
此后 GET 任意己方报告 detail 可见(按服务规则)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. 页面设计
|
||||||
|
|
||||||
|
| 路由 | 页面 |
|
||||||
|
|---|---|
|
||||||
|
| `/membership` | MembershipPage |
|
||||||
|
| 画像/关系/报告内 | Paywall / DeepAccess CTA |
|
||||||
|
|
||||||
|
```text
|
||||||
|
/membership
|
||||||
|
├── Loading
|
||||||
|
├── Normal(未开通 / 已开通+到期)
|
||||||
|
├── Error
|
||||||
|
└── (无独立 Locked;本身即售卖页)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. 页面状态规范
|
||||||
|
|
||||||
|
| 状态 | UI |
|
||||||
|
|---|---|
|
||||||
|
| Loading | 拉取 `/membership/me` |
|
||||||
|
| Normal | 展示套餐、当前是否会员、到期时间 |
|
||||||
|
| Error | 重试 |
|
||||||
|
| 报告 Locked | 深度版入口文案(lexicon:深度版/成长会员,不用「解锁」作主文案) |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 7. Business Rules
|
||||||
|
|
||||||
|
| ID | Rule |
|
||||||
|
|---|---|
|
||||||
|
| R1 | DeepAccess 绑定 `user_id` + `report_id` |
|
||||||
|
| R2 | Membership active:`expires_at > now` |
|
||||||
|
| R3 | 报告 detail 可见 ⇔ Membership active **OR** DeepAccess 存在 |
|
||||||
|
| R4 | 支付 P1 仅 mock;成功必须服务端落库后再改可见性 |
|
||||||
|
| R5 | Ask 配额:免费次数耗尽后可购 ask_pack 或依赖会员配额(见 ask Spec) |
|
||||||
|
| R8 | `ask_pack`:plan=`pack10|pack30|pack100` → 增加 `users.ask_paid_quota_left`;不改变 membership / deep_access |
|
||||||
|
| R6 | 订单归属必须校验 report 属于当前用户 |
|
||||||
|
| R7 | 文案:成长会员 / 深度版;禁用恐吓与疗效承诺 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 8. 数据模型影响
|
||||||
|
|
||||||
|
| 表 | 备注 |
|
||||||
|
|---|---|
|
||||||
|
| `orders` | kind, amount, status, report_id null |
|
||||||
|
| `payments` | mock |
|
||||||
|
| `deep_access` | user_id, report_id, unique |
|
||||||
|
| `memberships` | plan, expires_at |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 9. API 需求
|
||||||
|
|
||||||
|
| Method | Path | 意图 |
|
||||||
|
|---|---|---|
|
||||||
|
| GET | `/api/v1/membership/me` | 当前会员状态 |
|
||||||
|
| POST | `/api/v1/orders` | deep_access \| membership \| ask_pack |
|
||||||
|
| POST | `/api/v1/orders/{id}/pay-mock` | 生效权益 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 10. 权限设计
|
||||||
|
|
||||||
|
| 能力 | Visitor | DeepAccess | VIP |
|
||||||
|
|---|---|---|---|
|
||||||
|
| 看基础报告 | ✓ | ✓ | ✓ |
|
||||||
|
| 看该报告 detail | ✗ | ✓ | ✓ |
|
||||||
|
| 看任意己方 detail | ✗ | 仅已购报告 | ✓ |
|
||||||
|
| 下单 mock | ✓ | ✓ | ✓ |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 11. 埋点
|
||||||
|
|
||||||
|
| Event | 触发 |
|
||||||
|
|---|---|
|
||||||
|
| `paywall_viewed` | 看到锁定区 |
|
||||||
|
| `deep_access_clicked` | 点深度版 |
|
||||||
|
| `membership_plan_clicked` | 选套餐 |
|
||||||
|
| `order_created` | 下单 |
|
||||||
|
| `purchase_completed` | pay-mock 成功 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 12. 测试验收标准
|
||||||
|
|
||||||
|
**Given** 无权益报告
|
||||||
|
**When** pay-mock deep_access
|
||||||
|
**Then** 再 GET 同报告 detail 非空
|
||||||
|
|
||||||
|
**Given** 会员未过期
|
||||||
|
**When** GET 任意己方 portrait/relation 报告
|
||||||
|
**Then** detail 可见无需每份 DeepAccess
|
||||||
|
|
||||||
|
**Given** 他人 report_id
|
||||||
|
**When** 尝试下单
|
||||||
|
**Then** 失败(归属校验)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 13. AI 开发前检查
|
||||||
|
|
||||||
|
- [x] Spec 齐全 · map · lexicon · OpenAPI · 可测
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 14. Implementation Notes
|
||||||
|
|
||||||
|
| 项 | 内容 |
|
||||||
|
|---|---|
|
||||||
|
| Packages | `service/order` · `service/membership` · `MembershipPage` |
|
||||||
|
| Gaps | 真支付网关;发票;退款(须先修订本 Spec §9) |
|
||||||
|
| Tests | L2 membership unlock;MembershipPage.spec |
|
||||||
|
| Process Review | 2026-08-02 [P1-PROCESS-REVIEW](P1-PROCESS-REVIEW.md) · mock 闭环设计闭合 · 实现 PASS · 测试 PASS |
|
||||||
@@ -0,0 +1,156 @@
|
|||||||
|
# Feature Spec: 账户生命周期 / UserStatus(Ops · ECR-013B)
|
||||||
|
|
||||||
|
> Status: `Active`(**Closed** · Feature Complete)· Map: `§7 运营后台` · Phase: `Ops-D`
|
||||||
|
> Parent: **WAVE0-FROZEN** (`27f27a1`) · Predecessor: **ECR-013A Closed**
|
||||||
|
> ESS: `docs/ECR/ECR-013B-account-lifecycle.md`(**Closed**)
|
||||||
|
> Capability: `AccountLifecycle` · BC: `Identity_Profile`
|
||||||
|
> 模板:`docs/WAVE0/contracts/OPS-CONTRACT-TEMPLATE.md`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ESS 门禁
|
||||||
|
|
||||||
|
1. Change Level = **L2** → 已 Approved + Coding auth + Implemented + **Closed**
|
||||||
|
2. ~~Contract Definition only~~ — 已完成
|
||||||
|
3. 实现证据:`docs/TEST_REPORT/ECR-013B.md` · `docs/CODE_REVIEW/ECR-013B.md`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## L0 Capability
|
||||||
|
|
||||||
|
| 字段 | 内容 |
|
||||||
|
|------|------|
|
||||||
|
| Capability ID | `AccountLifecycle` |
|
||||||
|
| Purpose | 以可审计状态机管理 C 端用户账户启停与封禁,阻断违规会话 |
|
||||||
|
| Why now | `users.status` 字段已存在但无运营迁移与强制拒绝;013A 权限面就绪后可挂状态写权限 |
|
||||||
|
| Non-goals | soft-delete / `deleted`;UGC 社区封禁;真支付;Admin 账号启停(已有 admin.status);推送通知 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## L1 Bounded Context
|
||||||
|
|
||||||
|
| 字段 | 内容 |
|
||||||
|
|------|------|
|
||||||
|
| Primary BC | `Identity_Profile` |
|
||||||
|
| owns | `User` · `UserStatus` · `AccountStateTransition` |
|
||||||
|
| does_not_own | `AdminRole` · `Membership` · `Payment` · `BanRecord`(Account_Risk 后置加深) |
|
||||||
|
| allowed | `Admin_Auth_Audit.write_audit`(经 admin 调用) |
|
||||||
|
| forbidden | `Payment` · `Membership.write` · soft-delete User |
|
||||||
|
|
||||||
|
权威:`.ai/domain/boundary-rules.md` · `Account_Risk` 仅允许经明确服务触发 `UserStatus.transition`。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. 功能定义
|
||||||
|
|
||||||
|
| 字段 | 内容 |
|
||||||
|
|------|------|
|
||||||
|
| Name | Account Lifecycle / UserStatus |
|
||||||
|
| Purpose | 运营可迁移用户状态;非 active 会话在 C 端被拒绝 |
|
||||||
|
| Business Goal | 风险处置最小闭环,不引入社区/UGC |
|
||||||
|
|
||||||
|
| In | Out |
|
||||||
|
|---|---|
|
||||||
|
| 状态机 `active/disabled/banned/suspended` | soft-delete / GDPR 擦除 |
|
||||||
|
| Admin 迁移 API + AuditLog + Transition 记录 | 站内推送 / 短信 |
|
||||||
|
| DeviceAuth / Bearer 对非 active 拒绝 | AdminAccount.status(013A 外) |
|
||||||
|
| 权限码 `admin.users.status.write` | 行级数据 ACL |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## L2 Domain
|
||||||
|
|
||||||
|
| Entity | 不变式 / 状态机 |
|
||||||
|
|--------|----------------|
|
||||||
|
| `UserStatus` | 取值冻结:`active` · `disabled` · `banned` · `suspended`;非法值拒写 |
|
||||||
|
| `User.status` | 与 `UserStatus` 同值;默认 `active`(已有列) |
|
||||||
|
| `AccountStateTransition` | 只追加;记录 from→to · admin_id · reason · created_at |
|
||||||
|
|
||||||
|
### 合法迁移
|
||||||
|
|
||||||
|
```text
|
||||||
|
active → disabled | banned | suspended
|
||||||
|
disabled → active | banned
|
||||||
|
suspended → active | banned | disabled
|
||||||
|
banned → active | disabled
|
||||||
|
```
|
||||||
|
|
||||||
|
其它边 → **400**。同状态写 → **400**(幂等拒绝,避免空审计噪音)。
|
||||||
|
|
||||||
|
### C 端效应
|
||||||
|
|
||||||
|
| Status | DeviceAuth / 已登录 Bearer |
|
||||||
|
|--------|------------------------------|
|
||||||
|
| `active` | 放行 |
|
||||||
|
| `disabled` / `banned` / `suspended` | **401**(或 403 统一码,实现轮定一)+ 不可发新 session |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## L3 API Contract(意图 · 实现轮同步 OpenAPI)
|
||||||
|
|
||||||
|
前缀:`/api/v1/admin` · AdminAuth · 信封 `{code,message,data}`
|
||||||
|
|
||||||
|
| Method | Path | 权限 | 语义 |
|
||||||
|
|--------|------|------|------|
|
||||||
|
| POST | `/users/:id/status` | `admin.users.status.write` | 迁移 UserStatus;写 Transition + AuditLog |
|
||||||
|
| GET | `/users/:id/status-transitions` | `admin.users.read` | 最近迁移列表(limit) |
|
||||||
|
|
||||||
|
既有 `GET /users` · `GET /users/:id` 已暴露 `status` — 保持;实现轮确认枚举文档化。
|
||||||
|
|
||||||
|
`contract_diff`:`docs/CONTRACT_DIFF/ECR-013B.yaml`
|
||||||
|
|
||||||
|
RBAC catalog **additive**:`admin.users.status.write` → 种子写入 `super_admin`(migration)。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## L4 Acceptance Criteria
|
||||||
|
|
||||||
|
### Functional
|
||||||
|
|
||||||
|
| ID | Given | When | Then |
|
||||||
|
|----|-------|------|------|
|
||||||
|
| AC-F-01 | 用户 `active` | POST status=`banned` + reason | 200;GET user.status=`banned` |
|
||||||
|
| AC-F-02 | 用户 `banned` | POST status=`active` | 200;可再次 DeviceAuth |
|
||||||
|
| AC-F-03 | 非法边(如 `active`→`active`) | POST | **400** |
|
||||||
|
| AC-F-04 | GET status-transitions | — | 含最近 from/to/admin/reason |
|
||||||
|
|
||||||
|
### Security
|
||||||
|
|
||||||
|
| ID | Given | When | Then |
|
||||||
|
|----|-------|------|------|
|
||||||
|
| AC-S-01 | Admin 无 `admin.users.status.write` | POST status | **403** + deny audit |
|
||||||
|
| AC-S-02 | 用户 `banned` | C 端带原 Bearer 访问受保护 API | **401/403** |
|
||||||
|
| AC-S-03 | 仅 DeviceAuth 无 Admin | POST `/admin/users/:id/status` | **401** |
|
||||||
|
| AC-S-04 | 无 Admin session | GET transitions | **401** |
|
||||||
|
|
||||||
|
### Performance
|
||||||
|
|
||||||
|
| ID | Given | When | Then |
|
||||||
|
|----|-------|------|------|
|
||||||
|
| AC-P-01 | transitions ≤1000 行/用户 | GET transitions limit=50 | 本机 P95 **< 500ms** |
|
||||||
|
|
||||||
|
### Observability
|
||||||
|
|
||||||
|
| ID | Given | When | Then |
|
||||||
|
|----|-------|------|------|
|
||||||
|
| AC-O-01 | 迁移成功 | — | AuditLog action=`users.status.transition` |
|
||||||
|
| AC-O-02 | 迁移成功 | — | `account_state_transitions` 有对应行 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Forbidden(本切片)
|
||||||
|
|
||||||
|
- soft-delete / `deleted` 状态
|
||||||
|
- 真支付 · UGC · Prompt · 兑换码 · Crisis 深化
|
||||||
|
- 改 Admin RBAC 模型(仅 **additive** 一枚 permission)
|
||||||
|
- 自动开下一 ECR
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Implementation Notes(实现轮才执行)
|
||||||
|
|
||||||
|
| 项 | 内容 |
|
||||||
|
|----|------|
|
||||||
|
| Migration | YES(transitions 表;permission 种子;必要时 CHECK/注释枚举) |
|
||||||
|
| Packages | service account/lifecycle · DeviceAuth/session 拒绝 · admin handler · admin-h5 用户详情最小 CTA |
|
||||||
|
| Depends | ECR-013A Closed(permission middleware) |
|
||||||
@@ -0,0 +1,226 @@
|
|||||||
|
# Feature Spec: 运营后台(Ops Admin)
|
||||||
|
|
||||||
|
> Status: `Active` · Map: `§7 运营后台 [Ops · Phase A]` · Phase: `Ops-A`
|
||||||
|
> 规范:[../feature-design.md](../feature-design.md)
|
||||||
|
> 对标推导参考:`cece-frontend-re/complete-design/40-ops-commerce.md`(IA 全量;本 Spec 只交付 Phase A)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. 功能定义
|
||||||
|
|
||||||
|
| 字段 | 内容 |
|
||||||
|
|---|---|
|
||||||
|
| Name | 运营后台 |
|
||||||
|
| Purpose | 让内部运营/客服在受控权限下查询用户与商业数据,并做可审计的会员权益干预 |
|
||||||
|
| Business Goal | 支撑 P1 用户侧交付后的日常运维;避免直接改库 |
|
||||||
|
|
||||||
|
| In(Phase A) | Out(后置) |
|
||||||
|
|---|---|
|
||||||
|
| 管理员账号登录 / 会话 | UGC 审核 · 达人 · 推送任务 |
|
||||||
|
| 用户列表 / 详情(档案摘要) | 首页运营位 / 工具配置 CMS |
|
||||||
|
| 订单列表 | 优惠券 · 退款工单流 |
|
||||||
|
| 成长会员只读 + **授予/延长**(mock 履约) | 真支付渠道配置 |
|
||||||
|
| 操作审计日志 | 真支付渠道配置 |
|
||||||
|
| `apps/admin-h5` 桌面友好壳 | 小程序后台 |
|
||||||
|
|
||||||
|
> Phase E(ECR-010):RBAC / 封禁 / 推送占位见 [ops-system.md](ops-system.md)。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. 用户价值
|
||||||
|
|
||||||
|
1. **为何需要:** P1 已有用户/会员/订单,无控制台则只能改库,风险高。
|
||||||
|
2. **完成后获得:** 可检索用户、看会员与订单、安全授予会员并留痕。
|
||||||
|
3. **为何付费:** N/A(内部工具)。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. 用户角色
|
||||||
|
|
||||||
|
| Actor | 说明 | 本功能能力 |
|
||||||
|
|---|---|---|
|
||||||
|
| Guest / Visitor | 终端用户身份 | **无**后台入口 |
|
||||||
|
| User / VIP | 终端用户 | **无** |
|
||||||
|
| Admin(Phase A) | `admin_accounts` 账号 | 登录;读写本 Spec In 范围 API |
|
||||||
|
| 运营/审核/客服分角色 | 后置 | Phase A 全部等同 Admin |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. 用户流程
|
||||||
|
|
||||||
|
```text
|
||||||
|
打开 admin-h5
|
||||||
|
↓
|
||||||
|
未登录 → /login(用户名+密码)
|
||||||
|
↓ POST /api/v1/admin/auth/login
|
||||||
|
↓ 存 token → 壳布局
|
||||||
|
↓
|
||||||
|
用户列表 / 订单 / 审计
|
||||||
|
↓ 点用户 → 详情(档案数 · 会员 · 近单)
|
||||||
|
↓ [可选] 授予会员 → 写 memberships + audit_logs
|
||||||
|
失败:401 回登录;403/5xx 页内错误态
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. 页面设计
|
||||||
|
|
||||||
|
| 路由 | 页面 | 说明 |
|
||||||
|
|---|---|---|
|
||||||
|
| `/login` | LoginPage | 无壳 |
|
||||||
|
| `/` | UsersPage | 用户列表 |
|
||||||
|
| `/users/:id` | UserDetailPage | 用户详情 + 授予会员 |
|
||||||
|
| `/orders` | OrdersPage | 订单列表 |
|
||||||
|
| `/audit` | AuditPage | 审计日志 |
|
||||||
|
|
||||||
|
```text
|
||||||
|
AdminShell
|
||||||
|
├── Nav: 用户 | 订单 | 审计 | 退出
|
||||||
|
└── Outlet
|
||||||
|
```
|
||||||
|
|
||||||
|
对照:不进入 user-h5 `page-tree`;独立 `apps/admin-h5`。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. 页面状态
|
||||||
|
|
||||||
|
| 页 | Loading | Empty | Error | Normal | Locked |
|
||||||
|
|---|---|---|---|---|---|
|
||||||
|
| Login | 提交中 | — | 账号错误 | 表单 | — |
|
||||||
|
| Users | 表格骨架 | 无用户 | 拉取失败 | 分页列表 | 未登录→登录 |
|
||||||
|
| UserDetail | 骨架 | 用户不存在 | 失败 | 摘要+操作 | — |
|
||||||
|
| Orders / Audit | 同 Users | 无记录 | 失败 | 列表 | — |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 7. Business Rules
|
||||||
|
|
||||||
|
| ID | Rule |
|
||||||
|
|---|---|
|
||||||
|
| R1 | 管理员鉴权与终端 `DeviceAuth` **隔离**;禁止用 `X-Device-Key` 访问 `/admin/*` |
|
||||||
|
| R2 | 除 `POST /admin/auth/login` 外,admin API 必须带有效 Admin Token |
|
||||||
|
| R3 | 用户列表默认按 `created_at DESC`;支持 `q` 精确匹配 `users.id`(UUID) |
|
||||||
|
| R4 | 授予会员:`plan ∈ {month,quarter,year}`;写入/更新 `memberships` 为 `active`,`expires_at` 按套餐延长;**必须**写 `admin_audit_logs` |
|
||||||
|
| R5 | Phase A **不**提供封禁/注销(避免误伤;后置) |
|
||||||
|
| R6 | Bootstrap:仅当 `admin_accounts` 为空且配置了 bootstrap 密码时,启动可种子一个超级管理员 |
|
||||||
|
| R7 | 审计日志只追加,不可通过 API 删除/篡改 |
|
||||||
|
| R8 | 文案用愈心谷 lexicon;UI 不出现竞品品牌词 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 8. 数据模型影响
|
||||||
|
|
||||||
|
新增表(见 `.ai/domain/erd.md`):
|
||||||
|
|
||||||
|
- `admin_accounts` — 管理员账号(password_hash)
|
||||||
|
- `admin_sessions` — 会话 token
|
||||||
|
- `admin_audit_logs` — 操作审计
|
||||||
|
|
||||||
|
复用只读:`users` · `profiles` · `memberships` · `orders`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 9. API 需求
|
||||||
|
|
||||||
|
前缀:`/api/v1/admin`
|
||||||
|
|
||||||
|
| Method | Path | 意图 |
|
||||||
|
|---|---|---|
|
||||||
|
| POST | `/auth/login` | 登录,返回 token + account |
|
||||||
|
| POST | `/auth/logout` | 注销当前会话 |
|
||||||
|
| GET | `/me` | 当前管理员 |
|
||||||
|
| GET | `/stats` | 仪表盘概览计数 |
|
||||||
|
| GET | `/users` | 列表 `?q=` 支持 UUID / 手机 / 昵称 |
|
||||||
|
| GET | `/users/:id` | 详情(档案 · 报告 · 会员 · 问答额度 · 近订单) |
|
||||||
|
| POST | `/users/:id/membership/grant` | 授予/延长会员 |
|
||||||
|
| POST | `/users/:id/ask-quota/grant` | 增加已购问答额度 `{delta}` |
|
||||||
|
| GET | `/orders` | 订单列表 |
|
||||||
|
| GET | `/audit-logs` | 审计列表 |
|
||||||
|
|
||||||
|
信封仍为 `{code,message,data}`。细节同步 OpenAPI。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 10. 权限设计
|
||||||
|
|
||||||
|
| 能力 | Admin Phase A |
|
||||||
|
|---|---|
|
||||||
|
| 登录 / me / logout | ✓ |
|
||||||
|
| 用户读 | ✓ |
|
||||||
|
| 订单读 | ✓ |
|
||||||
|
| 授予会员 | ✓ |
|
||||||
|
| 审计读 | ✓ |
|
||||||
|
| 改用户 status / 删数据 | ✗ |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 11. 埋点
|
||||||
|
|
||||||
|
| event | 属性 |
|
||||||
|
|---|---|
|
||||||
|
| `admin_login` | ok / fail_reason |
|
||||||
|
| `admin_user_view` | user_id |
|
||||||
|
| `admin_membership_grant` | user_id, plan |
|
||||||
|
| `admin_page_view` | route |
|
||||||
|
|
||||||
|
Phase A 可先 `console`/本地;不挡验收。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 12. 测试验收标准
|
||||||
|
|
||||||
|
| # | Given / When / Then |
|
||||||
|
|---|---|
|
||||||
|
| T1 | 无 token 调 GET `/admin/users` → 401 |
|
||||||
|
| T2 | 正确账号登录 → 200 + token;错密 → 非 0 code |
|
||||||
|
| T3 | 登录后列表可见已有 users |
|
||||||
|
| T4 | grant membership → memberships active + audit 一条 |
|
||||||
|
| T5 | admin-h5:登录 → 用户列表 → 详情 → 授予 → 审计页可见 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 13. AI 开发前检查
|
||||||
|
|
||||||
|
- [x] 有 Active Spec(本文件)
|
||||||
|
- [x] feature-map §7 已挂
|
||||||
|
- [x] ERD / API 意图已写
|
||||||
|
- [x] In/Out 边界清晰(无 UGC/达人)
|
||||||
|
- [x] ECR-006 Approved + BACKEND_DESIGN
|
||||||
|
- [x] 实现后过 DoD + Review Report
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Review Report(Phase A)
|
||||||
|
|
||||||
|
- Feature: 运营后台 Phase A
|
||||||
|
- Scope label: **Feature Complete**(Ops-A;非 P1 Complete 扩展)
|
||||||
|
- Architecture: PASS — admin 与 DeviceAuth 隔离;H→S→R
|
||||||
|
- API: PASS — `/api/v1/admin/*` + OpenAPI
|
||||||
|
- Security: PASS — bcrypt · session token · 审计
|
||||||
|
- Test: PASS — `TestAdminOpsPhaseA` · `TestPlanDays` · `build:admin`
|
||||||
|
- Known Issues: SDK 未并入 admin;RBAC/CMS 后置
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 分期
|
||||||
|
|
||||||
|
| Phase | 内容 |
|
||||||
|
|---|---|
|
||||||
|
| **A(本 ECR)** | 登录 · 用户 · 订单 · 授予会员 · 审计 · admin-h5 壳 |
|
||||||
|
| **B(ECR-007 Closed)** | 自有埋点 · 管理端「数据」看板 — Spec `ops-analytics.md` |
|
||||||
|
| **C(ECR-008 Closed)** | 首页宫格 CRUD · 测评上下架 — Spec `ops-content.md` |
|
||||||
|
| **E(ECR-013A Closed)** | Admin RBAC — Spec `ops-rbac.md` · Parent WAVE0-FROZEN |
|
||||||
|
| **F(ECR-013B Closed)** | AccountLifecycle — Spec `ops-account-lifecycle.md` |
|
||||||
|
| **G(ECR-014 Closed)** | MembershipPlan — Spec `ops-membership-plan.md` |
|
||||||
|
| **H(ECR-015 Closed)** | RedemptionCode — Spec `ops-redemption-code.md` |
|
||||||
|
| **I(ECR-016 Closed)** | UserIntelligence — Spec `ops-user-intelligence.md` |
|
||||||
|
| **J(ECR-017 Closed)** | AskOperations — Spec `ops-ask-operations.md` |
|
||||||
|
| **K(ECR-018 Closed)** | Entitlement — Spec `ops-entitlement.md` |
|
||||||
|
| **L(ECR-019 Closed)** | ContentSafety FilterRule — Spec `ops-content-safety.md` |
|
||||||
|
| **M(ECR-020 Closed)** | QualityFeedback — Spec `ops-quality-feedback.md` |
|
||||||
|
| **N(ECR-021 Closed)** | AICoreConfig SystemPrompt — Spec `ops-ai-core-config.md` |
|
||||||
|
| **O(ECR-022 Closed)** | CrisisCare CrisisPolicy — Spec `ops-crisis-care.md` |
|
||||||
|
| 后置 | Knowledge·Tools 写面 / CrisisEvent / 真支付(Loop 续跑) |
|
||||||
|
| D | 订单筛选 · 展示价 · 退款只读(另开 ECR) |
|
||||||
|
| 后置 | 封禁加深(Account_Risk)· 推送占位 |
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
# Feature Spec: AICoreConfig · SystemPrompt(Ops · ECR-021)
|
||||||
|
|
||||||
|
> Status: `Active`(Loop continuous · **ECR-021 Closed**)
|
||||||
|
> Parent: WAVE0-FROZEN · Predecessor: ECR-020 Closed
|
||||||
|
> Capability: `AICoreConfig` · BC: `Ask_Ops`
|
||||||
|
> 授权:`docs/WAVE0/LOOP_AUTHORIZATION.md`
|
||||||
|
|
||||||
|
## Non-goals
|
||||||
|
|
||||||
|
Prompt 在线编辑/发布 · KnowledgeSource/Chunk · ToolDefinition · 切换运行时引擎 · UGC · 真支付
|
||||||
|
|
||||||
|
## L2 Domain
|
||||||
|
|
||||||
|
| 概念 | 语义 |
|
||||||
|
|------|------|
|
||||||
|
| `SystemPrompt` | code 唯一;body 为模板文本;active/system;本切片只读 |
|
||||||
|
|
||||||
|
## L3 API
|
||||||
|
|
||||||
|
| Method | Path | 权限 | 语义 |
|
||||||
|
|--------|------|------|------|
|
||||||
|
| GET | `/admin/ai/system-prompts` | `admin.ai_config.read` | 列表 |
|
||||||
|
| GET | `/admin/ai/system-prompts/:id` | 同上 | 详情(含 body) |
|
||||||
|
|
||||||
|
## Migration
|
||||||
|
|
||||||
|
`000022`:`system_prompts` + 种子 `ask_default` + 授予权限
|
||||||
|
|
||||||
|
## L4 AC
|
||||||
|
|
||||||
|
| ID | Then |
|
||||||
|
|----|------|
|
||||||
|
| AC-F-01 | list 含 ask_default |
|
||||||
|
| AC-F-02 | get 返回 body 非空 |
|
||||||
|
| AC-F-03 | 未知 id → 404 |
|
||||||
|
| AC-S-01 | 无 Admin → 401 |
|
||||||
|
| AC-S-02 | 无 ai_config.read → 403 |
|
||||||
|
| AC-P-01 | list < 500ms |
|
||||||
|
| AC-O-01 | N/A 只读 |
|
||||||
|
|
||||||
|
contract_diff: `docs/CONTRACT_DIFF/ECR-021.yaml`
|
||||||
@@ -0,0 +1,156 @@
|
|||||||
|
# Feature Spec: 运营行为分析(Ops-B)
|
||||||
|
|
||||||
|
> Status: `Active` · Map: `§7 运营后台` · Phase: `Ops-B`
|
||||||
|
> ESS:`docs/ECR/ECR-007-ops-analytics.md`(**Closed** · L2)· BD-2026-007 Approved
|
||||||
|
> 关联:[ops-admin.md](ops-admin.md) · [analytics.md](analytics.md) · [cece-frontend-re/complete-design/40-ops-commerce.md](cece-frontend-re/complete-design/40-ops-commerce.md)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ESS 门禁
|
||||||
|
|
||||||
|
按本仓 `docs/PROJECT_RULES.md` + ESS `CHANGE_MANAGEMENT.md`:
|
||||||
|
|
||||||
|
1. Change Level = **L2** → ECR Approved + Feature Spec Active + BACKEND_DESIGN Approved — **已满足(2026-08-07)**
|
||||||
|
2. 实现顺序以 `docs/ENGINEERING_SPEC/ECR-007-ops-analytics.md` 为准
|
||||||
|
3. 完成后:TEST_REPORT · CODE_REVIEW · `ess-validate --phase review` · DoD Review Report
|
||||||
|
|
||||||
|
(与 ECR/BACKEND_DESIGN 冲突时以已 Approved 的 ESS 工件为准。)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. 目标
|
||||||
|
|
||||||
|
按**传统 App 运营**模式:
|
||||||
|
|
||||||
|
1. **采集**:页浏览、点击、停留时长、会话退出页等
|
||||||
|
2. **落库**:自有管道(可与 GA4 双写)
|
||||||
|
3. **展示**:管理端「数据」看板(DAU、页面、退出页、漏斗)
|
||||||
|
4. **分期**:先 Ops-B 分析,再内容 / 商业 / 权限全量模块
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. 分期总览
|
||||||
|
|
||||||
|
| 分期 | 主题 | 交付 |
|
||||||
|
|---|---|---|
|
||||||
|
| Ops-A | 已完成 | 登录 · 用户 · 订单 · 会员授予 · 审计 · 概览图 |
|
||||||
|
| **Ops-B** | **行为分析** | 自有埋点 + 管理端「数据」 |
|
||||||
|
| Ops-C | 内容运营 | 首页宫格/工具配置 · 测评上下架 |
|
||||||
|
| Ops-D | 商业加深 | 订单筛选 · 套餐价配置 · 退款只读 |
|
||||||
|
| Ops-E | 系统 | RBAC · 封禁 · 推送/站内信占位 |
|
||||||
|
|
||||||
|
UGC / 达人 / 真支付网关:**更远期**,不在本 Spec 承诺范围。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. Ops-B 功能定义
|
||||||
|
|
||||||
|
| 字段 | 内容 |
|
||||||
|
|---|---|
|
||||||
|
| Name | App 行为分析(采集 + 运营看板) |
|
||||||
|
| Purpose | 用自有数据回答:谁来了、看了哪、停多久、从哪走、点了什么、漏斗掉哪 |
|
||||||
|
| Business Goal | 替代「只能看 GA / 改库」;支撑日常运营决策 |
|
||||||
|
|
||||||
|
| In | Out |
|
||||||
|
|---|---|
|
||||||
|
| session / page_view / page_leave(dwell) / ui_click / session_end(exit_page) | 热力图坐标级精确点击 |
|
||||||
|
| 漏斗事件写入同一管道 | 实时毫秒大屏 |
|
||||||
|
| Admin「数据」页聚合 | 用户轨迹录像 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. 采集字典(客户端)
|
||||||
|
|
||||||
|
扩展 `apps/user-h5/src/lib/analytics.ts`:通道 A = GA4(可选);通道 B = 自有 `POST /api/v1/analytics/events`。
|
||||||
|
|
||||||
|
| Event | 触发 | 关键 props |
|
||||||
|
|---|---|---|
|
||||||
|
| `session_start` | 冷启动或可见性恢复(节流) | `session_id`, `cold`, `app_ver` |
|
||||||
|
| `page_view` | `router.afterEach` | `page_path`, `page_title`, `referrer_path` |
|
||||||
|
| `page_leave` | 路由离开 / `visibilitychange=hidden` / `pagehide` | `page_path`, **`dwell_ms`** |
|
||||||
|
| `ui_click` | `data-track` 或白名单委托 | `page_path`, `element_id` |
|
||||||
|
| `session_end` | 超时 / 关页(`sendBeacon`) | `session_id`, `duration_ms`, **`exit_page`** |
|
||||||
|
| 既有漏斗 | 保持 | `home_cta_portrait` 等 |
|
||||||
|
|
||||||
|
规则:
|
||||||
|
|
||||||
|
- 批量上报(5–10s)+ 退出冲刷
|
||||||
|
- `session_id`:`sessionStorage`;30min 无互动新开
|
||||||
|
- **禁止**生日、问答正文、手机号、完整档案 ID 明文
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. 数据模型
|
||||||
|
|
||||||
|
```text
|
||||||
|
analytics_sessions
|
||||||
|
id, device_key, user_id?, started_at, ended_at, exit_page, duration_ms
|
||||||
|
|
||||||
|
analytics_events
|
||||||
|
id, session_id, user_id?, name, page_path, props jsonb, client_ts, received_at
|
||||||
|
|
||||||
|
analytics_daily_page(可选汇总)
|
||||||
|
day, page_path, pv, uv, dwell_sum_ms, exit_count
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. API
|
||||||
|
|
||||||
|
| Method | Path | 意图 |
|
||||||
|
|---|---|---|
|
||||||
|
| POST | `/api/v1/analytics/events` | 批量 ingest(DeviceAuth,限流) |
|
||||||
|
| GET | `/api/v1/admin/analytics/overview` | DAU / 会话 / 均时长 |
|
||||||
|
| GET | `/api/v1/admin/analytics/pages` | 页 PV/UV/avg_dwell/exit |
|
||||||
|
| GET | `/api/v1/admin/analytics/exits` | 退出页 TOP |
|
||||||
|
| GET | `/api/v1/admin/analytics/clicks` | 点击 TOP |
|
||||||
|
| GET | `/api/v1/admin/analytics/funnel` | 漏斗计数 |
|
||||||
|
|
||||||
|
查询均带 `from` / `to`(日)。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 7. 管理端「数据」页
|
||||||
|
|
||||||
|
侧栏:概览 · **数据** · 用户 · 订单 · 审计
|
||||||
|
|
||||||
|
- 时间筛选:今日 / 7 日 / 30 日
|
||||||
|
- 卡片:DAU、新增、会话数、人均会话时长
|
||||||
|
- 图:日活趋势;页面均停留 TOP
|
||||||
|
- 表:页面明细、退出页 TOP、点击 TOP
|
||||||
|
- 漏斗:探索列表 → 开始作答 → 量表完成 → 画像完成 → 深度 CTA → 支付成功
|
||||||
|
|
||||||
|
视觉:愈心谷色系;品牌仅 logo,无「运营后台」字样。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 8. Ops-C~E 边界(后置)
|
||||||
|
|
||||||
|
| 分期 | In |
|
||||||
|
|---|---|
|
||||||
|
| Ops-C | 首页宫格/工具 CRUD;scales 上下架 |
|
||||||
|
| Ops-D | 订单多维筛选;membership 展示价;退款状态只读 |
|
||||||
|
| Ops-E | 用户封禁;admin 角色;推送任务占位 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 9. Ops-B 验收
|
||||||
|
|
||||||
|
**Given** H5 打开并切换两页后离开
|
||||||
|
**When** ingest 成功
|
||||||
|
**Then** 存在 `page_view`×2、`page_leave`(含 dwell_ms)、`session_end.exit_page`
|
||||||
|
|
||||||
|
**Given** Admin 登录「数据」近 7 日
|
||||||
|
**When** GET overview/pages/exits
|
||||||
|
**Then** 返回非空聚合且与事件量级一致
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 10. 实施顺序
|
||||||
|
|
||||||
|
1. 本 Spec 置 Active + 改 feature-map §7 / ops-admin 分期
|
||||||
|
2. Migration + ingest API
|
||||||
|
3. Admin 聚合 API
|
||||||
|
4. H5 SDK(会话/停留/点击/beacon)
|
||||||
|
5. admin-h5「数据」页
|
||||||
|
6. 测试与部署
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
# Feature Spec: AskOperations(Ops · ECR-017)
|
||||||
|
|
||||||
|
> Status: `Active`(Loop continuous · **ECR-017 Closed**)
|
||||||
|
> Parent: WAVE0-FROZEN · Predecessor: ECR-016 Closed
|
||||||
|
> Capability: `AskOperations` · BC: `Ask_Ops`
|
||||||
|
> 授权:`docs/WAVE0/LOOP_AUTHORIZATION.md`
|
||||||
|
|
||||||
|
## Non-goals
|
||||||
|
|
||||||
|
改写/删除消息正文 · SystemPrompt/Knowledge 配置 · QualityFeedback 写回 · AICoreConfig · 真支付 · UGC
|
||||||
|
|
||||||
|
## L2 读模型
|
||||||
|
|
||||||
|
| 概念 | 语义 |
|
||||||
|
|------|------|
|
||||||
|
| `AskSessionView` | 线程元数据 + message_count(列表) |
|
||||||
|
| 会话详情 | 只读消息序列(role/content/created_at) |
|
||||||
|
|
||||||
|
## L3 API
|
||||||
|
|
||||||
|
| Method | Path | 权限 | 语义 |
|
||||||
|
|--------|------|------|------|
|
||||||
|
| GET | `/admin/ask/threads` | `admin.ask.read` | 列表(可选 `user_id`) |
|
||||||
|
| GET | `/admin/ask/threads/:id` | `admin.ask.read` | 会话 meta(不含原文) |
|
||||||
|
| GET | `/admin/ask/threads/:id/messages` | `admin.ask.transcript.read` | 对话原文(审计 `ask.transcript.read`) |
|
||||||
|
|
||||||
|
## Migration
|
||||||
|
|
||||||
|
`000019`:为 `super_admin` 授予 `admin.ask.read`(无新业务表)
|
||||||
|
|
||||||
|
## L4 AC
|
||||||
|
|
||||||
|
| ID | Then |
|
||||||
|
|----|------|
|
||||||
|
| AC-F-01 | 有消息线程 → list 含该 thread · message_count≥1 |
|
||||||
|
| AC-F-02 | detail 返回 user+assistant 消息 |
|
||||||
|
| AC-S-01 | 无 Admin → 401 |
|
||||||
|
| AC-S-02 | 无 ask.read → 403 |
|
||||||
|
| AC-P-01 | list < 500ms 本机 |
|
||||||
|
| AC-O-01 | N/A 只读(无写审计强制) |
|
||||||
|
|
||||||
|
contract_diff: `docs/CONTRACT_DIFF/ECR-017.yaml`
|
||||||
@@ -0,0 +1,112 @@
|
|||||||
|
# Feature Spec: OpsCMS · Banner 写面(Ops · ECR-041)
|
||||||
|
|
||||||
|
> Status: `Active`(**ECR-041 Closed** · Feature Complete)
|
||||||
|
> Map: `§7 运营后台` · Capability: `OpsCMS` · BC: `Ops_CMS_NoUGC`
|
||||||
|
> Parent: WAVE0-FROZEN · Write-Wave: `docs/WAVE0/WRITE_WAVE_AUTHORIZATION.md`
|
||||||
|
> Predecessor: ECR-024 Closed(Banner 只读)
|
||||||
|
> 关联:[ops-banner.md](ops-banner.md)(只读基线)· [ops-content.md](ops-content.md) · [home.md](home.md)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. 目标
|
||||||
|
|
||||||
|
让运营可 **创建 / 更新 / 上下架** Banner;C 端首页对 `placement=home` 的 active Banner **生效**;写操作鉴权 + 审计;失败可回退静态。
|
||||||
|
|
||||||
|
验证 Write-Wave 首刀闭环,**不**做 FeedSlot、真支付、UGC。
|
||||||
|
|
||||||
|
## 2. In / Out
|
||||||
|
|
||||||
|
| In | Out |
|
||||||
|
|----|-----|
|
||||||
|
| Admin:Banner create / update / 设 `active` | **FeedSlot** 一切写与 API |
|
||||||
|
| 加法权限 `admin.cms.write`(既有 RBAC) | soft-delete 物理删行(`system=true` 禁止删) |
|
||||||
|
| C 端:`GET` active banners(至少 `placement=home`) | ScheduledPublication 写 · 外链任意 URL |
|
||||||
|
| 首页推荐区:API Banner 投影优先,空则回退静态 `homeFeeds` | 把 FeedSlot 与 Banner 合并为一 ECR |
|
||||||
|
| `admin_audit_logs` 记录写操作 | Crisis / Handoff / ContentSafety 写 · 真支付 · UGC |
|
||||||
|
| OpenAPI · contract_diff · integration | 新权限子系统 · 改引擎分层 |
|
||||||
|
|
||||||
|
### 与 `homeFeeds` 的关系(诚实边界)
|
||||||
|
|
||||||
|
- ECR-008 将「首页 Feeds CMS」后置;表意信息流位属 **FeedSlot**(ECR-025 只读,写面另 ECR)。
|
||||||
|
- **本切片**:用 **Banner(placement=home)** 驱动首页推荐区展示(投影字段见下);**不**写 `ops_feed_slots`。
|
||||||
|
- 完整 Feeds 槽位运营(多 slot、排期)→ 后续 FeedSlot 写面 ECR。
|
||||||
|
|
||||||
|
## 3. Domain
|
||||||
|
|
||||||
|
| 概念 | 语义 |
|
||||||
|
|------|------|
|
||||||
|
| `Banner` | `code` 唯一;`placement` ∈ {home,explore,ask};`active`;`system` |
|
||||||
|
| 写语义 | upsert 字段;`active=false` = 下架;禁止 soft-delete 列/物理删 system 行 |
|
||||||
|
| C 端投影 | 仅 `active=true`;按 `sort_order` 升序 |
|
||||||
|
|
||||||
|
### 首页投影映射(Banner → 原 homeFeeds 卡)
|
||||||
|
|
||||||
|
| homeFeeds 字段 | 来源 |
|
||||||
|
|----------------|------|
|
||||||
|
| `to` | `link_path`(须站内 `/` 相对路径) |
|
||||||
|
| `title` | `title` |
|
||||||
|
| `meta` | 可选:无则空串或固定「运营推荐」 |
|
||||||
|
| `icon` / `tone` / `stat` / `tag` | 本切片可用缺省;**不**扩表除非 migration 明确(默认缺省,避免 scope creep) |
|
||||||
|
|
||||||
|
## 4. API
|
||||||
|
|
||||||
|
### Admin(既有前缀 `/api/v1/admin/cms`)
|
||||||
|
|
||||||
|
| Method | Path | 权限 | 语义 |
|
||||||
|
|--------|------|------|------|
|
||||||
|
| GET | `/banners` · `/banners/{id}` | `admin.cms.read` | 保持 ECR-024 |
|
||||||
|
| POST | `/banners` | `admin.cms.write` | 创建(code 唯一) |
|
||||||
|
| PUT | `/banners/{id}` | `admin.cms.write` | 更新 title/placement/image_url/link_path/sort_order/active |
|
||||||
|
| — | DELETE | — | **不做**(下架用 `active=false`) |
|
||||||
|
|
||||||
|
校验:`link_path` 若非空须以 `/` 开头、禁 `http(s):`;`placement` 枚举;`system=true` 行不可改 `code`、不可删。
|
||||||
|
|
||||||
|
### C 端
|
||||||
|
|
||||||
|
| Method | Path | Auth | 语义 |
|
||||||
|
|--------|------|------|------|
|
||||||
|
| GET | `/api/v1/home/banners` | DeviceAuth(与 `/home/tools` 同级) | 仅 `active`;query `placement` 默认 `home` |
|
||||||
|
|
||||||
|
## 5. Permission / Audit
|
||||||
|
|
||||||
|
- Migration 授予 `super_admin`:`admin.cms.write`(加法码,非新 RBAC 模型)。
|
||||||
|
- 每次 POST/PUT 写 `admin_audit_logs`(actor · action · target id/code · diff 摘要)。
|
||||||
|
|
||||||
|
## 6. Migration
|
||||||
|
|
||||||
|
- 若仅需权限种子:`000051_ops_banner_write`(以 TRACEABILITY Max+1 为准,编码时再锁)。
|
||||||
|
- **表结构**:默认复用 `ops_banners`;本切片 **不**为 FeedSlot 改表。若投影缺省不够且 Human 未扩 scope,不得私自加列。
|
||||||
|
|
||||||
|
## 7. UI
|
||||||
|
|
||||||
|
| 端 | 行为 |
|
||||||
|
|----|------|
|
||||||
|
| admin-h5 `/cms` | Banner 列表 + 新建/编辑/上下架(只动 Banner;FeedSlot 仍只读展示可保留) |
|
||||||
|
| user-h5 首页 | `GET /home/banners` → 推荐区;失败或空 → 静态 `homeFeeds` |
|
||||||
|
|
||||||
|
## 8. AC
|
||||||
|
|
||||||
|
| ID | Then |
|
||||||
|
|----|------|
|
||||||
|
| AC-F-01 | POST 合法 Banner → list/get 可见 |
|
||||||
|
| AC-F-02 | PUT `active=false` → C 端 list 不含 |
|
||||||
|
| AC-F-03 | PUT `active=true` + placement=home → `GET /home/banners` 含该项 |
|
||||||
|
| AC-F-04 | 重复 `code` → 4xx |
|
||||||
|
| AC-F-05 | 非法 `link_path`(外链)→ 4xx |
|
||||||
|
| AC-S-01 | 无 Admin → 401 |
|
||||||
|
| AC-S-02 | 仅 read 无 write → POST/PUT 403 |
|
||||||
|
| AC-A-01 | 写操作产生审计行 |
|
||||||
|
| AC-C-01 | H5 首页:有 active home Banner 时推荐区非纯静态 |
|
||||||
|
| AC-C-02 | API 失败时首页不白屏(回退静态) |
|
||||||
|
| AC-O-01 | 不触碰 FeedSlot 写路径 · 无 soft-delete · 无支付 |
|
||||||
|
|
||||||
|
## 9. Non-goals(STOP 对齐)
|
||||||
|
|
||||||
|
FeedSlot 写 · ScheduledPublication 写 · UGC · 真支付 · soft-delete · Crisis/Handoff/ContentSafety 写 · 扩大为本 ECR 合并多概念。
|
||||||
|
|
||||||
|
## 10. Trace
|
||||||
|
|
||||||
|
- ECR: `docs/ECR/ECR-041-banner-write.md`
|
||||||
|
- BD: `docs/BACKEND_DESIGN/BD-2026-041-banner-write.md`
|
||||||
|
- PRODUCT_SPEC · CONTRACT_DIFF · TEST_REPORT · CODE_REVIEW(实现阶段)
|
||||||
|
- Auth: `docs/WAVE0/WRITE_WAVE_AUTHORIZATION.md`
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
# Feature Spec: OpsCMS · Banner(Ops · ECR-024 只读基线)
|
||||||
|
|
||||||
|
> Status: `Active`(**ECR-024 Closed** · 只读)
|
||||||
|
> Parent: WAVE0-FROZEN · Predecessor: ECR-023 Closed
|
||||||
|
> Capability: `OpsCMS` · BC: `Ops_CMS_NoUGC`
|
||||||
|
> 授权(只读队列):`docs/WAVE0/LOOP_AUTHORIZATION.md`
|
||||||
|
> **写面:** [ops-banner-write.md](ops-banner-write.md)(**ECR-041** · Write-Wave)
|
||||||
|
|
||||||
|
## Non-goals(本只读 Spec)
|
||||||
|
|
||||||
|
Banner 写发布(见 ECR-041)· FeedSlot · ScheduledPublication · UGC · 真支付
|
||||||
|
|
||||||
|
## L2 Domain
|
||||||
|
|
||||||
|
| 概念 | 语义 |
|
||||||
|
|------|------|
|
||||||
|
| `Banner` | code 唯一;placement ∈ {home,explore,ask};active/system;本切片只读 |
|
||||||
|
|
||||||
|
## L3 API
|
||||||
|
|
||||||
|
| Method | Path | 权限 | 语义 |
|
||||||
|
|--------|------|------|------|
|
||||||
|
| GET | `/admin/cms/banners` | `admin.cms.read` | 只读 |
|
||||||
|
| GET | `/admin/cms/banners/{id}` | `admin.cms.read` | 只读 |
|
||||||
|
|
||||||
|
## Migration
|
||||||
|
|
||||||
|
`000025`:表 + 种子(若有) + 授予 admin.cms.read
|
||||||
|
|
||||||
|
## L4 AC
|
||||||
|
|
||||||
|
| ID | Then |
|
||||||
|
|----|------|
|
||||||
|
| AC-F-01 | list 含种子或空列表合法 |
|
||||||
|
| AC-F-02 | 已知 id get 200 |
|
||||||
|
| AC-F-03 | 未知 id → 404 |
|
||||||
|
| AC-S-01 | 无 Admin → 401 |
|
||||||
|
| AC-S-02 | 无权限 → 403 |
|
||||||
|
| AC-P-01 | list < 500ms |
|
||||||
|
| AC-O-01 | N/A 只读 |
|
||||||
|
|
||||||
|
contract_diff: `docs/CONTRACT_DIFF/ECR-024.yaml`
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
# Feature Spec: ContentSafety · BlockPolicy(Ops · ECR-029)
|
||||||
|
|
||||||
|
> Status: `Active`(Loop continuous · **ECR-029 Closed**)
|
||||||
|
> Parent: WAVE0-FROZEN · Predecessor: ECR-028 Closed
|
||||||
|
> Capability: `ContentSafety` · BC: `Content_Safety`
|
||||||
|
> 授权:`docs/WAVE0/LOOP_AUTHORIZATION.md`
|
||||||
|
|
||||||
|
## Non-goals
|
||||||
|
|
||||||
|
策略写发布 · 用户侧硬拦截上线 · UGC · 真支付
|
||||||
|
|
||||||
|
## L2 Domain
|
||||||
|
|
||||||
|
| 概念 | 语义 |
|
||||||
|
|------|------|
|
||||||
|
| `BlockPolicy` | 本切片只读目录;code 唯一(若适用) |
|
||||||
|
|
||||||
|
## L3 API
|
||||||
|
|
||||||
|
| Method | Path | 权限 | 语义 |
|
||||||
|
|--------|------|------|------|
|
||||||
|
| GET | `/admin/content-safety/block-policies` | `admin.content_safety.read` | 只读 |
|
||||||
|
| GET | `/admin/content-safety/block-policies/{id}` | `admin.content_safety.read` | 只读 |
|
||||||
|
|
||||||
|
## Migration
|
||||||
|
|
||||||
|
`000030`:表 + 种子(若有)(权限复用)
|
||||||
|
|
||||||
|
## L4 AC
|
||||||
|
|
||||||
|
| ID | Then |
|
||||||
|
|----|------|
|
||||||
|
| AC-F-01 | list 含种子或空列表合法 |
|
||||||
|
| AC-F-02 | 已知 id get 200 |
|
||||||
|
| AC-F-03 | 未知 id → 404 |
|
||||||
|
| AC-S-01 | 无 Admin → 401 |
|
||||||
|
| AC-S-02 | 无权限 → 403 |
|
||||||
|
| AC-P-01 | list < 500ms |
|
||||||
|
| AC-O-01 | N/A 只读 |
|
||||||
|
|
||||||
|
contract_diff: `docs/CONTRACT_DIFF/ECR-029.yaml`
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
# Feature Spec: 运营商业加深(Ops-D)
|
||||||
|
|
||||||
|
> Status: `Active` · Map: `§7 Phase D` · Phase: `Ops-D` · ECR: `ECR-009`
|
||||||
|
> 规范:[../feature-design.md](../feature-design.md)
|
||||||
|
> 上游:Ops-A/B/C(ECR-006/007/008)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. 功能定义
|
||||||
|
|
||||||
|
| 字段 | 内容 |
|
||||||
|
|---|---|
|
||||||
|
| Name | 运营商业加深 Ops-D |
|
||||||
|
| Purpose | 订单可筛选;套餐展示价可配;退款状态只读可见 |
|
||||||
|
| Business Goal | 运营无需改库即可查单与维护展示价 |
|
||||||
|
|
||||||
|
| In | Out |
|
||||||
|
|---|---|
|
||||||
|
| 订单筛选:status / kind / from–to / user_id | 真支付 · 退款工单流转 |
|
||||||
|
| `refund_status` 只读字段 | 优惠券 · 发票 |
|
||||||
|
| 会员套餐展示价 CRUD(分) | RBAC(Ops-E) |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. 验收
|
||||||
|
|
||||||
|
**Given** 库内多状态订单
|
||||||
|
**When** `GET /api/v1/admin/orders?status=paid&kind=membership&from=&to=`
|
||||||
|
**Then** 仅返回匹配项,且含 `refund_status`
|
||||||
|
|
||||||
|
**Given** Admin 配置 `monthly` 展示价
|
||||||
|
**When** `PUT /api/v1/admin/membership/plan-prices`
|
||||||
|
**Then** `GET` 返回新价;不改历史 `orders.amount_cents`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. 页面
|
||||||
|
|
||||||
|
| 路由 | 说明 |
|
||||||
|
|---|---|
|
||||||
|
| `/orders` | 增加筛选条 + 退款状态列 |
|
||||||
|
| `/pricing` | 套餐展示价表 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. 非目标
|
||||||
|
|
||||||
|
真支付网关 · 退款执行 · Ops-E 权限矩阵 · UGC
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
# Feature Spec: ContentSafety · FilterRule(Ops · ECR-019)
|
||||||
|
|
||||||
|
> Status: `Active`(Loop continuous · **ECR-019 Closed**)
|
||||||
|
> Parent: WAVE0-FROZEN · Predecessor: ECR-018 Closed
|
||||||
|
> Capability: `ContentSafety` · BC: `Content_Safety`
|
||||||
|
> 授权:`docs/WAVE0/LOOP_AUTHORIZATION.md`
|
||||||
|
|
||||||
|
## Non-goals
|
||||||
|
|
||||||
|
ModerationCase 写回 · CrisisPolicy 配置 · 真 NLP/厂商审核 · UGC · 真支付 · 用户侧硬拦截上线(本切片仅运营只读 + 试匹配)
|
||||||
|
|
||||||
|
## L2 Domain
|
||||||
|
|
||||||
|
| 概念 | 语义 |
|
||||||
|
|------|------|
|
||||||
|
| `FilterRule` | code 唯一;category ∈ {crisis,abuse,spam,pii};action ∈ {flag,block,escalate};system 种子不可本切片删除 |
|
||||||
|
|
||||||
|
## L3 API
|
||||||
|
|
||||||
|
| Method | Path | 权限 | 语义 |
|
||||||
|
|--------|------|------|------|
|
||||||
|
| GET | `/admin/content-safety/filter-rules` | `admin.content_safety.read` | 列表 |
|
||||||
|
| GET | `/admin/content-safety/filter-rules/:id` | 同上 | 详情 |
|
||||||
|
| POST | `/admin/content-safety/evaluate` | 同上 | 试匹配(不写工单) |
|
||||||
|
|
||||||
|
## Migration
|
||||||
|
|
||||||
|
`000020`:`filter_rules` + 种子规则 + 授予 `admin.content_safety.read`
|
||||||
|
|
||||||
|
## L4 AC
|
||||||
|
|
||||||
|
| ID | Then |
|
||||||
|
|----|------|
|
||||||
|
| AC-F-01 | list 含 system 种子 ≥1 |
|
||||||
|
| AC-F-02 | evaluate 命中种子 pattern → matches 非空 |
|
||||||
|
| AC-F-03 | get 未知 id → 404 |
|
||||||
|
| AC-S-01 | 无 Admin → 401 |
|
||||||
|
| AC-S-02 | 无 content_safety.read → 403 |
|
||||||
|
| AC-P-01 | list < 500ms |
|
||||||
|
| AC-O-01 | evaluate 不写 Audit(只读试匹配) |
|
||||||
|
|
||||||
|
contract_diff: `docs/CONTRACT_DIFF/ECR-019.yaml`
|
||||||
@@ -0,0 +1,92 @@
|
|||||||
|
# Feature Spec: 运营内容配置(Ops-C)
|
||||||
|
|
||||||
|
> Status: `Active` · Map: `§7 运营后台` · Phase: `Ops-C`
|
||||||
|
> ESS:`docs/ECR/ECR-008-ops-content.md`(**Closed** · L2)· BD-2026-008 Approved
|
||||||
|
> 关联:[ops-admin.md](ops-admin.md) · [ops-analytics.md](ops-analytics.md) · [home.md](home.md) · [explore-test.md](explore-test.md)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ESS 门禁
|
||||||
|
|
||||||
|
1. Change Level = **L2** → ECR Approved + Feature Spec Active + BACKEND_DESIGN Approved — **已满足(2026-08-07)**
|
||||||
|
2. 实现顺序以 `docs/ENGINEERING_SPEC/ECR-008-ops-content.md` 为准
|
||||||
|
3. 完成后:TEST_REPORT · CODE_REVIEW · `ess-validate --phase review`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. 目标
|
||||||
|
|
||||||
|
让运营在后台配置:
|
||||||
|
|
||||||
|
1. **首页宫格工具**:增删改排序、显隐、角标(替代写死 `homeCatalog.ts`)
|
||||||
|
2. **测评上下架**:`scales.status` = `published` / `draft`,C 端列表只见已发布
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. In / Out
|
||||||
|
|
||||||
|
| In | Out |
|
||||||
|
|---|---|
|
||||||
|
| 首页宫格 CRUD(最多约 24 项;默认 12) | 首页 Feeds/推荐区运营:ECR-008 后置;**Banner 写面见 ECR-041**;完整 FeedSlot 写另 ECR |
|
||||||
|
| 工具 path / icon 白名单校验 | 任意外链、自定义 SVG 上传 |
|
||||||
|
| scales 列表 + 上架/下架 + 审计 | 新建量表题目编辑器 · 探索目录全量 CMS |
|
||||||
|
| Admin「内容」页 | RBAC / 封禁 / 推送(Ops-E) |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. 数据模型
|
||||||
|
|
||||||
|
```text
|
||||||
|
home_tools
|
||||||
|
id, row_index (1|2), sort_order, path, icon, label,
|
||||||
|
badge?, badge_tone? (hot|new|null), enabled, updated_at
|
||||||
|
|
||||||
|
scales(已有)
|
||||||
|
status: published | draft
|
||||||
|
```
|
||||||
|
|
||||||
|
种子:与当前 `homeGridRow1/2` 一致。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. API
|
||||||
|
|
||||||
|
| Method | Path | 意图 |
|
||||||
|
|---|---|---|
|
||||||
|
| GET | `/api/v1/home/tools` | C 端宫格(仅 enabled;DeviceAuth) |
|
||||||
|
| GET | `/api/v1/admin/home/tools` | 管理端全量 |
|
||||||
|
| PUT | `/api/v1/admin/home/tools` | 整表替换保存(排序+字段)+ 审计 |
|
||||||
|
| GET | `/api/v1/admin/scales` | 全部量表(含 draft) |
|
||||||
|
| PATCH | `/api/v1/admin/scales/:id` | `{ status }` + 审计 |
|
||||||
|
|
||||||
|
C 端既有 `GET /scales` 继续只返回 published。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. 管理端「内容」页
|
||||||
|
|
||||||
|
侧栏:概览 · 数据 · **内容** · 用户 · 订单 · 审计
|
||||||
|
|
||||||
|
- Tab「首页宫格」:两行列表、拖拽/上下移、编辑 label/path/icon/badge、启用开关、保存
|
||||||
|
- Tab「测评」:列表 · 上架/下架
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. C 端行为
|
||||||
|
|
||||||
|
- `useHomePage` 优先拉 `GET /home/tools`;失败回退静态 `homeCatalog`
|
||||||
|
- 下架 scale:列表不可见;直链 slug 返回 404/不可用(与现 Get 行为对齐)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 7. 验收
|
||||||
|
|
||||||
|
**Given** Admin 将某宫格 disabled 并保存
|
||||||
|
**When** H5 刷新首页
|
||||||
|
**Then** 该项不出现
|
||||||
|
|
||||||
|
**Given** Admin 将 `mbti-lite` 置 draft
|
||||||
|
**When** GET `/scales`
|
||||||
|
**Then** 列表不含该 slug
|
||||||
|
|
||||||
|
---
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
# Feature Spec: CrisisCare · CrisisPolicy(Ops · ECR-022)
|
||||||
|
|
||||||
|
> Status: `Active`(Loop continuous · **ECR-022 Closed**)
|
||||||
|
> Parent: WAVE0-FROZEN · Predecessor: ECR-021 Closed
|
||||||
|
> Capability: `CrisisCare` · BC: `Content_Safety`
|
||||||
|
> 授权:`docs/WAVE0/LOOP_AUTHORIZATION.md`
|
||||||
|
|
||||||
|
## Non-goals
|
||||||
|
|
||||||
|
CrisisEvent 入库工单 · InterventionOutcome · 策略在线编辑 · 医疗诊断结论 · UGC · 真支付 · 用户侧硬熔断上线
|
||||||
|
|
||||||
|
## L2 Domain
|
||||||
|
|
||||||
|
| 概念 | 语义 |
|
||||||
|
|------|------|
|
||||||
|
| `CrisisPolicy` | code 唯一;severity ∈ {high,critical};action ∈ {escalate,block,show_helpline};helpline_text 可选;本切片只读 |
|
||||||
|
|
||||||
|
## L3 API
|
||||||
|
|
||||||
|
| Method | Path | 权限 | 语义 |
|
||||||
|
|--------|------|------|------|
|
||||||
|
| GET | `/admin/crisis/policies` | `admin.crisis.read` | 列表 |
|
||||||
|
| GET | `/admin/crisis/policies/:id` | 同上 | 详情 |
|
||||||
|
| POST | `/admin/crisis/evaluate` | 同上 | 试匹配(不写 CrisisEvent) |
|
||||||
|
|
||||||
|
## Migration
|
||||||
|
|
||||||
|
`000023`:`crisis_policies` + 种子 + 授予权限
|
||||||
|
|
||||||
|
## L4 AC
|
||||||
|
|
||||||
|
| ID | Then |
|
||||||
|
|----|------|
|
||||||
|
| AC-F-01 | list 含 system 种子 ≥1 |
|
||||||
|
| AC-F-02 | evaluate 命中 pattern → matches 非空 |
|
||||||
|
| AC-F-03 | 未知 id → 404 |
|
||||||
|
| AC-S-01 | 无 Admin → 401 |
|
||||||
|
| AC-S-02 | 无 crisis.read → 403 |
|
||||||
|
| AC-P-01 | list < 500ms |
|
||||||
|
| AC-O-01 | evaluate 不写 Audit/Event |
|
||||||
|
|
||||||
|
contract_diff: `docs/CONTRACT_DIFF/ECR-022.yaml`
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
# Feature Spec: CrisisCare · CrisisEvent(Ops · ECR-031)
|
||||||
|
|
||||||
|
> Status: `Active`(Loop continuous · **ECR-031 Closed**)
|
||||||
|
> Parent: WAVE0-FROZEN · Predecessor: ECR-030 Closed
|
||||||
|
> Capability: `CrisisCare` · BC: `Content_Safety`
|
||||||
|
> 授权:`docs/WAVE0/LOOP_AUTHORIZATION.md`
|
||||||
|
|
||||||
|
## Non-goals
|
||||||
|
|
||||||
|
事件写入工单流 · 医疗诊断 · UGC · 真支付
|
||||||
|
|
||||||
|
## L2 Domain
|
||||||
|
|
||||||
|
| 概念 | 语义 |
|
||||||
|
|------|------|
|
||||||
|
| `CrisisEvent` | 本切片只读目录;code 唯一(若适用) |
|
||||||
|
|
||||||
|
## L3 API
|
||||||
|
|
||||||
|
| Method | Path | 权限 | 语义 |
|
||||||
|
|--------|------|------|------|
|
||||||
|
| GET | `/admin/crisis/events` | `admin.crisis.read` | 只读 |
|
||||||
|
| GET | `/admin/crisis/events/{id}` | `admin.crisis.read` | 只读 |
|
||||||
|
|
||||||
|
## Migration
|
||||||
|
|
||||||
|
`000032`:表 + 种子(若有)(权限复用)
|
||||||
|
|
||||||
|
## L4 AC
|
||||||
|
|
||||||
|
| ID | Then |
|
||||||
|
|----|------|
|
||||||
|
| AC-F-01 | list 含种子或空列表合法 |
|
||||||
|
| AC-F-02 | 已知 id get 200 |
|
||||||
|
| AC-F-03 | 未知 id → 404 |
|
||||||
|
| AC-S-01 | 无 Admin → 401 |
|
||||||
|
| AC-S-02 | 无权限 → 403 |
|
||||||
|
| AC-P-01 | list < 500ms |
|
||||||
|
| AC-O-01 | N/A 只读 |
|
||||||
|
|
||||||
|
contract_diff: `docs/CONTRACT_DIFF/ECR-031.yaml`
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
# Feature Spec: Entitlement(Ops · ECR-018)
|
||||||
|
|
||||||
|
> Status: `Active`(Loop continuous · **ECR-018 Closed**)
|
||||||
|
> Parent: WAVE0-FROZEN · Predecessor: ECR-017 Closed
|
||||||
|
> Capability: `CommerceEntitlement` · BC: `Membership_Orders`
|
||||||
|
> 授权:`docs/WAVE0/LOOP_AUTHORIZATION.md`
|
||||||
|
|
||||||
|
## Non-goals
|
||||||
|
|
||||||
|
真支付 · 改订单/退款 · 新建权益矩阵表 · UGC · 改报告正文 · ask_pack SKU
|
||||||
|
|
||||||
|
## L2 读模型(无 migration)
|
||||||
|
|
||||||
|
| 概念 | 来源 |
|
||||||
|
|------|------|
|
||||||
|
| `Entitlement` | Membership + DeepAccess 列表 + ask_paid_quota 聚合 |
|
||||||
|
| flags | `report_detail_via_membership` · `deep_access_count` |
|
||||||
|
|
||||||
|
## L3 API
|
||||||
|
|
||||||
|
| Method | Path | 权限 | 语义 |
|
||||||
|
|--------|------|------|------|
|
||||||
|
| GET | `/admin/users/:id/entitlements` | `admin.users.read` | 用户权益只读视图 |
|
||||||
|
|
||||||
|
## L4 AC
|
||||||
|
|
||||||
|
| ID | Then |
|
||||||
|
|----|------|
|
||||||
|
| AC-F-01 | 授予会员后 flags.report_detail_via_membership=true |
|
||||||
|
| AC-F-02 | 有 deep_access 时 deep_accesses 非空或 count≥1 |
|
||||||
|
| AC-F-03 | 无会员无深度 → membership.active=false 且 count=0 仍 200 |
|
||||||
|
| AC-S-01 | 无 Admin → 401 |
|
||||||
|
| AC-P-01 | GET < 500ms 本机 |
|
||||||
|
| AC-O-01 | N/A 只读 |
|
||||||
|
|
||||||
|
contract_diff: `docs/CONTRACT_DIFF/ECR-018.yaml`
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
# Feature Spec: OpsCMS · FeedSlot 写面(Ops · ECR-042)
|
||||||
|
|
||||||
|
> Status: `Active`(**ECR-042 Closed**)
|
||||||
|
> Map: `§7` · Capability: `OpsCMS` · BC: `Ops_CMS_NoUGC`
|
||||||
|
> Write-Wave: `docs/WAVE0/WRITE_WAVE_AUTHORIZATION.md`
|
||||||
|
> Predecessor: ECR-025 Closed · ECR-041 Closed
|
||||||
|
|
||||||
|
## Goal
|
||||||
|
|
||||||
|
运营可创建/更新/上下架 FeedSlot;C 端可读 active 槽位;首页主信息流区按 `home.main`(或 placement=home 的 active 槽)显隐;失败回退「仍展示推荐区」。
|
||||||
|
|
||||||
|
## In / Out
|
||||||
|
|
||||||
|
| In | Out |
|
||||||
|
|----|-----|
|
||||||
|
| Admin POST/PUT feed-slots · `admin.cms.write` | Banner 再扩 · ScheduledPublication 写 |
|
||||||
|
| C 端 GET `/home/feed-slots` | UGC 内容流正文 CMS · soft-delete |
|
||||||
|
| 首页:无 active home 槽 → 隐藏推荐区;API 失败 → 仍显示 | 真支付 · Crisis/Handoff · 新权限模型 |
|
||||||
|
|
||||||
|
## Domain
|
||||||
|
|
||||||
|
复用 `ops_feed_slots`:`code` 唯一 · `slot_key` · `placement` ∈ {home,explore,ask} · `active` · `system`(system 不可改 code)。
|
||||||
|
|
||||||
|
## API
|
||||||
|
|
||||||
|
| Method | Path | Perm |
|
||||||
|
|--------|------|------|
|
||||||
|
| GET | `/admin/cms/feed-slots*` | cms.read |
|
||||||
|
| POST/PUT | `/admin/cms/feed-slots*` | cms.write |
|
||||||
|
| GET | `/home/feed-slots?placement=home` | DeviceAuth |
|
||||||
|
|
||||||
|
无 DELETE;下架 `active=false`。
|
||||||
|
|
||||||
|
## AC
|
||||||
|
|
||||||
|
AC-F create/update/conflict/invalid · AC-S 401/403 · AC-A audit · AC-C 首页显隐与失败回退 · AC-O 无 Banner 合并 / 无 soft-delete
|
||||||
|
|
||||||
|
## Migration
|
||||||
|
|
||||||
|
无新表;权限已在 `000051`。本切片 **不新增 migration 文件**(Max 保持 `000051`)。
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
# Feature Spec: OpsCMS · FeedSlot(Ops · ECR-025)
|
||||||
|
|
||||||
|
> Status: `Active`(Loop continuous · **ECR-025 Closed**)
|
||||||
|
> Parent: WAVE0-FROZEN · Predecessor: ECR-024 Closed
|
||||||
|
> Capability: `OpsCMS` · BC: `Ops_CMS_NoUGC`
|
||||||
|
> 授权:`docs/WAVE0/LOOP_AUTHORIZATION.md`
|
||||||
|
|
||||||
|
## Non-goals
|
||||||
|
|
||||||
|
FeedSlot 写发布 · ScheduledPublication · UGC · 真支付 · Banner 写
|
||||||
|
|
||||||
|
## L2 Domain
|
||||||
|
|
||||||
|
| 概念 | 语义 |
|
||||||
|
|------|------|
|
||||||
|
| `FeedSlot` | 本切片只读目录;code 唯一(若适用) |
|
||||||
|
|
||||||
|
## L3 API
|
||||||
|
|
||||||
|
| Method | Path | 权限 | 语义 |
|
||||||
|
|--------|------|------|------|
|
||||||
|
| GET | `/admin/cms/feed-slots` | `admin.cms.read` | 只读 |
|
||||||
|
| GET | `/admin/cms/feed-slots/{id}` | `admin.cms.read` | 只读 |
|
||||||
|
|
||||||
|
## Migration
|
||||||
|
|
||||||
|
`000026`:表 + 种子(若有)(权限复用)
|
||||||
|
|
||||||
|
## L4 AC
|
||||||
|
|
||||||
|
| ID | Then |
|
||||||
|
|----|------|
|
||||||
|
| AC-F-01 | list 含种子或空列表合法 |
|
||||||
|
| AC-F-02 | 已知 id get 200 |
|
||||||
|
| AC-F-03 | 未知 id → 404 |
|
||||||
|
| AC-S-01 | 无 Admin → 401 |
|
||||||
|
| AC-S-02 | 无权限 → 403 |
|
||||||
|
| AC-P-01 | list < 500ms |
|
||||||
|
| AC-O-01 | N/A 只读 |
|
||||||
|
|
||||||
|
contract_diff: `docs/CONTRACT_DIFF/ECR-025.yaml`
|
||||||
@@ -0,0 +1,72 @@
|
|||||||
|
# Feature Spec: GrowthInsights · FunnelDefinition 写面(Ops · ECR-047)
|
||||||
|
|
||||||
|
> Status: `Active`(**Implemented · ECR-047 Closed**)
|
||||||
|
> Map: `§7` · Capability: `GrowthInsights` · BC: `Analytics_OpsB`
|
||||||
|
> Auth: `docs/WAVE0/ECR-047_WRITE_AUTHORIZATION.md`(**仅 ECR-047**)
|
||||||
|
> Predecessor: ECR-039 Closed(只读)· ECR-046 Closed
|
||||||
|
> 关联:[ops-funnel-definition.md](ops-funnel-definition.md)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. 目标
|
||||||
|
|
||||||
|
运营可 **创建 / 更新 / 上下架** `FunnelDefinition`(漏斗目录);写鉴权 + 审计;**无**新 C 端路由。
|
||||||
|
|
||||||
|
**Closed 后立即 STOP**,不自动 ECR-048。
|
||||||
|
|
||||||
|
## 2. In / Out
|
||||||
|
|
||||||
|
| In | Out |
|
||||||
|
|----|-----|
|
||||||
|
| Admin POST/PUT `/admin/analytics/funnel-definitions*` | ReportTemplate 写 |
|
||||||
|
| 加法 `admin.growth.write` | SystemPrompt · Knowledge · Chunk |
|
||||||
|
| 复用表 `funnel_definitions` | soft-delete · 真支付 · UGC |
|
||||||
|
| 审计 | 题干 · Crisis/Handoff |
|
||||||
|
| | 自动 ECR-048 · 新 C 端路由 |
|
||||||
|
|
||||||
|
## 3. Domain
|
||||||
|
|
||||||
|
| 字段 | 规则 |
|
||||||
|
|------|------|
|
||||||
|
| `code` | 唯一;`^[a-z][a-z0-9_]{1,62}$`;`system=true` **不可改 code** |
|
||||||
|
| `title` | 必填 · ≤128 |
|
||||||
|
| `active` | `false` = 下架(唯一下架手段) |
|
||||||
|
| `system` | 种子行;禁止物理删除 |
|
||||||
|
|
||||||
|
## 4. API
|
||||||
|
|
||||||
|
| Method | Path | 权限 |
|
||||||
|
|--------|------|------|
|
||||||
|
| GET | `/admin/analytics/funnel-definitions` · `/{id}` | `admin.growth.read` |
|
||||||
|
| POST | `/admin/analytics/funnel-definitions` | `admin.growth.write` |
|
||||||
|
| PUT | `/admin/analytics/funnel-definitions/{id}` | `admin.growth.write` |
|
||||||
|
|
||||||
|
无 DELETE · 无新 C 端路径。
|
||||||
|
|
||||||
|
## 5. Permission / Migration
|
||||||
|
|
||||||
|
- Migration `000056_ops_funnel_definition_write`:授予 `super_admin` → `admin.growth.write`
|
||||||
|
- 编码时占号(Max=`000055` → `000056`)
|
||||||
|
|
||||||
|
## 6. UI
|
||||||
|
|
||||||
|
admin-h5 漏斗定义页:列表 + 新建/编辑/上下架。
|
||||||
|
|
||||||
|
## 7. AC
|
||||||
|
|
||||||
|
| ID | Then |
|
||||||
|
|----|------|
|
||||||
|
| AC-F-01 | POST → list/get 可见 |
|
||||||
|
| AC-F-02 | PUT active=false → list 仍可见且 active=false |
|
||||||
|
| AC-F-03 | 重复 code → 409 |
|
||||||
|
| AC-S-01/02 | 401;仅 growth.read → POST 403 |
|
||||||
|
| AC-A-01 | 写产生审计 |
|
||||||
|
| AC-O-01 | 无 soft-delete · 无 ReportTemplate/Prompt 写路径 |
|
||||||
|
|
||||||
|
## 8. Closed 后
|
||||||
|
|
||||||
|
**立即 STOP**。ECR-048 须新 Candidate Review + Human 拍板。
|
||||||
|
|
||||||
|
## 9. Trace
|
||||||
|
|
||||||
|
ECR-047 · BD-2026-047 · CONTRACT_DIFF · ECR-047_WRITE_AUTHORIZATION
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
# Feature Spec: GrowthInsights · FunnelDefinition(Ops · ECR-039)
|
||||||
|
|
||||||
|
> Status: `Active`(Loop continuous · **ECR-039 Closed**)
|
||||||
|
> **写面:** [ops-funnel-definition-write.md](ops-funnel-definition-write.md)(**ECR-047 Closed**)
|
||||||
|
> Parent: WAVE0-FROZEN · Predecessor: ECR-038 Closed
|
||||||
|
> Capability: `GrowthInsights` · BC: `Analytics_OpsB`
|
||||||
|
> 授权:`docs/WAVE0/LOOP_AUTHORIZATION.md`
|
||||||
|
|
||||||
|
## Non-goals
|
||||||
|
|
||||||
|
漏斗写配置 · UGC · 真支付
|
||||||
|
|
||||||
|
## L2 Domain
|
||||||
|
|
||||||
|
| 概念 | 语义 |
|
||||||
|
|------|------|
|
||||||
|
| `FunnelDefinition` | 本切片只读目录;code 唯一(若适用) |
|
||||||
|
|
||||||
|
## L3 API
|
||||||
|
|
||||||
|
| Method | Path | 权限 | 语义 |
|
||||||
|
|--------|------|------|------|
|
||||||
|
| GET | `/admin/analytics/funnel-definitions` | `admin.growth.read` | 只读 |
|
||||||
|
| GET | `/admin/analytics/funnel-definitions/{id}` | `admin.growth.read` | 只读 |
|
||||||
|
|
||||||
|
## Migration
|
||||||
|
|
||||||
|
`000040`:表 + 种子(若有)(权限复用)
|
||||||
|
|
||||||
|
## L4 AC
|
||||||
|
|
||||||
|
| ID | Then |
|
||||||
|
|----|------|
|
||||||
|
| AC-F-01 | list 含种子或空列表合法 |
|
||||||
|
| AC-F-02 | 已知 id get 200 |
|
||||||
|
| AC-F-03 | 未知 id → 404 |
|
||||||
|
| AC-S-01 | 无 Admin → 401 |
|
||||||
|
| AC-S-02 | 无权限 → 403 |
|
||||||
|
| AC-P-01 | list < 500ms |
|
||||||
|
| AC-O-01 | N/A 只读 |
|
||||||
|
|
||||||
|
contract_diff: `docs/CONTRACT_DIFF/ECR-039.yaml`
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
# Feature Spec: AskOperations · HandoffCase(Ops · ECR-033)
|
||||||
|
|
||||||
|
> Status: `Active`(Loop continuous · **ECR-033 Closed**)
|
||||||
|
> Parent: WAVE0-FROZEN · Predecessor: ECR-032 Closed
|
||||||
|
> Capability: `AskOperations` · BC: `Ask_Ops`
|
||||||
|
> 授权:`docs/WAVE0/LOOP_AUTHORIZATION.md`
|
||||||
|
|
||||||
|
## Non-goals
|
||||||
|
|
||||||
|
转人工写流 · 顾问执业 · UGC · 真支付
|
||||||
|
|
||||||
|
## L2 Domain
|
||||||
|
|
||||||
|
| 概念 | 语义 |
|
||||||
|
|------|------|
|
||||||
|
| `HandoffCase` | 本切片只读目录;code 唯一(若适用) |
|
||||||
|
|
||||||
|
## L3 API
|
||||||
|
|
||||||
|
| Method | Path | 权限 | 语义 |
|
||||||
|
|--------|------|------|------|
|
||||||
|
| GET | `/admin/ask/handoffs` | `admin.ask.read` | 只读 |
|
||||||
|
| GET | `/admin/ask/handoffs/{id}` | `admin.ask.read` | 只读 |
|
||||||
|
|
||||||
|
## Migration
|
||||||
|
|
||||||
|
`000034`:表 + 种子(若有)(权限复用)
|
||||||
|
|
||||||
|
## L4 AC
|
||||||
|
|
||||||
|
| ID | Then |
|
||||||
|
|----|------|
|
||||||
|
| AC-F-01 | list 含种子或空列表合法 |
|
||||||
|
| AC-F-02 | 已知 id get 200 |
|
||||||
|
| AC-F-03 | 未知 id → 404 |
|
||||||
|
| AC-S-01 | 无 Admin → 401 |
|
||||||
|
| AC-S-02 | 无权限 → 403 |
|
||||||
|
| AC-P-01 | list < 500ms |
|
||||||
|
| AC-O-01 | N/A 只读 |
|
||||||
|
|
||||||
|
contract_diff: `docs/CONTRACT_DIFF/ECR-033.yaml`
|
||||||
@@ -0,0 +1,95 @@
|
|||||||
|
# Feature Spec: ExploreConfig · ImageCardDeck 写面(Ops · ECR-045)
|
||||||
|
|
||||||
|
> Status: `Active`(**Implemented · ECR-045 Closed**)
|
||||||
|
> Map: `§7` · Capability: `ExploreConfig` · BC: `Explore_Reports`
|
||||||
|
> Auth: `docs/WAVE0/ECR-045_WRITE_AUTHORIZATION.md`(Human 批准 · **仅 ECR-045**)
|
||||||
|
> Predecessor: ECR-037 Closed(只读)· ECR-044 Closed(Rhythm 写)
|
||||||
|
> 关联:[ops-image-card-deck.md](ops-image-card-deck.md)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. 目标
|
||||||
|
|
||||||
|
运营可 **创建 / 更新 / 上下架** `ImageCardDeck`(牌组目录);写操作鉴权 + 审计;C 端可读 active deck 并影响 `/cards` 可用性;失败回退「现网可抽」。
|
||||||
|
|
||||||
|
**Closed 后立即 STOP**,不自动 ECR-046。
|
||||||
|
|
||||||
|
## 2. In / Out
|
||||||
|
|
||||||
|
| In | Out |
|
||||||
|
|----|-----|
|
||||||
|
| Admin POST/PUT `/admin/explore/image-card-decks*` | **牌面/单卡内容 CRUD** · Star / Rhythm / Scale |
|
||||||
|
| 复用 `admin.explore.write` | SystemPrompt · Knowledge · Chunk |
|
||||||
|
| 复用表 `image_card_decks` | soft-delete · 真支付 · UGC |
|
||||||
|
| C 端 GET active decks | Crisis / Handoff 写 |
|
||||||
|
| `/cards`:无 active → 空态禁抽卡 CTA;失败 → 回退可抽 | 自动 ECR-046 |
|
||||||
|
| 审计 | 新权限子系统 |
|
||||||
|
|
||||||
|
## 3. Domain
|
||||||
|
|
||||||
|
| 字段 | 规则 |
|
||||||
|
|------|------|
|
||||||
|
| `code` | 唯一;`^[a-z][a-z0-9_]{1,62}$`;`system=true` 不可改 code |
|
||||||
|
| `title` | 必填 · ≤128 |
|
||||||
|
| `active` | `false` = 下架(唯一下架手段) |
|
||||||
|
| `system` | 种子行;禁止物理删除 |
|
||||||
|
|
||||||
|
## 4. API
|
||||||
|
|
||||||
|
### Admin
|
||||||
|
|
||||||
|
| Method | Path | 权限 |
|
||||||
|
|--------|------|------|
|
||||||
|
| GET | `/admin/explore/image-card-decks` · `/{id}` | `admin.explore.read` |
|
||||||
|
| POST | `/admin/explore/image-card-decks` | `admin.explore.write` |
|
||||||
|
| PUT | `/admin/explore/image-card-decks/{id}` | `admin.explore.write` |
|
||||||
|
|
||||||
|
无 DELETE。
|
||||||
|
|
||||||
|
### C 端
|
||||||
|
|
||||||
|
| Method | Path | Auth | 语义 |
|
||||||
|
|--------|------|------|------|
|
||||||
|
| GET | `/api/v1/cards/decks` | DeviceAuth | 仅 `active=true`;按 code 排序 |
|
||||||
|
|
||||||
|
## 5. C 端生效
|
||||||
|
|
||||||
|
| 条件 | user-h5 `/cards` |
|
||||||
|
|------|------------------|
|
||||||
|
| ≥1 active | 保持现网抽卡 |
|
||||||
|
| 成功且 0 active | 「意象牌组暂未开放」空态;禁用抽卡 CTA |
|
||||||
|
| 请求失败 | **回退**不阻断抽卡 |
|
||||||
|
|
||||||
|
## 6. Permission / Migration
|
||||||
|
|
||||||
|
- Migration `000054_ops_image_card_deck_write`:幂等确认 `super_admin` → `admin.explore.write`
|
||||||
|
- 编码时占号(Max=`000053`)
|
||||||
|
|
||||||
|
## 7. UI
|
||||||
|
|
||||||
|
| 端 | 行为 |
|
||||||
|
|----|------|
|
||||||
|
| admin-h5 意象牌组页 | 列表 + 新建/编辑/上下架(仅 Deck) |
|
||||||
|
| user-h5 `/cards` | 按 §5 |
|
||||||
|
|
||||||
|
## 8. AC
|
||||||
|
|
||||||
|
| ID | Then |
|
||||||
|
|----|------|
|
||||||
|
| AC-F-01 | POST → list/get 可见 |
|
||||||
|
| AC-F-02 | PUT active=false → C 端不含 |
|
||||||
|
| AC-F-03 | 有 active → C 端非空 |
|
||||||
|
| AC-F-04 | 重复 code → 409 |
|
||||||
|
| AC-S-01/02 | 401;仅 read → POST 403 |
|
||||||
|
| AC-A-01 | 写产生审计 |
|
||||||
|
| AC-C-01 | 全下架后空态/禁 CTA |
|
||||||
|
| AC-C-02 | API 失败回退可抽 |
|
||||||
|
| AC-O-01 | 无牌面写路径 · 无 soft-delete |
|
||||||
|
|
||||||
|
## 9. Closed 后
|
||||||
|
|
||||||
|
**立即 STOP**。ECR-046 须新 Candidate Review + Human 拍板。
|
||||||
|
|
||||||
|
## 10. Trace
|
||||||
|
|
||||||
|
ECR-045 · BD-2026-045 · CONTRACT_DIFF · ECR-045_WRITE_AUTHORIZATION
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
# Feature Spec: ExploreConfig · ImageCardDeck(Ops · ECR-037)
|
||||||
|
|
||||||
|
> Status: `Active`(Loop continuous · **ECR-037 Closed**)
|
||||||
|
> **写面:** [ops-image-card-deck-write.md](ops-image-card-deck-write.md)(**ECR-045 Closed**)
|
||||||
|
> Parent: WAVE0-FROZEN · Predecessor: ECR-036 Closed
|
||||||
|
> Capability: `ExploreConfig` · BC: `Explore_Reports`
|
||||||
|
> 授权:`docs/WAVE0/LOOP_AUTHORIZATION.md`
|
||||||
|
|
||||||
|
## Non-goals
|
||||||
|
|
||||||
|
牌组写发布 · UGC · 真支付
|
||||||
|
|
||||||
|
## L2 Domain
|
||||||
|
|
||||||
|
| 概念 | 语义 |
|
||||||
|
|------|------|
|
||||||
|
| `ImageCardDeck` | 本切片只读目录;code 唯一(若适用) |
|
||||||
|
|
||||||
|
## L3 API
|
||||||
|
|
||||||
|
| Method | Path | 权限 | 语义 |
|
||||||
|
|--------|------|------|------|
|
||||||
|
| GET | `/admin/explore/image-card-decks` | `admin.explore.read` | 只读 |
|
||||||
|
| GET | `/admin/explore/image-card-decks/{id}` | `admin.explore.read` | 只读 |
|
||||||
|
|
||||||
|
## Migration
|
||||||
|
|
||||||
|
`000038`:表 + 种子(若有)(权限复用)
|
||||||
|
|
||||||
|
## L4 AC
|
||||||
|
|
||||||
|
| ID | Then |
|
||||||
|
|----|------|
|
||||||
|
| AC-F-01 | list 含种子或空列表合法 |
|
||||||
|
| AC-F-02 | 已知 id get 200 |
|
||||||
|
| AC-F-03 | 未知 id → 404 |
|
||||||
|
| AC-S-01 | 无 Admin → 401 |
|
||||||
|
| AC-S-02 | 无权限 → 403 |
|
||||||
|
| AC-P-01 | list < 500ms |
|
||||||
|
| AC-O-01 | N/A 只读 |
|
||||||
|
|
||||||
|
contract_diff: `docs/CONTRACT_DIFF/ECR-037.yaml`
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
# Feature Spec: CrisisCare · InterventionOutcome(Ops · ECR-032)
|
||||||
|
|
||||||
|
> Status: `Active`(Loop continuous · **ECR-032 Closed**)
|
||||||
|
> Parent: WAVE0-FROZEN · Predecessor: ECR-031 Closed
|
||||||
|
> Capability: `CrisisCare` · BC: `Content_Safety`
|
||||||
|
> 授权:`docs/WAVE0/LOOP_AUTHORIZATION.md`
|
||||||
|
|
||||||
|
## Non-goals
|
||||||
|
|
||||||
|
干预写回 · 医疗诊断 · UGC · 真支付
|
||||||
|
|
||||||
|
## L2 Domain
|
||||||
|
|
||||||
|
| 概念 | 语义 |
|
||||||
|
|------|------|
|
||||||
|
| `InterventionOutcome` | 本切片只读目录;code 唯一(若适用) |
|
||||||
|
|
||||||
|
## L3 API
|
||||||
|
|
||||||
|
| Method | Path | 权限 | 语义 |
|
||||||
|
|--------|------|------|------|
|
||||||
|
| GET | `/admin/crisis/interventions` | `admin.crisis.read` | 只读 |
|
||||||
|
| GET | `/admin/crisis/interventions/{id}` | `admin.crisis.read` | 只读 |
|
||||||
|
|
||||||
|
## Migration
|
||||||
|
|
||||||
|
`000033`:表 + 种子(若有)(权限复用)
|
||||||
|
|
||||||
|
## L4 AC
|
||||||
|
|
||||||
|
| ID | Then |
|
||||||
|
|----|------|
|
||||||
|
| AC-F-01 | list 含种子或空列表合法 |
|
||||||
|
| AC-F-02 | 已知 id get 200 |
|
||||||
|
| AC-F-03 | 未知 id → 404 |
|
||||||
|
| AC-S-01 | 无 Admin → 401 |
|
||||||
|
| AC-S-02 | 无权限 → 403 |
|
||||||
|
| AC-P-01 | list < 500ms |
|
||||||
|
| AC-O-01 | N/A 只读 |
|
||||||
|
|
||||||
|
contract_diff: `docs/CONTRACT_DIFF/ECR-032.yaml`
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
# Feature Spec: AICoreConfig · KnowledgeChunk(Ops · ECR-027)
|
||||||
|
|
||||||
|
> Status: `Active`(Loop continuous · **ECR-027 Closed**)
|
||||||
|
> Parent: WAVE0-FROZEN · Predecessor: ECR-026 Closed
|
||||||
|
> Capability: `AICoreConfig` · BC: `Ask_Ops`
|
||||||
|
> 授权:`docs/WAVE0/LOOP_AUTHORIZATION.md`
|
||||||
|
|
||||||
|
## Non-goals
|
||||||
|
|
||||||
|
Embedding · 上传切块 · 运行时 RAG 接线 · UGC · 真支付
|
||||||
|
|
||||||
|
## L2 Domain
|
||||||
|
|
||||||
|
| 概念 | 语义 |
|
||||||
|
|------|------|
|
||||||
|
| `KnowledgeChunk` | 本切片只读目录;code 唯一(若适用) |
|
||||||
|
|
||||||
|
## L3 API
|
||||||
|
|
||||||
|
| Method | Path | 权限 | 语义 |
|
||||||
|
|--------|------|------|------|
|
||||||
|
| GET | `/admin/ai/knowledge-chunks` | `admin.ai_config.read` | 只读 |
|
||||||
|
| GET | `/admin/ai/knowledge-chunks/{id}` | `admin.ai_config.read` | 只读 |
|
||||||
|
|
||||||
|
## Migration
|
||||||
|
|
||||||
|
`000028`:表 + 种子(若有)(权限复用)
|
||||||
|
|
||||||
|
## L4 AC
|
||||||
|
|
||||||
|
| ID | Then |
|
||||||
|
|----|------|
|
||||||
|
| AC-F-01 | list 含种子或空列表合法 |
|
||||||
|
| AC-F-02 | 已知 id get 200 |
|
||||||
|
| AC-F-03 | 未知 id → 404 |
|
||||||
|
| AC-S-01 | 无 Admin → 401 |
|
||||||
|
| AC-S-02 | 无权限 → 403 |
|
||||||
|
| AC-P-01 | list < 500ms |
|
||||||
|
| AC-O-01 | N/A 只读 |
|
||||||
|
|
||||||
|
contract_diff: `docs/CONTRACT_DIFF/ECR-027.yaml`
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
# Feature Spec: AICoreConfig · KnowledgeSource(Ops · ECR-023)
|
||||||
|
|
||||||
|
> Status: `Active`(Loop continuous · **ECR-023 Closed**)
|
||||||
|
> Parent: WAVE0-FROZEN · Predecessor: ECR-022 Closed
|
||||||
|
> Capability: `AICoreConfig` · BC: `Ask_Ops`
|
||||||
|
> 授权:`docs/WAVE0/LOOP_AUTHORIZATION.md`
|
||||||
|
|
||||||
|
## Non-goals
|
||||||
|
|
||||||
|
KnowledgeChunk / Embedding · 源文件上传 · 在线编辑发布 · ToolDefinition · 运行时 RAG 接线 · UGC · 真支付
|
||||||
|
|
||||||
|
## L2 Domain
|
||||||
|
|
||||||
|
| 概念 | 语义 |
|
||||||
|
|------|------|
|
||||||
|
| `KnowledgeSource` | code 唯一;source_kind ∈ {faq,policy,guide};active/system;本切片只读目录,不含 Chunk |
|
||||||
|
|
||||||
|
## L3 API
|
||||||
|
|
||||||
|
| Method | Path | 权限 | 语义 |
|
||||||
|
|--------|------|------|------|
|
||||||
|
| GET | `/admin/ai/knowledge-sources` | `admin.ai_config.read` | 列表 |
|
||||||
|
| GET | `/admin/ai/knowledge-sources/:id` | 同上 | 详情 |
|
||||||
|
|
||||||
|
## Migration
|
||||||
|
|
||||||
|
`000024`:`knowledge_sources` + 种子 `ask_grounding`(权限已由 000022 授予)
|
||||||
|
|
||||||
|
## L4 AC
|
||||||
|
|
||||||
|
| ID | Then |
|
||||||
|
|----|------|
|
||||||
|
| AC-F-01 | list 含 ask_grounding |
|
||||||
|
| AC-F-02 | get 返回 source_kind 合法 |
|
||||||
|
| AC-F-03 | 未知 id → 404 |
|
||||||
|
| AC-S-01 | 无 Admin → 401 |
|
||||||
|
| AC-S-02 | 无 ai_config.read → 403 |
|
||||||
|
| AC-P-01 | list < 500ms |
|
||||||
|
| AC-O-01 | N/A 只读 |
|
||||||
|
|
||||||
|
contract_diff: `docs/CONTRACT_DIFF/ECR-023.yaml`
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user