MatchQuestion.vue 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. <template>
  2. <div class="match-question">
  3. <div
  4. :class="['ep-question-content', { 'is-active': isActive }]"
  5. @click="activeQuestion"
  6. >
  7. <div class="ep-question-title">
  8. <span class="ep-question-title-number">{{ question.number }}.</span>
  9. <rich-text :text-json="question.body"></rich-text>
  10. </div>
  11. <question-info-view
  12. v-if="!isActive"
  13. :question="getData()"
  14. ></question-info-view>
  15. </div>
  16. <div v-if="isActive" class="ep-question-props">
  17. <el-form
  18. ref="modalFormComp"
  19. :model="modalForm"
  20. :rules="rules"
  21. label-width="72px"
  22. >
  23. <el-form-item prop="quesAnswer" label="答案">
  24. <el-radio-group v-model="quesAnswer" @change="answerChange">
  25. <el-radio-button
  26. v-for="option in parentQuestion.options"
  27. :key="option.number"
  28. :label="option.number"
  29. >
  30. {{ (option.number - 1) | optionOrderWordFilter }}
  31. </el-radio-button>
  32. </el-radio-group>
  33. </el-form-item>
  34. <el-form-item label="答案解析">
  35. <v-editor
  36. v-model="modalForm.answerAnalysis"
  37. :enable-audio="false"
  38. ></v-editor>
  39. </el-form-item>
  40. </el-form>
  41. <question-info-edit
  42. ref="QuestionInfoEdit"
  43. :question="modalForm"
  44. label-width="72px"
  45. use-course-property-cache
  46. @change="questionInfoChange"
  47. ></question-info-edit>
  48. <div class="ep-question-props-close" @click="unactiveQuestion">
  49. <i class="el-icon-error"></i>
  50. </div>
  51. </div>
  52. </div>
  53. </template>
  54. <script>
  55. import QuestionInfoEdit from "../QuestionInfoEdit.vue";
  56. import QuestionInfoView from "./QuestionInfoView.vue";
  57. import { getInitQuestionModel } from "./model";
  58. import { mapState, mapMutations } from "vuex";
  59. import { objTypeOf } from "@/plugins/utils";
  60. export default {
  61. name: "MatchQuestion",
  62. components: { QuestionInfoEdit, QuestionInfoView },
  63. props: {
  64. question: {
  65. type: Object,
  66. default() {
  67. return {};
  68. },
  69. },
  70. parentQuestion: {
  71. type: Object,
  72. default() {
  73. return {
  74. options: [],
  75. questionType: "",
  76. };
  77. },
  78. },
  79. },
  80. data() {
  81. return {
  82. modalForm: {},
  83. quesAnswer: null,
  84. rules: {
  85. quesAnswer: [
  86. {
  87. validator: (rule, value, callback) => {
  88. if (!value || !value.length) {
  89. return callback(new Error(`请设置答案`));
  90. }
  91. callback();
  92. },
  93. trigger: "change",
  94. },
  95. ],
  96. },
  97. };
  98. },
  99. computed: {
  100. ...mapState("import-edit", ["curQuestion"]),
  101. isActive() {
  102. return this.curQuestion.id === this.question.id;
  103. },
  104. IS_PARAGRAPH_MATCHING() {
  105. return this.parentQuestion.questionType === "PARAGRAPH_MATCHING";
  106. },
  107. },
  108. created() {
  109. this.initData();
  110. },
  111. methods: {
  112. ...mapMutations("import-edit", ["setCurQuestion"]),
  113. initData() {
  114. this.modalForm = this.$objAssign(getInitQuestionModel(), this.question);
  115. this.modalForm.courseId = this.parentQuestion.courseId;
  116. this.initAnswer(this.question.quesAnswer);
  117. this.quesAnswer = this.modalForm.quesAnswer[0] || null;
  118. },
  119. initAnswer(answer) {
  120. let quesAnswer = [];
  121. if (answer) {
  122. try {
  123. quesAnswer = JSON.parse(answer);
  124. } catch (err) {
  125. console.log(`answer error:${answer}`);
  126. }
  127. }
  128. if (this.checkAnswerFormatValid(quesAnswer)) {
  129. this.modalForm.quesAnswer = quesAnswer;
  130. } else {
  131. this.modalForm.quesAnswer = [];
  132. }
  133. },
  134. checkAnswerFormatValid(answer) {
  135. if (objTypeOf(answer) !== "array") return;
  136. return !answer.some((item) => !/^[0-9]{1,2}$/.test(item));
  137. },
  138. answerChange() {
  139. this.modalForm.quesAnswer =
  140. this.quesAnswer || this.quesAnswer === 0 ? [this.quesAnswer] : [];
  141. this.$refs.modalFormComp.validateField(`quesAnswer`, () => {});
  142. },
  143. questionInfoChange(questionInfo) {
  144. this.modalForm = Object.assign({}, this.modalForm, questionInfo);
  145. },
  146. validate() {
  147. return this.$refs.modalFormComp.validate();
  148. },
  149. getData() {
  150. let data = Object.assign({}, this.question, this.modalForm);
  151. data.quesAnswer = JSON.stringify(this.modalForm.quesAnswer);
  152. return data;
  153. },
  154. activeQuestion() {
  155. this.setCurQuestion(this.question);
  156. },
  157. unactiveQuestion() {
  158. this.setCurQuestion({});
  159. },
  160. },
  161. };
  162. </script>