刘洋 1 жил өмнө
parent
commit
8df62bc45e

+ 35 - 0
src/features/OnlineExam/Examing/FaceId.vue

@@ -162,18 +162,39 @@ async function faceTestEnd(receivedMsg: FaceIDMessage) {
   });
   if (receivedMsg.verifyCount == 1) {
     if (receivedMsg.verifyResult == "TIME_OUT") {
+      if (store.QECSConfig.FACE_VERIFY_FORCE_EXIT === "false") {
+        logger({
+          cnl: ["server"],
+          act: "第一次指定动作检测超时,但是因为配置不强制,于是允许继续考试",
+        });
+        return;
+      }
       logger({
         cnl: ["server"],
         act: "第一次指定动作检测超时,检测失败,系统退出,请重新登录",
       });
       showLogout("第一次指定动作检测超时,检测失败,系统退出,请重新登录");
     } else if (receivedMsg.verifyResult == "VERIFY_FAILED") {
+      if (store.QECSConfig.FACE_VERIFY_FORCE_EXIT === "false") {
+        logger({
+          cnl: ["server"],
+          act: "第一次指定动作检测失败,但是因为配置不强制,于是允许继续考试",
+        });
+        return;
+      }
       logger({
         cnl: ["server"],
         act: "第一次指定动作检测失败,系统退出,请重新登录",
       });
       showLogout("第一次指定动作检测失败,系统退出,请重新登录");
     } else if (receivedMsg.verifyResult == "NOT_ONESELF") {
+      if (store.QECSConfig.FACE_VERIFY_FORCE_EXIT === "false") {
+        logger({
+          cnl: ["server"],
+          act: "指定动作检测不合格,但是因为配置不强制,于是允许继续考试",
+        });
+        return;
+      }
       logger({ cnl: ["server"], act: "指定动作检测不合格,结束考试" });
       $message.error("指定动作检测不合格,结束考试");
       return faceTestUploadResult("FAILED");
@@ -182,6 +203,13 @@ async function faceTestEnd(receivedMsg: FaceIDMessage) {
       $message.info("指定动作检测成功,请继续完成考试");
       return faceTestUploadResult("SUCCESS");
     } else if (receivedMsg.verifyResult == "UNKNOWN") {
+      if (store.QECSConfig.FACE_VERIFY_FORCE_EXIT === "false") {
+        logger({
+          cnl: ["server"],
+          act: "第一次指定动作检测异常(fid),但是因为配置不强制,于是允许继续考试",
+        });
+        return;
+      }
       showLogout("第一次指定动作检测异常(fid),系统退出,请重新登录");
     }
   } else if (receivedMsg.verifyCount >= 2) {
@@ -190,6 +218,13 @@ async function faceTestEnd(receivedMsg: FaceIDMessage) {
       $message.info("指定动作检测成功,请继续完成考试");
       return faceTestUploadResult("SUCCESS");
     } else {
+      if (store.QECSConfig.FACE_VERIFY_FORCE_EXIT === "false") {
+        logger({
+          cnl: ["server"],
+          act: "指定动作检测不合格,但是因为配置不强制,于是允许继续考试",
+        });
+        return;
+      }
       logger({ cnl: ["server"], act: "指定动作检测不合格,结束考试" });
       $message.error("指定动作检测不合格,结束考试");
       return faceTestUploadResult("FAILED");

+ 18 - 4
src/features/OnlineExam/OnlineExamList.vue

@@ -10,6 +10,7 @@ import OnlineExamResultList from "./OnlineExamResultList.vue";
 import { useRoute } from "vue-router";
 import { watch } from "vue";
 import { Refresh } from "@vicons/ionicons5";
+import { httpApp } from "@/plugins/axiosApp";
 
 const {
   courses = [],
@@ -25,6 +26,7 @@ const route = useRoute();
 
 let selectedCourse: OnlineExam | null = $ref(null);
 let selectExamState: "EXAMING" | "EXAM_END" = $ref("EXAMING");
+let jumpFaceStep: boolean = $ref(false);
 
 watch(route, () => {
   selectExamState = "EXAMING";
@@ -124,8 +126,19 @@ async function raceEnter(course: OnlineExam) {
       act: "开考未限流",
       dtl: "限流-" + minutesAfterCourseStart + "分进入",
     });
-
-    selectedCourse = course;
+    try {
+      let res = await httpApp.post(
+        `/api/ecs_exam_work/exam/skip/face/check?examId=${course.examId}&examStudentId=${store.user.id}`
+      );
+      if (res?.data) {
+        jumpFaceStep = true;
+      }
+      selectedCourse = course;
+    } catch (err) {
+      $message.error("查询考试的人脸检测设置属性出错!");
+      logger({ cnl: ["server"], act: "查询考试的人脸检测设置属性出错!" });
+      return false;
+    }
   } else {
     logger({
       cnl: ["server"],
@@ -143,7 +156,7 @@ async function raceEnter(course: OnlineExam) {
     });
   }
 }
-		
+
 const emit = defineEmits<{ (e: "refresh"): void }>();
 function refreshPage() {
   emit("refresh");
@@ -168,7 +181,7 @@ function refreshPage() {
       >
         已结束考试
       </n-button>
-      	
+
       <n-button strong secondary circle type="success" @click="refreshPage">
         <template #icon>
           <n-icon><Refresh /></n-icon> </template
@@ -233,6 +246,7 @@ function refreshPage() {
   <StartExamModal
     v-if="selectedCourse"
     :course="selectedCourse"
+    :jumpFaceStep="jumpFaceStep"
     @onUnselectCourse="selectedCourse = null"
   />
 </template>

+ 20 - 10
src/features/OnlineExam/StartExamModal.vue

@@ -13,7 +13,10 @@ import { getKey } from "@/utils/utils";
 import { AxiosError } from "axios";
 import { doDec, doEnc } from "@/utils/encDec";
 
-const { course } = defineProps<{ course: OnlineExam }>();
+const { course, jumpFaceStep } = defineProps<{
+  course: OnlineExam;
+  jumpFaceStep: boolean;
+}>();
 
 const emit = defineEmits<{ (e: "on-unselect-course"): void }>();
 
@@ -22,13 +25,20 @@ const emit = defineEmits<{ (e: "on-unselect-course"): void }>();
  * 1. 自动跳转在watch里面
  * 2. 用户事件跳转,通过组件注册事件
  */
-const STEPS = [
+// const STEPS = [
+//   "COMMITTMENT",
+//   "CHECK_ENV_1",
+//   "CHECK_ENV_2",
+//   "CHECK_FACE",
+//   "CHECK_FACE_COMMITTMENT",
+// ] as const;
+const STEPS = $computed(() => [
   "COMMITTMENT",
   "CHECK_ENV_1",
   "CHECK_ENV_2",
-  "CHECK_FACE",
+  ...(jumpFaceStep ? [] : ["CHECK_FACE"]),
   "CHECK_FACE_COMMITTMENT",
-] as const;
+]);
 
 let curentStep = $ref(-1);
 
@@ -216,12 +226,12 @@ function disagreeCommittment() {
 }
 
 let passedAllChecks = false;
-let loading = $ref(false)
+let loading = $ref(false);
 async function enterExam() {
-  if(loading){
-    return 
+  if (loading) {
+    return;
   }
-  loading = true
+  loading = true;
   let hstate = { examStudentId: course.examStudentId };
   /** 为了代码加密混淆效果更好,隐藏在线考试开始考试的启动逻辑,将在线考试启动接口调用放在该组件内部 */
   if (course.examType === "ONLINE") {
@@ -288,7 +298,7 @@ async function enterExam() {
           possibleError: error,
         });
       }
-      loading = false
+      loading = false;
       return;
     }
   }
@@ -298,7 +308,7 @@ async function enterExam() {
     params: { examId: course.examId },
     query: hstate,
   });
-  loading = false
+  loading = false;
 }
 
 onUnmounted(() => {

+ 2 - 0
src/types/student-client.d.ts

@@ -65,6 +65,8 @@ export type Store = {
     /** @deprecated 登录支持的客户端类型。新版只支持Electron包。 */
     LOGIN_SUPPORT: Partial<["NATIVE", "BROWSER"]>;
     SHOW_INFO?: string;
+    FACE_VERIFY_FORCE_EXIT?: string;
+    EXAMING_BLACK_LIST_CHECK?: string;
   };
   /** 电脑时间管理 */
   sysTime: {