onlineExam.vue 35 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015
  1. <template>
  2. <div>
  3. <LinkTitlesCustom
  4. :currentPaths="['考试管理', '考试信息', '网络考试设置']"
  5. />
  6. <section class="content">
  7. <div class="box box-info">
  8. <!-- 正文信息 -->
  9. <div class="box-body">
  10. <el-form
  11. :inline="true"
  12. :rules="rules"
  13. ref="form"
  14. :model="form"
  15. inline-message
  16. label-position="right"
  17. >
  18. <div style="margin-bottom: 10px;">
  19. <el-button type="primary" size="small" @click="saveExam"
  20. >保 存</el-button
  21. >
  22. <el-button
  23. type="primary"
  24. size="small"
  25. @click="back"
  26. icon="el-icon-arrow-left"
  27. >返 回</el-button
  28. >
  29. </div>
  30. <el-tabs type="border-card" v-model="activeName">
  31. <!-- 基础信息 -->
  32. <el-tab-pane label="基础信息" name="tab1">
  33. <el-row>
  34. <el-form-item
  35. label="考试名称"
  36. placeholder="请输入考试名称"
  37. prop="name"
  38. :label-width="style.label_width_tab1"
  39. >
  40. <el-input
  41. v-model="form.name"
  42. class="input"
  43. maxlength="20"
  44. ></el-input>
  45. </el-form-item>
  46. </el-row>
  47. <el-row>
  48. <el-form-item
  49. label="考试类型"
  50. :label-width="style.label_width_tab1"
  51. >
  52. <el-select
  53. class="input"
  54. :disabled="true"
  55. v-model="form.examType"
  56. placeholder="请选择"
  57. >
  58. <el-option
  59. v-for="item in examTypeList"
  60. :key="item.value"
  61. :label="item.label"
  62. :value="item.value"
  63. >
  64. </el-option>
  65. </el-select>
  66. </el-form-item>
  67. </el-row>
  68. <el-row>
  69. <el-form-item
  70. label="状态"
  71. :label-width="style.label_width_tab1"
  72. >
  73. <el-radio-group v-model="form.enable" class="input">
  74. <el-radio label="true">启用</el-radio>
  75. <el-radio label="false">禁用</el-radio>
  76. </el-radio-group>
  77. </el-form-item>
  78. </el-row>
  79. <el-row v-if="1 == 2">
  80. <el-form-item
  81. label="是否可以考试"
  82. :label-width="style.label_width_tab1"
  83. >
  84. <el-radio-group v-model="form.examLimit" class="input">
  85. <el-radio label="true">否</el-radio>
  86. <el-radio label="false">是</el-radio>
  87. </el-radio-group>
  88. </el-form-item>
  89. </el-row>
  90. <el-row>
  91. <el-form-item
  92. label="考试时间"
  93. prop="examDatetimeRange"
  94. :label-width="style.label_width_tab1"
  95. >
  96. <el-date-picker
  97. class="input"
  98. v-model="examDatetimeRange"
  99. type="datetimerange"
  100. range-separator="至"
  101. start-placeholder="开始日期"
  102. end-placeholder="结束日期"
  103. value-format="yyyy-MM-dd HH:mm:ss"
  104. :clearable="false"
  105. >
  106. </el-date-picker>
  107. </el-form-item>
  108. </el-row>
  109. </el-tab-pane>
  110. <!-- 控制设置 -->
  111. <el-tab-pane label="控制设置" name="tab2">
  112. <el-row>
  113. <el-form-item
  114. label="考试时长"
  115. prop="duration"
  116. :label-width="style.label_width_tab2"
  117. >
  118. <el-input
  119. maxlength="20"
  120. v-model.trim.number="form.duration"
  121. auto-complete="off"
  122. class="input"
  123. ><template slot="append"
  124. >分钟</template
  125. ></el-input
  126. >
  127. </el-form-item>
  128. </el-row>
  129. <el-row>
  130. <el-form-item
  131. label="考试次数"
  132. prop="examTimes"
  133. :label-width="style.label_width_tab2"
  134. >
  135. <el-input
  136. maxlength="20"
  137. v-model.trim.number="form.examTimes"
  138. auto-complete="off"
  139. class="input"
  140. ><template slot="append"
  141. >次</template
  142. ></el-input
  143. >
  144. </el-form-item>
  145. </el-row>
  146. <el-row>
  147. <el-form-item
  148. label="交卷冻结时间"
  149. prop="FREEZE_TIME"
  150. :label-width="style.label_width_tab2"
  151. >
  152. <el-input
  153. maxlength="20"
  154. v-model.trim.number="form.properties.FREEZE_TIME"
  155. auto-complete="off"
  156. class="input"
  157. ><template slot="append"
  158. >分钟</template
  159. ></el-input
  160. >
  161. </el-form-item>
  162. </el-row>
  163. <el-row>
  164. <el-form-item
  165. label="断点续考时间"
  166. prop="EXAM_RECONNECT_TIME"
  167. :label-width="style.label_width_tab2"
  168. >
  169. <el-input
  170. maxlength="20"
  171. v-model.trim.number="form.properties.EXAM_RECONNECT_TIME"
  172. auto-complete="off"
  173. class="input"
  174. ><template slot="append"
  175. >分钟</template
  176. ></el-input
  177. >
  178. </el-form-item>
  179. </el-row>
  180. </el-tab-pane>
  181. <el-tab-pane label="显示设置" name="tab3">
  182. <el-row v-if="show_ckeditor">
  183. <el-form-item
  184. label="考前说明"
  185. :label-width="style.label_width_tab3"
  186. >
  187. <ckeditor
  188. v-model="form.properties.BEFORE_EXAM_REMARK"
  189. ></ckeditor>
  190. </el-form-item>
  191. </el-row>
  192. <el-row v-if="show_ckeditor">
  193. <el-form-item
  194. label="考后说明"
  195. :label-width="style.label_width_tab3"
  196. >
  197. <ckeditor
  198. v-model="form.properties.AFTER_EXAM_REMARK"
  199. ></ckeditor>
  200. </el-form-item>
  201. </el-row>
  202. <el-row>
  203. <el-form-item
  204. label="展示作弊说明"
  205. :label-width="style.label_width_tab3"
  206. >
  207. <el-radio-group
  208. v-model="form.properties.SHOW_CHEATING_REMARK"
  209. class="input"
  210. >
  211. <el-radio label="true">开启</el-radio>
  212. <el-radio label="false">关闭</el-radio>
  213. </el-radio-group>
  214. </el-form-item>
  215. </el-row>
  216. <el-row v-if="show_ckeditor">
  217. <el-form-item
  218. label="作弊说明"
  219. :label-width="style.label_width_tab3"
  220. >
  221. <ckeditor
  222. v-model="form.properties.CHEATING_REMARK"
  223. ></ckeditor>
  224. </el-form-item>
  225. </el-row>
  226. <el-row>
  227. <el-form-item
  228. label="单选题补充说明"
  229. :label-width="style.label_width_tab3"
  230. >
  231. <el-input
  232. maxlength="20"
  233. :disabled="!form.properties.SINGLE_EDIT"
  234. v-model="form.properties.SINGLE_ANSWER_REMARK"
  235. auto-complete="off"
  236. class="input"
  237. ></el-input>
  238. </el-form-item>
  239. <el-form-item label="">
  240. <el-switch
  241. v-model="form.properties.SINGLE_EDIT"
  242. on-text="启用"
  243. off-text="禁用"
  244. ></el-switch>
  245. </el-form-item>
  246. </el-row>
  247. <el-row>
  248. <el-form-item
  249. label="多选题补充说明"
  250. :label-width="style.label_width_tab3"
  251. >
  252. <el-input
  253. maxlength="20"
  254. :disabled="!form.properties.MUTIPLE_EDIT"
  255. v-model="form.properties.MUTIPLE_ANSWER_REMARK"
  256. auto-complete="off"
  257. class="input"
  258. ></el-input>
  259. </el-form-item>
  260. <el-form-item label="">
  261. <el-switch
  262. v-model="form.properties.MUTIPLE_EDIT"
  263. on-text="启用"
  264. off-text="禁用"
  265. ></el-switch>
  266. </el-form-item>
  267. </el-row>
  268. <el-row>
  269. <el-form-item
  270. label="判断题补充说明"
  271. :label-width="style.label_width_tab3"
  272. >
  273. <el-input
  274. maxlength="20"
  275. :disabled="!form.properties.BOOL_EDIT"
  276. v-model="form.properties.BOOL_ANSWER_REMARK"
  277. class="input"
  278. auto-complete="off"
  279. ></el-input>
  280. </el-form-item>
  281. <el-form-item label="">
  282. <el-switch
  283. v-model="form.properties.BOOL_EDIT"
  284. on-text="启用"
  285. off-text="禁用"
  286. ></el-switch>
  287. </el-form-item>
  288. </el-row>
  289. <el-row>
  290. <el-form-item
  291. label="填空题补充说明"
  292. :label-width="style.label_width_tab3"
  293. >
  294. <el-input
  295. maxlength="20"
  296. :disabled="!form.properties.FILL_BLANK_EDIT"
  297. v-model="form.properties.FILL_BLANK_REMARK"
  298. class="input"
  299. auto-complete="off"
  300. ></el-input>
  301. </el-form-item>
  302. <el-form-item label="">
  303. <el-switch
  304. v-model="form.properties.FILL_BLANK_EDIT"
  305. on-text="启用"
  306. off-text="禁用"
  307. ></el-switch>
  308. </el-form-item>
  309. </el-row>
  310. <el-row>
  311. <el-form-item
  312. label="客观题成绩显示"
  313. :label-width="style.label_width_tab3"
  314. >
  315. <el-radio-group
  316. v-model="form.properties.IS_OBJ_SCORE_VIEW"
  317. class="input"
  318. >
  319. <el-radio label="true">开启</el-radio>
  320. <el-radio label="false">关闭</el-radio>
  321. </el-radio-group>
  322. </el-form-item>
  323. </el-row>
  324. </el-tab-pane>
  325. <el-tab-pane label="身份检测设置" name="tab4">
  326. <el-row>
  327. <el-form-item
  328. label="开启身份检测"
  329. :label-width="style.label_width_tab4"
  330. >
  331. <el-radio-group
  332. v-model="form.properties.IS_FACE_ENABLE"
  333. @change="faceChange"
  334. class="input"
  335. >
  336. <el-radio label="true">是</el-radio>
  337. <el-radio label="false">否</el-radio>
  338. </el-radio-group>
  339. </el-form-item>
  340. </el-row>
  341. <el-row v-show="form.properties.IS_FACE_ENABLE == 'true'">
  342. <el-form-item
  343. label="考试强制使用"
  344. :label-width="style.label_width_tab4"
  345. >
  346. <el-radio-group
  347. v-model="form.properties.IS_FACE_CHECK"
  348. class="input"
  349. >
  350. <el-radio label="true">强制</el-radio>
  351. <el-radio label="false">非强制</el-radio>
  352. </el-radio-group>
  353. </el-form-item>
  354. </el-row>
  355. <el-row v-show="form.properties.IS_FACE_ENABLE == 'true'">
  356. <el-form-item
  357. label="抓拍间隔"
  358. prop="SNAPSHOT_INTERVAL"
  359. :label-width="style.label_width_tab4"
  360. >
  361. <el-input
  362. maxlength="20"
  363. v-model.trim.number="form.properties.SNAPSHOT_INTERVAL"
  364. auto-complete="off"
  365. class="input"
  366. ><template slot="append"
  367. >分钟</template
  368. ></el-input
  369. >
  370. </el-form-item>
  371. </el-row>
  372. <el-row v-show="form.properties.IS_FACE_ENABLE == 'true'">
  373. <el-form-item
  374. label="预警阀值"
  375. prop="WARN_THRESHOLD"
  376. :label-width="style.label_width_tab4"
  377. >
  378. <el-input
  379. maxlength="20"
  380. v-model.trim.number="form.properties.WARN_THRESHOLD"
  381. auto-complete="off"
  382. class="input"
  383. ><template slot="append"
  384. >%</template
  385. ></el-input
  386. >
  387. </el-form-item>
  388. </el-row>
  389. <el-row v-show="form.properties.IS_FACE_ENABLE == 'true'">
  390. <el-form-item
  391. label="真实性预警阀值"
  392. prop="LIVING_WARN_THRESHOLD"
  393. :label-width="style.label_width_tab4"
  394. >
  395. <el-input
  396. maxlength="20"
  397. v-model.number="form.properties.LIVING_WARN_THRESHOLD"
  398. auto-complete="off"
  399. class="input"
  400. ><template slot="append"
  401. >%</template
  402. ></el-input
  403. >
  404. </el-form-item>
  405. </el-row>
  406. <el-row v-show="form.properties.IS_FACE_ENABLE == 'true'">
  407. <el-form-item
  408. label="开启人脸活体检测"
  409. :label-width="style.label_width_tab4"
  410. >
  411. <el-radio-group
  412. v-model="form.properties.IS_FACE_VERIFY"
  413. class="input"
  414. >
  415. <el-radio label="true">是</el-radio>
  416. <el-radio label="false">否</el-radio>
  417. </el-radio-group>
  418. </el-form-item>
  419. </el-row>
  420. <el-row v-show="form.properties.IS_FACE_VERIFY == 'true'">
  421. <el-form-item
  422. label="人脸活体检测开始时间"
  423. prop="FACE_VERIFY_START_MINUTE"
  424. :label-width="style.label_width_tab4"
  425. >
  426. <el-input
  427. maxlength="20"
  428. v-model.trim.number="
  429. form.properties.FACE_VERIFY_START_MINUTE
  430. "
  431. auto-complete="off"
  432. class="input"
  433. ><template slot="append"
  434. >分钟</template
  435. ></el-input
  436. >
  437. </el-form-item>
  438. </el-row>
  439. <el-row v-show="form.properties.IS_FACE_VERIFY == 'true'">
  440. <el-form-item
  441. label="人脸活体检测结束时间"
  442. prop="FACE_VERIFY_END_MINUTE"
  443. :label-width="style.label_width_tab4"
  444. >
  445. <el-input
  446. maxlength="20"
  447. v-model.trim.number="
  448. form.properties.FACE_VERIFY_END_MINUTE
  449. "
  450. auto-complete="off"
  451. class="input"
  452. ><template slot="append"
  453. >分钟</template
  454. ></el-input
  455. >
  456. </el-form-item>
  457. </el-row>
  458. </el-tab-pane>
  459. <el-tab-pane label="阅卷设置" name="tab5">
  460. <el-row>
  461. <el-form-item
  462. label="阅卷方式"
  463. :label-width="style.label_width_tab5"
  464. >
  465. <el-radio-group
  466. :disabled="form.started"
  467. v-model="form.properties.MARKING_TYPE"
  468. class="input"
  469. >
  470. <el-radio label="ALL">全部评阅</el-radio>
  471. <el-radio label="OBJECT_SCORE_MAX">客观分最高</el-radio>
  472. <el-radio label="LAST_SUBMIT">最后一次提交</el-radio>
  473. </el-radio-group>
  474. </el-form-item>
  475. </el-row>
  476. </el-tab-pane>
  477. <el-tab-pane label="网络设置" name="tab6">
  478. <el-row>
  479. <el-form-item
  480. label="IP限制"
  481. :label-width="style.label_width_tab6"
  482. >
  483. <el-radio-group v-model="form.properties.IP_LIMIT">
  484. <el-radio label="true">开启</el-radio>
  485. <el-radio label="false">关闭</el-radio>
  486. </el-radio-group>
  487. </el-form-item>
  488. </el-row>
  489. <el-row>
  490. <el-form-item
  491. label="IP段( *表示任意 )"
  492. :label-width="style.label_width_tab6"
  493. >
  494. <el-input
  495. maxlength="20"
  496. v-model="form.properties.IP_ADDRESSES"
  497. class="input"
  498. ></el-input>
  499. </el-form-item>
  500. </el-row>
  501. </el-tab-pane>
  502. <el-tab-pane label="其它" name="tab7">
  503. <el-row>
  504. <el-form-item
  505. label="是否推送成绩"
  506. :label-width="style.label_width_tab7"
  507. >
  508. <el-radio-group v-model="form.properties.PUSH_SCORE">
  509. <el-radio label="true">是</el-radio>
  510. <el-radio label="false">否</el-radio>
  511. </el-radio-group>
  512. </el-form-item>
  513. </el-row>
  514. </el-tab-pane>
  515. </el-tabs>
  516. </el-form>
  517. </div>
  518. </div>
  519. </section>
  520. </div>
  521. </template>
  522. <script>
  523. import { EXAM_TYPE, EXAM_WORK_API } from "@/constants/constants.js";
  524. import moment from "moment";
  525. import ckeditor from "@/components/ckeditor.vue";
  526. import LinkTitlesCustom from "@/components/LinkTitlesCustom.vue";
  527. let _this = null;
  528. let validateName = (rule, value, callback) => {
  529. let name = _this.form.name;
  530. if (name == "") {
  531. callback(new Error("请输入考试名称"));
  532. if (!_this.toActiveName) {
  533. _this.toActiveName = "tab1";
  534. _this.activeName = "tab1";
  535. }
  536. } else {
  537. callback();
  538. }
  539. };
  540. let validateExamDatetimeRange = (rule, value, callback) => {
  541. let examDatetimeRange = _this.examDatetimeRange;
  542. if (!examDatetimeRange) {
  543. callback(new Error("请输入考试时间"));
  544. if (!_this.toActiveName) {
  545. _this.toActiveName = "tab1";
  546. _this.activeName = "tab1";
  547. }
  548. } else {
  549. callback();
  550. }
  551. };
  552. let validateDuration = (rule, value, callback) => {
  553. let duration = _this.form.duration;
  554. if (duration === "") {
  555. callback(new Error("请输入考试时长"));
  556. if (!_this.toActiveName) {
  557. _this.toActiveName = "tab2";
  558. _this.activeName = "tab2";
  559. }
  560. } else if (!duration.toString().match(/^[1-9]\d*|0$/)) {
  561. callback(new Error("只能是非负整数"));
  562. if (!_this.toActiveName) {
  563. _this.toActiveName = "tab2";
  564. _this.activeName = "tab2";
  565. }
  566. } else {
  567. callback();
  568. }
  569. };
  570. let validateExamTimes = (rule, value, callback) => {
  571. let examTimes = _this.form.examTimes;
  572. if (examTimes === "") {
  573. callback(new Error("请输入考试次数"));
  574. if (!_this.toActiveName) {
  575. _this.toActiveName = "tab2";
  576. _this.activeName = "tab2";
  577. }
  578. } else if (!examTimes.toString().match(/^[1-9]\d*$/)) {
  579. callback(new Error("只能是正整数"));
  580. if (!_this.toActiveName) {
  581. _this.toActiveName = "tab2";
  582. _this.activeName = "tab2";
  583. }
  584. } else {
  585. callback();
  586. }
  587. };
  588. let validateFreezeTime = (rule, value, callback) => {
  589. let freezeTime = _this.form.properties.FREEZE_TIME;
  590. let duration = _this.form.duration;
  591. if (freezeTime === "") {
  592. callback(new Error("请输入交卷冻结时长"));
  593. if (!_this.toActiveName) {
  594. _this.toActiveName = "tab2";
  595. _this.activeName = "tab2";
  596. }
  597. } else if (!freezeTime.toString().match(/^[1-9]\d*|0$/)) {
  598. callback(new Error("只能是非负整数"));
  599. if (!_this.toActiveName) {
  600. _this.toActiveName = "tab2";
  601. _this.activeName = "tab2";
  602. }
  603. } else if (duration != "" && parseInt(freezeTime) > parseInt(duration)) {
  604. callback(new Error("交卷冻结时长不能大于考试时长"));
  605. if (!_this.toActiveName) {
  606. _this.toActiveName = "tab2";
  607. _this.activeName = "tab2";
  608. }
  609. } else {
  610. callback();
  611. }
  612. };
  613. let validateExamReconnectTime = (rule, value, callback) => {
  614. let examReconnectTime = _this.form.properties.EXAM_RECONNECT_TIME;
  615. if (examReconnectTime === "") {
  616. callback(new Error("请输入断点续考时间"));
  617. if (!_this.toActiveName) {
  618. _this.toActiveName = "tab2";
  619. _this.activeName = "tab2";
  620. }
  621. } else if (!examReconnectTime.toString().match(/^[1-9]\d*$/)) {
  622. callback(new Error("只能是正整数"));
  623. if (!_this.toActiveName) {
  624. _this.toActiveName = "tab2";
  625. _this.activeName = "tab2";
  626. }
  627. } else {
  628. callback();
  629. }
  630. };
  631. let validateSnapshotInterval = (rule, value, callback) => {
  632. let isFaceEnable = _this.form.properties.IS_FACE_ENABLE;
  633. let snapshotnterval = _this.form.properties.SNAPSHOT_INTERVAL;
  634. let duration = _this.form.duration;
  635. if (isFaceEnable == "true") {
  636. if (snapshotnterval === "") {
  637. callback(new Error("请输入抓拍间隔"));
  638. if (!_this.toActiveName) {
  639. _this.toActiveName = "tab4";
  640. _this.activeName = "tab4";
  641. }
  642. } else if (!snapshotnterval.toString().match(/^[1-9]\d*$/)) {
  643. callback(new Error("只能是正整数"));
  644. if (!_this.toActiveName) {
  645. _this.toActiveName = "tab4";
  646. _this.activeName = "tab4";
  647. }
  648. } else if (
  649. duration != "" &&
  650. parseInt(snapshotnterval) > parseInt(duration)
  651. ) {
  652. callback(new Error("抓拍间隔不能大于考试时长"));
  653. if (!_this.toActiveName) {
  654. _this.toActiveName = "tab4";
  655. _this.activeName = "tab4";
  656. }
  657. } else {
  658. callback();
  659. }
  660. } else {
  661. callback();
  662. }
  663. };
  664. let validateWarnThreshold = (rule, value, callback) => {
  665. let isFaceEnable = _this.form.properties.IS_FACE_ENABLE;
  666. let warnThreshold = _this.form.properties.WARN_THRESHOLD;
  667. if (isFaceEnable == "true") {
  668. if (warnThreshold === "") {
  669. callback(new Error("请输入预警阀值"));
  670. if (!_this.toActiveName) {
  671. _this.toActiveName = "tab4";
  672. _this.activeName = "tab4";
  673. }
  674. } else if (!warnThreshold.toString().match(/^[1-9]\d*|0$/)) {
  675. callback(new Error("只能是非负整数"));
  676. if (!_this.toActiveName) {
  677. _this.toActiveName = "tab4";
  678. _this.activeName = "tab4";
  679. }
  680. } else {
  681. callback();
  682. }
  683. } else {
  684. callback();
  685. }
  686. };
  687. let validateLivingWarnThreshold = (rule, value, callback) => {
  688. let isFaceEnable = _this.form.properties.IS_FACE_ENABLE;
  689. let livingWarnThreshold = _this.form.properties.LIVING_WARN_THRESHOLD;
  690. if (isFaceEnable == "true") {
  691. if (livingWarnThreshold === "") {
  692. callback(new Error("请输入真实性预警阀值"));
  693. if (!_this.toActiveName) {
  694. _this.toActiveName = "tab4";
  695. _this.activeName = "tab4";
  696. }
  697. } else if (!livingWarnThreshold.toString().match(/^[1-9]\d*|0$/)) {
  698. callback(new Error("只能是非负整数"));
  699. if (!_this.toActiveName) {
  700. _this.toActiveName = "tab4";
  701. _this.activeName = "tab4";
  702. }
  703. } else {
  704. callback();
  705. }
  706. } else {
  707. callback();
  708. }
  709. };
  710. let validateFaceVerifyStartMinute = (rule, value, callback) => {
  711. let isFaceVerify = _this.form.properties.IS_FACE_VERIFY;
  712. let freezeTime = _this.form.properties.FREEZE_TIME;
  713. let v = _this.form.properties.FACE_VERIFY_START_MINUTE;
  714. if (isFaceVerify == "true") {
  715. if (v === "") {
  716. callback(new Error("请输入活体检测开始分钟数"));
  717. if (!_this.toActiveName) {
  718. _this.toActiveName = "tab4";
  719. _this.activeName = "tab4";
  720. }
  721. } else if (!v.toString().match(/^[1-9]\d*$/)) {
  722. callback(new Error("只能是正整数"));
  723. if (!_this.toActiveName) {
  724. _this.toActiveName = "tab4";
  725. _this.activeName = "tab4";
  726. }
  727. } else if (freezeTime != "" && parseInt(v) > parseInt(freezeTime)) {
  728. callback(new Error("活体检测开始分钟数不能大于交卷冻结时长"));
  729. if (!_this.toActiveName) {
  730. _this.toActiveName = "tab4";
  731. _this.activeName = "tab4";
  732. }
  733. } else {
  734. callback();
  735. }
  736. } else {
  737. callback();
  738. }
  739. };
  740. let validateFaceVerifyEndMinute = (rule, value, callback) => {
  741. let isFaceVerify = _this.form.properties.IS_FACE_VERIFY;
  742. let freezeTime = _this.form.properties.FREEZE_TIME;
  743. let start = _this.form.properties.FACE_VERIFY_START_MINUTE;
  744. let v = _this.form.properties.FACE_VERIFY_END_MINUTE;
  745. if (isFaceVerify == "true") {
  746. if (v === "") {
  747. callback(new Error("请输入活体检测结束分钟数"));
  748. if (!_this.toActiveName) {
  749. _this.toActiveName = "tab4";
  750. _this.activeName = "tab4";
  751. }
  752. } else if (!v.toString().match(/^[1-9]\d*$/)) {
  753. callback(new Error("只能是正整数"));
  754. if (!_this.toActiveName) {
  755. _this.toActiveName = "tab4";
  756. _this.activeName = "tab4";
  757. }
  758. } else if (start != "" && parseInt(v) < parseInt(start)) {
  759. callback(new Error("活体检测结束分钟数不能小于活体检测开始分钟数"));
  760. if (!_this.toActiveName) {
  761. _this.toActiveName = "tab4";
  762. _this.activeName = "tab4";
  763. }
  764. } else if (freezeTime != "" && parseInt(v) > parseInt(freezeTime)) {
  765. callback(new Error("活体检测结束分钟数不能大于交卷冻结时长"));
  766. if (!_this.toActiveName) {
  767. _this.toActiveName = "tab4";
  768. _this.activeName = "tab4";
  769. }
  770. } else {
  771. callback();
  772. }
  773. } else {
  774. callback();
  775. }
  776. };
  777. export default {
  778. components: {
  779. ckeditor,
  780. LinkTitlesCustom
  781. },
  782. data() {
  783. return {
  784. style: {
  785. label_width_tab1: "100px",
  786. label_width_tab2: "110px",
  787. label_width_tab3: "120px",
  788. label_width_tab4: "170px",
  789. label_width_tab5: "80px",
  790. label_width_tab6: "120px",
  791. label_width_tab7: "120px"
  792. },
  793. activeName: "tab1",
  794. toActiveName: null,
  795. examDatetimeRange: [],
  796. show_ckeditor: false,
  797. form: {
  798. started: false,
  799. name: "",
  800. examType: "ONLINE",
  801. examTimes: 1,
  802. beginTime: null,
  803. endTime: null,
  804. duration: 120,
  805. enable: "true",
  806. examLimit: "false",
  807. properties: {
  808. IS_OBJ_SCORE_VIEW: "true",
  809. EXAM_RECONNECT_TIME: 30,
  810. FREEZE_TIME: 0,
  811. BEFORE_EXAM_REMARK: "",
  812. AFTER_EXAM_REMARK: "",
  813. SHOW_CHEATING_REMARK: "true",
  814. CHEATING_REMARK: "",
  815. SINGLE_EDIT: "false",
  816. MUTIPLE_EDIT: "false",
  817. BOOL_EDIT: "false",
  818. FILL_BLANK_EDIT: "false",
  819. SINGLE_ANSWER_REMARK: "",
  820. MUTIPLE_ANSWER_REMARK: "",
  821. FILL_BLANK_REMARK: "",
  822. BOOL_ANSWER_REMARK: "",
  823. IS_FACE_ENABLE: "false",
  824. IS_FACE_CHECK: "false",
  825. SNAPSHOT_INTERVAL: 30,
  826. WARN_THRESHOLD: 50,
  827. MARKING_TYPE: "ALL",
  828. IP_LIMIT: "false",
  829. IP_ADDRESSES: null,
  830. LIVING_WARN_THRESHOLD: 50,
  831. IS_FACE_VERIFY: "false",
  832. FACE_VERIFY_START_MINUTE: 5,
  833. FACE_VERIFY_END_MINUTE: 10,
  834. PUSH_SCORE: "true"
  835. }
  836. },
  837. examTypeList: EXAM_TYPE,
  838. examId: "",
  839. rules: {
  840. name: [{ required: true, validator: validateName, trigger: "blur" }],
  841. examDatetimeRange: [
  842. {
  843. required: true,
  844. validator: validateExamDatetimeRange,
  845. trigger: "blur"
  846. }
  847. ],
  848. duration: [
  849. { required: true, validator: validateDuration, trigger: "blur" }
  850. ],
  851. examTimes: [
  852. { required: true, validator: validateExamTimes, trigger: "blur" }
  853. ],
  854. FREEZE_TIME: [
  855. { required: true, validator: validateFreezeTime, trigger: "blur" }
  856. ],
  857. EXAM_RECONNECT_TIME: [
  858. {
  859. required: true,
  860. validator: validateExamReconnectTime,
  861. trigger: "blur"
  862. }
  863. ],
  864. SNAPSHOT_INTERVAL: [
  865. {
  866. required: true,
  867. validator: validateSnapshotInterval,
  868. trigger: "blur"
  869. }
  870. ],
  871. WARN_THRESHOLD: [
  872. { required: true, validator: validateWarnThreshold, trigger: "blur" }
  873. ],
  874. FACE_VERIFY_START_MINUTE: [
  875. {
  876. required: true,
  877. validator: validateFaceVerifyStartMinute,
  878. trigger: "blur"
  879. }
  880. ],
  881. FACE_VERIFY_END_MINUTE: [
  882. {
  883. required: true,
  884. validator: validateFaceVerifyEndMinute,
  885. trigger: "blur"
  886. }
  887. ],
  888. LIVING_WARN_THRESHOLD: [
  889. {
  890. required: true,
  891. validator: validateLivingWarnThreshold,
  892. trigger: "blur"
  893. }
  894. ]
  895. }
  896. };
  897. },
  898. methods: {
  899. faceChange() {
  900. if (this.form.properties.IS_FACE_ENABLE == "false") {
  901. this.form.properties.IS_FACE_VERIFY = "false";
  902. } else if (this.form.properties.IS_FACE_ENABLE == "true") {
  903. this.form.properties.IS_FACE_VERIFY = "true";
  904. }
  905. },
  906. init() {
  907. if (this.examId != "add") {
  908. let url = EXAM_WORK_API + "/exam/" + this.examId;
  909. this.$httpWithMsg.get(url).then(response => {
  910. let body = response.data;
  911. body.properties = this.form.properties;
  912. this.form = Object.assign(this.form, response.data);
  913. this.form.enable = this.form.enable ? "true" : "false";
  914. this.form.examLimit = this.form.examLimit ? "true" : "false";
  915. this.examDatetimeRange = [this.form.beginTime, this.form.endTime];
  916. console.log("getOnlineExam(); form: ", this.form);
  917. let url = EXAM_WORK_API + "/exam/allProperties/" + this.examId;
  918. this.$httpWithMsg.get(url).then(response => {
  919. this.form.properties = Object.assign(
  920. this.form.properties,
  921. response.data
  922. );
  923. this.form.properties.SINGLE_EDIT =
  924. this.form.properties.SINGLE_EDIT === "true";
  925. this.form.properties.MUTIPLE_EDIT =
  926. this.form.properties.MUTIPLE_EDIT === "true";
  927. this.form.properties.BOOL_EDIT =
  928. this.form.properties.BOOL_EDIT === "true";
  929. this.form.properties.FILL_BLANK_EDIT =
  930. this.form.properties.FILL_BLANK_EDIT === "true";
  931. this.show_ckeditor = true;
  932. });
  933. });
  934. } else {
  935. let now = moment().format("YYYY-MM-DD HH:mm:ss");
  936. this.examDatetimeRange = [now, now];
  937. this.show_ckeditor = true;
  938. }
  939. },
  940. saveExam: function() {
  941. this.toActiveName = null;
  942. this.form.beginTime = this.examDatetimeRange[0];
  943. this.form.endTime = this.examDatetimeRange[1];
  944. console.log(this.form);
  945. let url = EXAM_WORK_API + "/exam";
  946. this.$refs.form.validate(valid => {
  947. if (valid) {
  948. if (this.examId != "add") {
  949. this.$httpWithMsg.put(url, this.form).then(response => {
  950. if (200 != response.status) {
  951. this.$notify({
  952. type: "error",
  953. message: response.body.desc
  954. });
  955. return;
  956. }
  957. this.$notify({
  958. type: "success",
  959. message: "保存成功"
  960. });
  961. });
  962. } else {
  963. this.$httpWithMsg.post(url, this.form).then(response => {
  964. console.log(response);
  965. this.$notify({
  966. type: "success",
  967. message: "新增成功"
  968. });
  969. this.examId = response.data.id;
  970. this.form.id = this.examId;
  971. this.$router.push({
  972. path: "/examwork/onlineExam/" + response.data.id
  973. });
  974. });
  975. }
  976. } else {
  977. return false;
  978. }
  979. });
  980. },
  981. back() {
  982. this.$router.push({ path: "/examwork/examInfo" });
  983. }
  984. },
  985. created() {
  986. _this = this;
  987. this.examId = this.$route.params.id;
  988. this.init();
  989. }
  990. };
  991. </script>
  992. <style scoped>
  993. .input {
  994. width: 440px;
  995. }
  996. .input >>> .el-input__inner {
  997. -webkit-appearance: button;
  998. }
  999. </style>