Explorar o código

优化管理后台页面setting的初始化

Michael Wang %!s(int64=3) %!d(string=hai) anos
pai
achega
a28c305f3b

+ 12 - 23
src/features/arbitrate/Arbitrate.vue

@@ -77,30 +77,19 @@ async function updateSetting() {
     subjectCode,
     groupNumber
   );
-  store.setting.examType = settingRes.data.examType;
-  store.setting.fileServer = settingRes.data.fileServer;
-  store.setting.subject = settingRes.data.subject;
-  store.setting.userName = settingRes.data.userName;
+  const { examType, fileServer, subject, userName, splitConfig } =
+    settingRes.data;
+  store.initSetting({
+    examType,
+    fileServer,
+    subject,
+    userName,
+    splitConfig,
+  });
   store.setting.selective = settingRes.data.selective;
-  store.setting.uiSetting = {
-    "answer.paper.scale": 1,
-    "score.board.collapse": false,
-    "normal.mode": "keyboard",
-  } as Setting["uiSetting"];
-  store.setting.mode = ModeEnum.COMMON;
-  store.setting.splitConfig = settingRes.data.splitConfig;
-
-  if (store.setting.subject?.answerUrl) {
-    store.setting.subject.answerUrl =
-      store.setting.fileServer + store.setting.subject?.answerUrl;
-  }
-  if (store.setting.subject?.paperUrl) {
-    store.setting.subject.paperUrl =
-      store.setting.fileServer + store.setting.subject?.paperUrl;
 
-    if (!store.isScanImage) {
-      await getPaper(store);
-    }
+  if (store.setting.subject?.paperUrl && !store.isScanImage) {
+    await getPaper(store);
   }
 }
 async function updateStatus() {
@@ -156,7 +145,7 @@ async function fetchTask() {
 onMounted(async () => {
   await updateClearTask();
   await updateSetting();
-  await fetchTask(); // mark-header 会调用 (watchEffect)
+  await fetchTask();
 });
 
 watch(

+ 13 - 17
src/features/library/inspect/LibraryInspect.vue

@@ -49,23 +49,19 @@ async function updateClearTask() {
 
 async function updateSetting() {
   const settingRes = await getInspectedSetting(subjectCode);
-  store.setting.examType = settingRes.data.examType;
-  store.setting.fileServer = settingRes.data.fileServer;
-  store.setting.subject = settingRes.data.subject;
-  store.setting.userName = settingRes.data.userName;
-  store.setting.uiSetting = {
-    "answer.paper.scale": 1,
-    "score.board.collapse": false,
-    "normal.mode": "keyboard",
-  } as Setting["uiSetting"];
-  store.setting.splitConfig = settingRes.data.splitConfig;
-  if (store.setting.subject?.paperUrl) {
-    store.setting.subject.paperUrl =
-      store.setting.fileServer + store.setting.subject?.paperUrl;
-
-    if (!store.isScanImage) {
-      await getPaper(store);
-    }
+
+  const { examType, fileServer, subject, userName, splitConfig } =
+    settingRes.data;
+  store.initSetting({
+    examType,
+    fileServer,
+    subject,
+    userName,
+    splitConfig,
+  });
+
+  if (store.setting.subject?.paperUrl && !store.isScanImage) {
+    await getPaper(store);
   }
 }
 async function updateStatus() {

+ 11 - 19
src/features/library/libraryTrack/LibraryTrack.vue

@@ -28,22 +28,18 @@ let subjectCode = route.query.subjectCode;
 
 async function updateSetting() {
   const settingRes = await getInspectedSetting(subjectCode as string);
-  store.setting.examType = settingRes.data.examType;
-  store.setting.fileServer = settingRes.data.fileServer;
-  store.setting.userName = settingRes.data.userName;
-  store.setting.subject = settingRes.data.subject;
-  store.setting.uiSetting = {
-    "answer.paper.scale": 1,
-    "score.board.collapse": false,
-  } as MarkStore["setting"]["uiSetting"];
-  store.setting.splitConfig = settingRes.data.splitConfig;
-  if (store.setting.subject?.paperUrl) {
-    store.setting.subject.paperUrl =
-      store.setting.fileServer + store.setting.subject?.paperUrl;
+  const { examType, fileServer, subject, userName, splitConfig } =
+    settingRes.data;
+  store.initSetting({
+    examType,
+    fileServer,
+    subject,
+    userName,
+    splitConfig,
+  });
 
-    if (!store.isScanImage) {
-      await getPaper(store);
-    }
+  if (store.setting.subject?.paperUrl && !store.isScanImage) {
+    await getPaper(store);
   }
 }
 
@@ -60,10 +56,6 @@ async function updateTask() {
     store.setting.fileServer = res.data.fileServer;
     store.setting.splitConfig = res.data.splitConfig;
     store.setting.groupNumber = res.data.groupNumber;
-    store.setting.uiSetting = {
-      "answer.paper.scale": 1,
-      "score.board.collapse": false,
-    } as MarkStore["setting"]["uiSetting"];
 
     let task = res.data.task as Task;
 

+ 11 - 21
src/features/library/quality/Quality.vue

@@ -24,7 +24,6 @@ import MarkHeader from "./MarkHeader.vue";
 import { useRoute } from "vue-router";
 import MarkBody from "./MarkBody.vue";
 import MarkHistory from "@/features/mark/MarkHistory.vue";
-import { MarkStore } from "@/types";
 import { getInspectedSetting } from "@/api/inspectPage";
 import MinimapModal from "@/features/mark/MinimapModal.vue";
 import PaperModal from "@/features/mark/PaperModal.vue";
@@ -41,27 +40,18 @@ const { subjectCode, markerId, markerScore } = route.query as {
 
 async function updateSetting() {
   const settingRes = await getInspectedSetting(subjectCode);
-  store.setting.examType = settingRes.data.examType;
-  store.setting.fileServer = settingRes.data.fileServer;
-  store.setting.subject = settingRes.data.subject;
-  store.setting.userName = settingRes.data.userName;
-  store.setting.uiSetting = {
-    "answer.paper.scale": 1,
-    "score.board.collapse": false,
-  } as MarkStore["setting"]["uiSetting"];
-  store.setting.splitConfig = settingRes.data.splitConfig;
-  store.setting.subject = settingRes.data.subject || {};
-  if (store.setting.subject?.answerUrl) {
-    store.setting.subject.answerUrl =
-      store.setting.fileServer + store.setting.subject?.answerUrl;
-  }
-  if (store.setting.subject?.paperUrl) {
-    store.setting.subject.paperUrl =
-      store.setting.fileServer + store.setting.subject?.paperUrl;
+  const { examType, fileServer, subject, userName, splitConfig } =
+    settingRes.data;
+  store.initSetting({
+    examType,
+    fileServer,
+    subject,
+    userName,
+    splitConfig,
+  });
 
-    if (!store.isScanImage) {
-      await getPaper(store);
-    }
+  if (store.setting.subject?.paperUrl && !store.isScanImage) {
+    await getPaper(store);
   }
 }
 

+ 3 - 4
src/features/mark/Mark.vue

@@ -93,10 +93,9 @@ async function updateSetting() {
   if (store.setting.subject?.paperUrl) {
     store.setting.subject.paperUrl =
       store.setting.fileServer + store.setting.subject?.paperUrl;
-
-    if (!store.isScanImage) {
-      await getPaper(store);
-    }
+  }
+  if (store.setting.subject?.paperUrl && !store.isScanImage) {
+    await getPaper(store);
   }
 }
 

+ 10 - 8
src/features/student/importInspect/ImportInspect.vue

@@ -41,15 +41,17 @@ let currentStudentId = $ref(0);
 
 async function updateSetting() {
   const settingRes = await getInspectedSetting(studentId);
-  store.setting.examType = settingRes.data.examType;
-  store.setting.fileServer = settingRes.data.fileServer;
+  const { examType, fileServer, subject, userName, splitConfig } =
+    settingRes.data;
+  store.initSetting({
+    examType,
+    fileServer,
+    subject,
+    userName,
+    splitConfig,
+  });
   store.status.totalCount = settingRes.data.inspectCount;
   store.status.markedCount = 0;
-  store.setting.uiSetting = {
-    "answer.paper.scale": 1,
-    "score.board.collapse": false,
-    "normal.mode": "keyboard",
-  } as Setting["uiSetting"];
 
   if (!settingRes.data.inspectCount) {
     store.message = settingRes.data.message;
@@ -110,7 +112,7 @@ async function fetchTask(next: boolean, init?: boolean) {
 
 onMounted(async () => {
   await updateSetting();
-  await fetchTask(true, true); // mark-header 会调用 (watchEffect)
+  await fetchTask(true, true);
 });
 
 const realStudentId = computed(

+ 11 - 17
src/features/student/inspect/Inspect.vue

@@ -67,23 +67,17 @@ async function updateClearTask() {
 
 async function updateSetting() {
   const settingRes = await getInspectedSetting(subjectCode);
-  store.setting.examType = settingRes.data.examType;
-  store.setting.fileServer = settingRes.data.fileServer;
-  store.setting.subject = settingRes.data.subject;
-  store.setting.userName = settingRes.data.userName;
-  store.setting.uiSetting = {
-    "answer.paper.scale": 1,
-    "score.board.collapse": false,
-    "normal.mode": "keyboard",
-  } as Setting["uiSetting"];
-  store.setting.splitConfig = settingRes.data.splitConfig;
-  if (store.setting.subject?.paperUrl) {
-    store.setting.subject.paperUrl =
-      store.setting.fileServer + store.setting.subject?.paperUrl;
-
-    if (!store.isScanImage) {
-      await getPaper(store);
-    }
+  const { examType, fileServer, subject, userName, splitConfig } =
+    settingRes.data;
+  store.initSetting({
+    examType,
+    fileServer,
+    subject,
+    userName,
+    splitConfig,
+  });
+  if (store.setting.subject?.paperUrl && !store.isScanImage) {
+    await getPaper(store);
   }
 }
 async function updateStatus() {

+ 11 - 43
src/features/student/studentTrack/StudentTrack.vue

@@ -36,27 +36,17 @@ let subjectCode = route.query.subjectCode as string;
 
 async function updateSetting() {
   const settingRes = await getInspectedSetting(subjectCode);
-  store.setting.examType = settingRes.data.examType;
-  store.setting.fileServer = settingRes.data.fileServer;
-  store.setting.userName = settingRes.data.userName;
-  store.setting.uiSetting = {
-    "answer.paper.scale": 1,
-    "score.board.collapse": false,
-    "normal.mode": "keyboard",
-  } as Setting["uiSetting"];
-  store.setting.splitConfig = settingRes.data.splitConfig;
-  store.setting.subject = settingRes.data.subject;
-  if (store.setting.subject?.answerUrl) {
-    store.setting.subject.answerUrl =
-      store.setting.fileServer + store.setting.subject?.answerUrl;
-  }
-  if (store.setting.subject?.paperUrl) {
-    store.setting.subject.paperUrl =
-      store.setting.fileServer + store.setting.subject?.paperUrl;
-
-    if (!store.isScanImage) {
-      await getPaper(store);
-    }
+  const { examType, fileServer, subject, userName, splitConfig } =
+    settingRes.data;
+  store.initSetting({
+    examType,
+    fileServer,
+    subject,
+    userName,
+    splitConfig,
+  });
+  if (store.setting.subject?.paperUrl && !store.isScanImage) {
+    await getPaper(store);
   }
 }
 
@@ -69,28 +59,6 @@ async function updateTask() {
     key: mkey,
   });
 
-  // if (res.data.sliceUrls) {
-  //   store.setting.fileServer = res.data.fileServer;
-  //   store.setting.uiSetting = {
-  //     "answer.paper.scale": 1,
-  //     "score.board.collapse": false,
-  //   };
-
-  // let task = {} as Task;
-  // task.examNumber = res.data.examNumber;
-
-  // task.sliceUrls = res.data.sliceUrls.map(
-  //   (s: string) => store.setting.fileServer + s
-  // );
-  // // 目前api并没有区分score和tag
-  // task.questionList = [
-  //   // @ts-ignore
-  //   // { trackList: res.data.tagList.filter((q) => !q.tagName) },
-  // ];
-  // // @ts-ignore
-  // task.specialTagList = res.data.tagList.filter((q) => q.tagName);
-
-  // store.currentTask = task;
   if (res.data.studentId) {
     let rawTask = res.data as Task;
     rawTask.sliceUrls = rawTask.sliceUrls?.map(

+ 20 - 1
src/store/store.ts

@@ -1,4 +1,4 @@
-import { Setting, MarkStore, Track, ModeEnum } from "@/types";
+import { Setting, MarkStore, Track, ModeEnum, AdminPageSetting } from "@/types";
 import { watch } from "vue";
 import { defineStore } from "pinia";
 
@@ -83,6 +83,25 @@ export const useMarkStore = defineStore("mark", {
     },
   },
   actions: {
+    initSetting(adminPageSetting: AdminPageSetting): void {
+      Object.assign(this.setting, adminPageSetting, {
+        mode: ModeEnum.COMMON,
+        uiSetting: {
+          "answer.paper.scale": 1,
+          "score.board.collapse": false,
+          "normal.mode": "keyboard",
+        } as Setting["uiSetting"],
+      });
+      const fileServer = this.setting.fileServer;
+      if (this.setting.subject?.answerUrl) {
+        this.setting.subject.answerUrl =
+          fileServer + this.setting.subject?.answerUrl;
+      }
+      if (this.setting.subject?.paperUrl) {
+        this.setting.subject.paperUrl =
+          fileServer + this.setting.subject?.paperUrl;
+      }
+    },
     toggleHistory(): void {
       this.historyOpen = !this.historyOpen;
     },

+ 17 - 1
src/types/index.ts

@@ -57,7 +57,23 @@ export interface Setting {
   prefetchCount: number; //预加载任务数量
   startTime: number; //评卷开始时间
   endTime: number; //评卷结束时间
-  selective: boolean; // 是否是未选择类型
+  selective: boolean; // 是否是未选做类型
+}
+
+// setting for admin page
+export interface AdminPageSetting {
+  examType: "SCAN_IMAGE" | "MULTI_MEDIA"; // 扫描图片或者多媒体,多媒体只允许 common mode
+  fileServer: string; //图片服务地址
+  userName: string; //管理员姓名
+  subject: {
+    //科目信息(试卷和答案功能)
+    name: string;
+    code: string;
+    answerUrl: string;
+    paperUrl: string;
+    questions: Array<RichTextQuestion>;
+  };
+  splitConfig: Array<number>; //使用裁切整图时的裁切配置 [0,1]|[0,0.3,0.25,0.55],
 }
 
 export enum ModeEnum {