林旭祥 8 mesiacov pred
rodič
commit
1d78d99f91

+ 1 - 0
src/utils/ws.ts

@@ -51,6 +51,7 @@ export const initWs = (data: any, callback: any) => {
     }
   }, 20000);
   socket.on('connect', (e: any) => {
+    callback({ cmd: 'mySid', data: { sid: socket.id.replace('/midexam#', '') } });
     if (testList.length > 1) {
       //单WS多区
       testList.forEach((item: any) => {

+ 27 - 1
src/views/train/multiple.vue

@@ -89,8 +89,9 @@ const data = reactive<any>({
   styleType: null,//展示样式1:1-5个,2:6-10个,3:10个以上
   showReportList: false,//显示隐藏测试记录
   exit: 0,//退出响应次数
+  sid: null,//WS的id
 });
-const { timerManager, parameter, time, userInfo, examState, needStart, showTestAgain, testList, multipleItemRefList, styleType, showReportList, exit } = toRefs(data);
+const { timerManager, parameter, time, userInfo, examState, needStart, showTestAgain, testList, multipleItemRefList, styleType, showReportList, exit, sid } = toRefs(data);
 
 /**
  * 创建组件实例
@@ -607,6 +608,11 @@ onMounted(() => {
   //加载WS
   let project = parameter.value.project;
   initWs({ parameter: parameter.value, testTime: time.value.testTime, version: "v2" }, (data: any) => {
+    //获取sid
+    if (data.cmd === 'mySid') {
+      console.log("data.data.sid", data.data.sid)
+      sid.value = data.data.sid;
+    }
     let index = testList.value.findIndex((item: any) => {
       let examId = `${project}_${item.area}`;
       return examId == data.exam_id;
@@ -623,6 +629,26 @@ onMounted(() => {
       getExit();
     }
   }, 10000);
+  //刷新关闭
+  window.onbeforeunload = function (e) {
+    var confirmationMessage = "刷新/关闭页面将会关闭页面,是否确认退出页面?";
+    (e || window.event).returnValue = confirmationMessage; // 兼容 Gecko + IE
+
+    testList.value.forEach((item: any) => {
+      let examId = item.exam_id;
+      let bUrl = import.meta.env.VITE_APP_BASE_API;
+      let classId = parameter.value.classes;
+      let mySid = sid.value;
+      let token: any = localStorage.getItem("token")
+      let formData = new FormData();
+      formData.append("exam_id", examId);
+      formData.append("class_id", classId);
+      formData.append("token", token);
+      formData.append("sid", mySid);
+      navigator.sendBeacon(bUrl + "/exam/close_exam", formData)
+    })
+    return confirmationMessage; // 兼容 Gecko + Webkit, Safari, Chrome
+  };
 })
 
 onBeforeUnmount(() => {

+ 22 - 1
src/views/train/run.vue

@@ -145,14 +145,20 @@ const data = reactive<any>({
   showTestAgain: false,//再测一次按钮
   isLongRun: false,//是否为长跑项目
   isBackRun: false,//是否为折返跑项目
+  sid: null,//WS的id
 });
-const { timerManager, parameter, time, userInfo, examState, resultId, faceStudentList, currentTrack, unit, needStart, showTestAgain, isLongRun, isBackRun } = toRefs(data);
+const { timerManager, parameter, time, userInfo, examState, resultId, faceStudentList, currentTrack, unit, needStart, showTestAgain, isLongRun, isBackRun, sid } = toRefs(data);
 
 /**
  * 接收消息
 */
 const getMessage = (e: any) => {
   //console.log("WS响应:", e)
+  //获取sid
+  if (e.cmd === 'mySid') {
+    console.log("e.data.sid", e.data.sid)
+    sid.value = e.data.sid;
+  }
   //实时状态
   if (e.cmd === 'exam_status') {
     examState.value = e.data;
@@ -823,6 +829,21 @@ onBeforeMount(() => {
   window.onbeforeunload = function (e) {
     var confirmationMessage = "刷新/关闭页面将会关闭页面,是否确认退出页面?";
     (e || window.event).returnValue = confirmationMessage; // 兼容 Gecko + IE
+    let bUrl = import.meta.env.VITE_APP_BASE_API;
+    let classId = parameter.value.classes;
+    let project = parameter.value.project;
+    let area = parameter.value.area;
+    let examId = `${project}_${area}`;
+    let mySid = sid.value;
+    let token: any = localStorage.getItem("token")
+    let formData = new FormData();
+
+    formData.append("exam_id", examId);
+    formData.append("class_id", classId);
+    formData.append("token", token);
+    formData.append("sid", mySid);
+    navigator.sendBeacon(bUrl + "/exam/close_exam", formData)
+
     return confirmationMessage; // 兼容 Gecko + Webkit, Safari, Chrome
   };
 })

+ 27 - 2
src/views/train/test.vue

@@ -21,7 +21,7 @@
               :leave-active-class="proxy?.animate.dialog.leave">
               <div class="time" v-show="needStart && [42].includes(examState)">{{
                 time.countdownNum
-              }}</div>
+                }}</div>
             </Transition>
             <div class="tips" v-if="examState == 41">
               <img v-if="parameter.gesture" src="@/assets/images/test/ready1.png" />
@@ -146,14 +146,20 @@ const data = reactive<any>({
   showTestAgain: false,//再测一次按钮
   readyState: true,//倒计时按钮状态
   exit: 0,//退出响应次数
+  sid: null,//WS的id
 });
-const { timerManager, parameter, time, userInfo, examState, resultId, faceCheckStu, currentResultObj, unit, backReason, backReasonStr, needStart, showTestAgain, readyState, exit } = toRefs(data);
+const { timerManager, parameter, time, userInfo, examState, resultId, faceCheckStu, currentResultObj, unit, backReason, backReasonStr, needStart, showTestAgain, readyState, exit, sid } = toRefs(data);
 
 /**
  * 接收消息
 */
 const getMessage = (e: any) => {
   //console.log("WS响应:", e)
+  //获取sid
+  if (e.cmd === 'mySid') {
+    console.log("e.data.sid", e.data.id)
+    sid.value = e.data.sid;
+  }
   //实时状态
   if (e.cmd === 'exam_status') {
     examState.value = e.data;
@@ -805,6 +811,25 @@ onBeforeMount(() => {
   initSpeech();
   //初始化手势
   initHand();
+  //刷新关闭
+  window.onbeforeunload = function (e) {
+    var confirmationMessage = "刷新/关闭页面将会关闭页面,是否确认退出页面?";
+    (e || window.event).returnValue = confirmationMessage; // 兼容 Gecko + IE
+    let bUrl = import.meta.env.VITE_APP_BASE_API;
+    let classId = parameter.value.classes;
+    let project = parameter.value.project;
+    let area = parameter.value.area;
+    let examId = `${project}_${area}`;
+    let mySid = sid.value;
+    let token: any = localStorage.getItem("token")
+    let formData = new FormData();
+    formData.append("exam_id", examId);
+    formData.append("class_id", classId);
+    formData.append("token", token);
+    formData.append("sid", mySid);
+    navigator.sendBeacon(bUrl + "/exam/close_exam", formData)
+    return confirmationMessage; // 兼容 Gecko + Webkit, Safari, Chrome
+  };
 })
 
 onBeforeUnmount(() => {