Browse Source

使用prettier去格式化vue文件中模板

Michael Wang 6 năm trước cách đây
mục cha
commit
d93d06d038
38 tập tin đã thay đổi với 824 bổ sung290 xóa
  1. 0 2
      .env.development
  2. 0 2
      .env.production
  3. 0 2
      .env.staging
  4. 5 0
      package.json
  5. 6 1
      src/App.vue
  6. 43 10
      src/components/MainLayout/MainLayout.vue
  7. 0 3
      src/constants/constants.js
  8. 74 15
      src/features/Login/Login.vue
  9. 6 2
      src/features/OfflineExam/OfflineExamHome.vue
  10. 45 10
      src/features/OfflineExam/OfflineExamList.vue
  11. 19 2
      src/features/OfflineExam/OfflineExamUpload.vue
  12. 8 2
      src/features/OnlineExam/Examing/ArrowNavView.vue
  13. 40 8
      src/features/OnlineExam/Examing/BooleanQuestionView.vue
  14. 31 7
      src/features/OnlineExam/Examing/ExamPaper.vue
  15. 53 12
      src/features/OnlineExam/Examing/ExamingEnd.vue
  16. 42 9
      src/features/OnlineExam/Examing/FaceId.vue
  17. 35 7
      src/features/OnlineExam/Examing/FillBlankQuestionView.vue
  18. 43 9
      src/features/OnlineExam/Examing/MultipleQuestionView.vue
  19. 0 99
      src/features/OnlineExam/Examing/NestedQuestionView.vue
  20. 7 1
      src/features/OnlineExam/Examing/OverallProgress.vue
  21. 29 5
      src/features/OnlineExam/Examing/QuestionBody.vue
  22. 16 4
      src/features/OnlineExam/Examing/QuestionFilters.vue
  23. 10 2
      src/features/OnlineExam/Examing/QuestionNavView.vue
  24. 51 13
      src/features/OnlineExam/Examing/QuestionView.vue
  25. 43 9
      src/features/OnlineExam/Examing/SingleQuestionView.vue
  26. 45 10
      src/features/OnlineExam/OnlineExamFaceCheckModal.vue
  27. 2 1
      src/features/OnlineExam/OnlineExamHome.vue
  28. 2 1
      src/features/OnlineExam/OnlineExamList.vue
  29. 25 6
      src/features/OnlineExam/OnlineExamOverview.vue
  30. 4 1
      src/features/OnlineExam/OnlineExamResultList.vue
  31. 30 5
      src/features/OnlineExam/PhoneVerifyForDD.vue
  32. 17 4
      src/features/OnlinePractice/OnlinePracticeHome.vue
  33. 15 4
      src/features/OnlinePractice/OnlinePracticeList.vue
  34. 26 7
      src/features/OnlinePractice/OnlinePracticeRecordDetail.vue
  35. 10 3
      src/features/OnlinePractice/OnlinePracticeRecordList.vue
  36. 40 9
      src/features/Password/Password.vue
  37. 2 2
      tests/unit/.eslintrc.js
  38. 0 1
      tests/vue/event.vue

+ 0 - 2
.env.development

@@ -1,4 +1,2 @@
 VUE_APP_TK_SERVER_URL=http://192.168.10.39:8868
-VUE_APP_FACEPP_KEY=kEz_MSSjkNuHL3fHhCvv62fXkAo-vobE
-VUE_APP_FACEPP_SECRET=aQMioMGUDShMnQmfM1_H_kPTP2pJva6J
 VUE_APP_WK_SERVER_SOCKET=wss://ecs-dev.qmth.com.cn:8878/oewebsocket/

+ 0 - 2
.env.production

@@ -1,4 +1,2 @@
 VUE_APP_TK_SERVER_URL=http://ecs.qmth.com.cn:8868
-VUE_APP_FACEPP_KEY=VOlRKNlCSAYIOcSLDKOaZukkqpmi-Pwo
-VUE_APP_FACEPP_SECRET=bzMjy-JfwtVUxVDMzagFh7ggbQBC71f1
 VUE_APP_WK_SERVER_SOCKET=wss://ecs.qmth.com.cn:8878/oewebsocket/

+ 0 - 2
.env.staging

@@ -1,4 +1,2 @@
 VUE_APP_TK_SERVER_URL=http://192.168.10.39:8868
-VUE_APP_FACEPP_KEY=kEz_MSSjkNuHL3fHhCvv62fXkAo-vobE
-VUE_APP_FACEPP_SECRET=aQMioMGUDShMnQmfM1_H_kPTP2pJva6J
 VUE_APP_WK_SERVER_SOCKET=wss://ecs-dev.qmth.com.cn:8878/oewebsocket/

+ 5 - 0
package.json

@@ -11,6 +11,11 @@
     "build:prod": "vue-cli-service build",
     "test:unit": "vue-cli-service test:unit"
   },
