practiceExam.vue 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804
  1. <template>
  2. <div>
  3. <LinkTitlesCustom
  4. :current-paths="['考试管理', '考试信息', '练习考试设置']"
  5. />
  6. <section class="content">
  7. <div class="box box-info">
  8. <!-- 正文信息 -->
  9. <div class="box-body">
  10. <el-form
  11. ref="form"
  12. :inline="true"
  13. :rules="rules"
  14. :model="form"
  15. label-position="right"
  16. inline-message
  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. icon="el-icon-arrow-left"
  26. @click="back"
  27. >返 回</el-button
  28. >
  29. </div>
  30. <el-tabs v-model="activeName" type="border-card">
  31. <!-- 基础信息 -->
  32. <el-tab-pane label="基础信息" name="tab1">
  33. <el-row v-if="examId != 'add'">
  34. <el-form-item
  35. label="ID"
  36. prop="id"
  37. :label-width="style.label_width_tab1"
  38. >
  39. <el-input
  40. v-model="form.id"
  41. class="input"
  42. :disabled="true"
  43. maxlength="20"
  44. ></el-input>
  45. </el-form-item>
  46. </el-row>
  47. <el-row v-if="examId != 'add'">
  48. <el-form-item
  49. label="考试编码"
  50. placeholder="请输入考试编码"
  51. prop="code"
  52. :label-width="style.label_width_tab1"
  53. >
  54. <el-input
  55. v-model="form.code"
  56. class="input"
  57. :disabled="true"
  58. maxlength="20"
  59. ></el-input>
  60. </el-form-item>
  61. </el-row>
  62. <el-row v-else>
  63. <el-form-item
  64. label="考试编码"
  65. placeholder="请输入考试编码"
  66. prop="code"
  67. :label-width="style.label_width_tab1"
  68. >
  69. <el-input
  70. v-model="form.name"
  71. class="input"
  72. :disabled="true"
  73. maxlength="20"
  74. ></el-input>
  75. </el-form-item>
  76. </el-row>
  77. <el-row>
  78. <el-form-item
  79. label="考试名称"
  80. :label-width="style.label_width_tab1"
  81. placeholder="请输入考试名称"
  82. prop="name"
  83. >
  84. <el-input
  85. v-model="form.name"
  86. maxlength="20"
  87. class="input"
  88. ></el-input>
  89. </el-form-item>
  90. </el-row>
  91. <el-row>
  92. <el-form-item
  93. label="考试类型"
  94. :label-width="style.label_width_tab1"
  95. >
  96. <el-select
  97. v-model="form.examType"
  98. class="input"
  99. :disabled="true"
  100. placeholder="请选择"
  101. >
  102. <el-option
  103. v-for="item in examTypeList"
  104. :key="item.value"
  105. :label="item.label"
  106. :value="item.value"
  107. >
  108. </el-option>
  109. </el-select>
  110. </el-form-item>
  111. </el-row>
  112. <el-row>
  113. <el-form-item
  114. label="状态"
  115. :label-width="style.label_width_tab1"
  116. >
  117. <el-radio-group v-model="form.enable" class="input">
  118. <el-radio label="true">启用</el-radio>
  119. <el-radio label="false">禁用</el-radio>
  120. </el-radio-group>
  121. </el-form-item>
  122. </el-row>
  123. <el-row>
  124. <el-form-item
  125. label="考试时间"
  126. prop="examDatetimeRange"
  127. :label-width="style.label_width_tab1"
  128. >
  129. <el-date-picker
  130. v-model="examDatetimeRange"
  131. class="input"
  132. type="datetimerange"
  133. range-separator="至"
  134. start-placeholder="开始日期"
  135. end-placeholder="结束日期"
  136. value-format="yyyy-MM-dd HH:mm:ss"
  137. :clearable="false"
  138. >
  139. </el-date-picker>
  140. </el-form-item>
  141. </el-row>
  142. </el-tab-pane>
  143. <!-- 周期设置 -->
  144. <el-tab-pane label="周期设置" name="tab4">
  145. <el-row>
  146. <el-form-item
  147. label="是否开启周期设置"
  148. :label-width="style.label_width_tab4"
  149. >
  150. <el-radio-group
  151. v-model="form.properties.EXAM_CYCLE_ENABLED"
  152. class="input"
  153. @change="examCycleEnabledChange"
  154. >
  155. <el-radio label="true">开启</el-radio>
  156. <el-radio label="false">不开启</el-radio>
  157. </el-radio-group></el-form-item
  158. >
  159. </el-row>
  160. <el-row v-if="form.properties.EXAM_CYCLE_ENABLED == 'true'">
  161. <el-form-item
  162. label="日期循环设置"
  163. prop="examCycleWeekArr"
  164. :label-width="style.label_width_tab4"
  165. >
  166. <el-checkbox-group
  167. v-model="examCycleWeekArr"
  168. style="width: 680px; display: -webkit-inline-box"
  169. >
  170. <el-checkbox :label="1">星期一</el-checkbox>
  171. <el-checkbox :label="2">星期二</el-checkbox>
  172. <el-checkbox :label="3">星期三</el-checkbox>
  173. <el-checkbox :label="4">星期四</el-checkbox>
  174. <el-checkbox :label="5">星期五</el-checkbox>
  175. <el-checkbox :label="6">星期六</el-checkbox>
  176. <el-checkbox :label="7">星期日</el-checkbox>
  177. </el-checkbox-group></el-form-item
  178. >
  179. </el-row>
  180. <template v-if="form.properties.EXAM_CYCLE_ENABLED == 'true'">
  181. <el-row>
  182. <el-col :span="14">
  183. <el-form-item
  184. label="时间分段设置"
  185. :label-width="style.label_width_tab4"
  186. prop="examCycleTimeRangeArr"
  187. >
  188. </el-form-item>
  189. </el-col>
  190. <el-col :span="10" style="line-height: 48px; height: 40px">
  191. <i
  192. class="el-icon-circle-plus"
  193. style="color: #00a4ff; font-size: 24px"
  194. @click="addCycleTimeRange"
  195. ></i>
  196. </el-col>
  197. </el-row>
  198. <el-row
  199. v-for="(item, index) in examCycleTimeRangeArr"
  200. :key="'tr' + index"
  201. >
  202. <el-col :span="14">
  203. <el-form-item
  204. :label-width="style.label_width_tab4"
  205. :label="index + 1 + '.'"
  206. >
  207. <el-time-picker
  208. v-model="item.timeRange"
  209. class="input"
  210. style="width: 100%"
  211. is-range
  212. start-placeholder="开始时间"
  213. range-separator="至"
  214. end-placeholder="结束时间"
  215. format="HH:mm"
  216. value-format="HH:mm"
  217. :clearable="false"
  218. size="small"
  219. ></el-time-picker>
  220. </el-form-item>
  221. </el-col>
  222. <el-col :span="10" style="line-height: 48px; height: 40px">
  223. <i
  224. class="el-icon-remove"
  225. style="color: #00a4ff; font-size: 24px"
  226. @click="removeExamCycleTimeRange(index)"
  227. ></i>
  228. </el-col>
  229. </el-row>
  230. </template>
  231. </el-tab-pane>
  232. <!-- 控制设置 -->
  233. <el-tab-pane label="控制设置" name="tab2">
  234. <el-row>
  235. <el-form-item
  236. label="考试时长"
  237. prop="duration"
  238. :label-width="style.label_width_tab2"
  239. >
  240. <el-input
  241. v-model.trim.number="form.duration"
  242. maxlength="5"
  243. class="input"
  244. auto-complete="off"
  245. ><template slot="append">分钟</template></el-input
  246. >
  247. </el-form-item>
  248. </el-row>
  249. <el-row>
  250. <el-form-item
  251. label="考试次数"
  252. prop="examTimes"
  253. :label-width="style.label_width_tab2"
  254. >
  255. <el-input
  256. v-model.trim.number="form.examTimes"
  257. maxlength="5"
  258. class="input"
  259. auto-complete="off"
  260. ><template slot="append">次</template></el-input
  261. >
  262. </el-form-item>
  263. </el-row>
  264. <el-row>
  265. <el-form-item
  266. label="交卷冻结时间"
  267. prop="FREEZE_TIME"
  268. :label-width="style.label_width_tab2"
  269. >
  270. <el-input
  271. v-model.trim.number="form.properties.FREEZE_TIME"
  272. maxlength="5"
  273. class="input"
  274. auto-complete="off"
  275. ><template slot="append">分钟</template></el-input
  276. >
  277. <el-radio-group
  278. v-model="form.properties.FREEZE_TIME_TYPE"
  279. style="margin-left: 30px"
  280. >
  281. <el-radio label="DURATION">按实际考试时长</el-radio>
  282. <el-radio label="BEGINTIME">按考试开始时间</el-radio>
  283. </el-radio-group>
  284. </el-form-item>
  285. </el-row>
  286. <el-row>
  287. <el-form-item
  288. label="断点续考时间"
  289. prop="EXAM_RECONNECT_TIME"
  290. :label-width="style.label_width_tab2"
  291. >
  292. <el-input
  293. v-model.trim.number="form.properties.EXAM_RECONNECT_TIME"
  294. maxlength="5"
  295. class="input"
  296. auto-complete="off"
  297. ><template slot="append">分钟</template></el-input
  298. >
  299. </el-form-item>
  300. </el-row>
  301. </el-tab-pane>
  302. <el-tab-pane label="显示设置" name="tab3">
  303. <el-row>
  304. <el-form-item
  305. label="考生承诺书"
  306. :label-width="style.label_width_tab3"
  307. >
  308. <el-radio-group
  309. v-model="form.properties.SHOW_UNDERTAKING"
  310. class="input"
  311. >
  312. <el-radio label="true">开启</el-radio>
  313. <el-radio label="false">关闭</el-radio>
  314. </el-radio-group>
  315. </el-form-item>
  316. </el-row>
  317. <el-row v-if="show_ckeditor">
  318. <el-form-item
  319. label="承诺书说明"
  320. :label-width="style.label_width_tab3"
  321. >
  322. <ckeditor
  323. v-model="form.properties.UNDERTAKING"
  324. extrabuttons="Font,FontSize,TextColor"
  325. ></ckeditor>
  326. </el-form-item>
  327. </el-row>
  328. <el-row v-if="show_ckeditor">
  329. <el-form-item
  330. label="考前说明"
  331. :label-width="style.label_width_tab3"
  332. >
  333. <ckeditor
  334. v-model="form.properties.BEFORE_EXAM_REMARK"
  335. extrabuttons="Font,FontSize,TextColor"
  336. ></ckeditor>
  337. </el-form-item>
  338. </el-row>
  339. <el-row>
  340. <el-form-item
  341. label="客观题成绩显示"
  342. :label-width="style.label_width_tab3"
  343. >
  344. <el-radio-group
  345. v-model="form.properties.IS_OBJ_SCORE_VIEW"
  346. class="input"
  347. >
  348. <el-radio label="true">开启</el-radio>
  349. <el-radio label="false">关闭</el-radio>
  350. </el-radio-group>
  351. </el-form-item>
  352. </el-row>
  353. <el-row>
  354. <el-form-item
  355. label="练习模式"
  356. :label-width="style.label_width_tab3"
  357. >
  358. <el-radio-group
  359. v-model="form.properties.PRACTICE_TYPE"
  360. class="input"
  361. >
  362. <el-radio label="IN_PRACTICE">边答边显示答案</el-radio>
  363. <el-radio label="AFTER_PRACTICE"
  364. >结束统一显示答案</el-radio
  365. >
  366. <el-radio label="NO_ANSWER">不显示答案</el-radio>
  367. </el-radio-group>
  368. </el-form-item>
  369. </el-row>
  370. </el-tab-pane>
  371. </el-tabs>
  372. </el-form>
  373. </div>
  374. </div>
  375. </section>
  376. </div>
  377. </template>
  378. <script>
  379. import { EXAM_TYPE, EXAM_WORK_API } from "@/constants/constants.js";
  380. import moment from "moment";
  381. import ckeditor from "@/components/ckeditor.vue";
  382. import LinkTitlesCustom from "@/components/LinkTitlesCustom.vue";
  383. let _this = null;
  384. let validateExamCycleTimeRange = (rule, value, callback) => {
  385. if (_this.examCycleTimeRangeArr.length == 0) {
  386. callback(new Error("请至少设置一个时间段"));
  387. } else {
  388. callback();
  389. }
  390. };
  391. let validateExamCycleWeek = (rule, value, callback) => {
  392. if (_this.examCycleWeekArr.length == 0) {
  393. callback(new Error("请至少勾选一个日期"));
  394. } else {
  395. callback();
  396. }
  397. };
  398. let validateCode = (rule, value, callback) => {
  399. if (_this.examId == "add") {
  400. _this.form.code = _this.form.name;
  401. }
  402. let code = _this.form.code;
  403. if (code == "") {
  404. callback(new Error("请输入考试编码"));
  405. if (!_this.toActiveName) {
  406. _this.toActiveName = "tab1";
  407. _this.activeName = "tab1";
  408. }
  409. } else {
  410. callback();
  411. }
  412. };
  413. let validateName = (rule, value, callback) => {
  414. let name = _this.form.name;
  415. if (name == "") {
  416. callback(new Error("请输入考试名称"));
  417. if (!_this.toActiveName) {
  418. _this.toActiveName = "tab1";
  419. _this.activeName = "tab1";
  420. }
  421. } else {
  422. callback();
  423. }
  424. };
  425. let validateExamDatetimeRange = (rule, value, callback) => {
  426. let examDatetimeRange = _this.examDatetimeRange;
  427. if (!examDatetimeRange) {
  428. callback(new Error("请输入考试时间"));
  429. if (!_this.toActiveName) {
  430. _this.toActiveName = "tab1";
  431. _this.activeName = "tab1";
  432. }
  433. } else {
  434. callback();
  435. }
  436. };
  437. let validateDuration = (rule, value, callback) => {
  438. let duration = _this.form.duration;
  439. if (duration === "") {
  440. callback(new Error("请输入考试时长"));
  441. if (!_this.toActiveName) {
  442. _this.toActiveName = "tab2";
  443. _this.activeName = "tab2";
  444. }
  445. } else if (0 > duration || !duration.toString().match(/^[1-9]\d*|0$/)) {
  446. callback(new Error("只能是非负整数"));
  447. if (!_this.toActiveName) {
  448. _this.toActiveName = "tab2";
  449. _this.activeName = "tab2";
  450. }
  451. } else {
  452. callback();
  453. }
  454. };
  455. let validateExamTimes = (rule, value, callback) => {
  456. let examTimes = _this.form.examTimes;
  457. if (examTimes === "") {
  458. callback(new Error("请输入考试次数"));
  459. if (!_this.toActiveName) {
  460. _this.toActiveName = "tab2";
  461. _this.activeName = "tab2";
  462. }
  463. } else if (0 >= examTimes || !examTimes.toString().match(/^[1-9]\d*$/)) {
  464. callback(new Error("只能是正整数"));
  465. if (!_this.toActiveName) {
  466. _this.toActiveName = "tab2";
  467. _this.activeName = "tab2";
  468. }
  469. } else {
  470. callback();
  471. }
  472. };
  473. let validateFreezeTime = (rule, value, callback) => {
  474. let freezeTime = _this.form.properties.FREEZE_TIME;
  475. let duration = _this.form.duration;
  476. if (freezeTime === "") {
  477. callback(new Error("请输入交卷冻结时长"));
  478. if (!_this.toActiveName) {
  479. _this.toActiveName = "tab2";
  480. _this.activeName = "tab2";
  481. }
  482. } else if (0 > freezeTime || !freezeTime.toString().match(/^[1-9]\d*|0$/)) {
  483. callback(new Error("只能是非负整数"));
  484. if (!_this.toActiveName) {
  485. _this.toActiveName = "tab2";
  486. _this.activeName = "tab2";
  487. }
  488. } else if (duration != "" && parseInt(freezeTime) > parseInt(duration)) {
  489. callback(new Error("交卷冻结时长不能大于考试时长"));
  490. if (!_this.toActiveName) {
  491. _this.toActiveName = "tab2";
  492. _this.activeName = "tab2";
  493. }
  494. } else {
  495. callback();
  496. }
  497. };
  498. let validateExamReconnectTime = (rule, value, callback) => {
  499. let examReconnectTime = _this.form.properties.EXAM_RECONNECT_TIME;
  500. if (examReconnectTime === "") {
  501. callback(new Error("请输入断点续考时间"));
  502. if (!_this.toActiveName) {
  503. _this.toActiveName = "tab2";
  504. _this.activeName = "tab2";
  505. }
  506. } else if (
  507. 0 >= examReconnectTime ||
  508. !examReconnectTime.toString().match(/^[1-9]\d*$/)
  509. ) {
  510. callback(new Error("只能是正整数"));
  511. if (!_this.toActiveName) {
  512. _this.toActiveName = "tab2";
  513. _this.activeName = "tab2";
  514. }
  515. } else if (examReconnectTime < 3) {
  516. callback(new Error("最小设置值为3"));
  517. if (!_this.toActiveName) {
  518. _this.toActiveName = "tab2";
  519. _this.activeName = "tab2";
  520. }
  521. } else {
  522. callback();
  523. }
  524. };
  525. export default {
  526. components: {
  527. ckeditor,
  528. LinkTitlesCustom,
  529. },
  530. data() {
  531. return {
  532. style: {
  533. label_width_tab1: "80px",
  534. label_width_tab2: "110px",
  535. label_width_tab3: "120px",
  536. label_width_tab4: "170px",
  537. },
  538. examCycleTimeRangeArr: [],
  539. examCycleWeekArr: [1, 2, 3, 4, 5, 6, 7],
  540. activeName: "tab1",
  541. toActiveName: null,
  542. examDatetimeRange: [],
  543. show_ckeditor: false,
  544. form: {
  545. started: false,
  546. name: "",
  547. examType: "PRACTICE",
  548. examTimes: 1,
  549. beginTime: null,
  550. endTime: null,
  551. duration: 120,
  552. enable: "true",
  553. properties: {
  554. FREEZE_TIME: 0,
  555. FREEZE_TIME_TYPE: "DURATION",
  556. EXAM_RECONNECT_TIME: 30,
  557. BEFORE_EXAM_REMARK: "",
  558. AFTER_EXAM_REMARK: "",
  559. IS_OBJ_SCORE_VIEW: "true",
  560. PRACTICE_TYPE: "IN_PRACTICE",
  561. EXAM_CYCLE_ENABLED: "false",
  562. EXAM_CYCLE_WEEK: "",
  563. EXAM_CYCLE_TIME_RANGE: "",
  564. SHOW_UNDERTAKING: "false",
  565. UNDERTAKING: "",
  566. },
  567. },
  568. examTypeList: EXAM_TYPE,
  569. examId: "",
  570. rules: {
  571. code: [{ required: true, validator: validateCode, trigger: "blur" }],
  572. name: [{ required: true, validator: validateName, trigger: "blur" }],
  573. examDatetimeRange: [
  574. {
  575. required: true,
  576. validator: validateExamDatetimeRange,
  577. trigger: "blur",
  578. },
  579. ],
  580. duration: [
  581. { required: true, validator: validateDuration, trigger: "blur" },
  582. ],
  583. examTimes: [
  584. { required: true, validator: validateExamTimes, trigger: "blur" },
  585. ],
  586. FREEZE_TIME: [
  587. { required: true, validator: validateFreezeTime, trigger: "blur" },
  588. ],
  589. EXAM_RECONNECT_TIME: [
  590. {
  591. required: true,
  592. validator: validateExamReconnectTime,
  593. trigger: "blur",
  594. },
  595. ],
  596. examCycleWeekArr: [
  597. {
  598. required: true,
  599. validator: validateExamCycleWeek,
  600. trigger: "change",
  601. },
  602. ],
  603. examCycleTimeRangeArr: [
  604. {
  605. required: true,
  606. validator: validateExamCycleTimeRange,
  607. trigger: "change",
  608. },
  609. ],
  610. },
  611. };
  612. },
  613. created() {
  614. _this = this;
  615. this.examId = this.$route.params.id;
  616. this.init();
  617. },
  618. methods: {
  619. examCycleEnabledChange(val) {
  620. if (val == "true") {
  621. this.examCycleWeekArr = [1, 2, 3, 4, 5, 6, 7];
  622. this.addCycleTimeRange();
  623. } else {
  624. this.examCycleTimeRangeArr = [];
  625. this.examCycleWeekArr = [];
  626. }
  627. },
  628. getEndTimeStr() {
  629. return "23:59";
  630. },
  631. getNowTimeStr() {
  632. let now = new Date();
  633. let hour = now.getHours();
  634. if (hour < 10) {
  635. hour = "0" + hour;
  636. }
  637. let minute = now.getMinutes();
  638. if (minute < 10) {
  639. minute = "0" + minute;
  640. }
  641. return hour + ":" + minute;
  642. },
  643. removeExamCycleTimeRange(index) {
  644. if (this.examCycleTimeRangeArr.length == 1) {
  645. this.$notify({
  646. type: "warning",
  647. message: "不能删除最后一个分段",
  648. });
  649. return;
  650. }
  651. this.examCycleTimeRangeArr.splice(index, 1);
  652. this.$refs.form.validateField("examCycleTimeRangeArr");
  653. },
  654. addCycleTimeRange() {
  655. if (this.examCycleTimeRangeArr.length >= 12) {
  656. this.$notify({
  657. type: "warning",
  658. message: "时间分段不得超过12条",
  659. });
  660. return;
  661. }
  662. this.examCycleTimeRangeArr.push({
  663. timeRange: [this.getNowTimeStr(), this.getEndTimeStr()],
  664. });
  665. this.$refs.form.validateField("examCycleTimeRangeArr");
  666. },
  667. init() {
  668. if (this.examId != "add") {
  669. let url = EXAM_WORK_API + "/exam/" + this.examId;
  670. this.$httpWithMsg.get(url).then((response) => {
  671. let body = response.data;
  672. body.properties = this.form.properties;
  673. this.form = Object.assign(this.form, response.data);
  674. this.form.enable = this.form.enable ? "true" : "false";
  675. this.examDatetimeRange = [this.form.beginTime, this.form.endTime];
  676. console.log("getOnlineExam(); form: ", this.form);
  677. let url = EXAM_WORK_API + "/exam/allProperties/" + this.examId;
  678. this.$httpWithMsg.get(url).then((response) => {
  679. this.form.properties = Object.assign(
  680. this.form.properties,
  681. response.data
  682. );
  683. if (this.form.properties.EXAM_CYCLE_TIME_RANGE) {
  684. this.examCycleTimeRangeArr = JSON.parse(
  685. this.form.properties.EXAM_CYCLE_TIME_RANGE
  686. );
  687. }
  688. if (this.form.properties.EXAM_CYCLE_WEEK) {
  689. this.examCycleWeekArr = JSON.parse(
  690. this.form.properties.EXAM_CYCLE_WEEK
  691. );
  692. }
  693. this.show_ckeditor = true;
  694. });
  695. });
  696. } else {
  697. let now = moment().format("YYYY-MM-DD HH:mm:ss");
  698. this.examDatetimeRange = [now, now];
  699. this.show_ckeditor = true;
  700. }
  701. },
  702. compare: function (x, y) {
  703. if (x < y) {
  704. return -1;
  705. } else if (x > y) {
  706. return 1;
  707. } else {
  708. return 0;
  709. }
  710. },
  711. saveExam: function () {
  712. this.toActiveName = null;
  713. this.form.beginTime = this.examDatetimeRange[0];
  714. this.form.endTime = this.examDatetimeRange[1];
  715. this.form.properties.EXAM_CYCLE_TIME_RANGE = JSON.stringify(
  716. this.examCycleTimeRangeArr
  717. );
  718. this.examCycleWeekArr.sort(this.compare);
  719. this.form.properties.EXAM_CYCLE_WEEK = JSON.stringify(
  720. this.examCycleWeekArr
  721. );
  722. if (!this.checkCkeditorVals()) {
  723. return false;
  724. }
  725. let url = EXAM_WORK_API + "/exam";
  726. this.$refs.form.validate((valid) => {
  727. if (valid) {
  728. if (this.examId != "add") {
  729. this.$httpWithMsg.put(url, this.form).then((response) => {
  730. if (200 != response.status) {
  731. this.$notify({
  732. type: "error",
  733. message: response.body.desc,
  734. });
  735. return;
  736. }
  737. this.$notify({
  738. type: "success",
  739. message: "保存成功",
  740. });
  741. });
  742. } else {
  743. this.form.code = this.form.name;
  744. this.$httpWithMsg.post(url, this.form).then((response) => {
  745. console.log(response);
  746. this.$notify({
  747. type: "success",
  748. message: "新增成功",
  749. });
  750. this.examId = response.data.id;
  751. this.form.id = this.examId;
  752. this.$router.push({
  753. path: "/examwork/practiceExam/" + response.data.id,
  754. });
  755. });
  756. }
  757. } else {
  758. return false;
  759. }
  760. });
  761. },
  762. checkCkeditorVals() {
  763. if (
  764. this.form.properties.SHOW_UNDERTAKING == "true" &&
  765. !this.form.properties.UNDERTAKING
  766. ) {
  767. this.$notify({
  768. type: "warning",
  769. message: "请输入承诺书说明",
  770. });
  771. this.activeName = "tab3";
  772. return false;
  773. }
  774. return true;
  775. },
  776. back() {
  777. this.$router.push({ path: "/examwork/examInfo" });
  778. },
  779. },
  780. };
  781. </script>
  782. <style scoped>
  783. .input {
  784. width: 440px;
  785. }
  786. .input >>> .el-input__inner {
  787. -webkit-appearance: button;
  788. }
  789. </style>