From 39824fbb3d49828c7c1391c082e3bd765a40988c Mon Sep 17 00:00:00 2001 From: wanghu Date: Wed, 16 Sep 2026 02:32:31 +0800 Subject: [PATCH] =?UTF-8?q?feat(M5-P1):=20=E6=95=99=E5=B8=88=E7=AB=AF?= =?UTF-8?q?=E5=8F=91=E5=B8=83=E9=93=BE=E8=B7=AF=E5=88=87=E6=8D=A2=20V2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - /list 挂载 TeacherHomeworks(已发布+草稿箱双 Tab,PRD 页 2/3), HomeworkList 仅保留 /homeworklist(全部作业,V1 冻结接口) - NewHomework 切 V2:班级树改 teacherApi.classTree(),创建/编辑一律先落草稿 再按需 publish/schedule,附件改 AttachmentUpload(AttachmentItem[]), 「仅查阅」与其余提交方式互斥;转发场景保留 V1 GetDetail(V2 详情有归属校验) - HomeworkList 摘除伪接口 remind 调用(后端无 /api/homework/Remind) - 路由:/accept 重定向 /stu/today,新增 /stu/detail(学生详情页载体), /stu/redo initTab 改 todo(V2 无独立 redo 桶,RETURNED 归 todo) --- src/router/routes.ts | 42 +++---- src/views/homework/HomeworkList.vue | 15 --- src/views/homework/NewHomework.vue | 168 ++++++++++++++++------------ 3 files changed, 115 insertions(+), 110 deletions(-) diff --git a/src/router/routes.ts b/src/router/routes.ts index 5be5ec8..ea4513a 100644 --- a/src/router/routes.ts +++ b/src/router/routes.ts @@ -5,30 +5,23 @@ import type { RouteRecordRaw } from "vue-router"; * 页面间参数通过 query 传递: * - /list/new?serid= (编辑) * - /list/new?fid= (转发) - * - /list/new?tempid=(模板引用) - * - /list/detail?serid=&type=、/homeworklist/detail?serid=&type= - * type: 0=编辑视角(不标读) 1=普通查看(标读) + * - /list/detail?serid=、/homeworklist/detail?serid= * * modId 是菜单 ↔ 路由的稳定契约(对照后端 GetUserMod 现行数据): - * 1=已收到 2=已发送 3=全部作业 4=作业统计 + * 1=已收到(→学生今日作业) 2=已发送 3=全部作业 4=作业统计 * 发作业为「已发送」的深层子页(modId 22 不在菜单树,meta.parentId=2 关联高亮), * 与 UserBase「应用管理>应用类型管理」范式一致。 */ const routes: RouteRecordRaw[] = [ // v1 教师默认落地:我布置的 { path: "/", redirect: "/list" }, - // 学生收件箱(v2 保留,不在菜单) - { - path: "/accept", - name: "homework_accept", - component: () => import("@/views/homework/HomeworkAccept.vue"), - meta: { title: "已收到", modId: 1 }, - }, - // 我布置的(教师端作业列表) + // v1 收件箱语义已由学生端列表替代(M5 §2.3):旧地址与书签统一导向学生今日作业 + { path: "/accept", redirect: "/stu/today" }, + // 我布置的(教师端 V2:已发布 + 草稿箱) { path: "/list", name: "homework_list", - component: () => import("@/views/homework/HomeworkList.vue"), + component: () => import("@/views/homework/TeacherHomeworks.vue"), meta: { title: "我布置的", modId: 2 }, }, // 提交情况(某作业的已交/未交名单;从列表行或菜单进入,无 serid 时页内选择作业) @@ -53,15 +46,15 @@ const routes: RouteRecordRaw[] = [ component: () => import("@/views/homework/NewHomework.vue"), meta: { title: "发作业", modId: 22, parentId: 2 }, }, - // 全部作业(管理端) + // 全部作业(管理端,V1 冻结接口;详情走 /homeworklist/detail 的 V1 分支) { path: "/homeworklist", name: "homework_manage", component: () => import("@/views/homework/HomeworkList.vue"), meta: { title: "全部作业", modId: 3 }, }, - // 作业详情(同一组件挂两个路由,面包屑/菜单高亮由 meta.parentId 确定父节点: - // 已发送下 /list/detail,全部作业下 /homeworklist/detail;type 区分是否标读) + // 作业详情(同一组件挂两个路由:/list/detail 走 V2 详情+统计(仅本人作业), + // /homeworklist/detail 走 V1 冻结 Detail(管理端可看他人作业;V2 有 requireOwned 校验) { path: "/list/detail", name: "homework_list_detail", @@ -83,19 +76,26 @@ const routes: RouteRecordRaw[] = [ }, /* ---- v2 学生端 ---- */ - // 学生·今日作业 + // 学生·今日作业(tab=all/todo/done/closed) { path: "/stu/today", name: "student_today", component: () => import("@/views/homework/StudentHomeworks.vue"), meta: { title: "今日作业", modId: 31, role: "student" }, }, - // 学生·待订正(复用同一页,默认过滤待订正) + // 学生·待订正(V2 无独立 redo 桶:RETURNED 归入 todo,页内红色强化展示) { path: "/stu/redo", name: "student_redo", component: () => import("@/views/homework/StudentHomeworks.vue"), - meta: { title: "待订正", modId: 32, role: "student", initTab: "redo" }, + meta: { title: "待订正", modId: 32, role: "student", initTab: "todo" }, + }, + // 学生·作业详情/提交/批阅结果(PRD 学生页 2/3 载体) + { + path: "/stu/detail", + name: "student_detail", + component: () => import("@/views/homework/HomeworkAccept.vue"), + meta: { title: "作业详情", modId: 33, role: "student" }, }, /* ---- 旧版路径兼容重定向(书签、残留的平台模块配置) ---- */ @@ -103,10 +103,10 @@ const routes: RouteRecordRaw[] = [ { path: "/newhomework", redirect: "/list/new" }, { path: "/edit", redirect: "/list/new" }, { path: "/manage", redirect: "/homeworklist" }, - { path: "/homework", redirect: "/accept" }, + { path: "/homework", redirect: "/stu/today" }, { path: "/homework/newhomework", redirect: "/list/new" }, { path: "/homework/edit", redirect: "/list/new" }, - { path: "/homework/homework_accept", redirect: "/accept" }, + { path: "/homework/homework_accept", redirect: "/stu/today" }, { path: "/homework/homework_list", redirect: "/list" }, { path: "/homework/manage", redirect: "/homeworklist" }, { path: "/homework/homework_details", redirect: "/list/detail" }, diff --git a/src/views/homework/HomeworkList.vue b/src/views/homework/HomeworkList.vue index 80355d1..6cf8460 100644 --- a/src/views/homework/HomeworkList.vue +++ b/src/views/homework/HomeworkList.vue @@ -104,20 +104,6 @@ function viewSubmissions(row: HomeworkVo) { function edit(row: HomeworkVo) { router.push({ path: "/list/new", query: { serid: row.id } }); } -function remind(row: HomeworkVo) { - MyConfirm({ - title: "催交", - msg: `向“ ${row.title} ”的未交学生发送提交提醒?`, - async onOk() { - try { - const r = await homeworkApi.remind(row.id).send(); - Message.success(`已提醒 ${(r && (r as any).reminded) ?? 0} 位未交学生`); - } catch (e: any) { - Message.error(e.message || "催交失败"); - } - }, - }); -} function del(row: HomeworkVo) { MyConfirm({ title: "删除", @@ -236,7 +222,6 @@ const columns = [ const nodes: any[] = []; if (row.hwStatus !== "draft" && (row as any).progress) nodes.push(opBtn(h, "提交情况", "icon-chakan", () => viewSubmissions(row))); if (row.hwStatus === "draft") nodes.push(opBtn(h, "编辑", "icon-edit", () => edit(row))); - if (row.hwStatus === "collecting" && row.progress && row.progress.unsubmitted > 0) nodes.push(opBtn(h, "催交", "icon-fasong", () => remind(row))); nodes.push(opBtn(h, "删除", "icon-ashbin", () => del(row))); return nodes; }, diff --git a/src/views/homework/NewHomework.vue b/src/views/homework/NewHomework.vue index 4b4ff2d..b4005fd 100644 --- a/src/views/homework/NewHomework.vue +++ b/src/views/homework/NewHomework.vue @@ -1,13 +1,14 @@