feat(ops): ECR-007 行为分析与 ECR-008 内容运营后台
落地埋点 ingest/数据看板、首页宫格 CMS 与测评上下架;含账号引导、问答流式与免责声明去重,以及 review P1 审计同事务修复。 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -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 | Approved(2026-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 扩展)· Infrastructure(repo + migration)· UI(user-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`
|
||||
- Immutable:events 只追加;不提供删除 API
|
||||
|
||||
## Migration Plan
|
||||
|
||||
- Required:YES
|
||||
- 步骤:expand 建表 → 部署 API → 开 H5 上报 → admin 看板
|
||||
- 回滚:关上报 + 下线路由 + down migration(非生产可)
|
||||
|
||||
## Failure Handling
|
||||
|
||||
- ingest 部分非法条目:整批 400 或跳过非法并计 dropped(选定一种写进实现注释,默认整批 400)
|
||||
- 未鉴权 Device:401
|
||||
- Admin 无 token:401
|
||||
- DB 错:500;客户端 track 吞错
|
||||
|
||||
## Test Plan
|
||||
|
||||
- Unit:props 截断、dwell 非负
|
||||
- Integration:login device → post events → admin overview/pages/exits
|
||||
- H5:analytics 队列 flush mock
|
||||
|
||||
## Rollback Plan
|
||||
|
||||
见 ECR Rollback。
|
||||
|
||||
---
|
||||
|
||||
## Backend Change Boundary(mandatory)
|
||||
|
||||
```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 鉴权面隔离
|
||||
- [ ] 未引入非默认中间件
|
||||
- [ ] 未简化分层
|
||||
@@ -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 | Approved(2026-08-07 Human) |
|
||||
| Author | Architect |
|
||||
| Date | 2026-08-07 |
|
||||
| Risk | Medium |
|
||||
|
||||
---
|
||||
|
||||
## Context
|
||||
|
||||
- 目标:首页宫格可运营配置;scales 可上下架。
|
||||
- 非目标:Feeds CMS、题目编辑器、外链图标、RBAC。
|
||||
- 无新 ADR。
|
||||
|
||||
## Architecture Change
|
||||
|
||||
- 分层边界:No
|
||||
- 层:API · Application · Infrastructure · UI(user-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 1–16 字;items ≤ 24
|
||||
- status ∈ {published, draft}
|
||||
- 非法整批 400
|
||||
|
||||
## Failure Handling
|
||||
|
||||
- Admin 无 token:401
|
||||
- scale 不存在:404
|
||||
- DB:500;H5 拉 tools 失败静默回退静态
|
||||
|
||||
## Test Plan
|
||||
|
||||
- Unit:path/icon 校验
|
||||
- Integration:seed → 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 鉴权隔离
|
||||
- [ ] 未引入非默认中间件
|
||||
- [ ] 未简化分层
|
||||
@@ -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 闭环)
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
# CODE_REVIEW — ECR-007
|
||||
|
||||
**Verdict:** Approve(Feature Complete · Ops-B)
|
||||
|
||||
Date: 2026-08-07
|
||||
|
||||
## Checklist
|
||||
|
||||
- [x] Handler → Service → Repository;ingest 挂 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] 文件 ≤400;integration + 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
|
||||
@@ -0,0 +1,34 @@
|
||||
# CODE_REVIEW — ECR-008
|
||||
|
||||
**Verdict:** Approve(Feature Complete · Ops-C · P1 已修)
|
||||
|
||||
Date: 2026-08-07 · Reviewer pass → P1 fixed
|
||||
|
||||
## Checklist
|
||||
|
||||
- [x] Handler → Service → Repository;home DeviceAuth;admin 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 直连 ScaleRepo;C 端多暴露字段;icon 白名单三处重复;OpenAPI schema 偏薄
|
||||
|
||||
## Architecture Regression
|
||||
|
||||
- [x] 无 Handler 直连 DB
|
||||
- [x] Admin / Device 鉴权隔离
|
||||
- [x] 未引入非默认中间件
|
||||
- [x] 审计与写操作同事务
|
||||
@@ -0,0 +1,74 @@
|
||||
# ECR-007
|
||||
|
||||
**Title:** 运营行为分析 Ops-B(自有埋点采集 · 管理端数据看板)
|
||||
**Status:** Approved
|
||||
**Date:** 2026-08-07
|
||||
**Approved:** 2026-08-07(Human)
|
||||
**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 路径
|
||||
|
||||
### Forbidden(Non-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] Integration:H5 形态上报 → 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 Yes(Approved)
|
||||
- 后续分期:Ops-C/D/E 各开独立 ECR(见 PRODUCT_SPEC 附录)
|
||||
@@ -0,0 +1,67 @@
|
||||
# ECR-008
|
||||
|
||||
**Title:** 运营内容配置 Ops-C(首页宫格 CRUD · 测评上下架)
|
||||
**Status:** Approved
|
||||
**Date:** 2026-08-07
|
||||
**Approved:** 2026-08-07(Human)
|
||||
**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
|
||||
|
||||
### Forbidden(Non-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] Integration:PUT tools → GET home/tools;PATCH 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` 挂 DeviceAuth;admin 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-h5:session / 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 Forbidden;Ops-C/D/E 见附录。
|
||||
|
||||
## 附录:后续 ECR(不在本 ECR Scope)
|
||||
|
||||
| 拟议 ECR | 分期 | 主题 |
|
||||
|---|---|---|
|
||||
| ECR-008+ | Ops-C | 内容:首页宫格/工具配置 · 测评上下架 |
|
||||
| ECR-009+ | Ops-D | 商业:订单筛选 · 套餐展示价 · 退款只读 |
|
||||
| ECR-010+ | Ops-E | 系统:RBAC · 封禁 · 推送占位 |
|
||||
@@ -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 Forbidden;Feeds CMS / 题目编辑器 / Ops-D/E 另开。
|
||||
@@ -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 |
|
||||
@@ -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 |
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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`)
|
||||
@@ -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-up(review P1)
|
||||
|
||||
- Replace/Patch 与 audit 同事务
|
||||
- ContentPage `move` 保留 `row_index`
|
||||
- Analytics `requireAnalytics`
|
||||
- Integration 断言 `home_tools.replace` + restore tools
|
||||
|
||||
@@ -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 A(admin 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 |
|
||||
|
||||
Reference in New Issue
Block a user