EditExplain.vue 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. <template>
  2. <el-dialog
  3. class="edit-explain edit-dialog"
  4. :visible.sync="dialogIsShow"
  5. title="解答题"
  6. top="10vh"
  7. width="640px"
  8. :modal="false"
  9. :close-on-click-modal="false"
  10. :close-on-press-escape="false"
  11. append-to-body
  12. @open="opened"
  13. @close="closed"
  14. >
  15. <el-form
  16. ref="modalFormComp"
  17. :model="modalForm"
  18. :rules="rules"
  19. :key="modalForm.id"
  20. label-width="100px"
  21. >
  22. <el-form-item prop="topicNo" label="大题题号:">
  23. <el-input-number
  24. style="width:125px;"
  25. v-model.number="modalForm.topicNo"
  26. :min="1"
  27. :max="20"
  28. :step="1"
  29. step-strictly
  30. :controls="false"
  31. ></el-input-number>
  32. </el-form-item>
  33. <el-form-item prop="topicName" label="题目名称:">
  34. <el-input
  35. v-model.trim="modalForm.topicName"
  36. size=""
  37. placeholder="请输入题目名称"
  38. clearable
  39. ></el-input>
  40. </el-form-item>
  41. <el-form-item prop="startEnd" label="起止题号:">
  42. <el-input-number
  43. style="width:40px;"
  44. v-model="modalForm.startNumber"
  45. :min="0"
  46. :max="100"
  47. :step="1"
  48. step-strictly
  49. :controls="false"
  50. ></el-input-number>
  51. <span class="el-input-split"></span>
  52. <el-input-number
  53. style="width:40px;"
  54. v-model="modalForm.endNumber"
  55. :min="0"
  56. :max="100"
  57. :step="1"
  58. step-strictly
  59. :controls="false"
  60. ></el-input-number>
  61. </el-form-item>
  62. </el-form>
  63. <div slot="footer">
  64. <el-button type="primary" @click="submit">确认</el-button>
  65. <el-button @click="cancel" plain>取消</el-button>
  66. </div>
  67. </el-dialog>
  68. </template>
  69. <script>
  70. const initModalForm = {
  71. id: "",
  72. topicNo: null,
  73. topicName: "",
  74. startNumber: 1,
  75. endNumber: 4,
  76. questionsCount: 4
  77. };
  78. export default {
  79. name: "edit-explain",
  80. props: {
  81. instance: {
  82. type: Object,
  83. default() {
  84. return {};
  85. }
  86. },
  87. topicNos: {
  88. type: Array,
  89. default() {
  90. return [];
  91. }
  92. }
  93. },
  94. data() {
  95. const numberRangeValidater = (rule, value, callback) => {
  96. if (!this.modalForm.startNumber || !this.modalForm.endNumber) {
  97. return callback(new Error("请输入起止题号"));
  98. }
  99. if (this.modalForm.startNumber > this.modalForm.endNumber) {
  100. callback(new Error("开始题号不能大于结束题号"));
  101. } else {
  102. callback();
  103. }
  104. };
  105. const topicNoValidater = (rule, value, callback) => {
  106. if (!this.instance.topicNo) {
  107. // 新增题目
  108. if (this.topicNos.includes(value)) {
  109. callback(new Error("当前大题题号已经存在,请重新输入"));
  110. } else {
  111. callback();
  112. }
  113. } else {
  114. // 修改题目
  115. if (value !== this.instance.topicNo && this.topicNos.includes(value)) {
  116. callback(new Error("当前大题题号已经存在,请重新输入"));
  117. } else {
  118. callback();
  119. }
  120. }
  121. };
  122. return {
  123. dialogIsShow: false,
  124. modalForm: { ...initModalForm },
  125. rules: {
  126. topicName: [
  127. {
  128. required: true,
  129. message: "请输入题目名称",
  130. trigger: "change"
  131. }
  132. ],
  133. topicNo: [
  134. {
  135. required: true,
  136. message: "请输入大题题号",
  137. trigger: "change"
  138. },
  139. {
  140. type: "number",
  141. validator: topicNoValidater,
  142. trigger: "change"
  143. }
  144. ],
  145. endNumber: [
  146. {
  147. required: true,
  148. message: "请输入起止题号",
  149. trigger: "change"
  150. },
  151. {
  152. type: "number",
  153. validator: numberRangeValidater,
  154. trigger: "change"
  155. }
  156. ]
  157. }
  158. };
  159. },
  160. methods: {
  161. initData(val) {
  162. const valInfo = val.parent || val;
  163. this.modalForm = { ...valInfo };
  164. this.modalForm.endNumber =
  165. this.modalForm.startNumber + this.modalForm.questionsCount - 1;
  166. },
  167. opened() {
  168. this.initData(this.instance);
  169. },
  170. closed() {
  171. this.$emit("closed");
  172. },
  173. cancel() {
  174. this.dialogIsShow = false;
  175. },
  176. open() {
  177. this.dialogIsShow = true;
  178. },
  179. async submit() {
  180. const valid = await this.$refs.modalFormComp.validate().catch(() => {});
  181. if (!valid) return;
  182. this.modalForm.questionsCount =
  183. this.modalForm.endNumber - this.modalForm.startNumber + 1;
  184. this.$emit("modified", this.modalForm);
  185. this.cancel();
  186. }
  187. }
  188. };
  189. </script>