offlineExam.vue 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339
  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="examId != 'add'"
  58. maxlength="20"
  59. ></el-input>
  60. </el-form-item>
  61. </el-row>
  62. <el-row>
  63. <el-form-item
  64. label="考试名称"
  65. placeholder="请输入考试名称"
  66. prop="name"
  67. :label-width="style.label_width_tab1"
  68. >
  69. <el-input
  70. maxlength="20"
  71. v-model="form.name"
  72. class="input"
  73. ></el-input>
  74. </el-form-item>
  75. </el-row>
  76. <el-row>
  77. <el-form-item
  78. label="考试类型"
  79. :label-width="style.label_width_tab1"
  80. >
  81. <el-select
  82. class="input"
  83. :disabled="true"
  84. v-model="form.examType"
  85. placeholder="请选择"
  86. >
  87. <el-option
  88. v-for="item in examTypeList"
  89. :key="item.value"
  90. :label="item.label"
  91. :value="item.value"
  92. >
  93. </el-option>
  94. </el-select>
  95. </el-form-item>
  96. </el-row>
  97. <el-row>
  98. <el-form-item
  99. label="状态"
  100. :label-width="style.label_width_tab1"
  101. >
  102. <el-radio-group v-model="form.enable" class="input">
  103. <el-radio label="true">启用</el-radio>
  104. <el-radio label="false">禁用</el-radio>
  105. </el-radio-group>
  106. </el-form-item>
  107. </el-row>
  108. <el-row>
  109. <el-form-item
  110. label="考试时间"
  111. prop="examDatetimeRange"
  112. :label-width="style.label_width_tab1"
  113. >
  114. <el-date-picker
  115. class="input"
  116. v-model="examDatetimeRange"
  117. type="datetimerange"
  118. range-separator="至"
  119. start-placeholder="开始日期"
  120. end-placeholder="结束日期"
  121. value-format="yyyy-MM-dd HH:mm:ss"
  122. :clearable="false"
  123. >
  124. </el-date-picker>
  125. </el-form-item>
  126. </el-row>
  127. <el-row>
  128. <el-form-item
  129. label="上传附件"
  130. :label-width="style.label_width_tab1"
  131. >
  132. <el-radio-group
  133. v-model="form.properties.CAN_UPLOAD_ATTACHMENT"
  134. class="input"
  135. >
  136. <el-radio label="true">允许</el-radio>
  137. <el-radio label="false">不允许</el-radio>
  138. </el-radio-group>
  139. </el-form-item>
  140. </el-row>
  141. <el-row>
  142. <el-form-item
  143. label="附件类型"
  144. :label-width="style.label_width_tab1"
  145. >
  146. <el-checkbox-group v-model="uploadFileType" class="input">
  147. <el-checkbox label="ZIP" key="ZIP"></el-checkbox>
  148. <el-checkbox label="PDF" key="PDF"></el-checkbox>
  149. </el-checkbox-group>
  150. </el-form-item>
  151. </el-row>
  152. </el-tab-pane>
  153. </el-tabs>
  154. </el-form>
  155. </div>
  156. </div>
  157. </section>
  158. </div>
  159. </template>
  160. <script>
  161. import { EXAM_TYPE, EXAM_WORK_API } from "@/constants/constants.js";
  162. import moment from "moment";
  163. import LinkTitlesCustom from "@/components/LinkTitlesCustom.vue";
  164. let _this = null;
  165. let validateCode = (rule, value, callback) => {
  166. let code = _this.form.code;
  167. if (code == "") {
  168. callback(new Error("请输入考试编码"));
  169. if (!_this.toActiveName) {
  170. _this.toActiveName = "tab1";
  171. _this.activeName = "tab1";
  172. }
  173. } else {
  174. callback();
  175. }
  176. };
  177. let validateName = (rule, value, callback) => {
  178. let name = _this.form.name;
  179. if (name == "") {
  180. callback(new Error("请输入考试名称"));
  181. _this.activeName = "tab1";
  182. } else {
  183. callback();
  184. }
  185. };
  186. let validateExamDatetimeRange = (rule, value, callback) => {
  187. let examDatetimeRange = _this.examDatetimeRange;
  188. if (!examDatetimeRange) {
  189. callback(new Error("请输入考试时间"));
  190. _this.activeName = "tab1";
  191. } else {
  192. callback();
  193. }
  194. };
  195. export default {
  196. components: { LinkTitlesCustom },
  197. data() {
  198. return {
  199. style: {
  200. label_width_tab1: "80px"
  201. },
  202. activeName: "tab1",
  203. examDatetimeRange: [],
  204. uploadFileType: [],
  205. show_ckeditor: false,
  206. form: {
  207. started: false,
  208. name: "",
  209. examType: "OFFLINE",
  210. examTimes: 1,
  211. beginTime: null,
  212. endTime: null,
  213. duration: 120,
  214. enable: "true",
  215. properties: {
  216. CAN_UPLOAD_ATTACHMENT: "true",
  217. OFFLINE_UPLOAD_FILE_TYPE: ""
  218. }
  219. },
  220. examTypeList: EXAM_TYPE,
  221. examId: "",
  222. rules: {
  223. code: [{ required: true, validator: validateCode, trigger: "blur" }],
  224. name: [{ required: true, validator: validateName, trigger: "blur" }],
  225. examDatetimeRange: [
  226. {
  227. required: true,
  228. validator: validateExamDatetimeRange,
  229. trigger: "blur"
  230. }
  231. ]
  232. }
  233. };
  234. },
  235. methods: {
  236. init() {
  237. if (this.examId != "add") {
  238. let url = EXAM_WORK_API + "/exam/" + this.examId;
  239. this.$httpWithMsg.get(url).then(response => {
  240. let body = response.data;
  241. body.properties = this.form.properties;
  242. this.form = Object.assign(this.form, response.data);
  243. this.form.enable = this.form.enable ? "true" : "false";
  244. this.examDatetimeRange = [this.form.beginTime, this.form.endTime];
  245. console.log("getOnlineExam(); form: ", this.form);
  246. let url = EXAM_WORK_API + "/exam/allProperties/" + this.examId;
  247. this.$httpWithMsg.get(url).then(response => {
  248. this.form.properties = Object.assign(
  249. this.form.properties,
  250. response.data
  251. );
  252. if (this.form.properties.OFFLINE_UPLOAD_FILE_TYPE) {
  253. this.uploadFileType = JSON.parse(
  254. this.form.properties.OFFLINE_UPLOAD_FILE_TYPE
  255. );
  256. }
  257. console.log(this.uploadFileType);
  258. this.show_ckeditor = true;
  259. });
  260. });
  261. } else {
  262. let now = moment().format("YYYY-MM-DD HH:mm:ss");
  263. this.examDatetimeRange = [now, now];
  264. this.uploadFileType = [];
  265. this.show_ckeditor = true;
  266. }
  267. },
  268. saveExam: function() {
  269. this.form.beginTime = this.examDatetimeRange[0];
  270. this.form.endTime = this.examDatetimeRange[1];
  271. this.form.properties.OFFLINE_UPLOAD_FILE_TYPE = JSON.stringify(
  272. this.uploadFileType
  273. );
  274. console.log(this.form);
  275. let url = EXAM_WORK_API + "/exam";
  276. this.$refs.form.validate(valid => {
  277. if (valid) {
  278. if (this.examId != "add") {
  279. this.$httpWithMsg.put(url, this.form).then(response => {
  280. if (200 != response.status) {
  281. this.$notify({
  282. type: "error",
  283. message: response.body.desc
  284. });
  285. return;
  286. }
  287. this.$notify({
  288. type: "success",
  289. message: "保存成功"
  290. });
  291. });
  292. } else {
  293. this.form.code = this.form.name;
  294. this.$httpWithMsg.post(url, this.form).then(response => {
  295. console.log(response);
  296. this.$notify({
  297. type: "success",
  298. message: "新增成功"
  299. });
  300. this.examId = response.data.id;
  301. this.form.id = this.examId;
  302. this.$router.push({
  303. path: "/examwork/offlineExam/" + response.data.id
  304. });
  305. });
  306. }
  307. } else {
  308. return false;
  309. }
  310. });
  311. },
  312. back() {
  313. this.$router.push({ path: "/examwork/examInfo" });
  314. }
  315. },
  316. created() {
  317. _this = this;
  318. this.examId = this.$route.params.id;
  319. this.init();
  320. }
  321. };
  322. </script>
  323. <style scoped>
  324. .input {
  325. width: 440px;
  326. }
  327. .input >>> .el-input__inner {
  328. -webkit-appearance: button;
  329. }
  330. </style>