+  "eslintIgnore": [
+    "quokka-test.js",
+    "src/plugins/face.js",
+    "src/plugins/tracking.js"
+  ],
   "dependencies": {
     "axios": "^0.18.0",
     "iview": "^3.1.2",

+ 6 - 1
src/App.vue

@@ -1,5 +1,10 @@
 <template>
-  <div id="app" onpaste="return false" oncopy="return false" oncut="return false">
+  <div
+    id="app"
+    onpaste="return false"
+    oncopy="return false"
+    oncut="return false"
+  >
     <transition :name="transitionName">
       <router-view></router-view>
     </transition>

+ 43 - 10
src/components/MainLayout/MainLayout.vue

@@ -3,15 +3,25 @@
     <header class="header qm-primary-text">
       <!-- <a style="float: left; padding-left: 20px" @click="goBack">
         <Icon type="ios-arrow-back" />返回</a> -->
-      <Poptip trigger="hover" width="300">
+      <Poptip
+        trigger="hover"
+        width="300"
+      >
         <span class="name-arrow">{{user.displayName}} &nbsp;
-          <i class="ivu-icon ivu-icon-md-arrow-dropdown" style="vertical-align: middle;"></i>
+          <i
+            class="ivu-icon ivu-icon-md-arrow-dropdown"
+            style="vertical-align: middle;"
+          ></i>
         </span>
         <div slot="content">
           <div class="info qm-primary-text">
             <div class="hr info-row">
               <div>底照</div>
-              <div><img class="user-avatar" :src="user.photoPath" alt="无底照" /></div>
+              <div><img
+                  class="user-avatar"
+                  :src="user.photoPath"
+                  alt="无底照"
+                /></div>
             </div>
             <div class="hr info-row">
               <div>学号</div>
@@ -26,31 +36,54 @@
               <div>{{user.orgName}}</div>
             </div>
             <div style="grid-column: span 2; place-self: center; width: 100%; padding-top: 10px">
-              <i-button class="qm-primary-button" long @click="goChangePwd">修改密码</i-button>
+              <i-button
+                class="qm-primary-button"
+                long
+                @click="goChangePwd"
+              >修改密码</i-button>
             </div>
           </div>
         </div>
       </Poptip>
       <span style="margin: auto 20px">|</span>
-      <a @click="logout" class="qm-primary-text" style="display: inline-block; margin-right: 20px; text-align: center;">退出登录</a>
+      <a
+        @click="logout"
+        class="qm-primary-text"
+        style="display: inline-block; margin-right: 20px; text-align: center;"
+      >退出登录</a>
     </header>
     <main class="content">
       <slot></slot>
     </main>
     <nav class="nav">
-      <img src="./qm-logo.png" class="qm-logo" />
+      <img
+        src="./qm-logo.png"
+        class="qm-logo"
+      />
       <ul>
         <li>
-          <router-link class="link" to="/online-exam">在线考试&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</router-link>
+          <router-link
+            class="link"
+            to="/online-exam"
+          >在线考试&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</router-link>
         </li>
         <li>
-          <router-link class="link" to="/online-practice">在线练习&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</router-link>
+          <router-link
+            class="link"
+            to="/online-practice"
+          >在线练习&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</router-link>
         </li>
         <li>
-          <router-link class="link" to="/offline-exam">离线考试&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</router-link>
+          <router-link
+            class="link"
+            to="/offline-exam"
+          >离线考试&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</router-link>
         </li>
         <li>
-          <router-link class="link" to="/password">修改密码&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</router-link>
+          <router-link
+            class="link"
+            to="/password"
+          >修改密码&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</router-link>
         </li>
       </ul>
     </nav>

+ 0 - 3
src/constants/constants.js

@@ -1,7 +1,4 @@
-export const FACEPP_API = "facepp_api";
 export const FACEID_LINENESS_URL =
   "https://api.megvii.com/faceid/liveness/v2/do?token=";
 export const TK_SERVER_URL = process.env.VUE_APP_TK_SERVER_URL;
-export const FACEPP_KEY = process.env.VUE_APP_FACEPP_KEY;
-export const FACEPP_SECRET = process.env.VUE_APP_FACEPP_SECRET;
 export const VUE_APP_WK_SERVER_SOCKET = process.env.VUE_APP_WK_SERVER_SOCKET;

+ 74 - 15
src/features/Login/Login.vue

@@ -2,40 +2,99 @@
   <div class="home">
 
     <header class="header">
-      <div class="school-logo"><img class="logo-size" :src="this.logoPath" alt="school logo" />
+      <div class="school-logo"><img
+          class="logo-size"
+          :src="this.logoPath"
+          alt="school logo"
+        />
       </div>
-      <a class="close" style="border-bottom-left-radius: 6px;" @click="closeApp">关闭</a>
+      <a
+        class="close"
+        style="border-bottom-left-radius: 6px;"
+        @click="closeApp"
+      >关闭</a>
     </header>
 
     <div class="center">
 
       <div class="content">
         <div style="display:flex;">
-          <a v-if="this.$route.params.domain !== 'cugr.ecs.qmth.com.cn'" :class="['qm-big-text', 'login-type', loginType === 'STUDENT_CODE' && 'active-type']" @click="loginType='STUDENT_CODE'" style="border-top-left-radius: 6px">学号登录</a>
-          <a :class="['qm-big-text', 'login-type', loginType !== 'STUDENT_CODE' && 'active-type']" @click="loginType='STUDENT_IDENTITY_NUMBER'" style="border-top-right-radius: 6px">身份证号登录</a>
+          <a
+            v-if="this.$route.params.domain !== 'cugr.ecs.qmth.com.cn'"
+            :class="['qm-big-text', 'login-type', loginType === 'STUDENT_CODE' && 'active-type']"
+            @click="loginType='STUDENT_CODE'"
+            style="border-top-left-radius: 6px"
+          >学号登录</a>
+          <a
+            :class="['qm-big-text', 'login-type', loginType !== 'STUDENT_CODE' && 'active-type']"
+            @click="loginType='STUDENT_IDENTITY_NUMBER'"
+            style="border-top-right-radius: 6px"
+          >身份证号登录</a>
         </div>
 
-        <div class="qm-title-text" style="margin: 40px 0 20px 0">
+        <div
+          class="qm-title-text"
+          style="margin: 40px 0 20px 0"
+        >
           {{productName}}
         </div>
 
         <div style="margin: 0 40px 40px 40px">
-          <i-form ref="loginForm" :model="loginForm" :rules="loginFormRule">
-            <i-form-item prop="accountValue" style='margin-bottom:35px;height:42px'>
-              <i-input type="text" size="large" v-model="loginForm.accountValue" :placeholder="usernameInputPlaceholder">
-                <i-icon type="ios-person" slot="prepend"></i-icon>
+          <i-form
+            ref="loginForm"
+            :model="loginForm"
+            :rules="loginFormRule"
+          >
+            <i-form-item
+              prop="accountValue"
+              style='margin-bottom:35px;height:42px'
+            >
+              <i-input
+                type="text"
+                size="large"
+                v-model="loginForm.accountValue"
+                :placeholder="usernameInputPlaceholder"
+              >
+                <i-icon
+                  type="ios-person"
+                  slot="prepend"
+                ></i-icon>
               </i-input>
             </i-form-item>
-            <i-form-item prop="password" style='margin-bottom:35px;height:42px'>
-              <i-input type="password" size="large" v-model="loginForm.password" :placeholder="passwordInputPlaceholder" @on-enter="login('loginForm')">
-                <i-icon type="ios-lock" slot="prepend"></i-icon>
+            <i-form-item
+              prop="password"
+              style='margin-bottom:35px;height:42px'
+            >
+              <i-input
+                type="password"
+                size="large"
+                v-model="loginForm.password"
+                :placeholder="passwordInputPlaceholder"
+                @on-enter="login('loginForm')"
+              >
+                <i-icon
+                  type="ios-lock"
+                  slot="prepend"
+                ></i-icon>
               </i-input>
             </i-form-item>
             <i-form-item style="position: relative">
-              <div v-if="errorInfo !== ''" style="position: absolute; top: -37px; width: 100%">
-                <i-alert type="error" show-icon>{{errorInfo}}</i-alert>
+              <div
+                v-if="errorInfo !== ''"
+                style="position: absolute; top: -37px; width: 100%"
+              >
+                <i-alert
+                  type="error"
+                  show-icon
+                >{{errorInfo}}</i-alert>
               </div>
-              <i-button size="large" class="qm-primary-button" long :disabled="disableLoginBtn" @click="login('loginForm')">登录</i-button>
+              <i-button
+                size="large"
+                class="qm-primary-button"
+                long
+                :disabled="disableLoginBtn"
+                @click="login('loginForm')"
+              >登录</i-button>
             </i-form-item>
           </i-form>
         </div>

+ 6 - 2
src/features/OfflineExam/OfflineExamHome.vue

@@ -1,12 +1,16 @@
 <template>
   <main-layout>
-    <Breadcrumb style="text-align: left; padding-left: 20px; height: 40px; line-height: 40px; background-color: #fafafa;">
+    <Breadcrumb style="text-align: left; padding-left: 20px; height: 40px; 
+                       line-height: 40px; background-color: #fafafa;">
       当前所在位置:
       <BreadcrumbItem>离线考试</BreadcrumbItem>
     </Breadcrumb>
 
     <div class="home">
-      <ecs-offline-list :courses="courses" @reloadList="fetchData"></ecs-offline-list>
+      <ecs-offline-list
+        :courses="courses"
+        @reloadList="fetchData"
+      ></ecs-offline-list>
     </div>
   </main-layout>
 </template>

+ 45 - 10
src/features/OfflineExam/OfflineExamList.vue

@@ -11,13 +11,20 @@
           <td style="max-width: 200px">操作</td>
         </tr>
 
-        <tr v-for="(course) in courses" :key="course.examId">
+        <tr
+          v-for="(course) in courses"
+          :key="course.examId"
+        >
           <td>{{ course.courseName }}</td>
           <td>{{ course.specialtyName }}</td>
           <td>{{ course.startTime }} <br> ~ <br> {{ course.endTime }}</td>
           <td>
             <div v-if="course.offlineFileUrl">
-              <a @click="() => downloadOfflineFile(course.offlineFileUrl)" :href="course.offlineFileUrl" download>
+              <a
+                @click="() => downloadOfflineFile(course.offlineFileUrl)"
+                :href="course.offlineFileUrl"
+                download
+              >
                 <i-icon type="ios-cloud-download"></i-icon>下载作答
               </a>
             </div>
@@ -27,17 +34,42 @@
           </td>
           <td style="min-width: 180px">
             <template v-if="!course.isvalid">
-              <div v-if="course.paperId" style="display: grid; grid-gap: 10px">
-                <i-button class="qm-primary-button" @click="previewPaper(course)">查看试卷</i-button>
-                <a class="qm-primary-button" v-show="!disableDownloadPaperBtn" @click="() => tempDisableBtn(course)" href="#" download>下载试卷</a>
-                <i-button v-if="disableDownloadPaperBtn" class="qm-primary-button">下载中</i-button>
+              <div
+                v-if="course.paperId"
+                style="display: grid; grid-gap: 10px"
+              >
+                <i-button
+                  class="qm-primary-button"
+                  @click="previewPaper(course)"
+                >查看试卷</i-button>
+                <a
+                  class="qm-primary-button"
+                  v-show="!disableDownloadPaperBtn"
+                  @click="() => tempDisableBtn(course)"
+                  href="#"
+                  download
+                >下载试卷</a>
+                <i-button
+                  v-if="disableDownloadPaperBtn"
+                  class="qm-primary-button"
+                >下载中</i-button>
                 <!-- <i-button class="qm-primary-button">
-                  <a class="qm-primary-button" href="https://ecs-static.qmth.com.cn/offline-exam/答题卡.zip" download>下载答题卡</a>
+                  <a
+                    class="qm-primary-button"
+                    href="https://ecs-static.qmth.com.cn/offline-exam/答题卡.zip"
+                    download
+                  >下载答题卡</a>
                 </i-button> -->
-                <ecs-offline-exam-upload :course="course" @reloadList="$emit('reloadList')"></ecs-offline-exam-upload>
+                <ecs-offline-exam-upload
+                  :course="course"
+                  @reloadList="$emit('reloadList')"
+                ></ecs-offline-exam-upload>
               </div>
 
-              <div v-else style="display: grid; grid-gap: 10px">
+              <div
+                v-else
+                style="display: grid; grid-gap: 10px"
+              >
                 <div v-if="new Date(course.startTime) - Date.now() > 0">
                   未开始
                 </div>
@@ -45,7 +77,10 @@
                   已结束
                 </div>
                 <div v-else>
-                  <i-button class="qm-primary-button" @click="enterExam(course)">抽取试卷</i-button>
+                  <i-button
+                    class="qm-primary-button"
+                    @click="enterExam(course)"
+                  >抽取试卷</i-button>
                 </div>
               </div>
             </template>

+ 19 - 2
src/features/OfflineExam/OfflineExamUpload.vue

@@ -1,7 +1,24 @@
 <template>
   <div>
-    <Upload :headers="headers" :data="{fileType: fileType}" :before-upload="handleBeforeUpload" :action="'/api/ecs_oe_student/offlineExam/submitPaper?examRecordDataId='+course.examRecordDataId" :max-size="1024*30" :format="['pdf','zip']" accept="application/zip,application/pdf" :on-format-error="handleFormatError" :on-exceeded-size="handleMaxSize" :on-success="handleSuccess" :on-error="handleError" :show-upload-list="false">
-      <Button icon="ios-cloud-upload-outline" class="qm-primary-button" style="width: 100%;">上传作答</Button>
+    <Upload
+      :headers="headers"
+      :data="{fileType: fileType}"
+      :before-upload="handleBeforeUpload"
+      :action="'/api/ecs_oe_student/offlineExam/submitPaper?examRecordDataId='+course.examRecordDataId"
+      :max-size="1024*30"
+      :format="['pdf','zip']"
+      accept="application/zip,application/pdf"
+      :on-format-error="handleFormatError"
+      :on-exceeded-size="handleMaxSize"
+      :on-success="handleSuccess"
+      :on-error="handleError"
+      :show-upload-list="false"
+    >
+      <Button
+        icon="ios-cloud-upload-outline"
+        class="qm-primary-button"
+        style="width: 100%;"
+      >上传作答</Button>
     </Upload>
     <div v-if="file !== null">待上传文件: {{ file.name }}
       <Button :loading="loadingStatus">{{ loadingStatus ? '上传中...' : '上传' }}</Button>

+ 8 - 2
src/features/OnlineExam/Examing/ArrowNavView.vue

@@ -2,7 +2,10 @@
   <div class="arrow-container">
     <div class="prev">
       <template v-if="previousQuestionOrder">
-        <router-link class="qm-primary-button" :to="{ path: `/online-exam/exam/${$route.params.examId}/examRecordData/${$route.params.examRecordDataId}/order/${previousQuestionOrder}`}">上一题</router-link>
+        <router-link
+          class="qm-primary-button"
+          :to="{ path: `/online-exam/exam/${$route.params.examId}/examRecordData/${$route.params.examRecordDataId}/order/${previousQuestionOrder}`}"
+        >上一题</router-link>
       </template>
 
       <template v-else>
@@ -14,7 +17,10 @@
     </div>
     <div class="next">
       <template v-if="nextQuestionOrder">
-        <router-link class="qm-primary-button" :to="{ path: `/online-exam/exam/${$route.params.examId}/examRecordData/${$route.params.examRecordDataId}/order/${nextQuestionOrder}`}">下一题</router-link>
+        <router-link
+          class="qm-primary-button"
+          :to="{ path: `/online-exam/exam/${$route.params.examId}/examRecordData/${$route.params.examRecordDataId}/order/${nextQuestionOrder}`}"
+        >下一题</router-link>
       </template>
 
       <template v-else>

+ 40 - 8
src/features/OnlineExam/Examing/BooleanQuestionView.vue

@@ -1,22 +1,54 @@
 <template>
-  <div v-if="isSyncState" class="question-view">
-    <question-body :questionBody="question.body" :examQuestion="examQuestion"></question-body>
+  <div
+    v-if="isSyncState"
+    class="question-view"
+  >
+    <question-body
+      :questionBody="question.body"
+      :examQuestion="examQuestion"
+    ></question-body>
     <div class="ops">
       <div class="stu-answer">{{{'true': '正确', 'false' : '错误'}[studentAnswer]}}</div>
       <div class="score">({{examQuestion.questionScore}}分)</div>
     </div>
-    <div @click="() => answerQuestion('true')" :class="[studentAnswer === 'true' && 'row-selected', 'option']">
-      <input type="radio" name="question" value="true" :checked="studentAnswer === 'true'" style="margin-top:3px;display:block" />
+    <div
+      @click="() => answerQuestion('true')"
+      :class="[studentAnswer === 'true' && 'row-selected', 'option']"
+    >
+      <input
+        type="radio"
+        name="question"
+        value="true"
+        :checked="studentAnswer === 'true'"
+        style="margin-top:3px;display:block"
+      />
       <span class="question-options">正确</span>
     </div>
-    <div @click="() => answerQuestion('false')" :class="[studentAnswer === 'false' && 'row-selected', 'option']">
-      <input type="radio" name="question" value="false" :checked="studentAnswer === 'false'" style="margin-top:3px;display:block" />
+    <div
+      @click="() => answerQuestion('false')"
+      :class="[studentAnswer === 'false' && 'row-selected', 'option']"
+    >
+      <input
+        type="radio"
+        name="question"
+        value="false"
+        :checked="studentAnswer === 'false'"
+        style="margin-top:3px;display:block"
+      />
       <span class="question-options">错误</span>
     </div>
     <div class="reset">
-      <i-button type="warning" size="large" @click="() => answerQuestion(null)">重置答案</i-button>
+      <i-button
+        type="warning"
+        size="large"
+        @click="() => answerQuestion(null)"
+      >重置答案</i-button>
       <span v-if="examShouldShowAnswer()">
-        &nbsp;&nbsp;&nbsp;<i-button type="info" size="large" @click="showAnswer">显示答案</i-button>
+        &nbsp;&nbsp;&nbsp;<i-button
+          type="info"
+          size="large"
+          @click="showAnswer"
+        >显示答案</i-button>
       </span>
       <div v-if="examShouldShowAnswer() && isShowAnswer">
         正确答案:<div>{{{'true': '正确', 'false' : '错误'}[question.rightAnswer]}}</div>

+ 31 - 7
src/features/OnlineExam/Examing/ExamPaper.vue

@@ -1,26 +1,50 @@
 <template>
-  <div v-if="exam" class="container" :key="exam.id">
+  <div
+    v-if="exam"
+    class="container"
+    :key="exam.id"
+  >
     <div class="main">
-      <div v-for="(qG, index) in questionGroupList" :key="index">
+      <div
+        v-for="(qG, index) in questionGroupList"
+        :key="index"
+      >
         <div>{{toChineseNumber(index+1)}}、{{qG.groupName}} ({{qG.groupScore}}分)</div>
-        <div v-for="(questionWrapper) in qG.questionWrapperList" :key="questionWrapper.questionId" class="question-wrapper">
+        <div
+          v-for="(questionWrapper) in qG.questionWrapperList"
+          :key="questionWrapper.questionId"
+          class="question-wrapper"
+        >
           <div v-html="restoreAudio(questionWrapper.body)"></div>
-          <div v-for="(questionUnit, index) in questionWrapper.questionUnitList" :key="index">
+          <div
+            v-for="(questionUnit, index) in questionWrapper.questionUnitList"
+            :key="index"
+          >
             <div class="flex">
               <div>{{questionWrapper.eqs[index].order}}、
               </div>
               <div v-html="restoreAudio(questionUnit.body)"></div>
             </div>
-            <div v-for="(optionOrder, index) in questionWrapper.eqs[index].optionPermutation" :key="index">
+            <div
+              v-for="(optionOrder, index) in questionWrapper.eqs[index].optionPermutation"
+              :key="index"
+            >
               <div class="flex">
                 <div>{{indexToABCD(index)}}、</div>
                 <div v-html="restoreAudio(questionUnit.questionOptionList[optionOrder-0].body)"></div>
               </div>
             </div>
 
-            <div class="flex" v-if="practiceType !== 'NO_ANSWER'">正确答案:<div v-html="rightAnswerToABCD(questionUnit.questionType, questionUnit.rightAnswer, questionWrapper.eqs[index].optionPermutation)"></div>
+            <div
+              class="flex"
+              v-if="practiceType !== 'NO_ANSWER'"
+            >
+              正确答案:
+              <div v-html="rightAnswerToABCD(questionUnit.questionType, questionUnit.rightAnswer, questionWrapper.eqs[index].optionPermutation)"></div>
             </div>
-            <div class="flex">学生答案:<div v-html="rightAnswerToABCD(questionUnit.questionType, questionWrapper.eqs[index].studentAnswer, questionWrapper.eqs[index].optionPermutation, questionUnit.rightAnswer)"></div>
+            <div class="flex">
+              学生答案:
+              <div v-html="rightAnswerToABCD(questionUnit.questionType, questionWrapper.eqs[index].studentAnswer, questionWrapper.eqs[index].optionPermutation, questionUnit.rightAnswer)"></div>
             </div>
           </div>
         </div>

+ 53 - 12
src/features/OnlineExam/Examing/ExamingEnd.vue

@@ -1,24 +1,65 @@
 <template>
 
-  <div class="container" id="exam-end" v-if="afterExamRemark !== null">
+  <div
+    class="container"
+    id="exam-end"
+    v-if="afterExamRemark !== null"
+  >
     <div class="instructions">
       <h1 class="">考试已结束</h1>
-      <div><img class="user-avatar" :src="user.photoPath" alt="无底照" /></div>
-      <div class="qm-big-text score-text" v-if="!examResult">考试结果计算中...</div>
-      <div class="qm-big-text score-text" v-if="!examResult && getResultTimes > 10">后台繁忙,请稍后在待考列表中查看客观题得分。</div>
-      <div class="qm-big-text score-text" v-if="showObjectScore && !examResult.isWarn">客观题得分: <span style="color: red">{{examResult.objectiveScore}}</span></div>
-      <div class="qm-big-text score-text" v-if="exam && exam.examType !== 'ONLINE' && showObjectScore && !examResult.isWarn">客观题正确率: <span style="color: red">{{examResult.objectiveAccuracy}}%</span></div>
-      <div class="qm-big-text score-text" v-if="examResult.isWarn">客观题得分: 成绩待审核</div>
-      <h1 v-if="examResult.isWarn" class="" style="text-align: left;">违纪提示: </h1>
-      <div v-if="examResult.isWarn" class="" style="text-align: left;  padding-bottom: 20px">
+      <div><img
+          class="user-avatar"
+          :src="user.photoPath"
+          alt="无底照"
+        /></div>
+      <div
+        class="qm-big-text score-text"
+        v-if="!examResult"
+      >考试结果计算中...</div>
+      <div
+        class="qm-big-text score-text"
+        v-if="!examResult && getResultTimes > 10"
+      >后台繁忙,请稍后在待考列表中查看客观题得分。</div>
+      <div
+        class="qm-big-text score-text"
+        v-if="showObjectScore && !examResult.isWarn"
+      >客观题得分: <span style="color: red">{{examResult.objectiveScore}}</span></div>
+      <div
+        class="qm-big-text score-text"
+        v-if="exam && exam.examType !== 'ONLINE' && showObjectScore && !examResult.isWarn"
+      >客观题正确率: <span style="color: red">{{examResult.objectiveAccuracy}}%</span></div>
+      <div
+        class="qm-big-text score-text"
+        v-if="examResult.isWarn"
+      >客观题得分: 成绩待审核</div>
+      <h1
+        v-if="examResult.isWarn"
+        class=""
+        style="text-align: left;"
+      >违纪提示: </h1>
+      <div
+        v-if="examResult.isWarn"
+        class=""
+        style="text-align: left;  padding-bottom: 20px"
+      >
         <p v-html="cheatingRemark"></p>
       </div>
-      <h1 class="" style="text-align: left;">考后说明: </h1>
-      <div class="" style="text-align: left;  padding-bottom: 20px">
+      <h1
+        class=""
+        style="text-align: left;"
+      >考后说明: </h1>
+      <div
+        class=""
+        style="text-align: left;  padding-bottom: 20px"
+      >
         <p v-html="afterExamRemark"></p>
       </div>
 
-      <router-link class="qm-primary-button" to="/online-exam" style="display: inline-block; width: 100%;">
+      <router-link
+        class="qm-primary-button"
+        to="/online-exam"
+        style="display: inline-block; width: 100%;"
+      >
         返回主页</router-link>
 
     </div>

+ 42 - 9
src/features/OnlineExam/Examing/FaceId.vue

@@ -1,24 +1,57 @@
 <template>
-  <div class="row" style="margin: 0;">
-    <div class="col-md-12 text-center" style="padding:8px;">
+  <div
+    class="row"
+    style="margin: 0;"
+  >
+    <div
+      class="col-md-12 text-center"
+      style="padding:8px;"
+    >
       <div style="font-size: 30px;">
         <span>人脸检测</span>
         <span v-if="showIframe">({{timeCount}})</span>
       </div>
-      <div v-if="showIframe" class="text-center" style="color: red; font-size: 16px;">
+      <div
+        v-if="showIframe"
+        class="text-center"
+        style="color: red; font-size: 16px;"
+      >
         (注意:请点击下方“开始比对”按钮并在60秒内完成人脸检测,超时将退出考试)
       </div>
     </div>
-    <div id="faceIdDiv" style="position: relative;
-								  height:620px; background-color: #6e6f72 !important;
-  								background-image: radial-gradient(circle at 50% 0,#a9a9a9,#34363c);">
-      <div v-show="!showIframe" width="100%" height="200px" style="text-align: center;line-height:100px;margin-top:5px;">
+    <div
+      id="faceIdDiv"
+      style="position: relative;
+						 height:620px; background-color: #6e6f72 !important;
+  					 background-image: radial-gradient(circle at 50% 0,#a9a9a9,#34363c);"
+    >
+      <div
+        v-show="!showIframe"
+        width="100%"
+        height="200px"
+        style="text-align: center;line-height:100px;margin-top:5px;"
+      >
         <div style="color:white;font-weight: bold;font-size:20px;">
           {{redoBtnMsg}}
         </div>
-        <button v-if="redoBtnShow" type="button" class="qm-primary-button" :disabled="redoBtnDisabled" @click="startFaceVerify">重试</button>
+        <button
+          v-if="redoBtnShow"
+          type="button"
+          class="qm-primary-button"
+          :disabled="redoBtnDisabled"
+          @click="startFaceVerify"
+        >重试</button>
       </div>
-      <iframe v-show="showIframe" allow="camera *" allowusermedia id="myFrame" scrolling="no" width="100%" height="620px" frameborder="0"></iframe>
+      <iframe
+        v-show="showIframe"
+        allow="camera *"
+        allowusermedia
+        id="myFrame"
+        scrolling="no"
+        width="100%"
+        height="620px"
+        frameborder="0"
+      ></iframe>
     </div>
   </div>
 </template>

+ 35 - 7
src/features/OnlineExam/Examing/FillBlankQuestionView.vue

@@ -1,20 +1,48 @@
 <template>
-  <div v-if="isSyncState" class="question-view">
-    <question-body :questionBody="questionBody" :examQuestion="examQuestion"></question-body>
+  <div
+    v-if="isSyncState"
+    class="question-view"
+  >
+    <question-body
+      :questionBody="questionBody"
+      :examQuestion="examQuestion"
+    ></question-body>
     <div class="ops">
       <div class="score">({{examQuestion.questionScore}}分)</div>
     </div>
-    <div v-for="(option, index) in studentAnswer.split('##')" :key="examQuestion.id + index" class="option">
+    <div
+      v-for="(option, index) in studentAnswer.split('##')"
+      :key="examQuestion.id + index"
+      class="option"
+    >
       <span class="question-options">{{index+1}}. </span>
-      <input type="text" maxlength="5000" name="question" class="input-answer" :value="option" @input="inputAnswer" />
+      <input
+        type="text"
+        maxlength="5000"
+        name="question"
+        class="input-answer"
+        :value="option"
+        @input="inputAnswer"
+      />
     </div>
     <div class="reset">
-      <i-button type="warning" size="large" @click="resetAnswer">重置答案</i-button>
+      <i-button
+        type="warning"
+        size="large"
+        @click="resetAnswer"
+      >重置答案</i-button>
       <span v-if="examShouldShowAnswer()">
-        &nbsp;&nbsp;&nbsp;<i-button type="info" size="large" @click="showAnswer">显示答案</i-button>
+        &nbsp;&nbsp;&nbsp;<i-button
+          type="info"
+          size="large"
+          @click="showAnswer"
+        >显示答案</i-button>
       </span>
       <div v-if="examShouldShowAnswer() && isShowAnswer">
-        正确答案:<div v-html="rightAnswerTransform" class="right-answer-section"></div>
+        正确答案:<div
+          v-html="rightAnswerTransform"
+          class="right-answer-section"
+        ></div>
       </div>
     </div>
   </div>

+ 43 - 9
src/features/OnlineExam/Examing/MultipleQuestionView.vue

@@ -1,23 +1,57 @@
 <template>
-  <div v-if="isSyncState && examQuestion.questionType === 'MULTIPLE_CHOICE'" class="question-view">
-    <question-body :questionBody="question.body" :examQuestion="examQuestion"></question-body>
+  <div
+    v-if="isSyncState && examQuestion.questionType === 'MULTIPLE_CHOICE'"
+    class="question-view"
+  >
+    <question-body
+      :questionBody="question.body"
+      :examQuestion="examQuestion"
+    ></question-body>
     <div class="ops">
       <div class="stu-answer"> {{oldIndexToABCD}}</div>
       <div class="score">({{examQuestion.questionScore}}分)</div>
     </div>
-    <div v-for="(option, index) in newQuestionOptions" :key="index" class="option" @click="toggleAnswer(option.oldIndex)">
-      <div :class="studentAnswer.includes(option.oldIndex) && 'row-selected'" style="display: flex;">
-        <input type="checkbox" name="question" value="option.oldIndex" :checked="studentAnswer && studentAnswer.includes(option.oldIndex)" style="margin-top: 4px" />
+    <div
+      v-for="(option, index) in newQuestionOptions"
+      :key="index"
+      class="option"
+      @click="toggleAnswer(option.oldIndex)"
+    >
+      <div
+        :class="studentAnswer.includes(option.oldIndex) && 'row-selected'"
+        style="display: flex;"
+      >
+        <input
+          type="checkbox"
+          name="question"
+          value="option.oldIndex"
+          :checked="studentAnswer && studentAnswer.includes(option.oldIndex)"
+          style="margin-top: 4px"
+        />
         <span style="padding: 0 10px;">{{optionName[index]}}: </span>
-        <div class="question-options" v-if="option.value">
-          <question-body :questionBody="option.value.body" :examQuestion="examQuestion"></question-body>
+        <div
+          class="question-options"
+          v-if="option.value"
+        >
+          <question-body
+            :questionBody="option.value.body"
+            :examQuestion="examQuestion"
+          ></question-body>
         </div>
       </div>
     </div>
     <div class="reset">
-      <i-button type="warning" size="large" @click="() => answerQuestion(null)">重置答案</i-button>
+      <i-button
+        type="warning"
+        size="large"
+        @click="() => answerQuestion(null)"
+      >重置答案</i-button>
       <span v-if="examShouldShowAnswer()">
-        &nbsp;&nbsp;&nbsp;<i-button type="info" size="large" @click="showAnswer">显示答案</i-button>
+        &nbsp;&nbsp;&nbsp;<i-button
+          type="info"
+          size="large"
+          @click="showAnswer"
+        >显示答案</i-button>
       </span>
       <div v-if="examShouldShowAnswer() && isShowAnswer">
         正确答案:<div>{{rightAnswerTransform}}</div>

+ 0 - 99
src/features/OnlineExam/Examing/NestedQuestionView.vue

@@ -1,99 +0,0 @@
-<template>
-  <div class="question-view">
-    <div class="question-body" v-html="question.body"></div>
-    <div class="hr" />
-    <template v-if="subQuestion && subQuestion.questionType === 'SINGLE_ANSWER_QUESTION'">
-      <single-question-view :question="subQuestion" :examQuestion="examQuestion" />
-    </template>
-    <template v-if="subQuestion && subQuestion.questionType === 'MULTIPLE_ANSWER_QUESTION'">
-      <multiple-question-view :question="subQuestion" :examQuestion="examQuestion" />
-    </template>
-    <template v-if="subQuestion && subQuestion.questionType === 'BOOL_ANSWER_QUESTION'">
-      <boolean-question-view :question="subQuestion" :examQuestion="examQuestion" />
-    </template>
-    <template v-if="subQuestion && subQuestion.questionType === 'FILL_BLANK_QUESTION'">
-      <fill-blank-question-view :question="subQuestion" :examQuestion="examQuestion" />
-    </template>
-    <template v-if="subQuestion && subQuestion.questionType === 'TEXT_ANSWER_QUESTION'">
-      <text-question-view :question="subQuestion" :examQuestion="examQuestion" />
-    </template>
-  </div>
-</template>
-
-<script>
-import SingleQuestionView from "./SingleQuestionView";
-import MultipleQuestionView from "./MultipleQuestionView";
-import BooleanQuestionView from "./BooleanQuestionView";
-import FillBlankQuestionView from "./FillBlankQuestionView";
-import TextQuestionView from "./TextQuestionView";
-
-export default {
-  name: "NestedQuestionView",
-  data() {
-    return {};
-  },
-  props: {
-    question: Object,
-    examQuestion: Object
-  },
-  methods: {
-    answerQuestion: function() {
-      this.$http.put("/api/exam_question/" + this.examQuestion.id, {
-        studentAnswer: this.studentAnswer
-      });
-    },
-    resetQuestion: function(examQuestionId) {
-      this.studentAnswer = "";
-      this.$http.put("/api/exam_question/" + examQuestionId, {
-        studentAnswer: null
-      });
-    }
-  },
-  computed: {
-    subQuestion: function() {
-      return this.question.subQuestionList[this.examQuestion.subNumber - 1];
-    }
-  },
-  components: {
-    SingleQuestionView,
-    MultipleQuestionView,
-    BooleanQuestionView,
-    FillBlankQuestionView,
-    TextQuestionView
-  }
-};
-</script>
-
-<style scoped>
-.question-view {
-  display: grid;
-  grid-row-gap: 10px;
-}
-
-.question-body {
-  font-size: 18px;
-  margin-bottom: 10px;
-}
-
-div.hr {
-  border-bottom: 1px dashed gray;
-}
-
-.ops {
-  display: flex;
-  align-items: flex-end;
-}
-
-.stu-answer {
-  width: 100px;
-  border-bottom: 1px solid black;
-  text-align: center;
-}
-
-.option {
-  display: flex;
-}
-.question-options {
-  text-align: left;
-}
-</style>

+ 7 - 1
src/features/OnlineExam/Examing/OverallProgress.vue

@@ -1,6 +1,12 @@
 <template>
   <div class="progress-container">
-    <i-progress :percent="progressNum" :stroke-width="20" status="active" hide-info style="color: black">
+    <i-progress
+      :percent="progressNum"
+      :stroke-width="20"
+      status="active"
+      hide-info
+      style="color: black"
+    >
     </i-progress>
     <span>{{progress}}</span>
   </div>

+ 29 - 5
src/features/OnlineExam/Examing/QuestionBody.vue

@@ -1,12 +1,36 @@
 <template>
-  <div v-if="questionDetail" class="question-body" :key="examQuestion.questionId">
+  <div
+    v-if="questionDetail"
+    class="question-body"
+    :key="examQuestion.questionId"
+  >
     <div v-html="questionDetail.text"></div>
     <!-- <div v-html="questionDetail.audio"></div> -->
-    <div v-for="({src, name}, index) in questionDetail.audio" :key="name" class="audio-div">
-      <div style="position: relative;" class="audio-div">
-        <audio controls preload="auto" controlsList='nodownload' :key="src" :name="name" :src="src" @play="($event) => played(index, $event)" @ended="() => audioEnded(name)" @click="($event) => audioClicked(index, $event)"></audio>
+    <div
+      v-for="({src, name}, index) in questionDetail.audio"
+      :key="name"
+      class="audio-div"
+    >
+      <div
+        style="position: relative;"
+        class="audio-div"
+      >
+        <audio
+          controls
+          preload="auto"
+          controlsList='nodownload'
+          :key="src"
+          :name="name"
+          :src="src"
+          @play="($event) => played(index, $event)"
+          @ended="() => audioEnded(name)"
+          @click="($event) => audioClicked(index, $event)"
+        ></audio>
         <span v-if="examQuestion.limitedPlayTimes">(剩余播放次数:{{getAudioPlayedTimes(name)}})</span><br />
-        <div v-if="audioInPlay.has(name)" style="position: absolute;top: 0;right: 0;bottom: 0;left: 0;">
+        <div
+          v-if="audioInPlay.has(name)"
+          style="position: absolute;top: 0;right: 0;bottom: 0;left: 0;"
+        >
         </div>
       </div>
     </div>

+ 16 - 4
src/features/OnlineExam/Examing/QuestionFilters.vue

@@ -1,9 +1,21 @@
 <template>
   <div class="q-filters">
-    <div :class="questionFilterType == 'ALL' && 'selected-type'" @click="updateQuestionFilter('ALL')">全部<span class="all-type">{{all}}</span></div>
-    <div :class="questionFilterType == 'ANSWERED' && 'selected-type'" @click="updateQuestionFilter('ANSWERED')">已答 <span class="answered-type">{{answered}}</span></div>
-    <div :class="questionFilterType == 'SIGNED' && 'selected-type'" @click="updateQuestionFilter('SIGNED')">标记<span class="signed-type">{{signed}}</span></div>
-    <div :class="questionFilterType == 'UNANSWERED' && 'selected-type'" @click="updateQuestionFilter('UNANSWERED')">未答<span class="unanswered-type">{{unanswered}}</span></div>
+    <div
+      :class="questionFilterType == 'ALL' && 'selected-type'"
+      @click="updateQuestionFilter('ALL')"
+    >全部<span class="all-type">{{all}}</span></div>
+    <div
+      :class="questionFilterType == 'ANSWERED' && 'selected-type'"
+      @click="updateQuestionFilter('ANSWERED')"
+    >已答 <span class="answered-type">{{answered}}</span></div>
+    <div
+      :class="questionFilterType == 'SIGNED' && 'selected-type'"
+      @click="updateQuestionFilter('SIGNED')"
+    >标记<span class="signed-type">{{signed}}</span></div>
+    <div
+      :class="questionFilterType == 'UNANSWERED' && 'selected-type'"
+      @click="updateQuestionFilter('UNANSWERED')"
+    >未答<span class="unanswered-type">{{unanswered}}</span></div>
   </div>
 </template>
 

+ 10 - 2
src/features/OnlineExam/Examing/QuestionNavView.vue

@@ -1,12 +1,20 @@
 <template>
   <div style="padding-bottom: 50px;">
     <template v-if="paperStruct && examQuestionList">
-      <div v-for="(struct, section) in paperStruct.defaultPaper.questionGroupList" :key="section" class="section">
+      <div
+        v-for="(struct, section) in paperStruct.defaultPaper.questionGroupList"
+        :key="section"
+        class="section"
+      >
         <div class="title">{{struct.groupName}} ({{struct.groupScore}}分)</div>
         <div class="list">
           <template v-for="(_, index2) in sectionQuestions(section)">
             <template v-if="isSelectedQuestion(section, index2)">
-              <router-link :key="index2" :class="itemClass(section, index2)" :to="{ path: `/online-exam/exam/${$route.params.examId}/examRecordData/${$route.params.examRecordDataId}/order/${getQuestionNum(section, index2).order}`}">{{index2+1}}</router-link>
+              <router-link
+                :key="index2"
+                :class="itemClass(section, index2)"
+                :to="{ path: `/online-exam/exam/${$route.params.examId}/examRecordData/${$route.params.examRecordDataId}/order/${getQuestionNum(section, index2).order}`}"
+              >{{index2+1}}</router-link>
             </template>
           </template>
         </div>

+ 51 - 13
src/features/OnlineExam/Examing/QuestionView.vue

@@ -2,11 +2,27 @@
 
   <div style="overflow: auto">
     <div class="question-header">
-      <Icon :type="examQuestion.isSign ? 'ios-star':'ios-star-outline'" :style="{color: '#ffcc00'}" class="star" @click="toggleSign" />
-      <question-index v-if="examQuestion.getQuestionContent" :examQuestion="examQuestion" />
+      <Icon
+        :type="examQuestion.isSign ? 'ios-star':'ios-star-outline'"
+        :style="{color: '#ffcc00'}"
+        class="star"
+        @click="toggleSign"
+      />
+      <question-index
+        v-if="examQuestion.getQuestionContent"
+        :examQuestion="examQuestion"
+      />
     </div>
-    <div v-if="parentQuestionBody" class="question-view">
-      <question-body :questionBody="parentQuestionBody" :examQuestion="examQuestion" style="margin-bottom: 20px" :key="examQuestion.questionId"></question-body>
+    <div
+      v-if="parentQuestionBody"
+      class="question-view"
+    >
+      <question-body
+        :questionBody="parentQuestionBody"
+        :examQuestion="examQuestion"
+        style="margin-bottom: 20px"
+        :key="examQuestion.questionId"
+      ></question-body>
       <div class="hr" />
     </div>
     <div v-if="!examQuestion.getQuestionContent">
@@ -15,22 +31,46 @@
 
     <transition name="fade">
 
-      <div v-show="question && examQuestion && examQuestion.getQuestionContent" class="question-view" :key="examQuestion.order">
+      <div
+        v-show="question && examQuestion && examQuestion.getQuestionContent"
+        class="question-view"
+        :key="examQuestion.order"
+      >
         <div style="margin-bottom: -45px;">{{examQuestion.groupOrder}}、</div>
         <template v-if="question && examQuestion.questionType === 'SINGLE_CHOICE'">
-          <single-question-view :question="question" :examQuestion="examQuestion" :key="examQuestion.order" />
+          <single-question-view
+            :question="question"
+            :examQuestion="examQuestion"
+            :key="examQuestion.order"
+          />
         </template>
         <template v-if="question && examQuestion.questionType === 'MULTIPLE_CHOICE'">
-          <multiple-question-view :question="question" :examQuestion="examQuestion" :key="examQuestion.order" />
+          <multiple-question-view
+            :question="question"
+            :examQuestion="examQuestion"
+            :key="examQuestion.order"
+          />
         </template>
         <template v-if="question && examQuestion.questionType === 'TRUE_OR_FALSE'">
-          <boolean-question-view :question="question" :examQuestion="examQuestion" :key="examQuestion.order" />
+          <boolean-question-view
+            :question="question"
+            :examQuestion="examQuestion"
+            :key="examQuestion.order"
+          />
         </template>
         <template v-if="question && examQuestion.questionType === 'FILL_UP'">
-          <fill-blank-question-view :question="question" :examQuestion="examQuestion" :key="examQuestion.order" />
+          <fill-blank-question-view
+            :question="question"
+            :examQuestion="examQuestion"
+            :key="examQuestion.order"
+          />
         </template>
         <template v-if="question && examQuestion.questionType === 'ESSAY'">
-          <text-question-view :question="question" :examQuestion="examQuestion" :key="examQuestion.order" />
+          <text-question-view
+            :question="question"
+            :examQuestion="examQuestion"
+            :key="examQuestion.order"
+          />
         </template>
       </div>
     </transition>
@@ -45,7 +85,6 @@ import MultipleQuestionView from "./MultipleQuestionView";
 import BooleanQuestionView from "./BooleanQuestionView";
 import FillBlankQuestionView from "./FillBlankQuestionView";
 import TextQuestionView from "./TextQuestionView";
-import NestedQuestionView from "./NestedQuestionView";
 import { createNamespacedHelpers } from "vuex";
 const { mapState, mapMutations } = createNamespacedHelpers("examingHomeModule");
 
@@ -209,8 +248,7 @@ export default {
     MultipleQuestionView,
     BooleanQuestionView,
     FillBlankQuestionView,
-    TextQuestionView,
-    NestedQuestionView
+    TextQuestionView
   }
 };
 </script>

+ 43 - 9
src/features/OnlineExam/Examing/SingleQuestionView.vue

@@ -1,25 +1,59 @@
 <template>
-  <div v-if="isSyncState && examQuestion.questionType === 'SINGLE_CHOICE'" class="question-view">
-    <question-body :questionBody="questionBody" :examQuestion="examQuestion"></question-body>
+  <div
+    v-if="isSyncState && examQuestion.questionType === 'SINGLE_CHOICE'"
+    class="question-view"
+  >
+    <question-body
+      :questionBody="questionBody"
+      :examQuestion="examQuestion"
+    ></question-body>
     <div class="ops">
       <div class="stu-answer">{{oldIndexToABCD}}</div>
       <div class="score">({{examQuestion.questionScore}}分)</div>
     </div>
-    <div v-for="(option, index) in newQuestionOptions" :key="index" class="option" @click="() => {answerQuestion(option.oldIndex);}">
-      <div :class="studentAnswer === option.oldIndex && 'row-selected'" style="display: flex;">
+    <div
+      v-for="(option, index) in newQuestionOptions"
+      :key="index"
+      class="option"
+      @click="() => {answerQuestion(option.oldIndex);}"
+    >
+      <div
+        :class="studentAnswer === option.oldIndex && 'row-selected'"
+        style="display: flex;"
+      >
         <div>
-          <input type="radio" name="question" :value="option.oldIndex" :checked="studentAnswer === option.oldIndex" style="margin-top:3px;display:block" />
+          <input
+            type="radio"
+            name="question"
+            :value="option.oldIndex"
+            :checked="studentAnswer === option.oldIndex"
+            style="margin-top:3px;display:block"
+          />
         </div>
         <span style="padding: 0 10px;">{{optionName[index]}}: </span>
-        <div class="question-options" v-if="option.value">
-          <question-body :questionBody="option.value.body" :examQuestion="examQuestion"></question-body>
+        <div
+          class="question-options"
+          v-if="option.value"
+        >
+          <question-body
+            :questionBody="option.value.body"
+            :examQuestion="examQuestion"
+          ></question-body>
         </div>
       </div>
     </div>
     <div class="reset">
-      <i-button type="warning" size="large" @click="() => answerQuestion(null)">重置答案</i-button>
+      <i-button
+        type="warning"
+        size="large"
+        @click="() => answerQuestion(null)"
+      >重置答案</i-button>
       <span v-if="examShouldShowAnswer()">
-        &nbsp;&nbsp;&nbsp;<i-button type="info" size="large" @click="showAnswer">显示答案</i-button>
+        &nbsp;&nbsp;&nbsp;<i-button
+          type="info"
+          size="large"
+          @click="showAnswer"
+        >显示答案</i-button>
       </span>
       <div v-if="examShouldShowAnswer() && isShowAnswer">
         正确答案:<div>{{rightAnswerTransform}}</div>

+ 45 - 10
src/features/OnlineExam/OnlineExamFaceCheckModal.vue

@@ -1,26 +1,61 @@
 <template>
-  <Modal v-model="faceCheckModalOpen" width="900" :mask-closable="false" :closable="false" @on-visible-change="updateCameraState">
-    <div slot="header" style="display: flex; justify-content: space-between; align-items: center;">
+  <Modal
+    v-model="faceCheckModalOpen"
+    width="900"
+    :mask-closable="false"
+    :closable="false"
+    @on-visible-change="updateCameraState"
+  >
+    <div
+      slot="header"
+      style="display: flex; justify-content: space-between; align-items: center;"
+    >
       <div class="qm-title-text">人脸识别</div>
-      <Icon type="ios-close" class="qm-icon-button" size="24" @click="closeModal" />
+      <Icon
+        type="ios-close"
+        class="qm-icon-button"
+        size="24"
+        @click="closeModal"
+      />
     </div>
     <div style="display: grid; grid-template-columns: 200px 400px 1fr; grid-gap: 5px; position: relative">
       <!-- TODO: 显示子组件的message -->
-      <!-- <div style="position: absolute; top: -16px; left: 0; width: 100%; height: 50px; background-color: #eee; opacity: 0.8; display: grid; ">
-        <div class="qm-title-text" style="width: 100%; text-algin: center; ">msg</div>
+      <!-- <div style="position: absolute; top: -16px; left: 0; width: 100%; height: 50px; 
+                  background-color: #eee; opacity: 0.8; display: grid; ">
+        <div
+          class="qm-title-text"
+          style="width: 100%; text-algin: center; "
+        >msg</div>
       </div> -->
-      <div class="avatar" :style="{ backgroundImage: `url('${userPhoto}')` }">
+      <div
+        class="avatar"
+        :style="{ backgroundImage: `url('${userPhoto}')` }"
+      >
         <!-- <img :src="userPhoto" width="200px" height="300px" alt="底照" /> -->
-        <div class="avatar-info" style="text-align: center; margin-top: 260px; color: white;">
-          <span style="background-color: rgba(0, 0, 0, 0.5); display: inline-block;padding: 6px 16px; border-radius: 6px;">我的底照</span>
+        <div
+          class="avatar-info"
+          style="text-align: center; margin-top: 260px; color: white;"
+        >
+          <span style="background-color: rgba(0, 0, 0, 0.5); display: inline-block;
+                       padding: 6px 16px; border-radius: 6px;">我的底照</span>
         </div>
       </div>
       <div class="camera">
-        <FaceRecognition v-if="faceCheckModalOpen" width="400" height="300" :showRecognizeButton="true" :close-camera="closeCamera" @on-recognize-result="getFaceRecognitionResult">
+        <FaceRecognition
+          v-if="faceCheckModalOpen"
+          width="400"
+          height="300"
+          :showRecognizeButton="true"
+          :close-camera="closeCamera"
+          @on-recognize-result="getFaceRecognitionResult"
+        >
         </FaceRecognition>
       </div>
       <div class="verify-desc qm-primary-text">
-        <h4 class="qm-big-text" style="font-weight: bold">操作提示:</h4>
+        <h4
+          class="qm-big-text"
+          style="font-weight: bold"
+        >操作提示:</h4>
         <p>1.请先确保摄像头设备已连接并能正常工作;</p>
         <p>2.请保持光源充足,不要逆光操作;</p>
         <p>3.请保证脸部正面面向摄像头,并适当调整姿势保证整个脸部能够进入左侧识别画面;</p>

+ 2 - 1
src/features/OnlineExam/OnlineExamHome.vue

@@ -1,6 +1,7 @@
 <template>
   <main-layout>
-    <Breadcrumb style="text-align: left; padding-left: 20px; height: 40px; line-height: 40px; background-color: #fafafa;">
+    <Breadcrumb style="text-align: left; padding-left: 20px; height: 40px; line-height: 40px; 
+                       background-color: #fafafa;">
       当前所在位置:
       <BreadcrumbItem>在线考试</BreadcrumbItem>
     </Breadcrumb>

+ 2 - 1
src/features/OnlineExam/OnlineExamList.vue

@@ -21,7 +21,8 @@
           <td>{{ course.startTime }} <br> ~ <br> {{ course.endTime }}</td>
           <td>{{ course.allowExamCount }}</td>
           <td style="min-width: 180px">
-            <div style="display: grid; grid-template-columns:  repeat( auto-fit, minmax(100px, 1fr) ); grid-gap: 10px">
+            <div style="display: grid; grid-template-columns: repeat( auto-fit, minmax(100px, 1fr) ); 
+                        grid-gap: 10px">
               <i-button
                 class="qm-primary-button"
                 :disabled="!courseInBetween(course) || course.allowExamCount < 1"

+ 25 - 6
src/features/OnlineExam/OnlineExamOverview.vue

@@ -1,13 +1,25 @@
 <template>
 
-  <div class="container" id="exam-overview" v-if="startInfo && paperStruct">
+  <div
+    class="container"
+    id="exam-overview"
+    v-if="startInfo && paperStruct"
+  >
     <div class="instructions">
       <h1 class="">考试说明</h1>
-      <div class="" style="text-align: left;  padding-bottom: 20px">
+      <div
+        class=""
+        style="text-align: left;  padding-bottom: 20px"
+      >
         <p v-html="beforeExamRemark"></p>
         <!-- <p>{{"测试".repeat(500)}}</p> -->
       </div>
-      <Button class="qm-primary-button" :disabled="isForceRead" @click="goToPaper" style="display: inline-block; width: 100%;">
+      <Button
+        class="qm-primary-button"
+        :disabled="isForceRead"
+        @click="goToPaper"
+        style="display: inline-block; width: 100%;"
+      >
         {{ isForceRead ? '强制阅读' : '开始答题'}}(倒计时:{{remainTimeFormatted}})</Button>
     </div>
 
@@ -17,15 +29,22 @@
       <h4 class="">试卷概览(总分:{{paperTotalScore}})</h4>
       <br>
       <ul class="list-group">
-        <li class="list-group-item" v-for="(questionsGroup, index) in paperStruct.defaultPaper.questionGroupList" :key="questionsGroup.gruopName">
+        <li
+          class="list-group-item"
+          v-for="(questionsGroup, index) in paperStruct.defaultPaper.questionGroupList"
+          :key="questionsGroup.gruopName"
+        >
           {{index+1}}、{{questionsGroup.groupName}}
           <small class="pull-right">
-            (共{{questionsGroup.questionWrapperList.length}}题,</span>共{{questionsGroup.groupScore}}分)
+            (共{{questionsGroup.questionWrapperList.length}}题,共{{questionsGroup.groupScore}}分)
           </small>
         </li>
       </ul>
       <div>
-        <img style="width:100%; padding-top: 40px;" src="./good-wish.png" />
+        <img
+          style="width:100%; padding-top: 40px;"
+          src="./good-wish.png"
+        />
       </div>
     </div>
 

+ 4 - 1
src/features/OnlineExam/OnlineExamResultList.vue

@@ -10,7 +10,10 @@
           <td>客观分</td>
         </tr>
 
-        <tr v-for="(result, index) in results" :key="index">
+        <tr
+          v-for="(result, index) in results"
+          :key="index"
+        >
           <td>{{ result.examOrder }}</td>
           <td>{{ result.startTime }}</td>
           <td>{{ result.endTime }}</td>

+ 30 - 5
src/features/OnlineExam/PhoneVerifyForDD.vue

@@ -1,15 +1,40 @@
 <template>
 
-  <Modal v-model="phoneModal" :closable="false" :mask-closable="false" title="请验证预留手机号" :footer-hide="true">
+  <Modal
+    v-model="phoneModal"
+    :closable="false"
+    :mask-closable="false"
+    title="请验证预留手机号"
+    :footer-hide="true"
+  >
     <div style="display: grid; grid-template-rows: 40px 40px 40px; font-size: 20px">
 
       <p>预留手机号: &nbsp;&nbsp;{{user.phoneNumber}}</p>
-      <p>输入验证码: &nbsp;&nbsp;<input size="6" v-model="code" placeholder="验证码" type="number" /> &nbsp;&nbsp;
+      <p>输入验证码: &nbsp;&nbsp;<input
+          size="6"
+          v-model="code"
+          placeholder="验证码"
+          type="number"
+        /> &nbsp;&nbsp;
       </p>
       <div>
-        <i-button style="margin: 0" class="qm-primary-button" :disabled="remainTime > 0" @click="getCode">{{btnText}} {{remainTime > 0 ? "("+remainTime + "秒)" : ""}}</i-button>&nbsp;&nbsp;
-        <i-button style="margin: 0" class="qm-primary-button" :disabled="!code" @click="verify">验证</i-button>&nbsp;&nbsp;
-        <i-button style="margin: 0" class="qm-primary-button" @click="() => this.logout()">退出系统</i-button>&nbsp;&nbsp;
+        <i-button
+          style="margin: 0"
+          class="qm-primary-button"
+          :disabled="remainTime > 0"
+          @click="getCode"
+        >{{btnText}} {{remainTime > 0 ? "("+remainTime + "秒)" : ""}}</i-button>&nbsp;&nbsp;
+        <i-button
+          style="margin: 0"
+          class="qm-primary-button"
+          :disabled="!code"
+          @click="verify"
+        >验证</i-button>&nbsp;&nbsp;
+        <i-button
+          style="margin: 0"
+          class="qm-primary-button"
+          @click="() => this.logout()"
+        >退出系统</i-button>&nbsp;&nbsp;
       </div>
     </div>
   </Modal>

+ 17 - 4
src/features/OnlinePractice/OnlinePracticeHome.vue

@@ -1,6 +1,7 @@
 <template>
   <main-layout>
-    <Breadcrumb style="text-align: left; padding-left: 20px; height: 40px; line-height: 40px; background-color: #fafafa;">
+    <Breadcrumb style="text-align: left; padding-left: 20px; height: 40px; line-height: 40px; 
+                       background-color: #fafafa;">
       当前所在位置:
       <BreadcrumbItem>在线练习</BreadcrumbItem>
     </Breadcrumb>
@@ -9,12 +10,24 @@
 
       <div style="text-align: left; margin-bottom: 20px;">
         选择考试批次:
-        <Select v-model="examId" style="width:200px" @on-change="fetchList" filterable>
-          <Option v-for="item in examList" :value="item.id" :key="item.id">{{ item.name }}</Option>
+        <Select
+          v-model="examId"
+          style="width:200px"
+          @on-change="fetchList"
+          filterable
+        >
+          <Option
+            v-for="item in examList"
+            :value="item.id"
+            :key="item.id"
+          >{{ item.name }}</Option>
         </Select>
       </div>
 
-      <OnlinePracticeList :courses="courses" :examList="examList"></OnlinePracticeList>
+      <OnlinePracticeList
+        :courses="courses"
+        :examList="examList"
+      ></OnlinePracticeList>
 
     </div>
   </main-layout>

+ 15 - 4
src/features/OnlinePractice/OnlinePracticeList.vue

@@ -12,7 +12,10 @@
           <td style="max-width: 200px">操作</td>
         </tr>
 
-        <tr v-for="course in courses" :key="course.courseId">
+        <tr
+          v-for="course in courses"
+          :key="course.courseId"
+        >
           <td>{{ course.courseName }}</td>
           <td>{{ course.startTime }} <br> ~ <br> {{ course.endTime }}</td>
           <td>{{ course.practiceCount }}</td>
@@ -20,9 +23,17 @@
           <td>{{ course.aveObjectiveAccuracy }}%</td>
           <td>{{ course.maxObjectiveAccuracy }}%</td>
           <td style="min-width: 180px">
-            <div style="display: grid; grid-template-columns:  repeat( auto-fit, minmax(100px, 1fr) ); grid-gap: 10px">
-              <i-button class="qm-primary-button" :disabled="!courseInBetween(course)" @click="enterPractice(course)">进入练习</i-button>
-              <i-button class="qm-primary-button" @click="enterPracticeList(course)">查看详情</i-button>
+            <div style="display: grid; grid-template-columns: repeat( auto-fit, minmax(100px, 1fr) ); 
+                        grid-gap: 10px">
+              <i-button
+                class="qm-primary-button"
+                :disabled="!courseInBetween(course)"
+                @click="enterPractice(course)"
+              >进入练习</i-button>
+              <i-button
+                class="qm-primary-button"
+                @click="enterPracticeList(course)"
+              >查看详情</i-button>
             </div>
           </td>
         </tr>

+ 26 - 7
src/features/OnlinePractice/OnlinePracticeRecordDetail.vue

@@ -1,6 +1,7 @@
 <template>
   <main-layout>
-    <Breadcrumb style="text-align: left; padding-left: 20px; height: 40px; line-height: 40px; background-color: #fafafa;">
+    <Breadcrumb style="text-align: left; padding-left: 20px; height: 40px; line-height: 40px;
+                       background-color: #fafafa;">
       当前所在位置:
       <BreadcrumbItem :to="{name: 'OnlinePracticeHome'}">在线练习</BreadcrumbItem>
       <!-- 不是很容易返回练习详情,需要examStudentId, courseName等等 -->
@@ -26,7 +27,10 @@
               <td>未答</td>
             </tr>
 
-            <tr v-for="record in examRecordResult.paperStructInfos" :key="record.index">
+            <tr
+              v-for="record in examRecordResult.paperStructInfos"
+              :key="record.index"
+            >
               <td>{{ record.title }}</td>
               <td>{{ record.questionCount }}</td>
               <td>{{ record.succQuestionNum }}</td>
@@ -38,7 +42,10 @@
 
         <div class="info-text">
           <h4 class="font-thin text-primary-lt m-t">报告提示:</h4>
-          <div class="scroll-y wrapper-sm" style="min-height: 80px;">
+          <div
+            class="scroll-y wrapper-sm"
+            style="min-height: 80px;"
+          >
             <p class="m-b-sm">1、若本练习卷中包含部分主观题型,则报告统计数据仅供参考,因为部分题型需考生根据参考答案判断正确和错误,报告仅对可统计的题型进行统计。</p>
             <p class="m-b-sm">2、若单题存在多处作答,只要有一处出错,该题就判为错题。</p>
           </div>
@@ -46,12 +53,24 @@
       </div>
     </div>
 
-    <div style="margin: 20px; display: grid; grid-template-columns: repeat( auto-fit, minmax(100px, 1fr) ); grid-gap: 20px">
-      <i-button class="qm-primary-button" @click="shouldShowPaper= !shouldShowPaper">展开试卷</i-button>
-      <i-button v-if="!disableGoBack" class="qm-primary-button" @click="goBack">返回</i-button>
+    <div style="margin: 20px; display: grid; grid-template-columns: repeat( auto-fit, minmax(100px, 1fr) ); 
+                grid-gap: 20px">
+      <i-button
+        class="qm-primary-button"
+        @click="shouldShowPaper= !shouldShowPaper"
+      >展开试卷</i-button>
+      <i-button
+        v-if="!disableGoBack"
+        class="qm-primary-button"
+        @click="goBack"
+      >返回</i-button>
     </div>
 
-    <ExamPaper v-if="shouldShowPaper" :examId="examId" :examRecordDataId="examRecordDataId" />
+    <ExamPaper
+      v-if="shouldShowPaper"
+      :examId="examId"
+      :examRecordDataId="examRecordDataId"
+    />
   </main-layout>
 </template>
 

+ 10 - 3
src/features/OnlinePractice/OnlinePracticeRecordList.vue

@@ -1,6 +1,7 @@
 <template>
   <main-layout>
-    <Breadcrumb style="text-align: left; padding-left: 20px; height: 40px; line-height: 40px; background-color: #fafafa;">
+    <Breadcrumb style="text-align: left; padding-left: 20px; height: 40px; line-height: 40px;
+                       background-color: #fafafa;">
       当前所在位置:
       <BreadcrumbItem :to="{name: 'OnlinePracticeHome'}">在线练习</BreadcrumbItem>
       <BreadcrumbItem>练习详情</BreadcrumbItem>
@@ -31,7 +32,10 @@
               <td style="max-width: 200px">操作</td>
             </tr>
 
-            <tr v-for="record in recordList" :key="record.examId">
+            <tr
+              v-for="record in recordList"
+              :key="record.examId"
+            >
               <td>{{ record.id }}</td>
               <td>{{ record.startTime }}</td>
               <td>{{ record.endTime }}</td>
@@ -42,7 +46,10 @@
               <td>{{ record.notAnsweredCount }}</td>
               <td>{{ record.objectiveAccuracy }}%</td>
               <td style="min-width: 120px">
-                <i-button class="qm-primary-button" @click="() => enterPracticeRecordDetail(record)">查看成绩报告</i-button>
+                <i-button
+                  class="qm-primary-button"
+                  @click="() => enterPracticeRecordDetail(record)"
+                >查看成绩报告</i-button>
               </td>
             </tr>
           </tbody>

+ 40 - 9
src/features/Password/Password.vue

@@ -1,23 +1,54 @@
 <template>
   <main-layout>
-    <i-breadcrumb style="text-align: left; padding-left: 20px; height: 40px; line-height: 40px; background-color: #fafafa;">
+    <i-breadcrumb style="text-align: left; padding-left: 20px; height: 40px; line-height: 40px;
+                         background-color: #fafafa;">
       当前所在位置:
       <i-breadcrumb-item>修改密码</i-breadcrumb-item>
     </i-breadcrumb>
 
     <div class="password-container">
-      <i-form ref="form" :model="form" :rules="rules" style="width: 320px">
-        <i-form-item label="" prop="oldPassword">
-          <i-input type="password" placeholder="请输入旧密码" v-model="form.oldPassword"></i-input>
+      <i-form
+        ref="form"
+        :model="form"
+        :rules="rules"
+        style="width: 320px"
+      >
+        <i-form-item
+          label=""
+          prop="oldPassword"
+        >
+          <i-input
+            type="password"
+            placeholder="请输入旧密码"
+            v-model="form.oldPassword"
+          ></i-input>
         </i-form-item>
-        <i-form-item label="" prop="newPassword">
-          <i-input type="password" placeholder="请输入新密码(6到18位的数字或字母)" v-model="form.newPassword"></i-input>
+        <i-form-item
+          label=""
+          prop="newPassword"
+        >
+          <i-input
+            type="password"
+            placeholder="请输入新密码(6到18位的数字或字母)"
+            v-model="form.newPassword"
+          ></i-input>
         </i-form-item>
-        <i-form-item label="" prop="newPasswordAgain">
-          <i-input type="password" placeholder="请再次输入新密码" v-model="form.newPasswordAgain"></i-input>
+        <i-form-item
+          label=""
+          prop="newPasswordAgain"
+        >
+          <i-input
+            type="password"
+            placeholder="请再次输入新密码"
+            v-model="form.newPasswordAgain"
+          ></i-input>
         </i-form-item>
         <i-form-item style="text-align: left">
-          <i-button size="large" class="qm-primary-button" @click="changePwd">保存</i-button>
+          <i-button
+            size="large"
+            class="qm-primary-button"
+            @click="changePwd"
+          >保存</i-button>
         </i-form-item>
       </i-form>
     </div>

+ 2 - 2
tests/unit/.eslintrc.js

@@ -3,6 +3,6 @@ module.exports = {
     jest: true
   },
   rules: {
-    'import/no-extraneous-dependencies': 'off'
+    "import/no-extraneous-dependencies": "off"
   }
-}
+};

+ 0 - 1
tests/vue/event.vue

@@ -47,4 +47,3 @@ export default {
   }
 };
 </script>
-