Forráskód Böngészése

Merge branch 'release_v5.0.2' of http://git.qmth.com.cn/examcloud-frontend/examcloud-admin-web

刘洋 1 éve
szülő
commit
89c3efa097

+ 19 - 1
src/modules/basic/view/campus.vue

@@ -95,6 +95,14 @@
         >
           导入
         </el-button>
+        <el-button
+          size="small"
+          type="primary"
+          icon="el-icon-download"
+          @click="exportOrg"
+        >
+          导出
+        </el-button>
 
         <div style="width: 100%; margin-bottom: 10px"></div>
 
@@ -666,7 +674,17 @@ export default {
     dialogBeforeClose() {
       this.$refs.campusForm.clearValidate();
     },
-    //导入
+    exportOrg() {
+      window.open(
+        CORE_API +
+          "/org/sub/org/export?$key=" +
+          this.user.key +
+          "&$token=" +
+          this.user.token +
+          "&rootOrgId=" +
+          this.formSearch.parentId
+      );
+    },
     imp() {
       this.impDialog = true;
       this.initUpload();

+ 2 - 2
src/modules/basic/view/school.vue

@@ -164,7 +164,7 @@
         <el-table-column prop="id" label="ID" width="60" />
         <el-table-column label="学校名称">
           <template slot-scope="scope">
-            <el-popover trigger="hover" placement="left">
+            <el-popover trigger="hover" placement="right">
               <div style="font-size: 18px; font-family: 新宋体">
                 <tr>
                   <td style="color: green">学校名称</td>
@@ -457,7 +457,7 @@ export default {
           type: "warning",
         }).then(() => {
           var url = CORE_API + "/org/disable/" + this.orgIds;
-          this.$$httpWithMsg.put(url, {}).then(() => {
+          this.$httpWithMsg.put(url, {}).then(() => {
             this.$notify({
               type: "success",
               message: "禁用成功!",

+ 35 - 1
src/modules/basic/view/school_config.vue

@@ -160,6 +160,14 @@
         </div>
 
         <div v-show="ruleForm.IDENTIFICATION_OF_LIVING_BODY_SCHEME === 'S3'">
+          <el-form-item label="C端人脸识别阈值" prop="PC_CLIENT_FACE_THRESHOLD">
+            <el-input
+              v-model="ruleForm.PC_CLIENT_FACE_THRESHOLD"
+              style="width: 180px"
+            ></el-input>
+            <span style="font-size: 14px; line-height: 44px"></span>
+          </el-form-item>
+
           <el-form-item label="指定动作检测提醒" prop="ACTION_ALERT">
             <el-input
               v-model="ruleForm.ACTION_ALERT"
@@ -289,6 +297,16 @@ export default {
       callback();
     };
 
+    let checkPcClientFaceThreshold = (rule, value, callback) => {
+      if (this.ruleForm.IDENTIFICATION_OF_LIVING_BODY_SCHEME === "S3") {
+        let reg = /^[1-9][0-9]*$/;
+        if (!new String(value).match(reg) || value < 1 || value > 99) {
+          return callback(new Error("范围1至99之间"));
+        }
+      }
+      callback();
+    };
+
     return {
       actionOptions: ACTION_OPTION_LIST,
       rootOrgList: [],
@@ -310,6 +328,7 @@ export default {
         FACE_VERIFY_API_PROVIDER: "FACEPP",
         FACE_COMPARE_API_PROVIDER: "FACEPP",
         BAIDU_EXPECT_FACE_COMPARE_SCORE: 70,
+        PC_CLIENT_FACE_THRESHOLD: 50,
         ACTION_ALERT: "",
         ACTION_NUM: "",
         ACTION_OPTIONS: [],
@@ -364,6 +383,13 @@ export default {
             trigger: "blur",
           },
         ],
+        PC_CLIENT_FACE_THRESHOLD: [
+          { required: true, message: " ", trigger: "blur" },
+          {
+            validator: checkPcClientFaceThreshold,
+            trigger: "blur",
+          },
+        ],
       },
     };
   },
@@ -461,8 +487,9 @@ export default {
             this.ruleForm.IDENTIFICATION_OF_LIVING_BODY_SCHEME;
 
           if (this.ruleForm.IDENTIFICATION_OF_LIVING_BODY_SCHEME === "S3") {
+            params.properties.PC_CLIENT_FACE_THRESHOLD =
+              this.ruleForm.PC_CLIENT_FACE_THRESHOLD;
             params.properties.ACTION_ALERT = this.ruleForm.ACTION_ALERT;
-
             params.properties.ACTION_NUM = this.ruleForm.ACTION_NUM;
 
             // 固定动作顺序
@@ -584,6 +611,13 @@ export default {
             this.ruleForm.ACTION_ALERT = 5;
           }
 
+          if (response.data.PC_CLIENT_FACE_THRESHOLD) {
+            this.ruleForm.PC_CLIENT_FACE_THRESHOLD =
+              response.data.PC_CLIENT_FACE_THRESHOLD;
+          } else {
+            this.ruleForm.PC_CLIENT_FACE_THRESHOLD = 50;
+          }
+
           if (response.data.ACTION_NUM) {
             this.ruleForm.ACTION_NUM = response.data.ACTION_NUM;
           } else {

+ 48 - 25
src/modules/basic/view/user.vue

@@ -130,15 +130,14 @@
 
         <div class="block-seperator"></div>
         <!-- 添加用户信息弹出框 -->
-        <el-dialog title="新增用户" width="450px" :visible.sync="addingDialog">
+        <el-dialog title="新增用户" width="500px" :visible.sync="addingDialog">
           <el-form
             ref="addingForm"
             :inline="true"
-            inline-message
             :model="userForm"
             :rules="rules"
             label-position="right"
-            label-width="120px"
+            label-width="80px"
           >
             <el-row>
               <el-form-item label="姓名" prop="name">
@@ -150,7 +149,7 @@
                 />
               </el-form-item>
             </el-row>
-            <el-row>
+            <el-row class="mt20">
               <el-form-item label="登录名" prop="loginName">
                 <el-input
                   v-model="userForm.loginName"
@@ -160,7 +159,7 @@
                 />
               </el-form-item>
             </el-row>
-            <el-row>
+            <el-row class="mt20">
               <el-form-item label="密码" prop="password">
                 <el-input
                   v-model="userForm.password"
@@ -170,7 +169,7 @@
                 />
               </el-form-item>
             </el-row>
-            <el-row>
+            <el-row class="mt20">
               <el-form-item label="联系方式" prop="phoneNumber">
                 <el-input
                   v-model="userForm.phoneNumber"
@@ -180,8 +179,8 @@
                 />
               </el-form-item>
             </el-row>
-            <el-row>
-              <el-form-item v-if="isSuperAdmin" label="学校" prop="rootOrgId">
+            <el-row v-if="isSuperAdmin" class="mt20">
+              <el-form-item label="学校" prop="rootOrgId">
                 <el-select
                   v-model="userForm.rootOrgId"
                   class="input_width_lg"
@@ -200,7 +199,7 @@
                 </el-select>
               </el-form-item>
             </el-row>
-            <el-row>
+            <el-row class="mt20">
               <el-form-item label="角色" prop="roleIds">
                 <el-select
                   v-model="userForm.roleIds"
@@ -219,7 +218,7 @@
                 </el-select>
               </el-form-item>
             </el-row>
-            <el-row>
+            <el-row class="mt20">
               <el-form-item label="子机构" prop="orgId">
                 <el-select
                   v-model="userForm.orgId"
@@ -242,7 +241,7 @@
                 </el-select>
               </el-form-item>
             </el-row>
-            <el-row>
+            <el-row class="mt20">
               <el-form-item label="状态">
                 <el-radio-group v-model="enableStr" class="pull_right_sm">
                   <el-radio label="true">启用</el-radio>
@@ -258,15 +257,14 @@
         </el-dialog>
 
         <!-- 修改用户信息弹出框 -->
-        <el-dialog title="编辑用户" width="450px" :visible.sync="updateDialog">
+        <el-dialog title="编辑用户" width="500px" :visible.sync="updateDialog">
           <el-form
             ref="updateForm"
             :inline="true"
-            inline-message
             :model="userForm"
             :rules="rules"
             label-position="right"
-            label-width="120px"
+            label-width="80px"
           >
             <el-row>
               <el-form-item label="ID">
@@ -277,7 +275,7 @@
                 />
               </el-form-item>
             </el-row>
-            <el-row>
+            <el-row class="mt20">
               <el-form-item label="姓名" prop="name">
                 <el-input
                   v-model="userForm.name"
@@ -287,7 +285,7 @@
                 />
               </el-form-item>
             </el-row>
-            <el-row>
+            <el-row class="mt20">
               <el-form-item label="登录名" prop="loginName">
                 <el-input
                   v-model="userForm.loginName"
@@ -297,7 +295,7 @@
                 />
               </el-form-item>
             </el-row>
-            <el-row>
+            <el-row class="mt20">
               <el-form-item label="联系方式" prop="phoneNumber">
                 <el-input
                   v-model="userForm.phoneNumber"
@@ -307,8 +305,8 @@
                 />
               </el-form-item>
             </el-row>
-            <el-row>
-              <el-form-item v-if="isSuperAdmin" label="学校" prop="rootOrgId">
+            <el-row v-if="isSuperAdmin" class="mt20">
+              <el-form-item label="学校" prop="rootOrgId">
                 <el-select
                   v-model="userForm.rootOrgId"
                   class="input_width_lg"
@@ -325,7 +323,7 @@
                 </el-select>
               </el-form-item>
             </el-row>
-            <el-row>
+            <el-row class="mt20">
               <el-form-item label="角色" prop="roleIds">
                 <el-select
                   v-model="userForm.roleIds"
@@ -346,7 +344,7 @@
                 </el-select>
               </el-form-item>
             </el-row>
-            <el-row>
+            <el-row class="mt20">
               <el-form-item label="子机构" prop="orgId">
                 <el-select
                   v-model="userForm.orgId"
@@ -369,7 +367,7 @@
                 </el-select>
               </el-form-item>
             </el-row>
-            <el-row>
+            <el-row class="mt20">
               <el-form-item label="状态">
                 <el-radio-group
                   v-model="enableStr"
@@ -549,6 +547,26 @@ export default {
   name: "User",
   components: { UserCopyPrevillegeDialog },
   data() {
+    let pswReg =
+      /^(?![a-zA-Z]+$)(?![A-Z0-9]+$)(?![A-Z\W_]+$)(?![a-z0-9]+$)(?![a-z\W_]+$)(?![0-9\W_]+$)[a-zA-Z0-9\W_]{6,10}$/;
+
+    var validatePsw = (rule, value, callback) => {
+      if (value === "") {
+        callback(new Error("请输入密码"));
+      } else if (value && !value.match(pswReg)) {
+        callback(
+          new Error(
+            "至少包含大写字母、小写字母、数字、特殊符号中的三种,且长度限制在6-10位!"
+          )
+        );
+      } else {
+        // if (this.userForm.password !== "") {
+        //   this.$refs.userForm.validateField("password");
+        // }
+        callback();
+      }
+    };
+
     var validateRootOrg = (rule, value, callback) => {
       if (0 != value && !value) {
         callback(new Error("请选择学校"));
@@ -621,8 +639,9 @@ export default {
         ],
         password: [
           {
-            required: true,
-            message: "请输入密码",
+            // required: true,
+            // message: "请输入密码",
+            validator: validatePsw,
             trigger: "blur",
           },
         ],
@@ -1169,9 +1188,13 @@ export default {
 }
 
 .input_width_lg {
-  width: 180px;
+  width: 300px;
 }
 .input_width {
   width: 150px;
 }
+
+.mt20 {
+  margin-top: 20px;
+}
 </style>

+ 10 - 0
src/modules/examwork/view/examInfo.vue

@@ -31,6 +31,15 @@
               ></el-option>
             </el-select>
           </el-form-item>
+
+          <el-form-item label="状态" class="pull-left">
+            <el-select v-model="formSearch.enable" class="input">
+              <el-option label="全部" value=""></el-option>
+              <el-option label="已启用" value="true"></el-option>
+              <el-option label="已禁用" value="false"></el-option>
+            </el-select>
+          </el-form-item>
+
           <el-form-item class="d-block">
             <el-button
               v-if="rolePrivileges.search_exam"
@@ -356,6 +365,7 @@ export default {
       formSearch: {
         name: "",
         examType: "",
+        enable: "true",
       },
       loading: false,
       examTypeList: EXAM_TYPE,

+ 7 - 7
src/modules/examwork/view/examIpLimit.vue

@@ -34,8 +34,8 @@
           <el-form-item label="限制类型">
             <el-select v-model="formSearch.limitType" class="input">
               <el-option label="未选择" value=""></el-option>
-              <el-option label="允许访问" value="0"></el-option>
-              <el-option label="禁止访问" value="1"></el-option>
+              <el-option label="允许访问" value="HAS_ACCESS"></el-option>
+              <el-option label="禁止访问" value="NO_ACCESS"></el-option>
             </el-select>
           </el-form-item>
 
@@ -410,11 +410,11 @@ export default {
     return {
       limitTypeList: [
         {
-          id: 0,
+          id: "HAS_ACCESS",
           label: "允许访问",
         },
         {
-          id: 1,
+          id: "NO_ACCESS",
           label: "禁止访问",
         },
       ],
@@ -620,9 +620,9 @@ export default {
     },
     getLimitType(type) {
       if (type === "允许访问") {
-        return 0;
+        return "HAS_ACCESS";
       } else if (type === "禁止访问") {
-        return 1;
+        return "NO_ACCESS";
       }
       return null;
     },
@@ -663,7 +663,7 @@ export default {
       }
       if (row) {
         this.examIpLimitTypeForm.id = row.id;
-        this.examIpLimitTypeForm.limitType = row.limitType;
+        this.examIpLimitTypeForm.limitType = this.getLimitType(row.limitType);
       } else {
         this.examIpLimitTypeForm.id = null;
         this.examIpLimitTypeForm.limitType = null;

+ 9 - 28
src/modules/examwork/view/onlineExam.vue

@@ -108,26 +108,6 @@
                     </el-select>
                   </el-form-item>
                 </el-row>
-                <el-row>
-                  <el-form-item
-                    label="抽题模式"
-                    :label-width="style.label_width_tab1"
-                  >
-                    <el-select
-                      v-model="form.callType"
-                      class="input"
-                      :disabled="examId != 'add'"
-                      placeholder="请选择"
-                    >
-                      <el-option
-                        v-for="item in callTypeList"
-                        :key="item.value"
-                        :label="item.label"
-                        :value="item.value"
-                      ></el-option>
-                    </el-select>
-                  </el-form-item>
-                </el-row>
                 <el-row>
                   <el-form-item
                     label="状态"
@@ -415,6 +395,13 @@
                     >
                       <template slot="append">分钟</template>
                     </el-input>
+                    <el-radio-group
+                      v-model="form.properties.FREEZE_TIME_TYPE"
+                      style="margin-left: 30px"
+                    >
+                      <el-radio label="DURATION">按实际考试时长</el-radio>
+                      <el-radio label="BEGINTIME">按考试开始时间</el-radio>
+                    </el-radio-group>
                   </el-form-item>
                 </el-row>
                 <el-row>
@@ -953,12 +940,7 @@
 
 <script>
 import { mapState } from "vuex";
-import {
-  EXAM_TYPE,
-  CALL_TYPE,
-  EXAM_WORK_API,
-  CORE_API,
-} from "@/constants/constants.js";
+import { EXAM_TYPE, EXAM_WORK_API, CORE_API } from "@/constants/constants.js";
 import moment from "moment";
 import ckeditor from "@/components/ckeditor.vue";
 import LinkTitlesCustom from "@/components/LinkTitlesCustom.vue";
@@ -1419,7 +1401,6 @@ export default {
         name: "",
         code: "",
         examType: "ONLINE",
-        callType: "WHOLE_SET",
         examTimes: 1,
         beginTime: null,
         endTime: null,
@@ -1435,6 +1416,7 @@ export default {
           MAX_SWITCH_SCREEN_COUNT: "",
           EXAM_RECONNECT_TIME: 30,
           FREEZE_TIME: 0,
+          FREEZE_TIME_TYPE: "DURATION",
           BEFORE_EXAM_REMARK: "",
           AFTER_EXAM_REMARK: "",
           SHOW_CHEATING_REMARK: "true",
@@ -1477,7 +1459,6 @@ export default {
         },
       },
       examTypeList: EXAM_TYPE,
-      callTypeList: CALL_TYPE,
       examId: "",
       rootOrgId: null,
       rules: {

+ 8 - 0
src/modules/examwork/view/onlineHomework.vue

@@ -365,6 +365,13 @@
                     >
                       <template slot="append">分钟</template>
                     </el-input>
+                    <el-radio-group
+                      v-model="form.properties.FREEZE_TIME_TYPE"
+                      style="margin-left: 30px"
+                    >
+                      <el-radio label="DURATION">按实际考试时长</el-radio>
+                      <el-radio label="BEGINTIME">按考试开始时间</el-radio>
+                    </el-radio-group>
                   </el-form-item>
                 </el-row>
                 <el-row>
@@ -870,6 +877,7 @@ export default {
           MAX_SWITCH_SCREEN_COUNT: "",
           EXAM_RECONNECT_TIME: 30,
           FREEZE_TIME: 0,
+          FREEZE_TIME_TYPE: "DURATION",
           BEFORE_EXAM_REMARK: "",
           AFTER_EXAM_REMARK: "",
           SHOW_CHEATING_REMARK: "true",

+ 40 - 54
src/modules/examwork/view/practiceExam.vue

@@ -109,26 +109,6 @@
                     </el-select>
                   </el-form-item>
                 </el-row>
-                <el-row>
-                  <el-form-item
-                    label="抽题模式"
-                    :label-width="style.label_width_tab1"
-                  >
-                    <el-select
-                      v-model="form.callType"
-                      class="input"
-                      :disabled="examId != 'add'"
-                      placeholder="请选择"
-                    >
-                      <el-option
-                        v-for="item in callTypeList"
-                        :key="item.value"
-                        :label="item.label"
-                        :value="item.value"
-                      ></el-option>
-                    </el-select>
-                  </el-form-item>
-                </el-row>
                 <el-row>
                   <el-form-item
                     label="状态"
@@ -282,7 +262,7 @@
                     >
                   </el-form-item>
                 </el-row>
-                <el-row>
+                <!-- <el-row>
                   <el-form-item
                     label="交卷冻结时间"
                     prop="FREEZE_TIME"
@@ -295,8 +275,15 @@
                       auto-complete="off"
                       ><template slot="append">分钟</template></el-input
                     >
+                    <el-radio-group
+                      v-model="form.properties.FREEZE_TIME_TYPE"
+                      style="margin-left: 30px"
+                    >
+                      <el-radio label="DURATION">按实际考试时长</el-radio>
+                      <el-radio label="BEGINTIME">按考试开始时间</el-radio>
+                    </el-radio-group>
                   </el-form-item>
-                </el-row>
+                </el-row> -->
                 <el-row>
                   <el-form-item
                     label="断点续考时间"
@@ -391,7 +378,7 @@
 </template>
 
 <script>
-import { CALL_TYPE, EXAM_TYPE, EXAM_WORK_API } from "@/constants/constants.js";
+import { EXAM_TYPE, EXAM_WORK_API } from "@/constants/constants.js";
 import moment from "moment";
 import ckeditor from "@/components/ckeditor.vue";
 import LinkTitlesCustom from "@/components/LinkTitlesCustom.vue";
@@ -494,31 +481,31 @@ let validateExamTimes = (rule, value, callback) => {
   }
 };
 
-let validateFreezeTime = (rule, value, callback) => {
-  let freezeTime = _this.form.properties.FREEZE_TIME;
-  let duration = _this.form.duration;
-  if (freezeTime === "") {
-    callback(new Error("请输入交卷冻结时长"));
-    if (!_this.toActiveName) {
-      _this.toActiveName = "tab2";
-      _this.activeName = "tab2";
-    }
-  } else if (0 > freezeTime || !freezeTime.toString().match(/^[1-9]\d*|0$/)) {
-    callback(new Error("只能是非负整数"));
-    if (!_this.toActiveName) {
-      _this.toActiveName = "tab2";
-      _this.activeName = "tab2";
-    }
-  } else if (duration != "" && parseInt(freezeTime) > parseInt(duration)) {
-    callback(new Error("交卷冻结时长不能大于考试时长"));
-    if (!_this.toActiveName) {
-      _this.toActiveName = "tab2";
-      _this.activeName = "tab2";
-    }
-  } else {
-    callback();
-  }
-};
+// let validateFreezeTime = (rule, value, callback) => {
+//   let freezeTime = _this.form.properties.FREEZE_TIME;
+//   let duration = _this.form.duration;
+//   if (freezeTime === "") {
+//     callback(new Error("请输入交卷冻结时长"));
+//     if (!_this.toActiveName) {
+//       _this.toActiveName = "tab2";
+//       _this.activeName = "tab2";
+//     }
+//   } else if (0 > freezeTime || !freezeTime.toString().match(/^[1-9]\d*|0$/)) {
+//     callback(new Error("只能是非负整数"));
+//     if (!_this.toActiveName) {
+//       _this.toActiveName = "tab2";
+//       _this.activeName = "tab2";
+//     }
+//   } else if (duration != "" && parseInt(freezeTime) > parseInt(duration)) {
+//     callback(new Error("交卷冻结时长不能大于考试时长"));
+//     if (!_this.toActiveName) {
+//       _this.toActiveName = "tab2";
+//       _this.activeName = "tab2";
+//     }
+//   } else {
+//     callback();
+//   }
+// };
 
 let validateExamReconnectTime = (rule, value, callback) => {
   let examReconnectTime = _this.form.properties.EXAM_RECONNECT_TIME;
@@ -571,14 +558,14 @@ export default {
         started: false,
         name: "",
         examType: "PRACTICE",
-        callType: "WHOLE_SET",
         examTimes: 1,
         beginTime: null,
         endTime: null,
         duration: 120,
         enable: "true",
         properties: {
-          FREEZE_TIME: 0,
+          // FREEZE_TIME: 0,
+          // FREEZE_TIME_TYPE: "DURATION",
           EXAM_RECONNECT_TIME: 30,
           BEFORE_EXAM_REMARK: "",
           AFTER_EXAM_REMARK: "",
@@ -592,7 +579,6 @@ export default {
         },
       },
       examTypeList: EXAM_TYPE,
-      callTypeList: CALL_TYPE,
       examId: "",
       rules: {
         code: [{ required: true, validator: validateCode, trigger: "blur" }],
@@ -610,9 +596,9 @@ export default {
         examTimes: [
           { required: true, validator: validateExamTimes, trigger: "blur" },
         ],
-        FREEZE_TIME: [
-          { required: true, validator: validateFreezeTime, trigger: "blur" },
-        ],
+        // FREEZE_TIME: [
+        //   { required: true, validator: validateFreezeTime, trigger: "blur" },
+        // ],
         EXAM_RECONNECT_TIME: [
           {
             required: true,

+ 1 - 1
src/modules/marking/views/MarkSettingWork.vue

@@ -125,7 +125,7 @@ export default {
       this.$http
         .get(
           MARKING_LOGIC_API +
-            "/markWorks?userId=" +
+            "/markWorks?isEnd=0&userId=" +
             this.user.userId +
             `&pageNumber=${this.currentPage - 1}&pageSize=${
               this.pageSize

+ 2 - 38
src/modules/marking/views/MarkWork.vue

@@ -219,18 +219,6 @@
                   </el-option>
                 </el-select>
               </el-form-item>
-              <el-form-item
-                v-show="formMarkWork.examType === 'ONLINE'"
-                label="抽题模式"
-              >
-                <el-radio-group
-                  v-model="formMarkWork.callType"
-                  :disabled="!!markWorkId"
-                >
-                  <el-radio label="WHOLE_SET">成套调用</el-radio>
-                  <el-radio label="RANDOM_PAPER">随机抽题</el-radio>
-                </el-radio-group>
-              </el-form-item>
               <el-form-item label="考试" prop="examIds">
                 <el-select
                   v-model="formMarkWork.examIds"
@@ -289,7 +277,6 @@ export default {
         name: "",
         examIds: [],
         remark: "",
-        callType: "WHOLE_SET",
       },
       rules: {
         name: [{ required: true, message: "请输入名称", trigger: "blur" }],
@@ -335,18 +322,7 @@ export default {
   computed: {
     ...mapState({ user: (state) => state.user }),
   },
-  watch: {
-    "formMarkWork.examType"(val) {
-      if (val !== "ONLINE") {
-        this.formMarkWork.callType = "WHOLE_SET";
-      }
-    },
-    "formMarkWork.callType"() {
-      if (this.formMarkWork.examType && !this.markWorkId) {
-        this.examTypeChange();
-      }
-    },
-  },
+  watch: {},
   created() {
     this.initMarkWorkData();
   },
@@ -426,9 +402,6 @@ export default {
       if (this.formMarkWork.examType) {
         params = params + "&examType=" + this.formMarkWork.examType;
       }
-      if (this.formMarkWork.examType === "ONLINE") {
-        params = params + "&callType=" + this.formMarkWork.callType;
-      }
       this.$http
         .get(MARKING_LOGIC_API + "/exam/all" + params)
         .then((response) => {
@@ -542,7 +515,6 @@ export default {
         remark: "",
         examType: "",
         examIds: [],
-        callType: "WHOLE_SET",
       };
       this.examSelect = [];
       this.markWorkId = "";
@@ -556,9 +528,7 @@ export default {
     },
     editMarkWorkModal(row) {
       this.examTitle = "编辑评卷工作";
-      this.formMarkWork = Object.assign({}, row, {
-        callType: row.callType || "WHOLE_SET",
-      });
+      this.formMarkWork = Object.assign({}, row, {});
       this.oldWorkName = this.formMarkWork.name;
       this.markWorkId = row.id;
       this.getExamSelect();
@@ -765,11 +735,6 @@ export default {
     resetForm() {
       if (this.markWorkId) {
         //编辑
-        // this.formMarkWork = Object.assign(this.formMarkWork, {
-        //   remark: "",
-        //   name: "",
-        //   callType: "WHOLE_SET",
-        // });
         this.formMarkWork.name = "";
         this.formMarkWork.remark = "";
         this.$refs["formMarkWork"].clearValidate();
@@ -779,7 +744,6 @@ export default {
           remark: "",
           examName: "",
           name: "",
-          callType: "WHOLE_SET",
         });
         this.$refs["formMarkWork"].clearValidate();
       }

+ 1 - 0
src/modules/oe/views/awaitingAudit.vue

@@ -869,6 +869,7 @@ export default {
     },
     examRecordDataDialogClose() {
       this.examRecordDataDialog = false;
+      this.search("clickSelectBtn");
     },
     examRecordDataDialogOpen(examRecordDataId, showAuditButton) {
       this.examRecordDataDialog = true;

+ 37 - 1
src/modules/oe/views/examPaperDetail.vue

@@ -1,6 +1,14 @@
 <template>
   <div id="paperView">
     <div id="paperName">{{ paperStruct.name }}</div>
+    <el-image
+      ref="elImage"
+      style="width: 0; height: 0"
+      :src="previewSrc"
+      :preview-src-list="previewList"
+      @load="elImageLoad"
+    >
+    </el-image>
     <div id="studentInfoDiv">
       <table id="studentInfoTable" border>
         <thead>
@@ -88,7 +96,10 @@
                 style="color: blue; font-weight: bold"
               >
                 学生答案:
-                <span v-html="questionUnit.studentAnswer"></span>
+                <span
+                  @click="answerClick"
+                  v-html="questionUnit.studentAnswer"
+                ></span>
                 <i
                   v-show="
                     questionUnit.isObjectiveQuestion && questionUnit.isRight
@@ -164,6 +175,8 @@ export default {
       courseInfo: {},
       paperStruct: {},
       examQuestionList: [],
+      previewList: [],
+      previewSrc: "",
     };
   },
   created() {
@@ -174,6 +187,26 @@ export default {
     this.getPaperData();
   },
   methods: {
+    elImageLoad() {
+      let img = this.$refs.elImage.$el.querySelector(".el-image__preview");
+      img.click();
+    },
+    answerClick(e) {
+      if ((e.target.className || "").includes("photo-answer")) {
+        e.preventDefault();
+        this.previewSrc = e.target.src;
+        this.previewList = [e.target.src];
+        setTimeout(() => {
+          try {
+            let img =
+              this.$refs.elImage.$el.querySelector(".el-image__preview");
+            img.click();
+          } catch (err) {
+            console.log(err);
+          }
+        }, 10);
+      }
+    },
     getExamRecordData() {
       this.$http
         .get("/api/ecs_oe_admin/exam/record/data/findExamRecordDataEntity", {
@@ -399,6 +432,9 @@ export default {
 <style scoped>
 #paperView {
   background-color: white;
+  width: 100vw;
+  height: 100vh;
+  overflow: auto;
 }
 #paperName {
   text-align: center;

+ 228 - 179
src/modules/oe/views/scoreStatistic.vue

@@ -6,7 +6,7 @@
           v-model="searchParams.examId"
           filterable
           remote
-          :remote-method="getExams"
+          :remote-method="getExamList"
           clearable
           placeholder="请选择考试"
           size="small"
@@ -20,33 +20,19 @@
           ></el-option>
         </el-select>
       </el-form-item>
-      <el-form-item label="课程" label-width="70px" label-position="right">
-        <el-select
-          v-model="searchParams.courseId"
-          class="form_search_width"
-          clearable
-          filterable
-          placeholder="请选择课程"
-          size="small"
-        >
-          <el-option
-            v-for="item in courseList"
-            :key="item.id"
-            :label="item.name"
-            :value="item.id"
-          ></el-option>
-        </el-select>
-      </el-form-item>
-      <el-button type="primary" :disabled="paramsMiss()" @click="searchHandler"
-        >查询</el-button
-      >
-      <el-button type="primary" :disabled="paramsMiss()" @click="countHandler"
+
+      <!-- <el-button type="primary" :disabled="disableParam()" @click="searchHandler">查询</el-button>-->
+
+      <el-button
+        type="primary"
+        :disabled="disableParam()"
+        @click="refreshHandler"
         >刷新计算</el-button
       >
       <el-button
         type="primary"
         style="float: right"
-        :disabled="!searchParams.examId"
+        :disabled="disableParam()"
         @click="openDialog"
         >及格线设置</el-button
       >
@@ -54,95 +40,125 @@
 
     <div class="search-result flex">
       <div class="result-column">
-        <div class="title">批次整体统计</div>
         <div class="desc-item">
           应考人次: <span>{{ examResult.allCount }}</span>
         </div>
         <div class="desc-item">
           实考人次:<span> {{ examResult.finishCount }}</span>
         </div>
+      </div>
+      <div class="result-column">
         <div class="desc-item">
           缺考人次:<span> {{ examResult.unFinishCount }}</span>
         </div>
         <div class="desc-item">
-          缺考率:<span> {{ examResult.unFinishRate }}</span>
+          缺考率(%):<span> {{ examResult.unFinishRate }}</span>
         </div>
       </div>
       <div class="result-column">
-        <div class="title">整体成绩概况</div>
         <div class="desc-item">
           及格人数:<span> {{ examResult.passScoreCount }}</span>
         </div>
         <div class="desc-item">
-          及格率:<span> {{ examResult.passScoreRate }}</span>
-        </div>
-        <div class="desc-item">
-          优秀人数:<span> {{ examResult.goodScoreCount }}</span>
-        </div>
-        <div class="desc-item">
-          优秀率:<span> {{ examResult.goodScoreRate }}</span>
+          及格率(%):<span> {{ examResult.passScoreRate }}</span>
         </div>
       </div>
       <div class="result-column">
-        <div class="title">
-          批次整体统计:<span>{{ courseResult.courseName }}</span>
-        </div>
-        <div class="desc-item">
-          应考人次: <span>{{ courseResult.allCount }}</span>
-        </div>
-        <div class="desc-item">
-          实考人次:<span> {{ courseResult.finishCount }}</span>
-        </div>
         <div class="desc-item">
-          缺考人次:<span> {{ courseResult.unFinishCount }}</span>
+          优秀人数:<span> {{ examResult.goodScoreCount }}</span>
         </div>
         <div class="desc-item">
-          缺考率:<span> {{ courseResult.unFinishRate }}</span>
+          优秀率(%):<span> {{ examResult.goodScoreRate }}</span>
         </div>
       </div>
       <div class="result-column">
-        <div class="title">科目成绩概况</div>
-        <div class="desc-item">
-          及格人数:<span> {{ courseResult.passScoreCount }}</span>
-        </div>
-        <div class="desc-item">
-          及格率: <span>{{ courseResult.passScoreRate }}</span>
-        </div>
         <div class="desc-item">
-          优秀人数: <span>{{ courseResult.goodScoreCount }}</span>
+          违纪人数:<span> {{ examResult.illegalityCount }}</span>
         </div>
         <div class="desc-item">
-          优秀率:<span> {{ courseResult.goodScoreRate }}</span>
+          违纪率(%):<span> {{ examResult.illegalityRate }}</span>
         </div>
       </div>
     </div>
 
-    <el-form :inline="true">
-      <el-form-item label="学习中心统计:">
-        <el-select v-model="subOrgId" clearable @change="filterSubOrg">
-          <el-option
-            v-for="item in orgOptions"
-            :key="item.id"
-            :label="item.name"
-            :value="item.id"
-          ></el-option>
-        </el-select>
-      </el-form-item>
+    <el-tabs type="border-card">
+      <el-tab-pane label="学习中心统计">
+        <el-form :inline="true">
+          <el-form-item label="">
+            <el-select
+              v-model="searchParams.orgId"
+              placeholder="请选择学习中心"
+              clearable
+              @change="changeOrg"
+            >
+              <el-option
+                v-for="item in orgList"
+                :key="item.id"
+                :label="item.name"
+                :value="item.id"
+              ></el-option>
+            </el-select>
+          </el-form-item>
 
-      <el-button type="primary" :disabled="paramsMiss()" @click="exportExcel"
-        >导出</el-button
-      >
-    </el-form>
+          <el-button
+            type="primary"
+            :disabled="disableParam()"
+            @click="exportOrgStatisticExcel"
+            >导出</el-button
+          >
+        </el-form>
 
-    <el-table :data="tableData" style="margin-top: 10px">
-      <el-table-column
-        v-for="(item, index) in tableColumns"
-        :key="index"
-        :label="item.label"
-        :prop="item.prop"
-      >
-      </el-table-column>
-    </el-table>
+        <el-table :data="orgTableData" style="margin-top: 10px">
+          <el-table-column
+            v-for="(item, index) in orgTableColumns"
+            :key="index"
+            :label="item.label"
+            :prop="item.prop"
+          >
+          </el-table-column>
+        </el-table>
+      </el-tab-pane>
+
+      <el-tab-pane label="课程统计">
+        <el-form :inline="true">
+          <el-form-item label="">
+            <el-select
+              v-model="searchParams.courseId"
+              class="form_search_width"
+              clearable
+              filterable
+              placeholder="请选择课程"
+              size="small"
+              @change="changeCourse"
+            >
+              <el-option
+                v-for="item in courseList"
+                :key="item.id"
+                :label="item.name"
+                :value="item.id"
+              ></el-option>
+            </el-select>
+          </el-form-item>
+
+          <el-button
+            type="primary"
+            :disabled="disableParam()"
+            @click="exportCourseStatisticExcel"
+            >导出</el-button
+          >
+        </el-form>
+
+        <el-table :data="courseTableData" style="margin-top: 10px">
+          <el-table-column
+            v-for="(item, index) in courseTableColumns"
+            :key="index"
+            :label="item.label"
+            :prop="item.prop"
+          >
+          </el-table-column>
+        </el-table>
+      </el-tab-pane>
+    </el-tabs>
 
     <el-dialog
       ref="dialog"
@@ -224,13 +240,11 @@ import { mapState } from "vuex";
 export default {
   data() {
     return {
-      dialogLoading: false,
-      searchParams: {
-        examId: "",
-        courseId: "",
-      },
-      subOrgId: "",
+      refreshing: false,
+      setLineLoading: false,
       visible: false,
+      dialogLoading: false,
+      dialogChecked: false,
       originDialogTableData: [],
       dialogTableData: [],
       dialogTableColumns: [
@@ -238,33 +252,16 @@ export default {
         { label: "及格线", prop: "passScoreLine" },
         { label: "优秀线", prop: "goodScoreLine" },
       ],
-      originTableData: [],
-      tableData: [],
-      tableColumns: [
-        { label: "学习中心", prop: "orgName" },
-        { label: "应考", prop: "allCount" },
-        { label: "实考", prop: "finishCount" },
-        { label: "缺考", prop: "unFinishCount" },
-        { label: "缺考率", prop: "unFinishRate" },
-        { label: "及格人数", prop: "passScoreCount" },
-        { label: "及格率", prop: "passScoreRate" },
-        { label: "优秀人数", prop: "goodScoreCount" },
-        { label: "优秀率", prop: "goodScoreRate" },
-      ],
+      searchParams: {
+        examId: "",
+        courseId: "",
+        orgId: "",
+      },
       examList: [],
       courseList: [],
+      orgList: [],
       examResult: {
-        courseName: "",
-        allCount: "",
-        finishCount: "",
-        unFinishCount: "",
-        unFinishRate: "",
-        passScoreCount: "",
-        passScoreRate: "",
-        goodScoreCount: "",
-        goodScoreRate: "",
-      },
-      courseResult: {
+        examName: "",
         allCount: "",
         finishCount: "",
         unFinishCount: "",
@@ -273,48 +270,53 @@ export default {
         passScoreRate: "",
         goodScoreCount: "",
         goodScoreRate: "",
+        illegalityCount: "",
+        illegalityRate: "",
       },
-      orgOptions: [],
-      dialogChecked: false,
-      counting: false,
-      setLineLoading: false,
+      orgTableData: [],
+      orgTableColumns: [
+        { label: "学习中心", prop: "orgName" },
+        { label: "应考", prop: "allCount" },
+        { label: "实考", prop: "finishCount" },
+        { label: "缺考", prop: "unFinishCount" },
+        { label: "缺考率(%)", prop: "unFinishRate" },
+        { label: "及格人数", prop: "passScoreCount" },
+        { label: "及格率(%)", prop: "passScoreRate" },
+        { label: "优秀人数", prop: "goodScoreCount" },
+        { label: "优秀率(%)", prop: "goodScoreRate" },
+        { label: "违纪人数", prop: "illegalityCount" },
+        { label: "违纪率(%)", prop: "illegalityRate" },
+      ],
+      courseTableData: [],
+      courseTableColumns: [
+        { label: "课程代码", prop: "courseCode" },
+        { label: "课程名称", prop: "courseName" },
+        { label: "应考", prop: "allCount" },
+        { label: "实考", prop: "finishCount" },
+        { label: "缺考", prop: "unFinishCount" },
+        { label: "缺考率(%)", prop: "unFinishRate" },
+        { label: "及格人数", prop: "passScoreCount" },
+        { label: "及格率(%)", prop: "passScoreRate" },
+        { label: "优秀人数", prop: "goodScoreCount" },
+        { label: "优秀率(%)", prop: "goodScoreRate" },
+        { label: "违纪人数", prop: "illegalityCount" },
+        { label: "违纪率(%)", prop: "illegalityRate" },
+      ],
     };
   },
   computed: {
     ...mapState({ user: (state) => state.user }),
   },
   created() {
-    this.getExams();
+    this.getExamList();
     this.getOrgList();
   },
 
   methods: {
-    paramsMiss() {
-      return !this.searchParams.examId || !this.searchParams.courseId;
-    },
-    filterSubOrg() {
-      if (!this.subOrgId) {
-        this.tableData = this.originTableData;
-      } else {
-        this.tableData = this.originTableData.filter(
-          (item) => item.orgId == this.subOrgId
-        );
-      }
-    },
-    getOrgList() {
-      this.$http
-        .get("/api/ecs_core/org/query", {
-          params: { name: "", rootOrgId: this.user.rootOrgId, enable: true },
-        })
-        .then((res) => {
-          this.orgOptions = res.data;
-        });
+    disableParam() {
+      return !this.searchParams.examId;
     },
-    openDialog() {
-      this.getDialogData();
-      this.visible = true;
-    },
-    getExams(examName) {
+    getExamList(examName) {
       if (!examName) {
         examName = "";
       }
@@ -330,7 +332,16 @@ export default {
           this.examList = response.data;
         });
     },
-    getCourses() {
+    getOrgList() {
+      this.$http
+        .get("/api/ecs_core/org/query", {
+          params: { name: "", rootOrgId: this.user.rootOrgId, enable: true },
+        })
+        .then((res) => {
+          this.orgList = res.data;
+        });
+    },
+    getCourseList() {
       this.courseList = [];
       this.searchParams.courseId = "";
       var examId = this.searchParams.examId;
@@ -341,7 +352,6 @@ export default {
         .get("/api/ecs_oe_admin/exam/student/findCoursesByExamIdAndOrgId", {
           params: {
             examId: examId,
-            // orgId: this.user.rootOrgId,
           },
         })
         .then((response) => {
@@ -349,54 +359,104 @@ export default {
         });
     },
     searchHandler() {
-      this.getStatisticInfo();
-      this.getTableData();
+      this.getStatisticForExam();
+      this.getStatisticForOrg();
+      this.getStatisticForCourse();
     },
-    countHandler() {
-      this.counting = true;
-      this.$http
-        .post(
-          "/api/ecs_oe_admin/exam/statistic/overview/refresh",
-          {},
-          {
-            params: {
-              courseId: this.searchParams.courseId,
-              examId: this.searchParams.examId,
-            },
-          }
-        )
-        .then(() => {
-          this.counting = false;
-          this.searchHandler();
-        });
+    changeExam() {
+      this.getCourseList();
+      this.getStatisticForExam();
+      this.getStatisticForOrg();
+      this.getStatisticForCourse();
     },
-    getStatisticInfo() {
-      const { examId, courseId } = this.searchParams;
+    changeOrg() {
+      this.getStatisticForOrg();
+    },
+    changeCourse() {
+      this.getStatisticForCourse();
+    },
+    getStatisticForExam() {
+      const { examId } = this.searchParams;
       this.$http
-        .post("/api/ecs_oe_admin/exam/statistic/overview", null, {
+        .post("/api/ecs_oe_admin/exam/statistic/overview/for/exam", null, {
           params: {
             examId,
-            courseId,
           },
           headers: { "content-type": "application/x-www-form-urlencoded" },
         })
         .then((res) => {
-          Object.assign(this.examResult, res.data.examResult || {});
-          Object.assign(this.courseResult, res.data.courseResult || {});
+          Object.assign(this.examResult, res.data || {});
         });
     },
-    getTableData() {
-      const { examId, courseId } = this.searchParams;
+
+    getStatisticForOrg() {
+      const { examId, orgId } = this.searchParams;
       this.$http
         .post("/api/ecs_oe_admin/exam/statistic/overview/for/org", null, {
+          params: { examId, orgId },
+          headers: { "content-type": "application/x-www-form-urlencoded" },
+        })
+        .then((res) => {
+          this.orgTableData = res.data || [];
+        });
+    },
+
+    getStatisticForCourse() {
+      const { examId, courseId } = this.searchParams;
+      this.$http
+        .post("/api/ecs_oe_admin/exam/statistic/overview/for/course", null, {
           params: { examId, courseId },
           headers: { "content-type": "application/x-www-form-urlencoded" },
         })
         .then((res) => {
-          this.tableData = res.data || [];
-          this.originTableData = JSON.parse(JSON.stringify(res.data || []));
+          this.courseTableData = res.data || [];
+        });
+    },
+    exportOrgStatisticExcel() {
+      const { examId, orgId } = this.searchParams;
+      let key = this.user.key;
+      let token = this.user.token;
+      let url = `/api/ecs_oe_admin/exam/statistic/overview/for/org/export?examId=${examId}&orgId=${orgId}&$key=${key}&$token=${token}`;
+      location.href = url;
+    },
+    exportCourseStatisticExcel() {
+      const { examId, courseId } = this.searchParams;
+      let key = this.user.key;
+      let token = this.user.token;
+      let url = `/api/ecs_oe_admin/exam/statistic/overview/for/course/export?examId=${examId}&courseId=${courseId}&$key=${key}&$token=${token}`;
+      location.href = url;
+    },
+    refreshHandler() {
+      this.refreshing = true;
+      this.$http
+        .post(
+          "/api/ecs_oe_admin/exam/statistic/overview/refresh",
+          {},
+          {
+            params: {
+              examId: this.searchParams.examId,
+            },
+          }
+        )
+        .then(() => {
+          this.refreshing = false;
+          this.searchHandler();
+        })
+        .catch((e) => {
+          if (e.response.status === 500) {
+            this.$notify({
+              showClose: true,
+              message: e.response.data.desc,
+              type: "error",
+            });
+          }
         });
     },
+
+    openDialog() {
+      this.getDialogData();
+      this.visible = true;
+    },
     resetDialogData() {
       this.getDialogData();
     },
@@ -422,17 +482,6 @@ export default {
           this.dialogLoading = false;
         });
     },
-    changeExam() {
-      this.getCourses();
-      // this.getDialogData();
-    },
-    exportExcel() {
-      const { examId, courseId } = this.searchParams;
-      let key = this.user.key;
-      let token = this.user.token;
-      let url = `/api/ecs_oe_admin/exam/statistic/overview/for/org/export?examId=${examId}&courseId=${courseId}&$key=${key}&$token=${token}`;
-      location.href = url;
-    },
     hasNumValue(val) {
       return !!val || val === 0;
     },

+ 28 - 17
src/modules/portal/views/home/Home.vue

@@ -74,7 +74,7 @@
     <!-- 添加用户信息弹出框 -->
     <el-dialog
       title="个人信息"
-      width="410px"
+      width="500px"
       :visible.sync="userDialog"
       @close="() => $refs.passForm.clearValidate()"
     >
@@ -99,7 +99,6 @@
           <el-form
             ref="passForm"
             :inline="true"
-            inline-message
             :model="passForm"
             :rules="passRules"
             label-position="right"
@@ -110,24 +109,24 @@
                 <el-input
                   v-model="passForm.pass"
                   type="password"
-                  style="width: 150px"
+                  style="width: 300px"
                   auto-complete="off"
                   placeholder="请输入密码"
                 />
               </el-form-item>
             </el-row>
-            <el-row>
+            <el-row style="margin-top: 20px">
               <el-form-item label="确认密码" prop="checkPass">
                 <el-input
                   v-model="passForm.checkPass"
                   type="password"
-                  style="width: 150px"
+                  style="width: 300px"
                   auto-complete="off"
                   placeholder="请输入确认密码"
                 />
               </el-form-item>
             </el-row>
-            <el-row style="margin-left: 100px">
+            <el-row style="margin-top: 20px; margin-left: 100px">
               <el-button type="primary" @click="submitForm">保 存</el-button>
               <el-button @click="userDialog = false">取 消</el-button>
             </el-row>
@@ -135,9 +134,10 @@
         </el-tab-pane>
       </el-tabs>
     </el-dialog>
+
     <el-dialog
       title="修改密码"
-      width="406px"
+      width="500px"
       :lock-scroll="true"
       :close-on-click-modal="false"
       :close-on-press-escape="false"
@@ -148,7 +148,6 @@
       <el-form
         ref="passWeakForm"
         :inline="true"
-        inline-message
         :model="passWeakForm"
         :rules="passWeakRules"
         label-position="right"
@@ -159,31 +158,31 @@
             <el-input
               v-model="passWeakForm.pass"
               type="password"
-              style="width: 150px"
+              style="width: 300px"
               auto-complete="off"
               placeholder="输入新密码"
             />
           </el-form-item>
         </el-row>
-        <el-row>
+        <el-row style="margin-top: 20px">
           <el-form-item label="确认密码" prop="checkPass">
             <el-input
               v-model="passWeakForm.checkPass"
               type="password"
-              style="width: 150px"
+              style="width: 300px"
               auto-complete="off"
               placeholder="再次输入新密码"
             />
           </el-form-item>
         </el-row>
-        <el-row>
+        <el-row style="margin-top: 20px">
           <el-form-item
             ><span class="passWeakInfo"
               >*为保护您的账户安全,请重新录入新密码,以防泄露
             </span></el-form-item
           >
         </el-row>
-        <el-row style="margin-left: 80px">
+        <el-row style="margin-top: 20px; margin-left: 80px">
           <el-button type="primary" @click="submitPassWeakForm"
             >确 认</el-button
           >
@@ -205,11 +204,18 @@ export default {
   name: "Home",
   components: { HomeSide, LinkTitles, SiteMessagePopup },
   data() {
+    let pswReg =
+      /^(?![a-zA-Z]+$)(?![A-Z0-9]+$)(?![A-Z\W_]+$)(?![a-z0-9]+$)(?![a-z\W_]+$)(?![0-9\W_]+$)[a-zA-Z0-9\W_]{6,10}$/;
+
     var validatePass = (rule, value, callback) => {
       if (value === "") {
         callback(new Error("请输入密码"));
-      } else if (value.length < 6) {
-        callback(new Error("密码长度至少6位"));
+      } else if (value && !value.match(pswReg)) {
+        callback(
+          new Error(
+            "至少包含大写字母、小写字母、数字、特殊符号中的三种,且长度限制在6-10位!"
+          )
+        );
       } else {
         if (this.passForm.checkPass !== "") {
           this.$refs.passForm.validateField("checkPass");
@@ -226,11 +232,16 @@ export default {
         callback();
       }
     };
+
     var validatePassWeakPass = (rule, value, callback) => {
       if (value === "") {
         callback(new Error("请输入密码"));
-      } else if (value.length < 6) {
-        callback(new Error("密码长度至少6位"));
+      } else if (value && !value.match(pswReg)) {
+        callback(
+          new Error(
+            "至少包含大写字母、小写字母、数字、特殊符号中的三种,且长度限制在6-10位!"
+          )
+        );
       } else {
         if (this.passWeakForm.checkPass !== "") {
           this.$refs.passWeakForm.validateField("checkPass");

+ 34 - 20
src/modules/questions/views/AddPaperSelect.vue

@@ -72,7 +72,9 @@
               <template slot-scope="scope">
                 <span
                   v-if="
-                    !['hardInfo', 'mediumInfo', 'easyInfo'].includes(item.prop)
+                    !['hardInfo', 'mediumInfo', 'easyInfo', 'anyInfo'].includes(
+                      item.prop
+                    )
                   "
                   >{{ scope.row[item.prop] }}</span
                 >
@@ -188,9 +190,12 @@
                   <template slot-scope="scope">
                     <div
                       v-if="
-                        ['hardInfo', 'mediumInfo', 'easyInfo'].includes(
-                          item.prop
-                        )
+                        [
+                          'hardInfo',
+                          'mediumInfo',
+                          'easyInfo',
+                          'anyInfo',
+                        ].includes(item.prop)
                       "
                     >
                       <el-tooltip
@@ -253,14 +258,6 @@ export default {
       options1: [],
       tableData1: [],
       difficultyDegree: "",
-      tableColumns1: [
-        { label: "题型", prop: "detailName", minWidth: "100" },
-        { label: "总分", prop: "totalScore", minWidth: "80" },
-        { label: "数量", prop: "totalCount", minWidth: "80" },
-        { label: "难", prop: "hardInfo", minWidth: "80" },
-        { label: "中", prop: "mediumInfo", minWidth: "80" },
-        { label: "易", prop: "easyInfo", minWidth: "80" },
-      ],
       tableData2: [],
       tableColumns2: [
         { label: "名称", prop: "name" },
@@ -268,13 +265,6 @@ export default {
       ],
       multipleSelection: [],
       tableData3: [],
-      tableColumns3: [
-        { label: "题型", prop: "detailName", minWidth: "100" },
-        { label: "数量", prop: "totalCount", minWidth: "80" },
-        { label: "难", prop: "hardInfo", minWidth: "80" },
-        { label: "中", prop: "mediumInfo", minWidth: "80" },
-        { label: "易", prop: "easyInfo", minWidth: "80" },
-      ],
       lastRequestKey: "",
       tableLoading3: false,
       tableLoading1: false,
@@ -305,6 +295,29 @@ export default {
         },
       };
     },
+    tableColumns1() {
+      let end = this.form.paperStructType === "EXACT" ? 7 : 6;
+      return [
+        { label: "题型", prop: "detailName", minWidth: "100" },
+        { label: "总分", prop: "totalScore", minWidth: "80" },
+        { label: "数量", prop: "totalCount", minWidth: "80" },
+        { label: "难", prop: "hardInfo", minWidth: "80" },
+        { label: "中", prop: "mediumInfo", minWidth: "80" },
+        { label: "易", prop: "easyInfo", minWidth: "80" },
+        { label: "不限难度", prop: "anyInfo", minWidth: "80" },
+      ].slice(0, end);
+    },
+    tableColumns3() {
+      let end = this.form.paperStructType === "EXACT" ? 6 : 5;
+      return [
+        { label: "题型", prop: "detailName", minWidth: "100" },
+        { label: "数量", prop: "totalCount", minWidth: "80" },
+        { label: "难", prop: "hardInfo", minWidth: "80" },
+        { label: "中", prop: "mediumInfo", minWidth: "80" },
+        { label: "易", prop: "easyInfo", minWidth: "80" },
+        { label: "不限难度", prop: "anyInfo", minWidth: "80" },
+      ].slice(0, end);
+    },
   },
   watch: {
     "form.paperStructId"() {
@@ -575,7 +588,8 @@ export default {
       return (
         row.easyInfo?.valid == false ||
         row.hardInfo?.valid == false ||
-        row.mediumInfo?.valid == false
+        row.mediumInfo?.valid == false ||
+        row.anyInfo?.valid == false
       );
       // if (prop === "detailName") {
       //   return false;

+ 59 - 47
src/modules/questions/views/ExtractPaperInfo.vue

@@ -61,7 +61,6 @@
               <el-radio-group
                 v-model="extractConfig.callType"
                 class="pull_right_ss"
-                disabled
               >
                 <el-radio label="WHOLE_SET">成套调用</el-radio>
                 <el-radio label="RANDOM_PAPER">随机抽题</el-radio>
@@ -267,25 +266,23 @@
         <template v-else>
           <el-tabs v-model="tabs">
             <el-tab-pane label="步骤二:随机抽题模板选择" name="first">
-              <el-select
-                v-model="extractConfig2.randomPaperId"
-                filterable
-                placeholder="请选择"
-              >
-                <el-option
-                  v-for="item in tplList"
-                  :key="item.id"
-                  :label="item.name"
-                  :value="item.id"
+              <el-form-item label="抽题模板" label-width="90px">
+                <el-select
+                  v-model="extractConfig2.randomPaperId"
+                  filterable
+                  placeholder="请选择"
                 >
-                </el-option>
-              </el-select>
-
-              <div style="line-height: 34px; margin-top: 10px" class="label">
-                试卷结构预览
-              </div>
+                  <el-option
+                    v-for="item in tplList"
+                    :key="item.id"
+                    :label="item.name"
+                    :value="item.id"
+                  >
+                  </el-option>
+                </el-select>
+              </el-form-item>
               <div class="flex items-center">
-                <el-form-item label="组卷结构:" label-width="90px">
+                <el-form-item label="组卷结构" label-width="90px">
                   <el-select v-model="curStructInfo.paperStructId" disabled>
                     <el-option
                       v-for="item in randomTplInfo.paperStructOptions"
@@ -310,7 +307,7 @@
                 style="margin-top: 8px; width: 700px"
               >
                 <el-table-column
-                  v-for="(item, index) in randomTplInfo.tableColumns"
+                  v-for="(item, index) in tableColumns"
                   :key="index"
                   :label="item.label"
                   :prop="item.prop"
@@ -318,9 +315,12 @@
                   <template slot-scope="scope">
                     <span
                       v-if="
-                        !['hardInfo', 'mediumInfo', 'easyInfo'].includes(
-                          item.prop
-                        )
+                        ![
+                          'hardInfo',
+                          'mediumInfo',
+                          'easyInfo',
+                          'anyInfo',
+                        ].includes(item.prop)
                       "
                       >{{ scope.row[item.prop] }}</span
                     >
@@ -333,7 +333,7 @@
 
           <el-tabs v-model="tabs">
             <el-tab-pane label="步骤三:音频播放次数设置" name="first">
-              <el-form-item label="播放次数" label-width="90px">
+              <el-form-item label="播放次数" label-width="90px">
                 <el-input-number
                   v-model="extractConfig2.playTime"
                   :min="1"
@@ -390,14 +390,14 @@ export default {
         paperStructType: "",
         paperIds: [],
         tableData: [],
-        tableColumns: [
-          { label: "题型", prop: "detailName", minWidth: "100" },
-          { label: "总分", prop: "totalScore", minWidth: "80" },
-          { label: "数量", prop: "totalCount", minWidth: "80" },
-          { label: "难", prop: "hardInfo", minWidth: "80" },
-          { label: "中", prop: "mediumInfo", minWidth: "80" },
-          { label: "易", prop: "easyInfo", minWidth: "80" },
-        ],
+        // tableColumns: [
+        //   { label: "题型", prop: "detailName", minWidth: "100" },
+        //   { label: "总分", prop: "totalScore", minWidth: "80" },
+        //   { label: "数量", prop: "totalCount", minWidth: "80" },
+        //   { label: "难", prop: "hardInfo", minWidth: "80" },
+        //   { label: "中", prop: "mediumInfo", minWidth: "80" },
+        //   { label: "易", prop: "easyInfo", minWidth: "80" },
+        // ],
         difficultyDegree: "",
       },
       curStructInfo: {
@@ -443,18 +443,30 @@ export default {
       }
       return courseList;
     },
+    tableColumns() {
+      let end = this.randomTplInfo.paperStructType === "EXACT" ? 7 : 6;
+      return [
+        { label: "题型", prop: "detailName", minWidth: "100" },
+        { label: "总分", prop: "totalScore", minWidth: "80" },
+        { label: "数量", prop: "totalCount", minWidth: "80" },
+        { label: "难", prop: "hardInfo", minWidth: "80" },
+        { label: "中", prop: "mediumInfo", minWidth: "80" },
+        { label: "易", prop: "easyInfo", minWidth: "80" },
+        { label: "不限难度", prop: "anyInfo", minWidth: "80" },
+      ].slice(0, end);
+    },
   },
   watch: {
-    "extractConfig.examId"(val) {
-      if (val && this.examList.length) {
-        this.getCurCallType();
-      }
-    },
-    examList(val) {
-      if (this.extractConfig.examId && val.length) {
-        this.getCurCallType();
-      }
-    },
+    // "extractConfig.examId"(val) {
+    //   if (val && this.examList.length) {
+    //     this.getCurCallType();
+    //   }
+    // },
+    // examList(val) {
+    //   if (this.extractConfig.examId && val.length) {
+    //     this.getCurCallType();
+    //   }
+    // },
     "extractConfig2.randomPaperId"() {
       this.getData();
     },
@@ -555,12 +567,12 @@ export default {
         this.getData();
       }
     },
-    getCurCallType() {
-      let item = this.examList.find(
-        (item) => item.id == this.extractConfig.examId
-      );
-      this.extractConfig.callType = item.callType || "WHOLE_SET";
-    },
+    // getCurCallType() {
+    //   let item = this.examList.find(
+    //     (item) => item.id == this.extractConfig.examId
+    //   );
+    //   this.extractConfig.callType = item.callType || "WHOLE_SET";
+    // },
     //根据考务查询考试集合
     getExams(query) {
       query = query.trim();

+ 5 - 1
src/modules/questions/views/InsertBluePaperStructureInfo.vue

@@ -65,7 +65,11 @@
                   <el-option
                     v-for="item in quesNameList"
                     :key="item.code"
-                    :label="item.name"
+                    :label="
+                      (item.name || '').length > 40
+                        ? item.name.slice(0, 40) + '...'
+                        : item.name
+                    "
                     :value="item.code"
                   >
                   </el-option>

+ 228 - 58
src/modules/questions/views/InsertPaperStructureInfo.vue

@@ -79,7 +79,11 @@
                 <el-option
                   v-for="item in quesNameList"
                   :key="item.code"
-                  :label="item.name"
+                  :label="
+                    (item.name || '').length > 40
+                      ? item.name.slice(0, 40) + '...'
+                      : item.name
+                  "
                   :value="item.code"
                 ></el-option>
               </el-select>
@@ -147,6 +151,11 @@
             <span>{{ scope.row.publicDifficulty }}</span>
           </template>
         </el-table-column>
+        <el-table-column label="公开(不限难度)" width="110">
+          <template slot-scope="scope">
+            <span>{{ scope.row.publicAnyDifficulty || 0 }}</span>
+          </template>
+        </el-table-column>
         <el-table-column label="非公开(简单)" width="102">
           <template slot-scope="scope">
             <span>{{ scope.row.noPublicSimple }}</span>
@@ -162,6 +171,11 @@
             <span>{{ scope.row.noPublicDifficulty }}</span>
           </template>
         </el-table-column>
+        <el-table-column label="非公开(不限难度)" width="120">
+          <template slot-scope="scope">
+            <span>{{ scope.row.noPublicAnyDifficulty || 0 }}</span>
+          </template>
+        </el-table-column>
         <el-table-column label="每题分值" width="80">
           <template slot-scope="scope">
             <span>{{ scope.row.score }}</span>
@@ -197,7 +211,11 @@
         </el-table-column>
       </el-table>
       <!-- 小题信息 -->
-      <el-dialog title="小题信息" :visible.sync="paperDetailUnitStructDialog">
+      <el-dialog
+        width="65%"
+        title="小题信息"
+        :visible.sync="paperDetailUnitStructDialog"
+      >
         <div>
           <el-form
             ref="paperUnitForm2"
@@ -268,7 +286,11 @@
                     <el-option
                       v-for="item in quesNameList"
                       :key="item.code"
-                      :label="item.name"
+                      :label="
+                        (item.name || '').length > 40
+                          ? item.name.slice(0, 40) + '...'
+                          : item.name
+                      "
                       :value="item.code"
                     ></el-option>
                   </el-select>
@@ -276,22 +298,27 @@
               </el-col>
             </el-row>
             <el-row :gutter="20">
-              <el-col :span="6">
+              <el-col :span="5">
                 <div class="grid-content bg-purple">
                   <div class="form_font_size">公开(简单)</div>
                 </div>
               </el-col>
-              <el-col :span="6">
+              <el-col :span="5">
                 <div class="grid-content bg-purple">
                   <div class="form_font_size">公开(中等)</div>
                 </div>
               </el-col>
-              <el-col :span="6">
+              <el-col :span="5">
                 <div class="grid-content bg-purple">
                   <div class="form_font_size">公开(困难)</div>
                 </div>
               </el-col>
-              <el-col :span="6">
+              <el-col :span="5">
+                <div class="grid-content bg-purple">
+                  <div class="form_font_size">公开(不限难度)</div>
+                </div>
+              </el-col>
+              <el-col :span="4">
                 <div class="grid-content bg-purple">
                   <div class="form_font_size">公开总数</div>
                 </div>
@@ -299,7 +326,7 @@
             </el-row>
             <!-- 第二列 -->
             <el-row :gutter="20">
-              <el-col :span="6">
+              <el-col :span="5">
                 <div class="grid-content bg-purple">
                   <el-input
                     v-model="paperUnitForm2.publicSimple"
@@ -313,7 +340,7 @@
                   ></el-input>
                 </div>
               </el-col>
-              <el-col :span="6">
+              <el-col :span="5">
                 <div class="grid-content bg-purple">
                   <el-input
                     v-model="paperUnitForm2.publicMedium"
@@ -327,7 +354,7 @@
                   ></el-input>
                 </div>
               </el-col>
-              <el-col :span="6">
+              <el-col :span="5">
                 <div class="grid-content bg-purple">
                   <el-input
                     v-model="paperUnitForm2.publicDifficulty"
@@ -341,7 +368,21 @@
                   ></el-input>
                 </div>
               </el-col>
-              <el-col :span="6">
+              <el-col :span="5">
+                <div class="grid-content bg-purple">
+                  <el-input
+                    v-model="paperUnitForm2.publicAnyDifficulty"
+                    @change="
+                      unitCount(
+                        paperUnitForm2.publicAnyDifficulty,
+                        'publicAnyDifficulty',
+                        paperUnitForm2
+                      )
+                    "
+                  ></el-input>
+                </div>
+              </el-col>
+              <el-col :span="4">
                 <div class="grid-content bg-purple">
                   <el-input
                     v-model="paperUnitForm2.publicSum"
@@ -351,22 +392,27 @@
               </el-col>
             </el-row>
             <el-row :gutter="20">
-              <el-col :span="6">
+              <el-col :span="5">
                 <div class="grid-content bg-purple">
                   <div class="form_font_size">非公开(简单)</div>
                 </div>
               </el-col>
-              <el-col :span="6">
+              <el-col :span="5">
                 <div class="grid-content bg-purple">
                   <div class="form_font_size">非公开(中等)</div>
                 </div>
               </el-col>
-              <el-col :span="6">
+              <el-col :span="5">
                 <div class="grid-content bg-purple">
                   <div class="form_font_size">非公开(困难)</div>
                 </div>
               </el-col>
-              <el-col :span="6">
+              <el-col :span="5">
+                <div class="grid-content bg-purple">
+                  <div class="form_font_size">非公开(不限难度)</div>
+                </div>
+              </el-col>
+              <el-col :span="4">
                 <div class="grid-content bg-purple">
                   <div class="form_font_size">非公开总数</div>
                 </div>
@@ -374,7 +420,7 @@
             </el-row>
             <!-- 第四列 -->
             <el-row :gutter="20">
-              <el-col :span="6">
+              <el-col :span="5">
                 <div class="grid-content bg-purple">
                   <el-input
                     v-model="paperUnitForm2.noPublicSimple"
@@ -388,7 +434,7 @@
                   ></el-input>
                 </div>
               </el-col>
-              <el-col :span="6">
+              <el-col :span="5">
                 <div class="grid-content bg-purple">
                   <el-input
                     v-model="paperUnitForm2.noPublicMedium"
@@ -402,7 +448,7 @@
                   ></el-input>
                 </div>
               </el-col>
-              <el-col :span="6">
+              <el-col :span="5">
                 <div class="grid-content bg-purple">
                   <el-input
                     v-model="paperUnitForm2.noPublicDifficulty"
@@ -416,7 +462,21 @@
                   ></el-input>
                 </div>
               </el-col>
-              <el-col :span="6">
+              <el-col :span="5">
+                <div class="grid-content bg-purple">
+                  <el-input
+                    v-model="paperUnitForm2.noPublicAnyDifficulty"
+                    @change="
+                      unitCount(
+                        paperUnitForm2.noPublicAnyDifficulty,
+                        'noPublicAnyDifficulty',
+                        paperUnitForm2
+                      )
+                    "
+                  ></el-input>
+                </div>
+              </el-col>
+              <el-col :span="4">
                 <div class="grid-content bg-purple">
                   <el-input
                     v-model="paperUnitForm2.noPublicSum"
@@ -426,22 +486,27 @@
               </el-col>
             </el-row>
             <el-row :gutter="20">
-              <el-col :span="6">
+              <el-col :span="5">
                 <div class="grid-content bg-purple">
                   <div class="form_font_size">简单总数</div>
                 </div>
               </el-col>
-              <el-col :span="6">
+              <el-col :span="5">
                 <div class="grid-content bg-purple">
                   <div class="form_font_size">中等总数</div>
                 </div>
               </el-col>
-              <el-col :span="6">
+              <el-col :span="5">
                 <div class="grid-content bg-purple">
                   <div class="form_font_size">困难总数</div>
                 </div>
               </el-col>
-              <el-col :span="6">
+              <el-col :span="5">
+                <div class="grid-content bg-purple">
+                  <div class="form_font_size">不限难度总数</div>
+                </div>
+              </el-col>
+              <el-col :span="4">
                 <div class="grid-content bg-purple">
                   <div class="form_font_size">总数</div>
                 </div>
@@ -449,7 +514,7 @@
             </el-row>
             <!-- 第六列 -->
             <el-row :gutter="20">
-              <el-col :span="6">
+              <el-col :span="5">
                 <div class="grid-content bg-purple">
                   <el-input
                     v-model="paperUnitForm2.simpleSum"
@@ -457,7 +522,7 @@
                   ></el-input>
                 </div>
               </el-col>
-              <el-col :span="6">
+              <el-col :span="5">
                 <div class="grid-content bg-purple">
                   <el-input
                     v-model="paperUnitForm2.mediumSum"
@@ -465,7 +530,7 @@
                   ></el-input>
                 </div>
               </el-col>
-              <el-col :span="6">
+              <el-col :span="5">
                 <div class="grid-content bg-purple">
                   <el-input
                     v-model="paperUnitForm2.difficultySum"
@@ -473,7 +538,15 @@
                   ></el-input>
                 </div>
               </el-col>
-              <el-col :span="6">
+              <el-col :span="5">
+                <div class="grid-content bg-purple">
+                  <el-input
+                    v-model="paperUnitForm2.anyDifficultySum"
+                    :disabled="true"
+                  ></el-input>
+                </div>
+              </el-col>
+              <el-col :span="4">
                 <div class="grid-content bg-purple">
                   <el-input
                     v-model="paperUnitForm2.count"
@@ -495,24 +568,29 @@
         </div>
       </el-dialog>
       <!-- 设置题目数量弹框 -->
-      <el-dialog title="题目数量" :visible.sync="propertyDialog">
+      <el-dialog width="65%" title="题目数量" :visible.sync="propertyDialog">
         <el-row :gutter="20">
-          <el-col :span="6">
+          <el-col :span="5">
             <div class="grid-content bg-purple">
               <div class="form_font_size">公开(简单)</div>
             </div>
           </el-col>
-          <el-col :span="6">
+          <el-col :span="5">
             <div class="grid-content bg-purple">
               <div class="form_font_size">公开(中等)</div>
             </div>
           </el-col>
-          <el-col :span="6">
+          <el-col :span="5">
             <div class="grid-content bg-purple">
               <div class="form_font_size">公开(困难)</div>
             </div>
           </el-col>
-          <el-col :span="6">
+          <el-col :span="5">
+            <div class="grid-content bg-purple">
+              <div class="form_font_size">公开(不限难度)</div>
+            </div>
+          </el-col>
+          <el-col :span="4">
             <div class="grid-content bg-purple">
               <div class="form_font_size">公开总数</div>
             </div>
@@ -520,7 +598,7 @@
         </el-row>
         <!-- 第二列 -->
         <el-row :gutter="20">
-          <el-col :span="6">
+          <el-col :span="5">
             <div class="grid-content bg-purple">
               <el-input
                 v-model="paperUnitForm.publicSimple"
@@ -534,7 +612,7 @@
               ></el-input>
             </div>
           </el-col>
-          <el-col :span="6">
+          <el-col :span="5">
             <div class="grid-content bg-purple">
               <el-input
                 v-model="paperUnitForm.publicMedium"
@@ -548,7 +626,7 @@
               ></el-input>
             </div>
           </el-col>
-          <el-col :span="6">
+          <el-col :span="5">
             <div class="grid-content bg-purple">
               <el-input
                 v-model="paperUnitForm.publicDifficulty"
@@ -562,7 +640,21 @@
               ></el-input>
             </div>
           </el-col>
-          <el-col :span="6">
+          <el-col :span="5">
+            <div class="grid-content bg-purple">
+              <el-input
+                v-model="paperUnitForm.publicAnyDifficulty"
+                @change="
+                  unitCount(
+                    paperUnitForm.publicAnyDifficulty,
+                    'publicAnyDifficulty',
+                    paperUnitForm
+                  )
+                "
+              ></el-input>
+            </div>
+          </el-col>
+          <el-col :span="4">
             <div class="grid-content bg-purple">
               <el-input
                 v-model="paperUnitForm.publicSum"
@@ -572,22 +664,27 @@
           </el-col>
         </el-row>
         <el-row :gutter="20">
-          <el-col :span="6">
+          <el-col :span="5">
             <div class="grid-content bg-purple">
               <div class="form_font_size">非公开(简单)</div>
             </div>
           </el-col>
-          <el-col :span="6">
+          <el-col :span="5">
             <div class="grid-content bg-purple">
               <div class="form_font_size">非公开(中等)</div>
             </div>
           </el-col>
-          <el-col :span="6">
+          <el-col :span="5">
             <div class="grid-content bg-purple">
               <div class="form_font_size">非公开(困难)</div>
             </div>
           </el-col>
-          <el-col :span="6">
+          <el-col :span="5">
+            <div class="grid-content bg-purple">
+              <div class="form_font_size">非公开(不限难度)</div>
+            </div>
+          </el-col>
+          <el-col :span="4">
             <div class="grid-content bg-purple">
               <div class="form_font_size">非公开总数</div>
             </div>
@@ -595,7 +692,7 @@
         </el-row>
         <!-- 第四列 -->
         <el-row :gutter="20">
-          <el-col :span="6">
+          <el-col :span="5">
             <div class="grid-content bg-purple">
               <el-input
                 v-model="paperUnitForm.noPublicSimple"
@@ -609,7 +706,7 @@
               ></el-input>
             </div>
           </el-col>
-          <el-col :span="6">
+          <el-col :span="5">
             <div class="grid-content bg-purple">
               <el-input
                 v-model="paperUnitForm.noPublicMedium"
@@ -623,7 +720,7 @@
               ></el-input>
             </div>
           </el-col>
-          <el-col :span="6">
+          <el-col :span="5">
             <div class="grid-content bg-purple">
               <el-input
                 v-model="paperUnitForm.noPublicDifficulty"
@@ -637,7 +734,21 @@
               ></el-input>
             </div>
           </el-col>
-          <el-col :span="6">
+          <el-col :span="5">
+            <div class="grid-content bg-purple">
+              <el-input
+                v-model="paperUnitForm.noPublicAnyDifficulty"
+                @change="
+                  unitCount(
+                    paperUnitForm.noPublicAnyDifficulty,
+                    'noPublicAnyDifficulty',
+                    paperUnitForm
+                  )
+                "
+              ></el-input>
+            </div>
+          </el-col>
+          <el-col :span="4">
             <div class="grid-content bg-purple">
               <el-input
                 v-model="paperUnitForm.noPublicSum"
@@ -647,22 +758,27 @@
           </el-col>
         </el-row>
         <el-row :gutter="20">
-          <el-col :span="6">
+          <el-col :span="5">
             <div class="grid-content bg-purple">
               <div class="form_font_size">简单总数</div>
             </div>
           </el-col>
-          <el-col :span="6">
+          <el-col :span="5">
             <div class="grid-content bg-purple">
               <div class="form_font_size">中等总数</div>
             </div>
           </el-col>
-          <el-col :span="6">
+          <el-col :span="5">
             <div class="grid-content bg-purple">
               <div class="form_font_size">困难总数</div>
             </div>
           </el-col>
-          <el-col :span="6">
+          <el-col :span="5">
+            <div class="grid-content bg-purple">
+              <div class="form_font_size">不限难度总数</div>
+            </div>
+          </el-col>
+          <el-col :span="4">
             <div class="grid-content bg-purple">
               <div class="form_font_size">总数</div>
             </div>
@@ -670,7 +786,7 @@
         </el-row>
         <!-- 第六列 -->
         <el-row :gutter="20">
-          <el-col :span="6">
+          <el-col :span="5">
             <div class="grid-content bg-purple">
               <el-input
                 v-model="paperUnitForm.simpleSum"
@@ -678,7 +794,7 @@
               ></el-input>
             </div>
           </el-col>
-          <el-col :span="6">
+          <el-col :span="5">
             <div class="grid-content bg-purple">
               <el-input
                 v-model="paperUnitForm.mediumSum"
@@ -686,7 +802,7 @@
               ></el-input>
             </div>
           </el-col>
-          <el-col :span="6">
+          <el-col :span="5">
             <div class="grid-content bg-purple">
               <el-input
                 v-model="paperUnitForm.difficultySum"
@@ -694,7 +810,15 @@
               ></el-input>
             </div>
           </el-col>
-          <el-col :span="6">
+          <el-col :span="5">
+            <div class="grid-content bg-purple">
+              <el-input
+                v-model="paperUnitForm.anyDifficultySum"
+                :disabled="true"
+              ></el-input>
+            </div>
+          </el-col>
+          <el-col :span="4">
             <div class="grid-content bg-purple">
               <el-input
                 v-model="paperUnitForm.count"
@@ -787,6 +911,9 @@ export default {
         simpleSum: 0,
         mediumSum: 0,
         difficultySum: 0,
+        publicAnyDifficulty: 0,
+        noPublicAnyDifficulty: 0,
+        anyDifficultySum: 0,
       },
       paperUnitForm2: {
         id: "",
@@ -806,6 +933,9 @@ export default {
         simpleSum: 0,
         mediumSum: 0,
         difficultySum: 0,
+        publicAnyDifficulty: 0,
+        noPublicAnyDifficulty: 0,
+        anyDifficultySum: 0,
       },
       unitId: "",
       detailName: "",
@@ -971,6 +1101,9 @@ export default {
           this.paperUnitForm.simpleSum = 0;
           this.paperUnitForm.mediumSum = 0;
           this.paperUnitForm.difficultySum = 0;
+          this.paperUnitForm.publicAnyDifficulty = 0;
+          this.paperUnitForm.noPublicAnyDifficulty = 0;
+          this.paperUnitForm.anyDifficultySum = 0;
           this.setUnits();
           sessionStorage.setItem(
             "paperStruct",
@@ -1005,6 +1138,12 @@ export default {
               unitStruct.simpleSum = this.paperUnitForm2.simpleSum;
               unitStruct.mediumSum = this.paperUnitForm2.mediumSum;
               unitStruct.difficultySum = this.paperUnitForm2.difficultySum;
+              unitStruct.publicAnyDifficulty =
+                this.paperUnitForm2.publicAnyDifficulty || 0;
+              unitStruct.noPublicAnyDifficulty =
+                this.paperUnitForm2.noPublicAnyDifficulty || 0;
+              unitStruct.anyDifficultySum =
+                this.paperUnitForm2.anyDifficultySum || 0;
               this.setUnits();
               this.paperDetailUnitStructDialog = false;
               sessionStorage.setItem(
@@ -1099,15 +1238,23 @@ export default {
           this.paperUnitForm2.noPublicMedium = unitStruct.noPublicMedium;
           this.paperUnitForm2.noPublicDifficulty =
             unitStruct.noPublicDifficulty;
+          this.paperUnitForm2.publicAnyDifficulty =
+            unitStruct.publicAnyDifficulty || 0;
+          this.paperUnitForm2.noPublicAnyDifficulty =
+            unitStruct.noPublicAnyDifficulty || 0;
+          this.paperUnitForm2.anyDifficultySum =
+            unitStruct.anyDifficultySum || 0;
           //实时计算,不存数据库
           this.paperUnitForm2.publicSum =
             this.paperUnitForm2.publicSimple +
-            this.paperUnitForm2.publicMedium +
-            this.paperUnitForm2.publicDifficulty;
+              this.paperUnitForm2.publicMedium +
+              this.paperUnitForm2.publicDifficulty +
+              this.paperUnitForm2.publicAnyDifficulty || 0;
           this.paperUnitForm2.noPublicSum =
             this.paperUnitForm2.noPublicSimple +
-            this.paperUnitForm2.noPublicMedium +
-            this.paperUnitForm2.noPublicDifficulty;
+              this.paperUnitForm2.noPublicMedium +
+              this.paperUnitForm2.noPublicDifficulty +
+              this.paperUnitForm2.noPublicAnyDifficulty || 0;
           this.paperUnitForm2.simpleSum =
             this.paperUnitForm2.publicSimple +
             this.paperUnitForm2.noPublicSimple;
@@ -1117,6 +1264,9 @@ export default {
           this.paperUnitForm2.difficultySum =
             this.paperUnitForm2.publicDifficulty +
             this.paperUnitForm2.noPublicDifficulty;
+          this.paperUnitForm2.anyDifficultySum =
+            (this.paperUnitForm2.publicAnyDifficulty || 0) +
+            (this.paperUnitForm2.noPublicAnyDifficulty || 0);
         }
       }
       this.getQuesNameList(this.paperUnitForm2.questionType);
@@ -1156,6 +1306,10 @@ export default {
           setTimeout(function () {
             paperUnitForm.publicDifficulty = 0;
           }, 1);
+        } else if (rowType === "publicAnyDifficulty") {
+          setTimeout(function () {
+            paperUnitForm.publicAnyDifficulty = 0;
+          }, 1);
         } else if (rowType === "noPublicSimple") {
           setTimeout(function () {
             paperUnitForm.noPublicSimple = 0;
@@ -1168,6 +1322,10 @@ export default {
           setTimeout(function () {
             paperUnitForm.noPublicDifficulty = 0;
           }, 1);
+        } else if (rowType === "noPublicAnyDifficulty") {
+          setTimeout(function () {
+            paperUnitForm.noPublicAnyDifficulty = 0;
+          }, 1);
         }
       }
       setTimeout(function () {
@@ -1176,21 +1334,29 @@ export default {
         paperUnitForm.publicDifficulty = parseInt(
           paperUnitForm.publicDifficulty
         );
+        paperUnitForm.publicAnyDifficulty = parseInt(
+          paperUnitForm.publicAnyDifficulty || 0
+        );
         paperUnitForm.noPublicSimple = parseInt(paperUnitForm.noPublicSimple);
         paperUnitForm.noPublicMedium = parseInt(paperUnitForm.noPublicMedium);
         paperUnitForm.noPublicDifficulty = parseInt(
           paperUnitForm.noPublicDifficulty
         );
+        paperUnitForm.noPublicAnyDifficulty = parseInt(
+          paperUnitForm.noPublicAnyDifficulty || 0
+        );
         //公开总数
         paperUnitForm.publicSum =
           parseInt(paperUnitForm.publicSimple) +
           parseInt(paperUnitForm.publicMedium) +
-          parseInt(paperUnitForm.publicDifficulty);
+          parseInt(paperUnitForm.publicDifficulty) +
+          parseInt(paperUnitForm.publicAnyDifficulty || 0);
         //非公开总数
         paperUnitForm.noPublicSum =
           parseInt(paperUnitForm.noPublicSimple) +
           parseInt(paperUnitForm.noPublicMedium) +
-          parseInt(paperUnitForm.noPublicDifficulty);
+          parseInt(paperUnitForm.noPublicDifficulty) +
+          parseInt(paperUnitForm.noPublicAnyDifficulty || 0);
         //简单总数
         paperUnitForm.simpleSum =
           parseInt(paperUnitForm.publicSimple) +
@@ -1203,6 +1369,10 @@ export default {
         paperUnitForm.difficultySum =
           parseInt(paperUnitForm.publicDifficulty) +
           parseInt(paperUnitForm.noPublicDifficulty);
+        //不限难度总数
+        paperUnitForm.anyDifficultySum =
+          parseInt(paperUnitForm.publicAnyDifficulty || 0) +
+          parseInt(paperUnitForm.noPublicAnyDifficulty || 0);
         //总数
         paperUnitForm.count =
           paperUnitForm.publicSum + paperUnitForm.noPublicSum;