EditFillLine.vue 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. <template>
  2. <el-dialog
  3. class="edit-fill-line 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="topicName" label="题目名称:">
  23. <el-input
  24. v-model.trim="modalForm.topicName"
  25. size=""
  26. placeholder="请输入题目名称"
  27. clearable
  28. ></el-input>
  29. </el-form-item>
  30. <el-form-item prop="startEnd" label="起止题号:">
  31. <el-input-number
  32. style="width:40px;"
  33. v-model="modalForm.startNumber"
  34. :min="0"
  35. :max="100"
  36. :step="1"
  37. step-strictly
  38. :controls="false"
  39. ></el-input-number>
  40. <span class="el-input-split"></span>
  41. <el-input-number
  42. style="width:40px;"
  43. v-model="modalForm.endNumber"
  44. :min="0"
  45. :max="100"
  46. :step="1"
  47. step-strictly
  48. :controls="false"
  49. ></el-input-number>
  50. </el-form-item>
  51. <el-form-item label="每行空数:">
  52. <el-input-number
  53. style="width:125px;"
  54. v-model="modalForm.questionNumberPerLine"
  55. :min="1"
  56. :max="10"
  57. :step="1"
  58. step-strictly
  59. :controls="false"
  60. ></el-input-number>
  61. <span class="el-input-tips">*指一行显示填空题数量</span>
  62. </el-form-item>
  63. <el-form-item label="每空行数:">
  64. <el-input-number
  65. style="width:125px;"
  66. v-model="modalForm.lineNumberPerQuestion"
  67. :min="1"
  68. :max="15"
  69. :step="1"
  70. step-strictly
  71. :controls="false"
  72. ></el-input-number>
  73. <span class="el-input-tips">*指每一题显示几行</span>
  74. </el-form-item>
  75. <el-form-item label="题号前缀:">
  76. <el-input
  77. style="width:125px;"
  78. v-model.trim="modalForm.numberPre"
  79. clearable
  80. ></el-input>
  81. </el-form-item>
  82. </el-form>
  83. <div slot="footer">
  84. <el-button type="primary" @click="submit">确认</el-button>
  85. <el-button @click="cancel" plain>取消</el-button>
  86. </div>
  87. </el-dialog>
  88. </template>
  89. <script>
  90. const initModalForm = {
  91. id: "",
  92. topicNo: null,
  93. topicName: "",
  94. startNumber: 1,
  95. endNumber: 2,
  96. questionsCount: 2,
  97. questionNumberPerLine: 1,
  98. lineNumberPerQuestion: 1,
  99. numberPre: ""
  100. };
  101. export default {
  102. name: "edit-fill-line",
  103. props: {
  104. instance: {
  105. type: Object,
  106. default() {
  107. return {};
  108. }
  109. },
  110. topicNos: {
  111. type: Array,
  112. default() {
  113. return [];
  114. }
  115. }
  116. },
  117. data() {
  118. const numberValidater = (rule, value, callback) => {
  119. if (this.modalForm.startNumber < this.modalForm.endNumber) {
  120. callback(new Error("开始序号不能小于结束序号"));
  121. } else {
  122. callback();
  123. }
  124. };
  125. const topicNoValidater = (rule, value, callback) => {
  126. if (this.instance.topicNo === 0) {
  127. // 新增题目
  128. if (this.topicNos.includes(value)) {
  129. callback(new Error("当前大题题号已经存在,请重新输入"));
  130. } else {
  131. callback();
  132. }
  133. } else {
  134. // 修改题目
  135. if (value !== this.instance.topicNo && this.topicNos.includes(value)) {
  136. callback(new Error("当前大题题号已经存在,请重新输入"));
  137. } else {
  138. callback();
  139. }
  140. }
  141. };
  142. return {
  143. dialogIsShow: false,
  144. modalForm: { ...initModalForm },
  145. rules: {
  146. topicNo: [
  147. {
  148. validate: topicNoValidater,
  149. trigger: "change"
  150. }
  151. ],
  152. startEnd: [
  153. {
  154. validate: numberValidater,
  155. trigger: "change"
  156. }
  157. ]
  158. }
  159. };
  160. },
  161. methods: {
  162. initData(val) {
  163. this.modalForm = { ...val };
  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>