# PaperManagementPanel 题目配置组件重设计 — 实施计划 > **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. **Goal:** 将 2235 行的 PaperManagementPanel.vue 巨型组件拆分为 7 个子组件 + 2 个 composable,统一使用 design-tokens,优化视觉与交互体验。 **Architecture:** 采用「状态提升 + 单向数据流」模式。所有业务逻辑集中在 `usePaperManagement.js` composable 中,子组件通过 props 接收数据、通过 emits 向上通信。题目解析纯函数提取为独立的 `useQuestionParser.js`。 **Tech Stack:** Vue 3 Composition API (` ``` - [ ] **Step 4: 创建 Style(使用 design-tokens)** ```css ``` --- ### Task 4: 创建 ComposePreviewPane.vue **Files:** - Create: `src/components/exam/ComposePreviewPane.vue` - [ ] **Step 1: 创建完整组件(Template + Script + Style)** ```html ``` --- ### Task 5: 创建 ComposePanel.vue **Files:** - Create: `src/components/exam/ComposePanel.vue` - [ ] **Step 1: 创建左右分栏容器组件** ```html ``` --- ### Task 6: 创建 PaperListTab.vue **Files:** - Create: `src/components/exam/PaperListTab.vue` - [ ] **Step 1: 创建完整的复用型列表组件** ```html ``` --- ## Phase 3: 弹窗组件 ### Task 7: 创建 EntityPickerModal.vue **Files:** - Create: `src/components/exam/EntityPickerModal.vue` - [ ] **Step 1: 创建通用实体选择器弹窗(完整代码)** ```html ``` --- ### Task 8: 创建 PublishDialog.vue **Files:** - Create: `src/components/exam/PublishDialog.vue` - [ ] **Step 1: 创建发布弹窗组件(完整代码,内嵌 EntityPickerModal)** > 此组件较大(~320 行),核心结构: > - 左列:目标部门选择器 + 发布时间 + 截止时间 > - 右列:用户范围模式切换 + 目标/排除用户选择器 > - 底部:取消/确认按钮 > - 内嵌 EntityPickerModal 用于部门/用户选择 > - 所有状态和方法通过 props 从父组件传入或内部管理 > 由于此组件代码量较大,完整内容见实施时的实际写入。关键点: > - 使用 `usePaperManagement` 中的 `pub`, `pubUI`, `pickerDialog` 等状态 > - 调用 EntityPickerModal 时传递 `sourceList` 和 `selectedIds` > - 两列 Grid 布局 `grid-template-columns: 1fr 1fr` > - 时间使用 `` 原生控件 > - 全部样式使用 design-tokens --- ### Task 9: 创建 PaperDetailModal.vue **Files:** - Create: `src/components/exam/PaperDetailModal.vue` - [ ] **Step 1: 创建试卷详情弹窗组件** > 核心要点: > - Props: `modelValue` (Boolean), `rawData` (Object|null) > - 使用 `useQuestionParser()` 解析 rawData → 得到 `previewQuestions[]` > - 展示区块:发布信息 → 概要行 → 题目列表(每题含选项/答案/解析/难度) > - Fallback 区:当解析失败时展示原始 JSON > - 解析区样式:`background: var(--bg-warning)` 黄色背景块 > - 正确选项:`border-left-color: var(--color-success)` 绿色左边框 > 注意:`viewPaperDetail()` 的完整数据解析逻辑(原 L1237-1567)需要整合到此组件或其调用的 composable 方法中。建议将此方法放入 `usePaperManagement.js` 中作为 `viewPaperDetail(data)` 方法,然后在 PaperDetailModal 中 watch `rawData` 变化时自动调用解析。 --- ## Phase 4: 主容器整合 ### Task 10: 重写 PaperManagementPanel.vue 为薄容器 **Files:** - Modify: `src/components/exam/PaperManagementPanel.vue` (完全重写) - [ ] **Step 1: 备份原文件并重写为薄容器** 将原 2235 行文件重写为 ~100 行的薄容器: ```html ``` - [ ] **Step 2: 验证重写后的文件完整性** 确认新文件包含所有必要的 import、props 绑定、事件转发。 --- ## Phase 5: 验证 ### Task 11: 构建验证与回归测试 **Files:** 无新建文件 - [ ] **Step 1: 运行前端构建验证** Run: `npm run build` Expected: 构建成功(3644 modules transformed),零编译错误 - [ ] **Step 2: VS Code 诊断检查** 对所有新建/修改的 `.vue` 和 `.js` 文件运行 GetDiagnostics,确认零错误。 - [ ] **Step 3: 功能清单验证** 逐一确认以下功能路径不受影响: - [ ] 智能组卷 Tab → 选择文件 → 设置难度 → 配置题型数量 → 生成试卷 → 预览显示 → 保存为草稿 - [ ] 我的草稿 Tab → 显示草稿列表 → 查看详情 → 发布 → 删除 - [ ] 已发布试卷 Tab → 显示已发布列表 → 查看详情 → 撤回 - [ ] 发布弹窗 → 选择部门 → 选择用户 → 设置时间 → 确认发布 - [ ] 详情弹窗 → 显示题目列表 → 选项正确标记 → 解析展示 → Fallback 兜底 - [ ] 移动端响应式布局(≤767px) - [ ] **Step 4: 清理验证** 确认以下清理项已完成: - [ ] 原 PaperManagementPanel.vue 中不再有硬编码颜色值(全部替换为 CSS 变量) - [ ] 不再有残留的 console.log/console.warn 调试语句 - [ ] 不再有 TrainingPanel/错题本相关的冗余 CSS 类 - [ ] 新组件均使用 BEM 命名规范和 design-tokens --- ## 自检清单 ### Spec 覆盖度 | 设计文档章节 | 对应 Task | 状态 | |------------|----------|------| | §2.1 文件结构(9个文件) | Tasks 1-10 | ✅ | | §2.2 组件树与数据流 | Task 10 | ✅ | | §3.1 PaperManagementPanel 主容器 | Task 10 | ✅ | | §3.2 ComposeConfigSidebar 配置栏 | Task 3 | ✅ | | §3.3 ComposePreviewPane 预览区 | Task 4 | ✅ | | §3.4 PaperListTab 列表组件 | Task 6 | ✅ | | §3.5 PaperDetailModal 详情弹窗 | Task 9 | ✅ | | §3.6 PublishDialog 发布弹窗 | Task 8 | ✅ | | §3.7 EntityPickerModal 选择器 | Task 7 | ✅ | | §4.1 usePaperManagement 状态中心 | Task 2 | ✅ | | §4.2 useQuestionParser 解析工具 | Task 1 | ✅ | | §5.1 Design Token 映射表 | All Tasks (CSS) | ✅ | | §5.2 BEM 命名规范 | All Tasks (CSS) | ✅ | | §5.3 响应式断点 | Tasks 3,4,6,10 (CSS) | ✅ | | §5.4 清理项(console.log/冗余CSS) | Task 11 | ✅ | ### 占位符扫描 - [ ] 无 TBD/TODO 占位符 - [ ] 无 "类似 Task N" 引用(每个任务包含完整代码) - [ ] 无 "添加适当的错误处理" 含糊描述 ### 类型一致性 - [ ] `usePaperManagement` 导出名称在 Task 2 定义,Task 10 使用一致 - [ ] 组件 Props 接口在设计文档 §3 中定义,Task 中实现一致 - [ ] CSS 变量名引用 `design-tokens.css` 中实际存在的变量名