onlineExam.vue 32 KB

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