# 管理员登录记录与仪表盘/统计页改造

## Context
- 管理端登录页存在“最近登录记录”体验需求，且需要确保不会保存失败登录或敏感信息（如密码）。
- 管理端仪表盘/统计页存在通过 `fetch` 手写请求与鉴权头、与 `src/services/api.ts` 统一封装并存的情况，导致代码重复且行为不一致。
- 管理端仪表盘指标卡片与统计模块需要重构：新增可点击的统计卡片与饼图展示，并新增“历史考试任务统计”（含分页与后端分页查询接口）。

## Goals / Non-Goals
- Goals:
  - 管理员登录页仅在登录成功时写入最近登录记录（用户名 + 时间戳），且不保存密码。
  - 管理端页面统一使用现有的 `api`/`adminAPI`/`quizAPI` 访问后端，避免重复拼接 token 与重复处理响应格式。
  - 管理员仪表盘指标卡片重构：
    - 移除现有卡片：答题记录、平均得分。
    - 新增总用户数：实时数字；点击跳转 `/admin/users`。
    - 新增题库统计：饼图展示各题目类别占比；点击跳转 `/admin/question-bank`。
    - 新增考试科目：显示当前活跃科目数量；点击跳转 `/admin/subjects`。
    - 新增考试任务：饼图展示任务状态分布（已完成/进行中/未开始）；点击跳转 `/admin/exam-tasks`。
  - 统计功能调整：移除题型正确率统计模块。
  - 新增历史考试任务统计：
    - 展示所有历史考试任务统计（非仅当前有效任务）。
    - 排序：按结束时间倒序。
    - 分页：每页 5 条，支持前后翻页。
    - 字段：与“当前有效考试任务统计”字段保持一致。
    - 需新增后端分页查询接口以支撑上述分页与排序。
  - 新增未开始考试任务统计：
    - 展示未开始的考试任务（开始时间晚于当前时间）。
    - 排序：按开始时间正序。
    - 分页：每页 5 条，支持前后翻页。
    - 字段：与“当前有效考试任务统计”字段保持一致。
    - 需新增后端分页查询接口以支撑上述分页与排序。
- Non-Goals:
  - 不调整管理员鉴权机制（`adminAuth` 仍为简化实现）。
  - 不新增第三方图表库或引入新的前端数据层框架。

## Decisions
- 决策：复用 `src/services/api.ts` 的 axios 实例与拦截器，统一处理 token 注入与 `success`/`message` 响应格式。
  - 理由：仓库已存在稳定封装，减少重复与差异。
- 决策：最近答题记录使用现有 `/api/quiz/records` 接口拉取（分页参数 `page=1&limit=10`）。
  - 理由：后端已实现管理员分页接口；前端无需再手写 `fetch`。
- 决策：新增的仪表盘跳转路由以不破坏现有路由为前提，通过新增别名路由满足新路径需求。
  - `/admin/question-bank` 作为 `/admin/questions` 的别名路由。
  - `/admin/exam-tasks` 作为 `/admin/tasks` 的别名路由。
- 决策：仪表盘新增数据优先由后端聚合提供，减少前端全量拉取与二次计算。
  - 题库类别占比：按题目类别聚合统计数量（用于饼图）。
  - 活跃科目数量：以“当前时间存在有效考试任务”的科目去重统计。
  - 任务状态分布：以任务开始/结束时间与当前时间对比划分已完成/进行中/未开始并聚合计数。
- 决策：新增历史考试任务统计分页接口，返回统一响应包裹并携带 `pagination`。
  - 路径建议：`GET /api/admin/tasks/history-stats?page=1&limit=5`。
  - 返回结构：`{ success: true, data: ActiveTaskStat[], pagination: { page, limit, total, pages } }`。
- 决策：新增未开始考试任务统计分页接口，返回统一响应包裹并携带 `pagination`。
  - 路径建议：`GET /api/admin/tasks/upcoming-stats?page=1&limit=5`。
  - 返回结构：`{ success: true, data: ActiveTaskStat[], pagination: { page, limit, total, pages } }`。

## Risks / Trade-offs
- 统一到 axios 封装后，错误提示将由拦截器抛错路径主导。
  - 缓解：在页面层使用 `message.error(error.message)`，保持用户感知一致。
- 历史任务统计若逐任务计算报表可能产生额外数据库开销。
  - 缓解：按分页限制任务数；必要时在模型层优化聚合 SQL 或缓存计算结果（仅服务端内存，不落地到业务表）。

## Migration Plan
- 前端无数据迁移：登录记录仍存储在 localStorage，仅调整写入触发条件与读取方式。
- 回滚策略：恢复为原先 `fetch` 调用与原登录记录写入逻辑。

