Browse Source

多媒体查看原卷;统一store

Michael Wang 3 years ago
parent
commit
26405418b1

+ 1 - 1
src/features/mark/CommonMarkBody.vue

@@ -85,7 +85,7 @@ import Viewer from "viewerjs";
 const props = defineProps<{
   useMarkResult?: boolean;
   makeTrack: Function;
-  store: MarkStore; // 实际上不是同一个store!!!
+  store: MarkStore; // 实际上不是同一个store!!! 最新的统一成一个相同的store了
   uniquePropName: string; // TODO: 这个字段不需要了,是以前的rendering字段附带要求的
 }>();
 

+ 63 - 27
src/features/mark/MultiMediaMarkBody.vue

@@ -28,7 +28,7 @@
             v-html="getDomByRichTextJSON(question.standardAnswerr)?.innerHTML"
           />
         </div>
-        <div v-if="route.name !== 'Mark'" style="color: blue">
+        <div v-if="showScore(question)" style="color: blue">
           得分 / 总分 :{{
             (question.score ?? "-") + " / " + question.totalScore
           }}
@@ -50,6 +50,9 @@ import Viewer from "viewerjs";
 import { useRoute } from "vue-router";
 
 const route = useRoute();
+const isSeePaper = route.name === "StudentTrack";
+const showScore = (question: QuestionForRender) =>
+  route.name !== "Mark" && question.totalScore;
 
 interface StudentAnswer {
   mainNumber: number;
@@ -98,32 +101,65 @@ watch(
         q.answer = [q.answer];
       }
     }
-    // TODO: 最好变成有结构的v-for渲染
-    for (const taskQuestion of store.currentTask?.questionList || []) {
-      const questionForRender = {} as QuestionForRender;
-
-      const q: StudentAnswer = stuQuestions.find(
-        (v: StudentAnswer) =>
-          v.mainNumber === taskQuestion.mainNumber &&
-          v.subNumber == taskQuestion.subNumber
-      ) || {
-        mainNumber: taskQuestion.mainNumber,
-        subNumber: taskQuestion.subNumber,
-        answer: [],
-      };
-
-      const questionBody = store.setting.subject.questions.find(
-        (ques) => ques.unionOrder === `${q.mainNumber}-${q.subNumber}`
-      );
-      if (!questionBody) continue;
-      questionForRender.unionOrder = questionBody.unionOrder;
-      questionForRender.parentBody = questionBody.parentBody;
-      questionForRender.body = questionBody.body;
-      questionForRender.standardAnswerr = questionBody.answer;
-      questionForRender.studentAnswer = q.answer;
-      questionForRender.score = taskQuestion.score;
-      questionForRender.totalScore = taskQuestion.maxScore;
-      questions.value.push(questionForRender);
+    // 试卷轨迹显示全部题目
+    if (isSeePaper) {
+      for (const questionBody of store.setting.subject.questions || []) {
+        const questionForRender = {} as QuestionForRender;
+
+        const [mainNumber, subNumber] = questionBody.unionOrder.split("-");
+        const q: StudentAnswer = stuQuestions.find(
+          (v: StudentAnswer) =>
+            questionBody.unionOrder === v.mainNumber + "-" + v.subNumber
+        ) || {
+          mainNumber: mainNumber,
+          subNumber: subNumber,
+          answer: [],
+        };
+
+        const taskQuestion = (store.currentTask?.questionList || []).find(
+          (v) => v.mainNumber + "" == mainNumber && v.subNumber == subNumber
+        );
+
+        // const questionBody = store.setting.subject.questions.find(
+        //   (ques) => ques.unionOrder === `${q.mainNumber}-${q.subNumber}`
+        // );
+        // if (!questionBody) continue;
+        questionForRender.unionOrder = questionBody.unionOrder;
+        questionForRender.parentBody = questionBody.parentBody;
+        questionForRender.body = questionBody.body;
+        questionForRender.standardAnswerr = questionBody.answer;
+        questionForRender.studentAnswer = q.answer;
+        questionForRender.score = taskQuestion?.score || null;
+        questionForRender.totalScore = taskQuestion?.maxScore || 0;
+        questions.value.push(questionForRender);
+      }
+    } else {
+      for (const taskQuestion of store.currentTask?.questionList || []) {
+        const questionForRender = {} as QuestionForRender;
+
+        const q: StudentAnswer = stuQuestions.find(
+          (v: StudentAnswer) =>
+            v.mainNumber === taskQuestion.mainNumber &&
+            v.subNumber == taskQuestion.subNumber
+        ) || {
+          mainNumber: taskQuestion.mainNumber,
+          subNumber: taskQuestion.subNumber,
+          answer: [],
+        };
+
+        const questionBody = store.setting.subject.questions.find(
+          (ques) => ques.unionOrder === `${q.mainNumber}-${q.subNumber}`
+        );
+        if (!questionBody) continue;
+        questionForRender.unionOrder = questionBody.unionOrder;
+        questionForRender.parentBody = questionBody.parentBody;
+        questionForRender.body = questionBody.body;
+        questionForRender.standardAnswerr = questionBody.answer;
+        questionForRender.studentAnswer = q.answer;
+        questionForRender.score = taskQuestion.score;
+        questionForRender.totalScore = taskQuestion.maxScore;
+        questions.value.push(questionForRender);
+      }
     }
   },
   { immediate: true }

+ 4 - 3
src/features/student/inspect/Inspect.vue

@@ -23,13 +23,13 @@ import {
   rejectInspectedTask,
   saveInspectedTask,
 } from "@/api/inspectPage";
-import { isScanImage, store } from "../store";
+import { isScanImage, store } from "@/features/mark/store";
 import MarkHeader from "./MarkHeader.vue";
 import { useRoute } from "vue-router";
 import MarkBody from "./MarkBody.vue";
 import MarkHistory from "./MarkHistory.vue";
 import MarkBoardInspect from "./MarkBoardInspect.vue";
-import type { Question, Task } from "@/types";
+import type { Question, Task, Setting } from "@/types";
 import { message } from "ant-design-vue";
 import { getPaper } from "@/api/jsonMark";
 
@@ -68,7 +68,8 @@ async function updateSetting() {
   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 =

+ 1 - 1
src/features/student/inspect/MarkBoardInspect.vue

@@ -94,7 +94,7 @@
 import type { Question } from "@/types";
 import { message } from "ant-design-vue";
 import { computed, reactive, watch } from "vue";
-import { store } from "../store";
+import { store } from "@/features/mark/store";
 
 const emit = defineEmits(["inspect", "reject"]);
 let checkedQuestions = reactive([] as Array<Question>);

+ 1 - 1
src/features/student/inspect/MarkBody.vue

@@ -30,7 +30,7 @@
 
 <script setup lang="ts">
 import { computed, reactive, ref, watch } from "vue";
-import { store } from "../store";
+import { store } from "@/features/mark/store";
 import MarkDrawTrack from "./MarkDrawTrack.vue";
 import type { SpecialTag, Track } from "@/types";
 import { useTimers } from "@/setups/useTimers";

+ 1 - 1
src/features/student/inspect/MarkDrawTrack.vue

@@ -24,7 +24,7 @@
 
 <script setup lang="ts">
 import type { SpecialTag, Track } from "@/types";
-import { store } from "../store";
+import { store } from "@/features/mark/store";
 import { toRefs, watch } from "vue";
 
 const props = defineProps<{

+ 1 - 1
src/features/student/inspect/MarkHeader.vue

@@ -52,7 +52,7 @@
 <script setup lang="ts">
 import { clearInspectedTask } from "@/api/inspectPage";
 import { onMounted, ref } from "vue";
-import { store, isScanImage } from "../store";
+import { store, isScanImage } from "@/features/mark/store";
 import {
   SnippetsOutlined,
   UserOutlined,

+ 1 - 1
src/features/student/inspect/MarkHistory.vue

@@ -55,7 +55,7 @@ import { getInspectedHistory } from "@/api/inspectPage";
 import type { Task } from "@/types";
 import { ref, watch, watchEffect } from "vue";
 import { useRoute } from "vue-router";
-import { store } from "../store";
+import { store } from "@/features/mark/store";
 import { CloseOutlined } from "@ant-design/icons-vue";
 import { cloneDeep } from "lodash";
 

+ 0 - 35
src/features/student/store.ts

@@ -1,35 +0,0 @@
-import { InspectStore } from "@/types";
-import { reactive } from "vue";
-
-const obj = {
-  setting: {
-    fileServer: "",
-    userName: "",
-    subject: { name: "", code: "", paperUrl: "", questions: [] },
-    examType: "SCAN_IMAGE",
-    uiSetting: {
-      "answer.paper.scale": 1,
-      "score.board.collapse": false,
-    },
-    splitConfig: [],
-  },
-  status: {
-    totalCount: 0,
-  },
-  currentTask: undefined,
-  historyOpen: false,
-  MarkBoardTrackCollapse: false,
-  historyTasks: [],
-  focusTracks: [],
-  message: null,
-} as InspectStore;
-
-/**
- * 是否是扫描阅卷
- * @returns boolean
- */
-export function isScanImage() {
-  return store.setting.examType === "SCAN_IMAGE";
-}
-
-export const store = reactive(obj);

+ 19 - 0
src/features/student/studentTrack/MarkBody.vue

@@ -0,0 +1,19 @@
+<template>
+  <CommonMarkBody
+    v-if="store"
+    :useMarkResult="false"
+    :store="store"
+    uniquePropName="libraryId"
+    @error="$emit('error')"
+    :makeTrack="() => {}"
+  />
+</template>
+
+<script setup lang="ts">
+import CommonMarkBody from "@/features/mark/CommonMarkBody.vue";
+import { store } from "@/features/mark/store";
+
+defineEmits(["error"]);
+</script>
+
+<style scoped></style>

+ 1 - 1
src/features/student/studentTrack/MarkHeader.vue

@@ -25,7 +25,7 @@
 </template>
 
 <script setup lang="ts">
-import { store, isScanImage } from "../store";
+import { store, isScanImage } from "@/features/mark/store";
 import { PoweroffOutlined } from "@ant-design/icons-vue";
 import ZoomPaper from "@/components/ZoomPaper.vue";
 

+ 39 - 24
src/features/student/studentTrack/StudentTrack.vue

@@ -9,11 +9,11 @@
 
 <script setup lang="ts">
 import { onMounted } from "vue";
-import { isScanImage, store } from "../store";
+import { isScanImage, store } from "@/features/mark/store";
 import MarkHeader from "./MarkHeader.vue";
 import { useRoute } from "vue-router";
-import MarkBody from "../inspect/MarkBody.vue";
-import type { Task } from "@/types";
+import MarkBody from "./MarkBody.vue";
+import type { Task, Setting } from "@/types";
 import { message } from "ant-design-vue";
 import { getSingleStudentTask } from "@/api/studentTrackPage";
 import { getInspectedSetting } from "@/api/inspectPage";
@@ -27,13 +27,18 @@ 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;
+  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;
@@ -50,28 +55,38 @@ async function updateTask() {
   let res = await getSingleStuTask();
   // message.success({ content: "获取成功", key: mkey });
 
-  if (res.data.sliceUrls) {
-    store.setting.fileServer = res.data.fileServer;
-    store.setting.uiSetting = {
-      "answer.paper.scale": 1,
-      "score.board.collapse": false,
-    };
+  // 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;
+  // 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);
+  // 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;
+  // store.currentTask = task;
+  if (res.data.studentId) {
+    let rawTask = res.data as Task;
+    rawTask.sliceUrls = rawTask.sliceUrls?.map(
+      (s) => store.setting.fileServer + s
+    );
+    rawTask.sheetUrls = rawTask.sheetUrls?.map(
+      (s) => store.setting.fileServer + s
+    );
+    rawTask.jsonUrl = store.setting.fileServer + rawTask.jsonUrl;
+    store.currentTask = res.data;
   } else {
     store.message = res.data.message;
   }

+ 1 - 0
src/router/index.ts

@@ -18,6 +18,7 @@ const routes = [
   },
   {
     path: "/admin/exam/track/student",
+    name: "StudentTrack",
     component: () => import("@/features/student/studentTrack/StudentTrack.vue"),
   },
   {