offlineExam.vue 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282
  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 type="primary" size="small" @click="back"
  23. >返 回</el-button
  24. >
  25. </div>
  26. <el-tabs type="border-card" v-model="activeName">
  27. <!-- 基础信息 -->
  28. <el-tab-pane label="基础信息" name="tab1">
  29. <el-row>
  30. <el-form-item
  31. label="考试名称"
  32. placeholder="请输入考试名称"
  33. prop="name"
  34. :label-width="style.label_width_tab1"
  35. >
  36. <el-input v-model="form.name" class="input"></el-input>
  37. </el-form-item>
  38. </el-row>
  39. <el-row>
  40. <el-form-item
  41. label="考试类型"
  42. :label-width="style.label_width_tab1"
  43. >
  44. <el-select
  45. class="input"
  46. :disabled="true"
  47. v-model="form.examType"
  48. placeholder="请选择"
  49. >
  50. <el-option
  51. v-for="item in examTypeList"
  52. :key="item.value"
  53. :label="item.label"
  54. :value="item.value"
  55. >
  56. </el-option>
  57. </el-select>
  58. </el-form-item>
  59. </el-row>
  60. <el-row>
  61. <el-form-item
  62. label="是否开启"
  63. :label-width="style.label_width_tab1"
  64. >
  65. <el-radio-group v-model="form.enable" class="input">
  66. <el-radio label="true">开启</el-radio>
  67. <el-radio label="false">关闭</el-radio>
  68. </el-radio-group>
  69. </el-form-item>
  70. </el-row>
  71. <el-row>
  72. <el-form-item
  73. label="考试时间"
  74. prop="examDatetimeRange"
  75. :label-width="style.label_width_tab1"
  76. >
  77. <el-date-picker
  78. class="input"
  79. v-model="examDatetimeRange"
  80. type="datetimerange"
  81. range-separator="至"
  82. start-placeholder="开始日期"
  83. end-placeholder="结束日期"
  84. value-format="yyyy-MM-dd HH:mm:ss"
  85. :clearable="false"
  86. >
  87. </el-date-picker>
  88. </el-form-item>
  89. </el-row>
  90. <el-row>
  91. <el-form-item
  92. label="上传附件"
  93. :label-width="style.label_width_tab1"
  94. >
  95. <el-radio-group
  96. v-model="form.properties.CAN_UPLOAD_ATTACHMENT"
  97. class="input"
  98. >
  99. <el-radio label="true">允许</el-radio>
  100. <el-radio label="false">不允许</el-radio>
  101. </el-radio-group>
  102. </el-form-item>
  103. </el-row>
  104. <el-row>
  105. <el-form-item
  106. label="附件类型"
  107. :label-width="style.label_width_tab1"
  108. >
  109. <el-checkbox-group v-model="uploadFileType" class="input">
  110. <el-checkbox label="ZIP" key="ZIP"></el-checkbox>
  111. <el-checkbox label="PDF" key="PDF"></el-checkbox>
  112. </el-checkbox-group>
  113. </el-form-item>
  114. </el-row>
  115. </el-tab-pane>
  116. </el-tabs>
  117. </el-form>
  118. </div>
  119. </div>
  120. </section>
  121. </div>
  122. </template>
  123. <script>
  124. import { EXAM_TYPE, EXAM_WORK_API } from "@/constants/constants.js";
  125. import moment from "moment";
  126. import LinkTitlesCustom from "@/components/LinkTitlesCustom.vue";
  127. let _this = null;
  128. let validateName = (rule, value, callback) => {
  129. let name = _this.form.name;
  130. if (name == "") {
  131. callback(new Error("请输入考试名称"));
  132. _this.activeName = "tab1";
  133. } else {
  134. callback();
  135. }
  136. };
  137. let validateExamDatetimeRange = (rule, value, callback) => {
  138. let examDatetimeRange = _this.examDatetimeRange;
  139. if (!examDatetimeRange) {
  140. callback(new Error("请输入考试时间"));
  141. _this.activeName = "tab1";
  142. } else {
  143. callback();
  144. }
  145. };
  146. export default {
  147. components: { LinkTitlesCustom },
  148. data() {
  149. return {
  150. style: {
  151. label_width_tab1: "80px"
  152. },
  153. activeName: "tab1",
  154. examDatetimeRange: [],
  155. uploadFileType: [],
  156. show_ckeditor: false,
  157. form: {
  158. started: false,
  159. name: "",
  160. examType: "OFFLINE",
  161. examTimes: 1,
  162. beginTime: null,
  163. endTime: null,
  164. duration: 120,
  165. enable: "true",
  166. properties: {
  167. CAN_UPLOAD_ATTACHMENT: "true",
  168. OFFLINE_UPLOAD_FILE_TYPE: ""
  169. }
  170. },
  171. examTypeList: EXAM_TYPE,
  172. examId: "",
  173. rules: {
  174. name: [{ required: true, validator: validateName, trigger: "blur" }],
  175. examDatetimeRange: [
  176. {
  177. required: true,
  178. validator: validateExamDatetimeRange,
  179. trigger: "blur"
  180. }
  181. ]
  182. }
  183. };
  184. },
  185. methods: {
  186. init() {
  187. if (this.examId != "add") {
  188. let url = EXAM_WORK_API + "/exam/" + this.examId;
  189. this.$http.get(url).then(response => {
  190. let body = response.data;
  191. body.properties = this.form.properties;
  192. this.form = Object.assign(this.form, response.data);
  193. this.form.enable = this.form.enable ? "true" : "false";
  194. this.examDatetimeRange = [this.form.beginTime, this.form.endTime];
  195. console.log("getOnlineExam(); form: ", this.form);
  196. let url = EXAM_WORK_API + "/exam/allProperties/" + this.examId;
  197. this.$http.get(url).then(response => {
  198. this.form.properties = Object.assign(
  199. this.form.properties,
  200. response.data
  201. );
  202. if (this.form.properties.OFFLINE_UPLOAD_FILE_TYPE) {
  203. this.uploadFileType = JSON.parse(
  204. this.form.properties.OFFLINE_UPLOAD_FILE_TYPE
  205. );
  206. }
  207. console.log(this.uploadFileType);
  208. this.show_ckeditor = true;
  209. });
  210. });
  211. } else {
  212. let now = moment().format("YYYY-MM-DD HH:mm:ss");
  213. this.examDatetimeRange = [now, now];
  214. this.uploadFileType = [];
  215. this.show_ckeditor = true;
  216. }
  217. },
  218. saveExam: function() {
  219. this.form.beginTime = this.examDatetimeRange[0];
  220. this.form.endTime = this.examDatetimeRange[1];
  221. this.form.properties.OFFLINE_UPLOAD_FILE_TYPE = JSON.stringify(
  222. this.uploadFileType
  223. );
  224. console.log(this.form);
  225. let url = EXAM_WORK_API + "/exam";
  226. this.$refs.form.validate(valid => {
  227. if (valid) {
  228. if (this.examId != "add") {
  229. this.$http.put(url, this.form).then(response => {
  230. if (200 != response.status) {
  231. this.$notify({
  232. type: "error",
  233. message: response.body.desc
  234. });
  235. return;
  236. }
  237. this.$notify({
  238. type: "success",
  239. message: "保存成功"
  240. });
  241. });
  242. } else {
  243. this.$http.post(url, this.form).then(response => {
  244. console.log(response);
  245. this.$notify({
  246. type: "success",
  247. message: "新增成功"
  248. });
  249. this.$router.push({
  250. path: "/examwork/offlineExam/" + response.data.id
  251. });
  252. });
  253. }
  254. } else {
  255. return false;
  256. }
  257. });
  258. },
  259. back() {
  260. this.$router.push({ path: "/examwork/examInfo" });
  261. }
  262. },
  263. created() {
  264. _this = this;
  265. this.examId = this.$route.params.id;
  266. this.init();
  267. }
  268. };
  269. </script>
  270. <style scoped>
  271. .input {
  272. width: 440px;
  273. }
  274. </style>