diff --git a/classwork-frontend-m5-plan.md b/classwork-frontend-m5-plan.md index 76d3a59..10d12c9 100644 --- a/classwork-frontend-m5-plan.md +++ b/classwork-frontend-m5-plan.md @@ -314,6 +314,54 @@ export interface StudentMatrixVo / StudentMatrixQuery / HomeworkStatsVo / ClassT **回退方式**:`git checkout HEAD -- src/views/homework/HomeworkSetting.vue src/components/TypeSetBox.vue src/components/UserCheckInput.vue` 复原三文件;routes/menu/menuRoute/api/types/mock 六个文件的改动前快照在 `.backup/20260915-drop-app-setting/`。 +--- + +## 8. M5 主体执行结果回填(2026-09-16 完成) + +### 8.1 提交序列(每阶段一组语义化 commit) + +| commit | 阶段 | 内容 | +|---|---|---| +| e6639f7 | 基线(前会话成果入库) | P0 契约层(types/homeworkV2.ts + 28 端点三客户端)+ §6/§7 下线 + 新增 TeacherHomeworks/ReviewModal/AttachmentUpload 组件(未挂路由) | +| 39824fb | P1 教师端发布链路 | /list 挂 TeacherHomeworks(已发布+草稿箱);NewHomework 切 V2(班级树/create→publish·schedule 三段式/AttachmentUpload/仅查阅互斥;转发保留 V1 GetDetail);HomeworkList 摘伪接口 remind;路由:/accept→/stu/today、新增 /stu/detail、/stu/redo initTab=todo | +| 23d6716 | P2 教师端批阅链路 | ReviewWorkbench 从 ReviewModal 抽出(版本切换/批阅/打回共用);Submissions 切 V2 矩阵(stats 汇总卡+classId/submitStatus/pendingGrade 筛选+未交占位行定向提醒);Grade 切 V2 批改中心(pendingGrade 排序+队列+内嵌工作台批完前移);HomeworkDetails 双模式(/list/detail 走 V2 详情+统计+分班进度表,/homeworklist/detail 保留 V1——V2 详情有 requireOwned 校验看不了他人作业) | +| 6258ebb | P3 学生端闭环 | StudentHomeworks 切 V2(四 tab 服务端分页+五态徽标+逾期角标+倒计时变色+todo 桶 RETURNED 置顶强化+快捷提交弹窗);HomeworkAccept 改造为学生详情页(3 秒阅读上报 onUnmounted 清理/我的提交/批阅结果/历史版本各版评语/submitType 动态表单/修改提交生成新版本/截止前撤回/打回重交);菜单与别名列齐 V2 | +| 44ace7c | P4 清理+mock+走查 | 见 §8.3 | + +### 8.2 关键实现口径(与计划的差异说明) + +1. **页 2/3 载体**:原计划「HomeworkList.vue 增加 草稿箱 段」,实际采用前会话已建好的独立页 TeacherHomeworks.vue 挂 /list(已发布/草稿箱双 Tab),HomeworkList.vue 仅保留给 /homeworklist(全部作业 V1 冻结)。功能映射不变,页面文件归属有变。 +2. **HomeworkDetails 双模式**(计划外新增):后端 V2 `detail()` 有 `requireOwned` 归属校验,而 /homeworklist 管理页要看他人作业 → 同一组件按路由分支:`/list/detail` 走 V2(详情+stats),`/homeworklist/detail` 走 V1 冻结 Detail。 +3. **学生端 redo 桶**(§4 风险 7 落地):采用「initTab 改 todo + 页内 RETURNED 红色强化置顶(当前页内重排)」;未做服务端 redo 过滤(V2 无此桶)。 +4. **修改提交语义**:后端 `doSubmit` 对「已交未批」无拦截,POST 直接生成新版本——修改提交无需先撤回;撤回(withdraw)是独立动作(截止前,生成 NOT_SUBMITTED 空行后重新 POST)。 +5. **已截止且 allowLate=0 的 RETURNED**:前端在列表与详情均禁重交入口(后端 doSubmit 必拒,前后端口径一致)。 +6. **vite 代理**:发现工作区实际指向远程测试环境,按计划改回 `http://localhost:8102`(远程地址保留注释可切回)。 + +### 8.3 P4 清理与 mock + +- **V1 客户端收敛**(api/module/homework.ts):仅保留仍被消费的 9 方法(sendList/modify/getHomeworkDetails/getNextPrevHomework/orgizeModify/deleteHomework/statistics/fileDownUrl/allFileDownUrl);删除伪接口方法(Submissions/SubmissionDetail/Grade/Remind/MyHomeworks/MySubmission/Submit)与孤儿方法(list/initializeRed/create/editHomework/receiveUsers/userPull/setTopmost/expedite + baseApi.getClassTree + postForm 辅助)。 +- **types/homework.ts**:收敛为 V1 冻结契约,删 11 个孤儿类型(HomeworkPageResult/InitializeRedVo/HomeworkRequest/SubmitStatus/SubmissionBrief/SubmissionGroup/SubmissionsResultVo/GradeResult/SubmissionDetailVo/GradeRequest/ClassTreeNode/v2 学生端 6 类型等)。 +- **删除被切换孤儿化的组件**:HomeworkUpload(消费者全部改 AttachmentUpload)、ClassCheckInput、UserCheckModal(ClassCheckInput 唯一消费者)。模板遗留死组件(BschImport/MyTree/TablePage 系等 M5 前已死)未动,留待统一清理。 +- **mock 整体重写**(.backup/20260916-m5-v2-mock/ 有改动前快照):「V2 单一存储 + V1 适配层」——V2 端点 28 个直连存储(教师 19/学生 6/通知 3),V1 冻结 7 端点(SendList/Detail/GetDetail/GetNextPrev/ReadDetail/Delete/Statis)由同一存储派生(hwStatus 派生映射),与后端「同一张 homework 表」一致;提交内核对齐后端 doSubmit(版本翻转、逾期 LATE_SUBMITTED 分流、image/attach 必附附件、dataURL 拒绝、仅查阅拒绝、归档拒交),submit/action 返回 `{submissionId}`(走查中发现裸 id 契约偏差后修正,教师 create/copy 为裸 Integer 与后端一致);种子 12 份作业覆盖五态(含 DRAFT_SCHEDULED/ARCHIVED),演示学生定制七种提交态(含 hw12 双版本)。 + +### 8.4 验收实测 + +1. **dev:mock 冒烟(node fetch 逐端点,.backup/20260916-m5-v2-mock/smoke.mjs)**:**58/58 PASS**——教师 23(创建→编辑→定时→取消→发布→详情→统计→矩阵→筛选→提醒(含定向)→延长→复制→删除→批阅→版本→打回→导出占位)、学生 16(四 tab/详情/read/纯文本与带附件提交/withdraw/resubmit/版本递增/仅查阅拒绝/打回态)、通知 4(含 read-all 后 unreadCount=0)、V1 冻结 7、已删伪接口 7 端点全部 404。 +2. **构建**:`npm run build` EXIT=0(约 40s)。`npx tsc --noEmit` 47 条全部为存量(基线 65 条 alova 泛型等,见 §6.4-4;vue-tsc 工具链不可用为既有问题),**零条引用已删符号**。 +3. **浏览器走查(dev:mock @8077,IAB)**:9 页面渲染与数据流全过——/list(14 列统计聚合+草稿箱+定时标签)、/list/new(V2 表单)、/list/detail(统计卡+分班表)、/submissions(矩阵+筛选+未交占位)、/grade(队列 31 份+内嵌工作台)、/homeworklist 与其 detail、/stats(V1 face 由 V2 存储派生)、/stu/today(五态徽标+倒计时+身份自动切换)、/stu/detail(提交表单/双版本历史/打回原因)。**交互闭环**:批阅弹窗填 95 分+评语→保存→toast→矩阵行变「已批阅 95」;/stu/detail 停留 >3 秒→教师矩阵 isRead 0→1(firstReadAt=当前时间)。 +4. **走查发现并修复 3 个缺陷**(均在 44ace7c): + - TeacherHomeworks 操作列 Dropdown 在 render 函数下插槽失效(view-ui-plus 需模板插槽),菜单项内联常显 → 改 column.slot + template #action; + - ReviewModal 残留 Vue2 写法 `:value/@input`(view-ui-plus Modal 是 modelValue),弹窗打不开 → 修正后批阅闭环通过; + - StudentHomeworks「重新提交」按钮缺 canSubmit 门控(已截止且不允许补交时后端必拒)→ 补门控。 +5. **真实后端(8102)E2E 未执行**:本地后端未启动(MySQL/v3_seed 名册环境未就绪),风险 1 的种子账号联调(stu01~stu06)留待后端联调时进行;vite 代理已指向 8102,冒烟与走查均在 mock 模式完成。 + +### 8.5 遗留与后续 + +- 真实后端全链路联调(P1~P3 验收的 8102 实测部分):启动 ClassHomeWork + v3_seed.sql 后按 §3 表逐项补测。 +- 通知中心页面(/notify 轻量页)为可选项未实施;notificationApi 3 端点已就绪并 mock 覆盖。 +- 模板遗留死组件与 `vuedraggable` 依赖统一清理(§7.6 遗留合并处理)。 +- 工作区新增用户文档 `bug检测与修复.md`(并行检测计划,44ace7c 随快照入库);`.gitignore` 增补 `.backup/` 忽略。 +