From 2ad3ee929ee1c955934862b0e16a046406d246f7 Mon Sep 17 00:00:00 2001 From: chenyuan Date: Thu, 30 Jul 2026 13:30:48 +0800 Subject: [PATCH] feat: add school default task configuration page --- src/api/teacher.js | 20 ++++ src/layout/components/Sidebar/index.vue | 1 + src/router/index.js | 15 +++ src/views/teacherEnd/defaultTask/index.vue | 108 +++++++++++++++++++++ tests/school-default-task.static.test.cjs | 20 ++++ 5 files changed, 164 insertions(+) create mode 100644 src/views/teacherEnd/defaultTask/index.vue create mode 100644 tests/school-default-task.static.test.cjs diff --git a/src/api/teacher.js b/src/api/teacher.js index 7f2b91a..ef5afa8 100644 --- a/src/api/teacher.js +++ b/src/api/teacher.js @@ -552,6 +552,26 @@ export function addTask(data) { }, }); } +// 学校默认实训任务(仅管理员教师) +export function getSchoolDefaultTasks() { + return request({ + url: "/api/school-default-tasks", + method: "GET", + }); +} +export function saveSchoolDefaultTasks(data) { + return request({ + url: "/api/school-default-tasks", + method: "PUT", + data, + }); +} +export function retrySchoolDefaultTaskInitialization() { + return request({ + url: "/api/school-default-tasks/retry", + method: "POST", + }); +} // 成绩中心-查询成绩列表 export function getScoreList(params) { return request({ diff --git a/src/layout/components/Sidebar/index.vue b/src/layout/components/Sidebar/index.vue index fd752aa..ac7f03e 100644 --- a/src/layout/components/Sidebar/index.vue +++ b/src/layout/components/Sidebar/index.vue @@ -586,6 +586,7 @@ function filterRoutesByOrganizationMode(routes) { const majorEnabled = config?.majorManagementEnabled ?? legacyAdminEnabled; const adminClassEnabled = config?.adminClassManagementEnabled ?? legacyAdminEnabled; return routes.filter((route) => { + if (route.meta?.requiresManagerTeacher && userStore.userInfo.teacherAdmin !== true) return false; if (route.meta?.requiresFacultyManagement && !facultyEnabled) return false; if (route.meta?.requiresMajorManagement && !majorEnabled) return false; if (route.meta?.requiresAdminClass && !adminClassEnabled) return false; diff --git a/src/router/index.js b/src/router/index.js index b2bfa3e..937758c 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -551,6 +551,21 @@ export const teacherRoutes = [ ], }, // 任务分配 + { + path: "/default-task", + component: Layout, + redirect: "/default-task/index", + roles: ["teacher"], + meta: { title: "默认实训任务配置", icon: "任务分配", affix: true, requiresManagerTeacher: true }, + children: [ + { + path: "index", + component: () => import("@/views/teacherEnd/defaultTask/index.vue"), + name: "defaultTask", + meta: { title: "默认实训任务配置", icon: "任务分配", affix: true, requiresManagerTeacher: true }, + }, + ], + }, { path: "/task", component: Layout, diff --git a/src/views/teacherEnd/defaultTask/index.vue b/src/views/teacherEnd/defaultTask/index.vue new file mode 100644 index 0000000..e6d4504 --- /dev/null +++ b/src/views/teacherEnd/defaultTask/index.vue @@ -0,0 +1,108 @@ + + + + + diff --git a/tests/school-default-task.static.test.cjs b/tests/school-default-task.static.test.cjs new file mode 100644 index 0000000..d941326 --- /dev/null +++ b/tests/school-default-task.static.test.cjs @@ -0,0 +1,20 @@ +const assert = require("assert"); +const fs = require("fs"); +const path = require("path"); + +const root = path.resolve(__dirname, ".."); +const read = (file) => fs.readFileSync(path.join(root, file), "utf8"); + +const routerSource = read("src/router/index.js"); +const sidebarSource = read("src/layout/components/Sidebar/index.vue"); +const apiSource = read("src/api/teacher.js"); +const pageSource = read("src/views/teacherEnd/defaultTask/index.vue"); + +assert.match(routerSource, /requiresManagerTeacher:\s*true/); +assert.match(sidebarSource, /route\.meta\?\.requiresManagerTeacher/); +assert.match(apiSource, /\/api\/school-default-tasks/); +assert.match(pageSource, /正在初始化,稍后刷新/); +assert.match(pageSource, /立即重试/); +assert.match(pageSource, /:disabled="!isReady"/); + +console.log("school default task front-end contract passed");