feat(ops): ECR-007 行为分析与 ECR-008 内容运营后台
ci / h5 (push) Canceled after 0s
ci / api (push) Canceled after 0s
ci / ess-docs (push) Canceled after 0s

落地埋点 ingest/数据看板、首页宫格 CMS 与测评上下架;含账号引导、问答流式与免责声明去重,以及 review P1 审计同事务修复。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
jackyu66git
2026-08-07 02:26:16 +08:00
co-authored by Cursor
parent 7e9023f0a8
commit 7ab9add5dd
132 changed files with 8276 additions and 491 deletions
@@ -0,0 +1,137 @@
# Backend Design: ECR-007 运营行为分析 Ops-B
> Architect 产出;Engineer 只消费本文件。
> 实现纪律:`$ESS_ROOT/technology-governance/BACKEND_STANDARD.md`
> 项目分层权威:`.ai/architecture.md` · Handler → Service → Repository
| Field | Value |
|-------|-------|
| ID | BD-2026-007 |
| ECR | ECR-007 |
| Change Level | L2 |
| Status | Approved2026-08-07 Human |
| Author | Architect |
| Date | 2026-08-07 |
| Risk | Medium |
---
## Context
- 问题 / 目标:缺自有行为数据与运营看板;需页停留、退出页、点击、会话级指标。
- 非目标:CMS/RBAC/OLAP/热力图;见 ECR Forbidden。
- 相关 Spec`ops-analytics.md`;无新 ADR(Postgres 足够,栈不变)。
## Architecture Change
- 是否改变分层边界:No
- 受影响层:API · Application`service/analytics` + admin 扩展)· Infrastructurerepo + migration)· UIuser-h5 analytics · admin-h5 数据页)
## Module Changes
| Module | Layer | Change | Must NOT |
|--------|-------|--------|----------|
| `handler` analytics ingest | API | bind、DeviceAuth、调 service | SQL;业务规则堆 handler |
| `service/analytics` | Application | 校验批量、截断、写 session/event | 直连 gin |
| `repository/analytics_repo.go` | Infrastructure | SQL ingest + 聚合 | 泄漏到 UI |
| `handler/admin` analytics GET | API | AdminAuth | Device 用户可访问 |
| `user-h5/lib/analytics.ts` | UI | 队列上报 | 直打 DB;传 PII |
| `admin-h5` 数据页 | UI | 展示聚合 | 裸拼绝对 API URL |
## Data Flow
```text
user-h5 analytics queue
→ POST /api/v1/analytics/events (X-Device-Key [+ Bearer])
→ service/analytics → AnalyticsRepo
→ analytics_events / analytics_sessions
admin-h5 「数据」
→ GET /api/v1/admin/analytics/* (Admin Bearer)
→ service/admin 或 service/analytics 只读聚合
→ SQL group by day / page_path / element_id / funnel names
```
## API Changes
- 契约:`proto/openapi.yaml` 增补
- 兼容:纯新增路径
- 信封:`{code,message,data}`
### Ingest(示意)
`POST /api/v1/analytics/events`
Body: `{ items: [{ name, session_id, page_path?, client_ts, props? }] }`
上限:≤100/请求;超限 400。
### Admin 聚合
| Path | data 要点 |
|------|-----------|
| `/admin/analytics/overview?from&to` | dau, new_users, sessions, avg_session_ms |
| `/admin/analytics/pages` | page_path, pv, uv, avg_dwell_ms, exit_count |
| `/admin/analytics/exits` | exit_page, count |
| `/admin/analytics/clicks` | element_id, count |
| `/admin/analytics/funnel` | steps[] name+count |
## Database Changes
- `analytics_sessions` · `analytics_events`
- 可选 `analytics_daily_page`(实现期若查询慢再加,仍属本 ECR 允许)
- Migration`000013_analytics_ops.up.sql` / `.down.sql`
- Immutableevents 只追加;不提供删除 API
## Migration Plan
- RequiredYES
- 步骤:expand 建表 → 部署 API → 开 H5 上报 → admin 看板
- 回滚:关上报 + 下线路由 + down migration(非生产可)
## Failure Handling
- ingest 部分非法条目:整批 400 或跳过非法并计 dropped(选定一种写进实现注释,默认整批 400)
- 未鉴权 Device401
- Admin 无 token401
- DB 错:500;客户端 track 吞错
## Test Plan
- Unitprops 截断、dwell 非负
- Integrationlogin device → post events → admin overview/pages/exits
- H5analytics 队列 flush mock
## Rollback Plan
见 ECR Rollback。
---
## Backend Change Boundarymandatory
```text
Change Level: L2
Change: 自有 analytics ingest + admin 聚合看板
Affected:
Domain:
- AnalyticsSession / AnalyticsEvent
Application:
- service/analytics · admin analytics reads
Infrastructure:
- AnalyticsRepo · migration 000013
API:
- POST /api/v1/analytics/events
- GET /api/v1/admin/analytics/*
Migration: Required
Tests:
- ingest + admin aggregate path
Risk: Medium
```
## Architecture Regression Check
- [ ] 无 Handler 直连 DB
- [ ] 无绕过 Service
- [ ] Admin / Device 鉴权面隔离
- [ ] 未引入非默认中间件
- [ ] 未简化分层
+128
View File
@@ -0,0 +1,128 @@
# Backend Design: ECR-008 运营内容 Ops-C
> Architect 产出;Engineer 只消费本文件。
> 项目分层:Handler → Service → Repository
| Field | Value |
|-------|-------|
| ID | BD-2026-008 |
| ECR | ECR-008 |
| Change Level | L2 |
| Status | Approved2026-08-07 Human |
| Author | Architect |
| Date | 2026-08-07 |
| Risk | Medium |
---
## Context
- 目标:首页宫格可运营配置;scales 可上下架。
- 非目标:Feeds CMS、题目编辑器、外链图标、RBAC。
- 无新 ADR。
## Architecture Change
- 分层边界:No
- 层:API · Application · Infrastructure · UIuser-h5 home · admin-h5 内容)
## Module Changes
| Module | Layer | Change | Must NOT |
|--------|-------|--------|----------|
| `repository/home_tools` | Infra | CRUD / ReplaceAll | 泄漏到 UI |
| `repository/scale` | Infra | ListAll · UpdateStatus | |
| `service/home` 或 content | App | 白名单校验 · 事务替换 | 直连 gin |
| `handler` home + admin | API | 绑定鉴权 | SQL |
| `user-h5` useHomePage | UI | GET tools | 直写 DB |
| `admin-h5` ContentPage | UI | 编辑保存 | 裸绝对 URL |
## Data Flow
```text
admin-h5 内容页
→ PUT /admin/home/tools → service → ReplaceAll + audit
→ PATCH /admin/scales/:id → UpdateStatus + audit
user-h5 首页
→ GET /home/tools → enabled 列表 → HomeToolGrid
失败 → homeCatalog.ts 静态回退
C 端测评
→ GET /scales(既有 ListPublished
```
## API Changes
- `GET /api/v1/home/tools``{ items: [{ id, row_index, sort_order, path, icon, label, badge?, badge_tone? }] }`
- `GET /api/v1/admin/home/tools` → 含 `enabled`
- `PUT /api/v1/admin/home/tools` body `{ items: [...] }` 整表替换
- `GET /api/v1/admin/scales` → 全量含 status
- `PATCH /api/v1/admin/scales/{id}` body `{ status: published|draft }`
## Database
```sql
home_tools (
id uuid PK,
row_index smallint NOT NULL, -- 1 or 2
sort_order int NOT NULL,
path text NOT NULL,
icon varchar(32) NOT NULL,
label varchar(32) NOT NULL,
badge varchar(8) NULL,
badge_tone varchar(8) NULL,
enabled boolean NOT NULL DEFAULT true,
updated_at timestamptz NOT NULL DEFAULT now()
)
```
Migration`000014_ops_content.up.sql` / `.down.sql`
## Validation
- icon ∈ 既有 HomeToolIcon 名集合
- path 匹配 `^/[a-zA-Z0-9_./-]{1,120}$` 且不含 `..`
- row_index ∈ {1,2}label 116 字;items ≤ 24
- status ∈ {published, draft}
- 非法整批 400
## Failure Handling
- Admin 无 token401
- scale 不存在:404
- DB500H5 拉 tools 失败静默回退静态
## Test Plan
- Unitpath/icon 校验
- Integrationseed → PUT 改 enabled → GET home 少一项;PATCH draft → ListPublished
## Rollback
见 ECR。
---
## Backend Change Boundary
```text
Change Level: L2
Change: home_tools CMS + scales status admin
Affected:
Domain: HomeTool
Application: service/home · admin scales
Infrastructure: HomeToolsRepo · ScaleRepo · 000014
API: /home/tools · /admin/home/tools · /admin/scales
Migration: Required
Tests: integration content ops
Risk: Medium
```
## Architecture Regression Check
- [ ] 无 Handler 直连 DB
- [ ] Admin / Device 鉴权隔离
- [ ] 未引入非默认中间件
- [ ] 未简化分层
+20
View File
@@ -1,5 +1,25 @@
# CHANGELOG — ESS process artifacts
## 2026-08-07
- **ECR-008 P1 修复**:审计同事务 · 宫格 move 保留 row_index · Analytics nil 守卫
- **ECR-008 Implemented**Ops-C 首页宫格 CMS + 测评上下架
migration `000014` · `/home/tools` · admin「内容」· TEST_REPORT/CODE_REVIEW
- **ECR-008 Approved**Human):Ops-C 进入 implement
BD-2026-008 Approved · Feature Spec Active · TASK ready
- **ECR-008 Draft**:运营内容 Ops-C(首页宫格 CRUD · 测评上下架)
工件:Spec `ops-content.md` · PRODUCT/ENGINEERING/BACKEND_DESIGN · HANDOFF · TASK · STATE
门禁:待 Human Approve 后方可编码
- **ECR-007 Implemented**Ops-B analytics ingest + admin「数据」看板
migration `000013` · POST `/analytics/events` · GET `/admin/analytics/*` · H5 队列 · admin-h5 `/analytics`
TEST_REPORT / CODE_REVIEW PASS · STATE phase=review
- **ECR-007 Approved**Human):运营行为分析 Ops-B 进入 implement
BD-2026-007 Approved · Feature Spec Active · TASK ready · STATE owner=engineer
- **ECR-007 Draft**:运营行为分析 Ops-B(自有埋点 + admin 数据看板)
工件:Feature Spec `ops-analytics.md` · PRODUCT/ENGINEERING/BACKEND_DESIGN · HANDOFF · TASK · STATE · TRACEABILITY
## 2026-08-06
## 2026-08-06
- ESS 升级后接入 `docs/BACKEND_DESIGN/`BACKEND_STANDARD 闭环)
+27
View File
@@ -0,0 +1,27 @@
# CODE_REVIEW — ECR-007
**Verdict:** ApproveFeature Complete · Ops-B
Date: 2026-08-07
## Checklist
- [x] Handler → Service → Repositoryingest 挂 DeviceAuth;聚合挂 AdminAuth
- [x] Feature Spec Active + BD-2026-007 Approved
- [x] OpenAPI`POST /analytics/events` · `GET /admin/analytics/*`
- [x] Migration `000013_analytics_ops` · ERD 同步
- [x] 文件 ≤400integration + H5 单测绿
- [x] props 白名单;无 PII 采集
- [x] 未引入 Kafka/ClickHouse
## Architecture Regression
- [x] 无 Handler 直连 DB
- [x] Admin / Device 鉴权面隔离
- [x] 未简化分层
## Residual(不阻断)
- ingest 逐条 INSERT(量上来再批量 COPY / 日汇总表)
- admin「数据」未进 `@yuxingu/sdk`(与 Ops-A 一致用 thin client
- Ops-C/D/E 另开 ECR
+34
View File
@@ -0,0 +1,34 @@
# CODE_REVIEW — ECR-008
**Verdict:** ApproveFeature Complete · Ops-C · P1 已修)
Date: 2026-08-07 · Reviewer pass → P1 fixed
## Checklist
- [x] Handler → Service → Repositoryhome DeviceAuthadmin AdminAuth
- [x] Feature Spec Active + BD-2026-008 Approved
- [x] OpenAPI home/admin content paths
- [x] Migration `000014_ops_content` · ERD
- [x] path/icon 白名单;**审计与变更同事务**ReplaceAllWithAudit / UpdateStatusWithAudit
- [x] C 端 Get/Submit 仅 published scales
- [x] H5 静态回退;integration 绿(含 audit 断言 + tools restore
## P1 — resolved
| ID | Fix |
|----|-----|
| P1-1 审计非原子 | `HomeToolsRepo.ReplaceAllWithAudit` · `ScaleRepo.UpdateStatusWithAudit` |
| P1-2 ↑↓ 破坏 row_index | `ContentPage.move` 仅交换位置并按行重算 sort_order |
| P1-3 Analytics nil | `requireAnalytics` 统一守卫 |
## P2(可跟进)
- Scales 直连 ScaleRepoC 端多暴露字段;icon 白名单三处重复;OpenAPI schema 偏薄
## Architecture Regression
- [x] 无 Handler 直连 DB
- [x] Admin / Device 鉴权隔离
- [x] 未引入非默认中间件
- [x] 审计与写操作同事务
+74
View File
@@ -0,0 +1,74 @@
# ECR-007
**Title:** 运营行为分析 Ops-B(自有埋点采集 · 管理端数据看板)
**Status:** Approved
**Date:** 2026-08-07
**Approved:** 2026-08-07Human
**Change Level:** L2(新能力;栈与分层不变)
## Change
1. Active Feature Spec`.ai/product/feature-spec/ops-analytics.md`Ops-B
2. 新增表 `analytics_sessions` / `analytics_events`(可选日汇总表)
3. User API`POST /api/v1/analytics/events`DeviceAuth,批量 ingest
4. Admin API`GET /api/v1/admin/analytics/*`overview / pages / exits / clicks / funnel
5. `user-h5`:扩展 `analytics.ts` — 会话、页停留、点击、退出页;可与 GA4 双写
6. `admin-h5`:侧栏「数据」看板(传统 App 运营看数)
## Motivation
当前埋点仅可选 GA4 + 漏斗事件,管理端无法看停留、退出页、点击排行;运维只能改库或外挂。需按传统 App 运营模式自有采集并在后台展示。
## Scope
### Allowed
- 上列 Spec / 表 / API / H5 SDK / admin「数据」页
- 修订 `ops-admin.md` / `feature-map.md` §7 写入 Ops-B
- OpenAPI 增补 analytics 路径
### ForbiddenNon-goals
- Ops-C 内容 CMS · Ops-D 优惠券/退款工单 · Ops-E RBAC/封禁/推送(另开 ECR
- UGC / 达人 / 真支付网关
- 热力图坐标、会话录像、实时毫秒大屏
- 新基础设施(Kafka/ClickHouse 等)— 首期 Postgres;量级不够不升级 L3
- 采集生日、问答正文、手机号等 PII
## Risk
| Risk | Mitigation |
|------|------------|
| 事件量表膨胀 | 批量 ingest + 日汇总表;索引按日;后续再议 OLAP(新 ECR/ADR |
| 客户端丢数 | sendBeacon 退出冲刷;失败静默不挡 UX |
| 与 GA 双写不一致 | Spec 声明自有管道为运营真相源;GA 可选 |
| Admin 鉴权绕过 | 聚合 API 仅挂 AdminAuth |
## Acceptance Criteria
- [x] Spec `ops-analytics.md` §验收用例通过
- [x] IntegrationH5 形态上报 → DB → admin analytics GET 非空且量级一致
- [x] `go test` 相关包绿;`npm run build:h5` · `build:admin` 绿
- [x] OpenAPI / TRACEABILITY / STATE / TEST_REPORT / CODE_REVIEW
- [ ] `python scripts/ess-validate.py --phase review --ecr ECR-007`Reviewer 门禁)
- [x] Docs + CHANGELOG
## Rollback
- 去掉 analytics 路由注册;H5 关闭自有上报开关
- down migration 删 analytics 表(开发/可接受环境)
## Risk Review
- Path: N/A(非交易策略变更)
## Linked
- Feature Spec: `.ai/product/feature-spec/ops-analytics.md`
- PRODUCT_SPEC: `docs/PRODUCT_SPEC/ECR-007-ops-analytics.md`
- ENGINEERING_SPEC: `docs/ENGINEERING_SPEC/ECR-007-ops-analytics.md`
- BACKEND_DESIGN: `docs/BACKEND_DESIGN/ECR-007-ops-analytics.md`BD-2026-007
- HANDOFF / TASK / STATE:见同号前缀
- EXPERIMENT: N/A
- TRACEABILITY row: updated YesApproved
- 后续分期:Ops-C/D/E 各开独立 ECR(见 PRODUCT_SPEC 附录)
+67
View File
@@ -0,0 +1,67 @@
# ECR-008
**Title:** 运营内容配置 Ops-C(首页宫格 CRUD · 测评上下架)
**Status:** Approved
**Date:** 2026-08-07
**Approved:** 2026-08-07Human
**Change Level:** L2(新能力;栈与分层不变)
## Change
1. Active Feature Spec`.ai/product/feature-spec/ops-content.md`Ops-C
2.`home_tools` + migration `000014_ops_content`(种子=现网宫格)
3. User`GET /api/v1/home/tools`DeviceAuth,仅 enabled
4. Admin`GET|PUT /api/v1/admin/home/tools``GET /api/v1/admin/scales``PATCH /api/v1/admin/scales/:id`
5. `user-h5`:首页宫格改为 API 优先 + 静态回退
6. `admin-h5`:侧栏「内容」页(宫格 + 测评)
7. 变更写 `admin_audit_logs`
## Motivation
首页 12 宫格与测评可见性写死/仅靠库改;运营无法自助调入口与上下架。
## Scope
### Allowed
- 上列 Spec / 表 / API / H5 / admin「内容」
- path/icon 白名单;审计
- OpenAPI · ERD · feature-map §7
### ForbiddenNon-goals
- 首页 Feeds CMS · 探索目录全量 CMS · 量表题目编辑器
- 外链/上传图标 · Ops-D/E · UGC
## Risk
| Risk | Mitigation |
|------|------------|
| 错误 path 打穿站外 | 仅允许以 `/` 开头的站内相对路径,长度上限 |
| 空宫格 | PUT 校验至少 1 个 enabled;或允许空但 H5 回退静态 |
| icon 非法 | 服务端白名单对齐 `HomeToolIconName` |
| 误下架全量表 | PATCH 单条;审计可追溯 |
## Acceptance Criteria
- [x] Spec `ops-content.md` §验收通过
- [x] IntegrationPUT tools → GET home/toolsPATCH scale draft → ListPublished 不含
- [x] `go test` · `build:h5` · `build:admin` 绿
- [x] OpenAPI / TRACEABILITY / STATE / TEST_REPORT / CODE_REVIEW
- [x] `ess-validate --phase review`
- [x] Docs + CHANGELOG
## Rollback
- 关 admin 路由;H5 回退静态 catalog
- down migration(非生产可)
## Risk Review
- Path: N/A
## Linked
- Feature Spec: `.ai/product/feature-spec/ops-content.md`
- PRODUCT / ENGINEERING / BACKEND_DESIGN / HANDOFF / TASK / STATE:同号前缀
- 前序:ECR-006 Ops-A · ECR-007 Ops-B
@@ -0,0 +1,30 @@
# ENGINEERING_SPEC — ECR-007 运营行为分析 Ops-B
权威设计:`docs/BACKEND_DESIGN/ECR-007-ops-analytics.md`
产品:`.ai/product/feature-spec/ops-analytics.md` · `docs/PRODUCT_SPEC/ECR-007-ops-analytics.md`
## Implement order
1. Migration `000013_analytics_ops`sessions / events;可选 daily_page+ ERD 同步
2. `repository/analytics_repo.go`ingest + 聚合查询)
3. `service/analytics`(校验、截断 props、限流语义)
4. `handler``POST /analytics/events`**既有 DeviceAuth gated group**
5. `service/admin` + handler`GET /admin/analytics/{overview,pages,exits,clicks,funnel}`
6. OpenAPI 增补
7. `user-h5``lib/analytics.ts` 队列 / session / dwell / click / beacon;关键控件 `data-track`
8. `admin-h5`:路由「数据」+ Dashboard 筛选与图表/表
9. 测试:repo/service 或 integration 上报→聚合;H5 analytics 单测
10. TRACEABILITY · STATE · CHANGELOG · feature-map §7
## Constraints
- 函数 ≤50 行 · 文件 ≤400 行(超标先拆)
- UI → sdk 或既有 thin client → Handler → Service → Repository(禁止 Handler SQL
- Admin 聚合不得走 DeviceAuth
- props 白名单键;禁止 PII
- 不提交 `config.local.yaml` / 密钥
- 不引入新中间件栈(无 Kafka)
## Done when
ECR Acceptance 勾完 + `.ai/definition-of-done.md` Review Report + `ess-validate`Approved 后门禁)
@@ -0,0 +1,28 @@
# ENGINEERING_SPEC — ECR-008 运营内容 Ops-C
权威设计:`docs/BACKEND_DESIGN/ECR-008-ops-content.md`
产品:`.ai/product/feature-spec/ops-content.md`
## Implement order
1. Migration `000014_ops_content``home_tools` + seed 12 格)+ ERD
2. `repository/home_tools_repo.go` · 扩展 `ScaleRepo` admin list/update status
3. `service/home`(或 `service/content`)+ admin 扩展:校验白名单、整表替换、审计
4. Handler`GET /home/tools` 挂 DeviceAuthadmin home/scales 挂 AdminAuth
5. OpenAPI
6. SDK`getHomeTools`
7. `user-h5``useHomePage` 拉 API + 静态回退
8. `admin-h5`:「内容」页两 Tab
9. Integration + 单测
10. TRACEABILITY · STATE · CHANGELOG · feature-map
## Constraints
- 函数 ≤50 · 文件 ≤400
- UI → sdk/thin client → Handler → Service → Repository
- PUT home_tools:整批事务替换;失败整批回滚
- 不提交密钥
## Done when
ECR Acceptance + DoD Review + ess-validate review
@@ -0,0 +1,36 @@
# HANDOFF — ECR-007 Architect → Engineer
## Gate
**仅当** `docs/ECR/ECR-007-ops-analytics.md` Status = **Approved**,且 `BACKEND_DESIGN` Status = **Approved** 后,方可改 `apps/` / `packages/`
当前:二者均为 **Approved**2026-08-07 Human)→ Engineer 可改 `apps/`
## Consume
1. `.ai/product/feature-spec/ops-analytics.md`
2. `docs/ECR/ECR-007-ops-analytics.md`
3. `docs/PRODUCT_SPEC/ECR-007-ops-analytics.md`
4. `docs/BACKEND_DESIGN/ECR-007-ops-analytics.md`**BD-2026-007**
5. `docs/ENGINEERING_SPEC/ECR-007-ops-analytics.md`
6. `$ESS_ROOT/technology-governance/BACKEND_STANDARD.md`
7. 本仓:`docs/PROJECT_RULES.md` · `.ai/architecture.md`
## Do
按 ENGINEERING_SPEC Implement order 落地 Ops-B。
## Do not
- 实现 Ops-C/D/E(另开 ECR
- Handler → DB
- 采集 PII
- 引入 Kafka/ClickHouse(需 L3 + ADR
## Return
1. `docs/HANDOFF/ECR-007-engineer-to-reviewer.md`
2. `docs/TEST_REPORT/ECR-007.md`
3. `docs/CODE_REVIEW/ECR-007.md`
4. 更新 `docs/STATE/ECR-007.md` owner → reviewer
5. `python scripts/ess-validate.py --phase review --ecr ECR-007`
@@ -0,0 +1,18 @@
# HANDOFF — ECR-007 Engineer → Reviewer
## Done
- Migration `000013_analytics_ops`sessions / events
- `AnalyticsRepo` · `service/analytics` · `AnalyticsHandler` · Admin analytics GETs
- SDK `postAnalyticsEvents`keepalive
- user-h5session / dwell / click / beacon 队列;`data-track` 委托
- admin-h5:「数据」页(今日 / 7 / 30 日)
- OpenAPI · ERD · TEST_REPORT · CODE_REVIEW
## Evidence
`docs/TEST_REPORT/ECR-007.md` · `docs/CODE_REVIEW/ECR-007.md`
## Ask
Reviewer 勾选 Approve;可将 ECR-007 标 Closed。
@@ -0,0 +1,34 @@
# HANDOFF — ECR-008 Architect → Engineer
## Gate
**仅当** ECR-008 与 BACKEND_DESIGN Status = **Approved** 后,方可改 `apps/`
当前:二者均为 **Approved**2026-08-07 Human)→ Engineer 可改 `apps/`
## Consume
1. `.ai/product/feature-spec/ops-content.md`
2. `docs/ECR/ECR-008-ops-content.md`
3. `docs/PRODUCT_SPEC/ECR-008-ops-content.md`
4. `docs/BACKEND_DESIGN/ECR-008-ops-content.md`BD-2026-008
5. `docs/ENGINEERING_SPEC/ECR-008-ops-content.md`
6. 本仓 `docs/PROJECT_RULES.md` · `.ai/architecture.md`
## Do
按 ENGINEERING_SPEC Implement order 落地 Ops-C。
## Do not
- Feeds CMS / 题目编辑器 / Ops-D/E
- Handler → DB
- 允许站外 URL 作 path
## Return
1. `docs/HANDOFF/ECR-008-engineer-to-reviewer.md`
2. `docs/TEST_REPORT/ECR-008.md`
3. `docs/CODE_REVIEW/ECR-008.md`
4. 更新 STATE → reviewer
5. `python3 scripts/ess-validate.py --phase review --ecr ECR-008`
@@ -0,0 +1,17 @@
# HANDOFF — ECR-008 Engineer → Reviewer
## Done
- Migration `000014_ops_content` + seed 12 格
- `GET /home/tools` · admin home/tools · admin scales PATCH
- user-h5 API 宫格 + 静态回退
- admin-h5「内容」页
- TEST_REPORT / CODE_REVIEW
## Evidence
`docs/TEST_REPORT/ECR-008.md` · `docs/CODE_REVIEW/ECR-008.md`
## Ask
Reviewer Approve;可将 ECR-008 标 Closed。
@@ -0,0 +1,32 @@
# PRODUCT_SPEC — ECR-007 运营行为分析 Ops-B
对齐 Feature Spec`.ai/product/feature-spec/ops-analytics.md`
## Outcome
1. user-h5 按传统 App 模式上报:会话、页浏览、停留、点击、退出页(及既有漏斗事件)。
2. 数据落入自有库;Admin 在「数据」页查看 DAU/会话/页面停留/退出页/点击/漏斗。
3. 可选继续双写 GA4;**运营看板以自有管道为准**。
## Actors
- Visitor / User:无感采集
- Admin:只读分析看板(授予会员等仍走既有 Ops-A)
## Success Metrics
- 有活跃用户的自然日,Admin「近 7 日」overview 可出 DAU 与会话数
- 抽样会话可追溯 `exit_page` 与至少一条 `page_leave.dwell_ms`
- 埋点失败不阻塞任何 C 端路径
## Out of scope
见 ECR-007 ForbiddenOps-C/D/E 见附录。
## 附录:后续 ECR(不在本 ECR Scope
| 拟议 ECR | 分期 | 主题 |
|---|---|---|
| ECR-008+ | Ops-C | 内容:首页宫格/工具配置 · 测评上下架 |
| ECR-009+ | Ops-D | 商业:订单筛选 · 套餐展示价 · 退款只读 |
| ECR-010+ | Ops-E | 系统:RBAC · 封禁 · 推送占位 |
+23
View File
@@ -0,0 +1,23 @@
# PRODUCT_SPEC — ECR-008 运营内容 Ops-C
对齐 Feature Spec`.ai/product/feature-spec/ops-content.md`
## Outcome
1. 运营可在后台调整首页宫格(文案、路径、图标、角标、排序、显隐)。
2. 运营可上下架测评;C 端 `GET /scales` 仅 published。
3. 变更可审计。
## Actors
- Admin:内容页读写
- Visitor/User:消费 `GET /home/tools` 与已发布 scales
## Success Metrics
- 改宫格后无需发版即可在 H5 首页生效(API 部署后)
- 下架量表不再出现在探索测评列表
## Out of scope
见 ECR-008 ForbiddenFeeds CMS / 题目编辑器 / Ops-D/E 另开。
+15
View File
@@ -0,0 +1,15 @@
# STATE — ECR-007
| Field | Value |
|-------|-------|
| ECR | ECR-007 |
| Title | 运营行为分析 Ops-B |
| Status | Implemented(待 Reviewer Closed |
| Phase | review |
| Owner | reviewer |
| Spec | `.ai/product/feature-spec/ops-analytics.md`Active |
| Backend Design | BD-2026-007 Approved |
| Test | `docs/TEST_REPORT/ECR-007.md` PASS |
| Review | `docs/CODE_REVIEW/ECR-007.md` Approve |
| Next | Human/Reviewer Closed ECR · 部署 API + 静态资源 |
| Updated | 2026-08-07 |
+14
View File
@@ -0,0 +1,14 @@
# STATE — ECR-008
| Field | Value |
|-------|-------|
| ECR | ECR-008 |
| Title | 运营内容配置 Ops-C |
| Status | Implemented(待 Reviewer Closed |
| Phase | review |
| Owner | reviewer |
| Spec | Active |
| Backend Design | BD-2026-008 Approved |
| Test | TEST_REPORT/ECR-008.md PASS |
| Review | CODE_REVIEW/ECR-008.md Approve |
| Updated | 2026-08-07 |
+20
View File
@@ -0,0 +1,20 @@
id: TASK-007-ECR007
ecr: ECR-007
title: Ops-B analytics ingest + admin data dashboard
role: engineer
status: review
change_level: L2
inputs:
- docs/HANDOFF/ECR-007-architect-to-engineer.md
- docs/BACKEND_DESIGN/ECR-007-ops-analytics.md
- docs/ENGINEERING_SPEC/ECR-007-ops-analytics.md
- .ai/product/feature-spec/ops-analytics.md
outputs:
- apps/api analytics migration + service/handler
- apps/user-h5 analytics session/dwell/click/beacon
- apps/admin-h5 数据页
- docs/TEST_REPORT/ECR-007.md
acceptance:
- ECR-007 Acceptance 全勾
- go test analytics/admin paths
- build:h5 + build:admin
+20
View File
@@ -0,0 +1,20 @@
id: TASK-008-ECR008
ecr: ECR-008
title: Ops-C home tools CMS + scales publish
role: engineer
status: review
change_level: L2
inputs:
- docs/HANDOFF/ECR-008-architect-to-engineer.md
- docs/BACKEND_DESIGN/ECR-008-ops-content.md
- docs/ENGINEERING_SPEC/ECR-008-ops-content.md
- .ai/product/feature-spec/ops-content.md
outputs:
- apps/api home_tools migration + APIs
- apps/user-h5 home tools from API
- apps/admin-h5 内容页
- docs/TEST_REPORT/ECR-008.md
acceptance:
- ECR-008 Acceptance 全勾
- go test content paths
- build:h5 + build:admin
+36
View File
@@ -0,0 +1,36 @@
# TEST_REPORT — ECR-007 Ops-B Analytics
Date: 2026-08-07
## Commands
```bash
export PATH="$HOME/.local/go/bin:$PATH"
cd apps/api && go test ./internal/service/analytics/ -count=1
cd apps/api && go test ./internal/integration/ -run TestAnalyticsOpsB -count=1
npm run test:h5 -- --run src/lib/analytics.spec.ts
npm run build:h5 && npm run build:admin
```
## Results
| Check | Result |
|-------|--------|
| `TestScrubDwellNonNeg` / `TestParseDayRange` | PASS |
| `TestAnalyticsOpsB`ingest → overview/pages/exits | PASS |
| `analytics.spec.ts`6 | PASS |
| `build:h5` / `build:admin` | PASS |
## Spec mapping
| Spec | Evidence |
|------|----------|
| page_view×2 + page_leave(dwell) + session_end.exit_page | TestAnalyticsOpsB ingest |
| Admin overview/pages/exits 非空 | same |
| props 截断 / dwell 非负 | service_test |
| H5 队列 session / leave | analytics.spec |
## Notes
- DeviceAuth 空 key 时写入 request header,便于 ingest 读 `X-Device-Key`
- 非法批次整批 400`ErrInvalidBatch`
+28
View File
@@ -0,0 +1,28 @@
# TEST_REPORT — ECR-008 Ops-C Content
Date: 2026-08-07
## Commands
```bash
export PATH="$HOME/.local/go/bin:$PATH"
cd apps/api && go test ./internal/service/home/ -count=1
cd apps/api && go test ./internal/integration/ -run TestOpsContentPhaseC -count=1
npm run build:h5 && npm run build:admin
```
## Results
| Check | Result |
|-------|--------|
| `TestNormalizeTool*` | PASS |
| `TestOpsContentPhaseC` | PASS |
| `build:h5` / `build:admin` | PASS |
## Follow-upreview P1
- Replace/Patch 与 audit 同事务
- ContentPage `move` 保留 `row_index`
- Analytics `requireAnalytics`
- Integration 断言 `home_tools.replace` + restore tools
+2
View File
@@ -12,3 +12,5 @@
| ECR-004 | Synastry 再拆 · Scale 测 · Membership 守卫 · OpenAPI · CI | review PASS | TEST_REPORT · CODE_REVIEW/ECR-004.md |
| ECR-005 | Ask/Decode/Portrait 再拆 · composable 外提 · OpenAPI `$ref` | review PASS | TEST_REPORT · CODE_REVIEW/ECR-005.md |
| ECR-006 | 运营后台 Phase Aadmin API + admin-h5 | **Closed** | Spec ops-admin · BD-2026-006 · TEST_REPORT · CODE_REVIEW |
| ECR-007 | 运营行为分析 Ops-B(埋点 + 数据看板) | **Implemented** | Spec Active · BD-2026-007 · TEST_REPORT · CODE_REVIEW · HANDOFF review |
| ECR-008 | 运营内容 Ops-C(首页宫格 + 测评上下架) | **Implemented** | Spec Active · BD-2026-008 · TEST_REPORT · CODE_REVIEW |