From 003eb9d182d18573e6378c1e8bfe774161abffef Mon Sep 17 00:00:00 2001 From: chenyuan Date: Mon, 3 Aug 2026 10:28:06 +0800 Subject: [PATCH] feat: add comprehensive training student entry --- src/layout/components/Sidebar/index.vue | 8 ++++++++ src/router/index.js | 15 +++++++++++++++ src/views/teacherEnd/task/index.vue | 8 ++++++-- src/views/training/studentTrainingPages.js | 14 ++++++++++++++ 4 files changed, 43 insertions(+), 2 deletions(-) diff --git a/src/layout/components/Sidebar/index.vue b/src/layout/components/Sidebar/index.vue index 777be09..6468863 100644 --- a/src/layout/components/Sidebar/index.vue +++ b/src/layout/components/Sidebar/index.vue @@ -286,6 +286,12 @@ const sidebarStyle = computed(() => { }); const studentCourseNav = [ { title: "AI智能助手", path: "/assistant/index", activePrefix: "/assistant" }, + { + title: "综合实训", + children: [ + { title: "综合案例实训", path: "/comprehensive/index" }, + ], + }, { title: "互联网产品开发基础", children: [ @@ -351,6 +357,7 @@ const teacherManageNav = [ }, ]; const trainingTaskKeyByPath = { + "/comprehensive/index": "comprehensive-case-training", "/foundation/new-product-survey": "new-product-survey", "/foundation/product-development-factors": "product-development-factors", "/foundation/product-development-process": "product-development-process", @@ -382,6 +389,7 @@ const currentCourseNav = computed(() => (isTeacherRole.value : filterStudentCourseNavigation(studentCourseNav, publishedTaskKeys.value))); const studentIconByPath = { "/assistant/index": "MagicStick", + "/comprehensive/index": "School", "/foundation/new-product-survey": "Search", "/foundation/product-development-factors": "SetUp", "/foundation/product-development-process": "Guide", diff --git a/src/router/index.js b/src/router/index.js index da63a1e..4b73cb8 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -153,6 +153,21 @@ export const dynamicRoutes = [ component: () => import("@/views/studentDemo/index.vue"), hidden: true, }, + { + path: "/comprehensive", + component: Layout, + redirect: "/comprehensive/index", + roles: ["student"], + hidden: true, + children: [ + { + path: "index", + component: () => import("@/views/training/GenericTrainingPage.vue"), + name: "ComprehensiveCaseTraining", + meta: { title: "综合实训", icon: "Finished", affix: true, pageKey: "comprehensive-case-training" }, + }, + ], + }, // 互联网产品开发基础 { path: "/foundation", diff --git a/src/views/teacherEnd/task/index.vue b/src/views/teacherEnd/task/index.vue index d33253f..7cbeafe 100644 --- a/src/views/teacherEnd/task/index.vue +++ b/src/views/teacherEnd/task/index.vue @@ -10,7 +10,7 @@ {{ configured ? '已保存发布配置' : '默认全部发布(未配置)' }} - {{ configured ? '仅勾选的实训任务会出现在学生端。' : '当前所有实训任务均已默认勾选,保存后将按勾选结果发布。' }} + {{ configured ? '仅勾选的实训任务会出现在学生端。' : '现有实训任务默认勾选;“综合案例实训”默认不发布,需由教师主动勾选。' }} 保存发布配置 @@ -27,6 +27,7 @@ > + @@ -46,6 +47,7 @@ const configured = ref(false); const loading = ref(false); const saving = ref(false); const tableRef = ref(null); +const comprehensiveTaskKey = "comprehensive-case-training"; let activeLoadGeneration = 0; let selectionSyncGeneration = -1; @@ -113,7 +115,9 @@ async function loadPublication() { configured.value = res.data?.configured === true; selectedTaskKeys.value = configured.value ? (res.data?.taskKeys || []) - : tasks.value.map((task) => task.taskKey); + : tasks.value + .filter((task) => task.taskKey !== comprehensiveTaskKey) + .map((task) => task.taskKey); applySelection(requestGeneration); } finally { if (requestGeneration === activeLoadGeneration) loading.value = false; diff --git a/src/views/training/studentTrainingPages.js b/src/views/training/studentTrainingPages.js index bf4ae30..ad64bf9 100644 --- a/src/views/training/studentTrainingPages.js +++ b/src/views/training/studentTrainingPages.js @@ -1,4 +1,18 @@ export const studentTrainingPages = { + "comprehensive-case-training": { + title: "综合案例实训", + knowledge: "综合实训以一个完整案例串联市场洞察、产品规划、开发验证和上线运营,训练学生在真实业务背景下完成产品开发全流程。", + background: "请根据教师发布的综合案例,梳理问题、方案、实施过程和验证结论。教师可在班级任务配置中替换案例材料、任务说明、步骤和评分要求。", + goals: ["综合运用互联网产品开发方法", "完成基于案例的分析与方案设计", "形成可提交、可评价的完整实训成果"], + task: "请围绕教师发布的综合案例,完成分析、方案设计、实施说明和结果复盘,并提交实训成果。", + flow: ["案例理解", "问题分析", "方案设计", "实施验证", "成果复盘"], + fields: [ + { key: "caseAnalysis", label: "案例与问题分析", type: "textarea", placeholder: "概括案例背景、目标用户、核心问题与关键约束" }, + { key: "solution", label: "整体解决方案", type: "textarea", placeholder: "说明产品方案、关键功能、实施步骤与资源安排" }, + { key: "validation", label: "验证与复盘", type: "textarea", placeholder: "说明验证方式、结果、风险及后续优化建议" }, + ], + keyPoints: ["案例目标", "用户需求", "产品方案", "验证证据", "复盘改进"], + }, "product-development-process": { title: "产品开发主要流程", knowledge: