浏览代码

5.0.3开发中

刘洋 1 年之前
父节点
当前提交
6058ec9d61

+ 38 - 6
src/features/OnlineExam/Examing/ArrowNavView.vue

@@ -1,8 +1,10 @@
 <script setup lang="ts">
 import { store } from "@/store/store";
-import { useRoute } from "vue-router";
+import { useRoute, useRouter } from "vue-router";
+import { useCheckMultipleAnswer } from "./setups/useCheckMultipleAnswer";
 
 const route = useRoute();
+const router = useRouter();
 
 // 借用是0的时候不显示此button
 const previousQuestionOrder = $computed(() => {
@@ -14,13 +16,28 @@ const nextQuestionOrder = $computed(() => {
   const order = +route.params.order;
   return order < store.exam.examQuestionList.length ? order + 1 : 0;
 });
+const toggleQuestion = (isNext: boolean) => {
+  const callback = () => {
+    let path = isNext
+      ? `/online-exam/exam/${route.params.examId}/examRecordData/${route.params.examRecordDataId}/order/${nextQuestionOrder}`
+      : `/online-exam/exam/${route.params.examId}/examRecordData/${route.params.examRecordDataId}/order/${previousQuestionOrder}`;
+    void router.push(path);
+  };
+  const { canToggle, rejectHandler } = useCheckMultipleAnswer();
+  if (!canToggle) {
+    rejectHandler(callback);
+    return;
+  } else {
+    callback();
+  }
+};
 </script>
 
 <template>
   <div class="arrow-container">
     <div class="prev">
       <template v-if="previousQuestionOrder">
-        <router-link
+        <!-- <router-link
           class="qm-primary-button"
           :to="{
             path: `/online-exam/exam/${route.params.examId}/examRecordData/${route.params.examRecordDataId}/order/${previousQuestionOrder}`,
@@ -28,17 +45,25 @@ const nextQuestionOrder = $computed(() => {
           ondragstart="return false;"
         >
           上一题
-        </router-link>
+        </router-link> -->
+        <a
+          class="qm-primary-button"
+          ondragstart="return false;"
+          style="cursor: pointer"
+          @click="toggleQuestion(false)"
+          >上一题</a
+        >
       </template>
 
       <template v-else>
         <div>上一题</div>
       </template>
     </div>
-    <div class="tips">A、B、C、D可勾选选项。<!-- Y、N来勾选判断题。 --></div>
+    <!-- <div class="tips">A、B、C、D可勾选选项。</div> -->
+    <div></div>
     <div class="next">
       <template v-if="nextQuestionOrder">
-        <router-link
+        <!-- <router-link
           class="qm-primary-button"
           ondragstart="return false;"
           :to="{
@@ -46,7 +71,14 @@ const nextQuestionOrder = $computed(() => {
           }"
         >
           下一题
-        </router-link>
+        </router-link> -->
+        <a
+          class="qm-primary-button"
+          ondragstart="return false;"
+          style="cursor: pointer"
+          @click="toggleQuestion(true)"
+          >下一题</a
+        >
       </template>
 
       <template v-else>

+ 1 - 0
src/features/OnlineExam/Examing/ChoiceQuestionView.vue

@@ -91,6 +91,7 @@ function answerQuestion(studentAnswer: string) {
     } else {
       examQuestion.studentAnswer = studentAnswer;
     }
+    console.log("examQuestion.studentAnswer", examQuestion.studentAnswer);
   }
   store.updateExamQuestion({
     order: examQuestion.order,

+ 4 - 3
src/features/OnlineExam/Examing/ExamingHome.vue

@@ -237,9 +237,10 @@ function checkRemoteAppClicked() {
 addInterval(() => checkRemoteApp(), 3 * 60 * 1000);
 //#endregion 防作弊检查
 
-const userInfo = $computed(
-  () => store.user.displayName + " - " + store.user.studentCodeList.join(",")
-);
+const userInfo = $computed(() => {
+  //todo
+  return store.user.displayName + " - " + store.user.studentCodeList.join(",");
+});
 </script>
 
 <template>

+ 31 - 4
src/features/OnlineExam/Examing/QuestionNavView.vue

@@ -2,9 +2,10 @@
 import { store } from "@/store/store";
 import { ExamQuestion } from "@/types/student-client";
 import { toChineseNumber } from "@/utils/utils";
-import { useRoute } from "vue-router";
-
+import { useRoute, useRouter } from "vue-router";
+import { useCheckMultipleAnswer } from "./setups/useCheckMultipleAnswer";
 const route = useRoute();
+const router = useRouter();
 
 function getQuestionNum(section: number, index: number): ExamQuestion {
   let total = 0;
@@ -65,6 +66,18 @@ function sectionQuestions(section: number) {
     (q) => q.mainNumber === section + 1
   );
 }
+const toggleQuestion = (path: string) => {
+  const callback = () => {
+    void router.push(path);
+  };
+  const { canToggle, rejectHandler } = useCheckMultipleAnswer();
+  if (!canToggle) {
+    rejectHandler(callback);
+    return;
+  } else {
+    callback();
+  }
+};
 </script>
 
 <template>
@@ -85,7 +98,7 @@ function sectionQuestions(section: number) {
       <div class="list">
         <template v-for="(_, index2) in sectionQuestions(section)">
           <template v-if="isSelectedQuestion(section, index2)">
-            <router-link
+            <!-- <router-link
               :key="index2"
               :class="itemClass(section, index2)"
               ondragstart="return false;"
@@ -98,7 +111,21 @@ function sectionQuestions(section: number) {
               }"
             >
               {{ index2 + 1 }}
-            </router-link>
+            </router-link> -->
+            <a
+              :key="index2"
+              :class="itemClass(section, index2)"
+              ondragstart="return false;"
+              @click="
+                toggleQuestion(
+                  `/online-exam/exam/${$route.params.examId}/examRecordData/${
+                    $route.params.examRecordDataId
+                  }/order/${getQuestionNum(section, index2).order}`
+                )
+              "
+            >
+              {{ index2 + 1 }}
+            </a>
           </template>
         </template>
       </div>

+ 1 - 1
src/features/OnlineExam/Examing/QuestionView.vue

@@ -116,7 +116,7 @@ function toggleSign() {
 
 <template>
   <div
-    v-if="store.exam.currentQuestion.gotQuestionContent"
+    v-if="store.exam.currentQuestion?.gotQuestionContent"
     class="question-container"
   >
     <div class="question-header">

+ 23 - 0
src/features/OnlineExam/Examing/setups/useCheckMultipleAnswer.ts

@@ -0,0 +1,23 @@
+import { store } from "@/store/store";
+export function useCheckMultipleAnswer() {
+  const currentQuestion = store.exam.currentQuestion;
+  const canToggle = !(
+    currentQuestion &&
+    currentQuestion.questionType == "MULTIPLE_CHOICE" &&
+    typeof currentQuestion.studentAnswer === "string" &&
+    currentQuestion.studentAnswer?.length == 1
+  );
+  const rejectHandler = (callback: any) => {
+    $dialog.warning({
+      title: "提示",
+      content: "当前多选题所选答案不足2个,是否跳过?",
+      positiveText: "跳过此题",
+      negativeText: "继续作答",
+      onPositiveClick: callback,
+    });
+  };
+  return {
+    canToggle,
+    rejectHandler,
+  };
+}

+ 7 - 1
src/features/OnlineExam/Examing/setups/useSubmitPaper.tsx

@@ -54,13 +54,19 @@ export function useRealSubmitPaper(
     const signed = store.exam.examQuestionList.filter(
       (q) => q.isStarred
     ).length;
+    const hasMultipleChoiceHalfAnswer = store.exam.examQuestionList.some(item=>{
+      return item.questionType==='MULTIPLE_CHOICE' && typeof(item.studentAnswer)==='string' && item.studentAnswer.length==1
+    })
     $dialog.info({
       title: "确认交卷",
       content: () => (
         <div>
           <p>已答题目:{answered}</p>
-          <p>未答题目:{unanswered}</p>
+          <p style="color:red">未答题目:{unanswered}</p>
           <p>标记题目:{signed}</p>
+          {
+            hasMultipleChoiceHalfAnswer?<p style="margin-top:15px;color:red">提示:存在多选题答案勾选不足2个的试题</p>:null
+          }
         </div>
       ),
       positiveText: "确定",