duoqi-admin/dev-spec.md
Wang Zhuoxuan 87a1f39d51 docs: 更新 CLAUDE.md 和 dev-spec.md — Phase 3 完成
- CLAUDE.md: 更新 Current Status、Architecture 树、Auth flow 说明
- dev-spec.md: 更新状态为 Phase 3 已完成

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-08 18:23:58 +08:00

17 KiB
Raw Blame History

duoqi-admin 开发规格

多奇管理后台 — 工程实施指南 本文档为 duoqi-admin 库的自包含开发参考。产品设计细节见 共享设计文档


一、库职责与定位

维度 内容
duoqi-admin
定位 多奇内部管理后台,面向开发者/运营人员
产品阶段 Phase 1 起持续迭代(题库管理从 Phase 1 即需要)
核心目标 题库内容管理、用户管理、数据看板、系统配置
用户 开发者本人Phase 1-2后续可能扩展至运营团队

在架构中的位置

┌──────────────────────────────────────────────────────┐
│  duoqi-harmony  │  duoqi-flutter  │  duoqi-web       │  ← 用户端
└────────┬────────┴────────┬─────────┴────────┬────────┘
         └─────────────────┼───────────────────┘
                           │
                    duoqi-api (REST API)
                    ├── /v1/*          用户端 API
                    └── /admin/*       管理端 API  ← 新增
                           │
         ┌─────────────────┼───────────────────┐
         │                 │                   │
  阿里云 RDS MySQL    阿里云 OSS      PostHog + ClickHouse
                           │
                    duoqi-admin (CSR)  ← 本库
                    调用 /admin/* API

二、技术栈

层面 选型 版本 理由
框架 Vite + React React 18 CSR 足够,无需 SSR比 Next.js 轻量
语言 TypeScript 与项目其他仓库统一
UI 组件 shadcn/ui 源码级复用 与 duoqi-web 统一,可定制
样式 Tailwind CSS 与 shadcn/ui 集成
数据表格 TanStack Table v8 管理后台核心组件:排序、筛选、分页
表单 React Hook Form + Zod 表单校验,管理后台大量表单
HTTP 客户端 ky / fetch 调用 duoqi-api admin 端点
路由 React Router v7 CSR 路由,管理后台够用
状态管理 Zustand 与 duoqi-web 统一
图表 Recharts 数据看板可视化
运行方式 npm run devvite dev 生产构建为静态文件,部署至 CDN/OSS

选型理由

  • Vite + React 而非 Next.js:管理后台不需要 SEO、不需要 SSR、不需要 API Routes。Vite 更轻量、构建更快、开发体验更好。duoqi-web 用 Next.js 是因为它是面向用户的 Web 产品admin 是内部工具,没必要承担 Next.js 的复杂度。
  • shadcn/ui:与 duoqi-web 统一组件库,降低学习成本,可按需引入组件。
  • TanStack Table管理后台最核心的交互是数据表格题库列表、用户列表等。TanStack Table 是 headless table配合 shadcn/ui 样式,灵活度最高。
  • Recharts:轻量 React 图表库,满足数据看板需求(折线图、柱状图、饼图)。

三、项目结构

duoqi-admin/
├── CLAUDE.md                    # Agent 指引
├── dev-spec.md                  # 本文件
├── src/
│   ├── main.tsx                 # 入口
│   ├── App.tsx                  # 根组件(路由 + 布局)
│   ├── routes/                  # 页面路由
│   │   ├── __root.tsx           # 根布局(侧边栏 + 顶栏)
│   │   ├── index.tsx            # 首页(数据看板)
│   │   ├── login.tsx            # 管理员登录
│   │   ├── questions/           # 题库管理
│   │   │   ├── index.tsx        # 题目列表
│   │   │   ├── new.tsx          # 新建题目
│   │   │   └── $id.tsx          # 编辑题目
│   │   ├── categories/          # 分类管理
│   │   │   ├── index.tsx        # 分类列表
│   │   │   └── new.tsx          # 新建/编辑分类
│   │   ├── knowledge-cards/     # 知识卡管理
│   │   │   └── index.tsx        # 知识卡列表(关联题目)
│   │   ├── skill-tree/          # 技能树管理
│   │   │   └── index.tsx        # 章节管理
│   │   ├── users/               # 用户管理
│   │   │   └── index.tsx        # 用户列表
│   │   ├── feedback/            # 用户反馈
│   │   │   └── index.tsx        # 反馈列表
│   │   └── settings/            # 系统设置
│   │       └── index.tsx        # 全局配置
│   ├── components/
│   │   ├── ui/                  # shadcn/ui 基础组件
│   │   ├── layout/
│   │   │   ├── Sidebar.tsx      # 侧边栏导航
│   │   │   ├── Header.tsx       # 顶栏(管理员信息)
│   │   │   └── AdminLayout.tsx  # 管理布局容器
│   │   ├── data-table/          # 数据表格封装
│   │   │   ├── DataTable.tsx    # 通用数据表格
│   │   │   ├── columns.tsx      # 列定义工具
│   │   │   └── filters.tsx     # 筛选器组件
│   │   ├── question-form/       # 题目编辑表单
│   │   │   ├── QuestionForm.tsx # 题目表单主组件
│   │   │   ├── StemEditor.tsx   # 题干编辑(支持多媒体)
│   │   │   └── DistractorEditor.tsx  # 干扰项编辑
│   │   └── charts/              # 图表组件
│   │       ├── StatsCard.tsx    # 统计卡片
│   │       ├── LineChart.tsx    # 折线图
│   │       └── BarChart.tsx     # 柱状图
│   ├── lib/
│   │   ├── api-client.ts        # duoqi-api HTTP 客户端admin 端点)
│   │   ├── auth.ts              # admin 认证token 管理)
│   │   ├── utils.ts             # 工具函数
│   │   └── constants.ts         # 常量(状态枚举、难度等级等)
│   ├── hooks/
│   │   ├── use-auth.ts          # 认证状态 hook
│   │   └── use-pagination.ts    # 分页 hook
│   ├── stores/
│   │   └── auth-store.ts        # 认证状态
│   └── types/
│       ├── question.ts          # 题目相关类型
│       ├── user.ts              # 用户相关类型
│       ├── category.ts          # 分类相关类型
│       └── api.ts               # API 响应类型
├── public/
│   └── favicon.svg
├── package.json
├── vite.config.ts
├── tailwind.config.ts
├── tsconfig.json
└── .env.example

四、功能范围

4.1 Phase 1 — 基础管理(与 duoqi-api Phase 1 并行)

# 功能 页面 说明
1 管理员登录 /login 环境变量 admin token 认证Phase 1 只有你一人)
2 题库 CRUD /questions 新建/编辑/删除/发布题目,支持批量操作
3 分类管理 /categories 管理题库分类(中国历史、经典剧集、相声小品)
4 知识卡编辑 /knowledge-cards 编辑基础版 + 深度版知识卡
5 技能树管理 /skill-tree 管理章节结构、排序、通过条件
6 数据看板 / 基础统计:用户数、答题数、正确率、留存
7 题目状态流转 题目编辑页 草稿 → 审核中 → 已发布 → 已下架

4.2 Phase 2 — 用户与运营

# 功能 页面 说明
8 用户列表 /users 查看用户、搜索、查看详情
9 用户反馈 /feedback 查看用户反馈(👍👎)和意见反馈
10 订阅管理 /users/$id 查看/调整用户订阅状态
11 批量导入 /questions 从 JSON/CSV 批量导入题目

4.3 Phase 3 — UGC 审核

# 功能 页面 说明
12 UGC 审核 /questions?source=ugc 用户投稿题目审核队列
13 举报处理 /reports 处理用户举报内容
14 运营配置 /settings 活动配置、推送文案管理

五、页面设计

5.1 布局结构

┌─────────────────────────────────────────────────┐
│ Header — 多奇管理后台          管理员: admin 退出 │
├──────────┬──────────────────────────────────────┤
│          │                                      │
│ 侧边栏    │  主内容区                             │
│          │                                      │
│ 数据看板  │  页面标题 + 操作按钮                    │
│ 题库管理  │  ─────────────────────               │
│   题目    │                                      │
│   分类    │  数据表格 / 表单 / 图表                │
│   知识卡  │                                      │
│   技能树  │                                      │
│ 用户管理  │                                      │
│ 用户反馈  │                                      │
│ 系统设置  │                                      │
│          │                                      │
└──────────┴──────────────────────────────────────┘

5.2 页面清单

数据看板(首页)

区域 内容
统计卡片 总用户数、今日活跃、总答题数、平均正确率
折线图 近 7/30 天 DAU 趋势
柱状图 各分类答题量分布
排行 今日答题最多用户 Top 5

题目列表

功能 说明
数据表格 ID、题干摘要、分类、难度、状态、创建时间、操作
筛选 按分类、难度、状态筛选
搜索 按题干文本搜索
批量操作 批量发布、批量下架、批量删除
排序 按创建时间、难度排序

题目编辑

区域 内容
题干编辑 文本输入 + 多媒体上传(图片/音频/视频)
正确答案 文本输入
干扰项 多行输入,至少 3 个干扰项(出题时随机抽 2 个)
分类选择 下拉选择
难度选择 1-5 级
知识卡编辑 基础版摘要(必填)+ 深度版可选Pro 专属)
状态操作 保存草稿 / 提交审核 / 发布

分类管理

功能 说明
列表 ID、名称、slug、题目数量、状态
编辑 名称、slug、父分类、排序、状态
统计 每个分类的题目数和答题数据

六、Admin API 端点duoqi-api 新增)

duoqi-api 需要新增以下 admin 路由,所有路由需要 admin 权限中间件。

6.1 认证

方法 路由 说明
POST /admin/auth/login 管理员登录token 验证)
GET /admin/auth/me 获取当前管理员信息

6.2 题库管理

方法 路由 说明
GET /admin/questions 题目列表(分页、筛选、搜索)
GET /admin/questions/:id 题目详情(含正确答案和干扰项)
POST /admin/questions 创建题目
PUT /admin/questions/:id 更新题目
DELETE /admin/questions/:id 删除题目
PATCH /admin/questions/:id/status 更新题目状态
POST /admin/questions/batch 批量操作(发布/下架/删除)
POST /admin/questions/import 批量导入题目

6.3 分类管理

方法 路由 说明
GET /admin/categories 分类列表
POST /admin/categories 创建分类
PUT /admin/categories/:id 更新分类
DELETE /admin/categories/:id 删除分类

6.4 知识卡管理

方法 路由 说明
GET /admin/knowledge-cards 知识卡列表
PUT /admin/knowledge-cards/:id 更新知识卡

6.5 技能树管理

方法 路由 说明
GET /admin/skill-tree 技能树章节列表
POST /admin/skill-tree 创建章节
PUT /admin/skill-tree/:id 更新章节
DELETE /admin/skill-tree/:id 删除章节
PATCH /admin/skill-tree/reorder 调整章节排序

6.6 用户管理

方法 路由 说明
GET /admin/users 用户列表(分页、搜索)
GET /admin/users/:id 用户详情
PATCH /admin/users/:id 更新用户(封禁、调整 tier

6.7 数据看板

方法 路由 说明
GET /admin/stats/overview 总览统计(用户数、答题数、正确率)
GET /admin/stats/daily 每日数据趋势DAU、答题量
GET /admin/stats/categories 各分类答题分布

6.8 用户反馈

方法 路由 说明
GET /admin/feedback 反馈列表(分页)
PATCH /admin/feedback/:id 更新反馈状态(已读/已处理)

七、认证方案

Phase 1静态 Token

Phase 1 只有开发者一人使用,认证方案极简:

登录流程:
1. 访问 /login
2. 输入 admin token环境变量 ADMIN_TOKEN 的值)
3. 前端调用 POST /admin/auth/login { token }
4. 后端验证 token签发 admin JWT
5. 前端存储 admin JWT后续请求携带

中间件验证:
- Authorization: Bearer <admin_jwt>
- 后端验证 JWT 中的 role: 'admin'

Phase 2+:账号密码(可选)

如需多人使用,扩展为用户名 + 密码登录。


八、环境变量

# duoqi-api 地址
VITE_API_BASE_URL=http://localhost:3000

# 无需其他环境变量admin token 通过登录页输入)

九、阶段路线图

Phase 1a — 骨架搭建(与 duoqi-api Phase 1a 同步)

├── 项目初始化Vite + React + TypeScript + Tailwind
├── shadcn/ui 配置 + 基础组件引入
├── 路由配置 + 管理布局(侧边栏 + 顶栏)
├── API 客户端封装 + admin 认证
├── 登录页
└── 数据看板骨架(统计卡片 + 占位图表)

Phase 1b — 题库管理核心(与 duoqi-api Phase 1b 同步)

├── 题目列表DataTable + 筛选 + 搜索 + 分页)
├── 题目编辑表单(题干、正确答案、干扰项、分类、难度)
├── 知识卡编辑(基础版 + 深度版)
├── 分类管理CRUD
├── 题目状态流转(草稿 → 审核 → 发布 → 下架)
└── 批量导入题目JSON

Phase 1c — 完善(与 duoqi-api Phase 1c 同步)

├── 技能树章节管理
├── 数据看板真实数据(对接 stats API
├── 批量操作(发布/下架/删除)
└── 用户列表基础版(只读)

Phase 2 — 用户与运营

├── 用户详情页(进度、订阅、答题历史)
├── 用户反馈管理
├── 订阅状态管理
└── 导出功能CSV

Phase 3 — UGC 审核

├── UGC 题目审核队列
├── 举报处理
├── 运营配置(活动、推送文案)
└── 多管理员支持(账号密码登录)

十、设计文档索引

文档 路径 本库相关章节
题目格式设计 shared/question-format-design.md 全文(题目 CRUD 核心数据模型)
游戏化+变现设计 shared/gamification-monetization-design.md §2技能树结构
数据埋点设计 shared/analytics-feedback-design.md 数据看板参考
产品总纲 product-overview.md 内容策略、阶段路线图
技术选型 tech-stack.md §六(代码库组织)
duoqi-api 开发规格 duoqi-api/dev-spec.md §四数据库设计、§五API 设计)

创建日期2026-04-06 状态Phase 3 已完成UGC 审核、举报处理、运营配置、多管理员)。所有计划内功能开发完毕。