ModifyExam.vue 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. <template>
  2. <el-dialog
  3. class="modify-exam"
  4. :visible.sync="modalIsShow"
  5. :title="title"
  6. top="10vh"
  7. width="650px"
  8. :close-on-click-modal="false"
  9. :close-on-press-escape="false"
  10. append-to-body
  11. @open="visibleChange"
  12. >
  13. <el-form
  14. ref="modalFormComp"
  15. :model="modalForm"
  16. :rules="rules"
  17. :key="modalForm.id"
  18. label-width="130px"
  19. >
  20. <el-form-item prop="name" label="考试名称:">
  21. <el-input
  22. v-model.trim="modalForm.name"
  23. placeholder="请输入考试名称"
  24. clearable
  25. :disabled="isEdit"
  26. ></el-input>
  27. <p class="tips-info">示例:期末考试/期中考试/模拟考试</p>
  28. </el-form-item>
  29. <el-form-item prop="semesterId" label="学年学期:">
  30. <semester-select
  31. v-model="modalForm.semesterId"
  32. placeholder="学年学期"
  33. clearable
  34. style="width: 100%"
  35. ></semester-select>
  36. </el-form-item>
  37. <el-form-item prop="category" label="考试类型:">
  38. <el-radio-group v-model="modalForm.category">
  39. <el-radio v-for="(val, key) in EXAM_TYPE" :key="key" :label="key">{{
  40. val
  41. }}</el-radio>
  42. </el-radio-group>
  43. <div class="tips-info">
  44. <p>说明:</p>
  45. <p>线下考试指纸笔传统考试,需要印刷试卷/题卡</p>
  46. <p>线上考试指无纸化考试,如网考/机考</p>
  47. </div>
  48. </el-form-item>
  49. <el-form-item
  50. v-if="modalForm.category === 'OFFLINE'"
  51. prop="examModel"
  52. label=""
  53. >
  54. <p class="tips-info mb-2">请选择符合此考试的业务模式</p>
  55. <el-radio-group v-model="modalForm.examModel">
  56. <el-radio
  57. v-for="(val, key) in EXAM_MODE_TYPE"
  58. :key="key"
  59. :label="key"
  60. class="el-radio-v"
  61. >{{ val }}</el-radio
  62. >
  63. </el-radio-group>
  64. </el-form-item>
  65. </el-form>
  66. <div slot="footer">
  67. <el-button type="primary" :disabled="isSubmit" @click="submit"
  68. >确认</el-button
  69. >
  70. <el-button @click="cancel">取消</el-button>
  71. </div>
  72. </el-dialog>
  73. </template>
  74. <script>
  75. import { updateExam } from "../api";
  76. import { EXAM_TYPE, OPEN_STATUS, EXAM_MODE_TYPE } from "@/constants/enumerate";
  77. const initModalForm = {
  78. id: null,
  79. name: "",
  80. semesterId: "",
  81. category: "OFFLINE",
  82. examModel: "MODEL1",
  83. };
  84. export default {
  85. name: "modify-exam",
  86. props: {
  87. instance: {
  88. type: Object,
  89. default() {
  90. return {};
  91. },
  92. },
  93. },
  94. computed: {
  95. isEdit() {
  96. return !!this.instance.id;
  97. },
  98. title() {
  99. return (this.isEdit ? "编辑" : "新增") + "考试";
  100. },
  101. },
  102. data() {
  103. return {
  104. modalIsShow: false,
  105. isSubmit: false,
  106. modalForm: { ...initModalForm },
  107. EXAM_TYPE,
  108. OPEN_STATUS,
  109. EXAM_MODE_TYPE,
  110. rules: {
  111. name: [
  112. {
  113. required: true,
  114. message: "请输入考试名称",
  115. trigger: "change",
  116. },
  117. {
  118. message: "考试名称不能超过100个字符",
  119. max: 100,
  120. trigger: "change",
  121. },
  122. ],
  123. semesterId: [
  124. {
  125. required: true,
  126. message: "请选择学年学期",
  127. trigger: "change",
  128. },
  129. ],
  130. category: [
  131. {
  132. required: true,
  133. message: "请选择考试类型",
  134. trigger: "change",
  135. },
  136. ],
  137. examModel: [
  138. {
  139. required: true,
  140. message: "请选择考试模式",
  141. trigger: "change",
  142. },
  143. ],
  144. },
  145. };
  146. },
  147. methods: {
  148. initData(val) {
  149. if (val.id) {
  150. this.modalForm = this.$objAssign(initModalForm, val);
  151. } else {
  152. this.modalForm = { ...initModalForm };
  153. }
  154. },
  155. visibleChange() {
  156. this.initData(this.instance);
  157. },
  158. cancel() {
  159. this.modalIsShow = false;
  160. },
  161. open() {
  162. this.modalIsShow = true;
  163. },
  164. async submit() {
  165. const valid = await this.$refs.modalFormComp.validate().catch(() => {});
  166. if (!valid) return;
  167. if (this.isSubmit) return;
  168. this.isSubmit = true;
  169. let datas = { ...this.modalForm };
  170. const data = await updateExam(datas).catch(() => {
  171. this.isSubmit = false;
  172. });
  173. if (!data) return;
  174. this.isSubmit = false;
  175. this.$message.success(this.title + "成功!");
  176. this.$emit("modified", { isEdit: this.isEdit, exam: data });
  177. this.cancel();
  178. },
  179. },
  180. };
  181. </script>