From e8bda9b43aee558f1836b381963018f3d8f1f3e4 Mon Sep 17 00:00:00 2001 From: chenyuan Date: Thu, 30 Jul 2026 15:24:34 +0800 Subject: [PATCH] feat: add student demo window --- src/api/studentDemo.js | 14 +++++++++ src/api/studentTrainingAnswer.js | 13 ++++++++ src/layout/components/AppMain.vue | 12 ++++++-- src/permission.js | 2 +- src/router/index.js | 9 ++++-- src/utils/auth.js | 26 +++++++++------- src/utils/studentDemo.js | 30 +++++++++++++++++++ src/views/components/TrainingAiEvaluation.vue | 5 ++++ src/views/studentDemo/index.vue | 28 +++++++++++++++++ src/views/teacherEnd/trainingTask/index.vue | 24 +++++++++++++++ src/views/training/GenericTrainingPage.vue | 5 +++- tests/student-demo-mode.static.test.cjs | 24 +++++++++++++++ 12 files changed, 175 insertions(+), 17 deletions(-) create mode 100644 src/api/studentDemo.js create mode 100644 src/utils/studentDemo.js create mode 100644 src/views/studentDemo/index.vue create mode 100644 tests/student-demo-mode.static.test.cjs diff --git a/src/api/studentDemo.js b/src/api/studentDemo.js new file mode 100644 index 0000000..0e6c974 --- /dev/null +++ b/src/api/studentDemo.js @@ -0,0 +1,14 @@ +import request from "@/utils/request"; + +export function createStudentDemoSession(teachingClassId) { + return request({ url: "/api/teacher/student-demo-sessions", method: "post", data: { teachingClassId } }); +} + +export function exchangeStudentDemoSession(ticket) { + return request({ + url: "/api/student-demo-sessions/exchange", + method: "post", + data: { ticket }, + headers: { isToken: false, repeatSubmit: false }, + }); +} diff --git a/src/api/studentTrainingAnswer.js b/src/api/studentTrainingAnswer.js index 5107dd2..45d34bc 100644 --- a/src/api/studentTrainingAnswer.js +++ b/src/api/studentTrainingAnswer.js @@ -1,6 +1,12 @@ import request from "@/utils/request"; +import { getDemoAnswerKey, getStudentDemoSession, isStudentDemo } from "@/utils/studentDemo"; + +function demoResult(taskKey) { + try { return JSON.parse(sessionStorage.getItem(getDemoAnswerKey(taskKey)) || "null"); } catch (error) { return null; } +} export function getStudentTrainingAnswer(taskKey, params) { + if (isStudentDemo()) return Promise.resolve({ code: 200, data: demoResult(taskKey) }); return request({ url: `/api/student-training-answers/${taskKey}`, method: "get", @@ -9,6 +15,11 @@ export function getStudentTrainingAnswer(taskKey, params) { } export function saveStudentTrainingAnswer(taskKey, data) { + if (isStudentDemo()) { + const answer = { ...data, teachingClassId: getStudentDemoSession()?.userInfo?.demoTeachingClassId }; + sessionStorage.setItem(getDemoAnswerKey(taskKey), JSON.stringify(answer)); + return Promise.resolve({ code: 200, data: answer }); + } return request({ url: `/api/student-training-answers/${taskKey}`, method: "post", @@ -18,6 +29,7 @@ export function saveStudentTrainingAnswer(taskKey, data) { } export function deleteStudentTrainingAnswer(taskKey, params) { + if (isStudentDemo()) { sessionStorage.removeItem(getDemoAnswerKey(taskKey)); return Promise.resolve({ code: 200 }); } return request({ url: `/api/student-training-answers/${taskKey}`, method: "delete", @@ -26,6 +38,7 @@ export function deleteStudentTrainingAnswer(taskKey, params) { } export function uploadStudentTrainingFile(data) { + if (isStudentDemo()) return Promise.reject(new Error("演示模式不上传文件")); return request({ url: "/common/upload", method: "post", diff --git a/src/layout/components/AppMain.vue b/src/layout/components/AppMain.vue index 281936a..acb4823 100644 --- a/src/layout/components/AppMain.vue +++ b/src/layout/components/AppMain.vue @@ -6,8 +6,9 @@ * @FilePath: \vue3\src\layout\components\AppMain.vue * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE --> -