Files
digital-psychology/docs/BACKEND_DESIGN/ECR-007-ops-analytics.md
T
jackyu66gitandCursor 7ab9add5dd
ci / h5 (push) Canceled after 0s
ci / api (push) Canceled after 0s
ci / ess-docs (push) Canceled after 0s
feat(ops): ECR-007 行为分析与 ECR-008 内容运营后台
落地埋点 ingest/数据看板、首页宫格 CMS 与测评上下架;含账号引导、问答流式与免责声明去重,以及 review P1 审计同事务修复。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-07 02:26:16 +08:00

138 lines
4.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 鉴权面隔离
- [ ] 未引入非默认中间件
- [ ] 未简化分层