offlineExam.vue 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404
  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. 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. @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 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. placeholder="请输入考试名称"
  81. prop="name"
  82. :label-width="style.label_width_tab1"
  83. >
  84. <el-input
  85. maxlength="20"
  86. v-model="form.name"
  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. class="input"
  98. :disabled="true"
  99. v-model="form.examType"
  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. class="input"
  131. v-model="examDatetimeRange"
  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-row>
  143. <el-form-item
  144. label="开启特殊设置"
  145. :label-width="style.label_width_tab1"
  146. >
  147. <el-switch
  148. v-model="form.specialSettingsEnabled"
  149. on-text="是"
  150. off-text="否"
  151. ></el-switch>
  152. </el-form-item>
  153. </el-row>
  154. <el-row>
  155. <el-form-item
  156. label="特殊设置方式"
  157. :label-width="style.label_width_tab1"
  158. v-show="form.specialSettingsEnabled"
  159. >
  160. <el-radio-group
  161. v-model="form.specialSettingsType"
  162. class="input"
  163. >
  164. <el-radio label="ORG_BASED">机构特殊设置</el-radio>
  165. <el-radio label="STUDENT_BASED">学生特殊设置</el-radio>
  166. </el-radio-group>
  167. </el-form-item>
  168. </el-row>
  169. <el-row>
  170. <el-form-item
  171. label="无特殊设置时禁止考试"
  172. :label-width="style.label_width_tab1"
  173. v-show="form.specialSettingsEnabled"
  174. >
  175. <el-switch
  176. v-model="form.properties.LIMITED_IF_NO_SPECIAL_SETTINGS"
  177. on-text="是"
  178. off-text="否"
  179. ></el-switch>
  180. </el-form-item>
  181. </el-row>
  182. <el-row>
  183. <el-form-item
  184. label="上传附件"
  185. :label-width="style.label_width_tab1"
  186. >
  187. <el-radio-group
  188. v-model="form.properties.CAN_UPLOAD_ATTACHMENT"
  189. class="input"
  190. >
  191. <el-radio label="true">允许</el-radio>
  192. <el-radio label="false">不允许</el-radio>
  193. </el-radio-group>
  194. </el-form-item>
  195. </el-row>
  196. <el-row>
  197. <el-form-item
  198. label="附件类型"
  199. :label-width="style.label_width_tab1"
  200. >
  201. <el-checkbox-group v-model="uploadFileType" class="input">
  202. <el-checkbox label="ZIP" key="ZIP"></el-checkbox>
  203. <el-checkbox label="PDF" key="PDF"></el-checkbox>
  204. </el-checkbox-group>
  205. </el-form-item>
  206. </el-row>
  207. </el-tab-pane>
  208. </el-tabs>
  209. </el-form>
  210. </div>
  211. </div>
  212. </section>
  213. </div>
  214. </template>
  215. <script>
  216. import { EXAM_TYPE, EXAM_WORK_API } from "@/constants/constants.js";
  217. import moment from "moment";
  218. import LinkTitlesCustom from "@/components/LinkTitlesCustom.vue";
  219. let _this = null;
  220. let validateCode = (rule, value, callback) => {
  221. if (_this.examId == "add") {
  222. _this.form.code = _this.form.name;
  223. }
  224. let code = _this.form.code;
  225. if (code == "") {
  226. callback(new Error("请输入考试编码"));
  227. if (!_this.toActiveName) {
  228. _this.toActiveName = "tab1";
  229. _this.activeName = "tab1";
  230. }
  231. } else {
  232. callback();
  233. }
  234. };
  235. let validateName = (rule, value, callback) => {
  236. let name = _this.form.name;
  237. if (name == "") {
  238. callback(new Error("请输入考试名称"));
  239. _this.activeName = "tab1";
  240. } else {
  241. callback();
  242. }
  243. };
  244. let validateExamDatetimeRange = (rule, value, callback) => {
  245. let examDatetimeRange = _this.examDatetimeRange;
  246. if (!examDatetimeRange) {
  247. callback(new Error("请输入考试时间"));
  248. _this.activeName = "tab1";
  249. } else {
  250. callback();
  251. }
  252. };
  253. export default {
  254. components: { LinkTitlesCustom },
  255. data() {
  256. return {
  257. style: {
  258. label_width_tab1: "160px"
  259. },
  260. activeName: "tab1",
  261. examDatetimeRange: [],
  262. uploadFileType: [],
  263. show_ckeditor: false,
  264. form: {
  265. started: false,
  266. name: "",
  267. examType: "OFFLINE",
  268. examTimes: 1,
  269. beginTime: null,
  270. endTime: null,
  271. duration: 120,
  272. enable: "true",
  273. specialSettingsEnabled: false,
  274. specialSettingsType: "",
  275. properties: {
  276. CAN_UPLOAD_ATTACHMENT: "true",
  277. OFFLINE_UPLOAD_FILE_TYPE: "",
  278. LIMITED_IF_NO_SPECIAL_SETTINGS: "false"
  279. }
  280. },
  281. examTypeList: EXAM_TYPE,
  282. examId: "",
  283. rules: {
  284. code: [{ required: true, validator: validateCode, trigger: "blur" }],
  285. name: [{ required: true, validator: validateName, trigger: "blur" }],
  286. examDatetimeRange: [
  287. {
  288. required: true,
  289. validator: validateExamDatetimeRange,
  290. trigger: "blur"
  291. }
  292. ]
  293. }
  294. };
  295. },
  296. methods: {
  297. init() {
  298. if (this.examId != "add") {
  299. let url = EXAM_WORK_API + "/exam/" + this.examId;
  300. this.$httpWithMsg.get(url).then(response => {
  301. let body = response.data;
  302. body.properties = this.form.properties;
  303. this.form = Object.assign(this.form, response.data);
  304. this.form.enable = this.form.enable ? "true" : "false";
  305. this.examDatetimeRange = [this.form.beginTime, this.form.endTime];
  306. console.log("getOnlineExam(); form: ", this.form);
  307. let url = EXAM_WORK_API + "/exam/allProperties/" + this.examId;
  308. this.$httpWithMsg.get(url).then(response => {
  309. this.form.properties = Object.assign(
  310. this.form.properties,
  311. response.data
  312. );
  313. if (this.form.properties.OFFLINE_UPLOAD_FILE_TYPE) {
  314. this.uploadFileType = JSON.parse(
  315. this.form.properties.OFFLINE_UPLOAD_FILE_TYPE
  316. );
  317. }
  318. this.form.properties.LIMITED_IF_NO_SPECIAL_SETTINGS =
  319. this.form.properties.LIMITED_IF_NO_SPECIAL_SETTINGS === "true";
  320. console.log(this.uploadFileType);
  321. this.show_ckeditor = true;
  322. });
  323. });
  324. } else {
  325. let now = moment().format("YYYY-MM-DD HH:mm:ss");
  326. this.examDatetimeRange = [now, now];
  327. this.uploadFileType = [];
  328. this.show_ckeditor = true;
  329. }
  330. },
  331. saveExam: function() {
  332. this.form.beginTime = this.examDatetimeRange[0];
  333. this.form.endTime = this.examDatetimeRange[1];
  334. this.form.properties.OFFLINE_UPLOAD_FILE_TYPE = JSON.stringify(
  335. this.uploadFileType
  336. );
  337. console.log(this.form);
  338. let url = EXAM_WORK_API + "/exam";
  339. this.$refs.form.validate(valid => {
  340. if (valid) {
  341. if (this.examId != "add") {
  342. this.$httpWithMsg.put(url, this.form).then(response => {
  343. if (200 != response.status) {
  344. this.$notify({
  345. type: "error",
  346. message: response.body.desc
  347. });
  348. return;
  349. }
  350. this.$notify({
  351. type: "success",
  352. message: "保存成功"
  353. });
  354. });
  355. } else {
  356. this.form.code = this.form.name;
  357. this.$httpWithMsg.post(url, this.form).then(response => {
  358. console.log(response);
  359. this.$notify({
  360. type: "success",
  361. message: "新增成功"
  362. });
  363. this.examId = response.data.id;
  364. this.form.id = this.examId;
  365. this.$router.push({
  366. path: "/examwork/offlineExam/" + response.data.id
  367. });
  368. });
  369. }
  370. } else {
  371. return false;
  372. }
  373. });
  374. },
  375. back() {
  376. this.$router.push({ path: "/examwork/examInfo" });
  377. }
  378. },
  379. created() {
  380. _this = this;
  381. this.examId = this.$route.params.id;
  382. this.init();
  383. }
  384. };
  385. </script>
  386. <style scoped>
  387. .input {
  388. width: 440px;
  389. }
  390. .input >>> .el-input__inner {
  391. -webkit-appearance: button;
  392. }
  393. </style>