admin-projects/docs/admin-learning-info-ops-design.md
wangdl a2cb0681d9
Some checks failed
Deploy Admin Frontend / build-and-deploy (push) Failing after 8s
feat: RecordPage with filter + detail drawer (ADMIN-INFO-008)
- Add userId filter input to LearningRecord list
- Add click-to-view detail Drawer with full record info
- Fix occurredAt formatting to use dayjs
- Add scroll for narrow displays

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-15 21:26:44 +08:00

219 lines
8.3 KiB
Markdown
Raw Permalink 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.

# Admin 学习信息运维模块 总设计
> ADMIN-INFO-000 | v1.0 | 2026-06-12
## 1. 概述
Admin 学习信息运维模块是运营人员查看、诊断、修复学习信息数据的 Web 管理后台。本里程碑只做 Admin 前端,所有数据通过 API-ADMIN-INFO 接口获取mock 只能用于开发调试,不得作为最终验收。
## 2. 职责边界
| 层 | 负责 | 不负责 |
|----|------|--------|
| **Admin 前端** | 页面渲染、筛选、分页、图表、操作按钮 | 数据聚合、权限校验、落库 |
| **API-ADMIN-INFO** | 数据查询、权限校验、分页、导出、重算 | 前端 UI |
| **业务 API** | 事件采集、分析、题目/卡片生成 | Admin 查询 |
## 3. 技术栈
- React 19 + TypeScript
- Vite (build)
- Ant Design 5 + @ant-design/pro-components (ProTable)
- @tanstack/react-query (data fetching)
- ECharts (charts)
- react-router-dom v6 (routing)
- TailwindCSS 4 (utilities)
## 4. 页面路由结构
```
/admin/learning/
├── dashboard # ADMIN-INFO-001
├── events
│ ├── list # ADMIN-INFO-002 (ReadingEvent)
│ ├── :eventId # ADMIN-INFO-002 (详情)
│ ├── failed # ADMIN-INFO-003 (failed/warning/duplicate)
│ └── replay # ADMIN-INFO-004 (重放)
├── sessions
│ ├── list # ADMIN-INFO-005
│ ├── :sessionId # ADMIN-INFO-005 (详情)
│ └── interrupted # ADMIN-INFO-013
├── progress
│ └── list # ADMIN-INFO-006
├── activity
│ ├── daily # ADMIN-INFO-007 (日历/热力图)
│ └── timeline/:userId # ADMIN-INFO-009 (用户时间线)
├── records
│ └── list # ADMIN-INFO-008
├── export # P1
└── audit # P1
```
## 5. API 端点映射
| 页面 | Issue | API 端点 | 方法 |
|------|-------|----------|------|
| Dashboard | 001 | `/admin/learning/dashboard` | GET |
| ReadingEvent 列表 | 002 | `/admin/learning/events` | GET |
| ReadingEvent 详情 | 002 | `/admin/learning/events/:id` | GET |
| failed/warning/duplicate | 003 | `/admin/learning/events?status=failed&status=warning&status=duplicate` | GET |
| 重放/修复 | 004 | `/admin/learning/events/:id/replay` | POST |
| Session 列表 | 005 | `/admin/learning/sessions` | GET |
| Session 详情 | 005 | `/admin/learning/sessions/:id` | GET |
| MaterialProgress | 006 | `/admin/learning/progress` | GET |
| DailyActivity | 007 | `/admin/learning/activity` | GET |
| LearningRecord | 008 | `/admin/learning/records` | GET |
| 用户时间线 | 009 | `/admin/learning/activity?userId=...` | GET |
| interrupted session | 013 | `/admin/learning/sessions?status=interrupted` | GET |
| TemporaryReadingMaterial | P1 | `/admin/learning/temporary-materials` | GET |
> **TemporaryReadingMaterial**P1临时文件阅读数据管理包括列表、详情、过期清理。API 路径待 API-ADMIN-INFO-014 定义后确认。
所有接口统一前缀 `/admin/learning/`,查询参数支持 `page`/`pageSize`/`userId`/`materialId`/`eventType`/`status`/`startDate`/`endDate`/`knowledgeBaseId`
## 6. API Service 层
```
src/services/learningAdmin.ts
├── getDashboard(params) → DashboardDTO
├── getEvents(params) → PaginatedResponse<ReadingEventDTO>
├── getEventDetail(id) → ReadingEventDTO
├── replayEvent(id) → ReplayResultDTO
├── getSessions(params) → PaginatedResponse<SessionDTO>
├── getSessionDetail(id) → SessionDTO
├── getProgressList(params) → PaginatedResponse<MaterialProgressDTO>
├── getDailyActivity(params) → DailyActivityDTO[]
├── getRecords(params) → PaginatedResponse<LearningRecordDTO>
├── getUserTimeline(userId, params) → TimelineDTO[]
└── getInterruptedSessions(params) → PaginatedResponse<SessionDTO>
```
统一使用 `@tanstack/react-query` 管理缓存和加载状态。所有请求通过 `http-client.ts` 发送,自动携带 admin token。
## 7. 类型系统
```
src/types/admin.ts (扩展)
├── ReadingEventDTO
├── SessionDTO
├── MaterialProgressDTO
├── DailyActivityDTO
├── LearningRecordDTO
├── TimelineDTO
├── DashboardDTO
├── PaginatedResponse<T>
├── EventFilterParams
├── SessionFilterParams
```
DTO 字段与 API-ADMIN-INFO 响应保持一致,使用 camelCase。
## 8. P0 / P1 / P2 范围
### P011 issues — 当前里程碑)
| Issue | 页面 | 核心功能 |
|-------|------|---------|
| ADMIN-INFO-000 | — | 总体设计(本文档) |
| ADMIN-INFO-001 | Dashboard | 全局统计、时间范围、knowledgeBaseId 筛选 |
| ADMIN-INFO-002 | ReadingEvent 列表/详情 | 分页、筛选userId/materialId/eventType/status/时间) |
| ADMIN-INFO-003 | 异常事件视图 | failed/warning/duplicate 列表 + 筛选 |
| ADMIN-INFO-004 | 重放/修复 | 单事件重放、批量操作 |
| ADMIN-INFO-005 | Session 列表/详情 | 分页、按用户/资料/状态筛选 |
| ADMIN-INFO-006 | MaterialProgress 列表 | 分页、按用户/资料筛选 |
| ADMIN-INFO-007 | DailyActivity 热力图 | 日历视图、按用户/日期筛选 |
| ADMIN-INFO-008 | LearningRecord 列表 | 分页、按类型/用户筛选 |
| ADMIN-INFO-009 | 用户时间线 | 单用户活动时间线 |
| ADMIN-INFO-013 | interrupted session | active/interrupted session 列表 + 操作 |
### P1本里程碑之后
- 单用户学习数据诊断页
- 单资料学习数据诊断页
- 异常数据筛选与跨表诊断
- 学习数据重算工具
- 临时文件阅读数据管理TemporaryReadingMaterial — 对应 Issue §11API 端点待 API-ADMIN-INFO-014 定义)
- 学习事件处理配置
- 学习数据导出
- 权限与审计日志
### P2最后
- Admin 页面/接口测试
- 后台使用文档
- 全局搜索
## 9. 通用页面模式
每个 P0 列表页统一使用 Ant Design ProTable
```tsx
// 通用模式
<ProTable<RecordType>
columns={columns}
request={async (params, sort, filter) => {
const { data, total } = await api.getXxx({ ...params, ...filter });
return { data, success: true, total };
}}
rowKey="id"
search={{ labelWidth: 'auto' }}
pagination={{ defaultPageSize: 20 }}
dateFormatter="string"
/>
```
详情页统一使用 Ant Design Descriptions + 关联数据子表。
## 10. 筛选器公共组件
```
src/components/learning/
├── EventStatusFilter.tsx # ReadingEvent status 筛选
├── EventTypeFilter.tsx # eventType 筛选
├── DateRangeFilter.tsx # 时间范围筛选
├── UserMaterialFilter.tsx # userId / materialId 筛选
└── KnowledgeBaseFilter.tsx # knowledgeBaseId 筛选
```
## 11. 依赖说明
- **阻塞项**: 所有 P0 Issue 标记 `blocked-by:api-admin-info`API 接口就绪后才能对接
- **开发策略**: 先搭建页面框架 + TypeScript 类型 + ProTable 列定义,使用 `mock-data.ts` 做开发占位API 就绪后切换 `learningAdmin.ts` 的真实调用
- **不使用 mock 验收**: mock 仅限 `npm run dev` 开发阶段CR 和上线必须以真实 API 数据为准
## 12. 路由注册
`src/routes/index.tsx` 中注册学习信息路由组:
```tsx
{
path: '/admin/learning',
element: <LearningLayout />,
children: [
{ index: true, element: <LearningDashboard /> },
{ path: 'events', element: <EventList /> },
{ path: 'events/:eventId', element: <EventDetail /> },
{ path: 'events/failed', element: <FailedEvents /> },
{ path: 'sessions', element: <SessionList /> },
{ path: 'sessions/:sessionId', element: <SessionDetail /> },
{ path: 'progress', element: <ProgressList /> },
{ path: 'activity', element: <DailyActivity /> },
{ path: 'records', element: <RecordList /> },
]
}
```
## 13. 开发顺序
000本文档→ 搭建路由框架 + 类型定义 → 001 Dashboard → 002 Events → 003 Failed → 004 Replay → 005 Sessions → 006 Progress → 007 Activity → 008 Records → 009 Timeline → 013 Interrupted
## 14. 验收清单
- [x] 输出 docs/admin-learning-info-ops-design.md
- [x] 明确本里程碑只做 Admin 前端
- [x] 明确依赖 API-ADMIN-INFO
- [x] 明确不使用 mock 作为最终验收
- [x] 明确页面路由和 tab 结构
- [x] 明确每个页面对应的 API
- [x] 明确 P0/P1/P2 范围