MatchQuestion.vue 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  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. label-width="50px"
  15. ></question-info-view>
  16. </div>
  17. <div v-if="isActive" class="ep-question-props">
  18. <el-form
  19. ref="modalFormComp"
  20. :model="modalForm"
  21. :rules="rules"
  22. label-width="72px"
  23. >
  24. <el-form-item prop="quesAnswer" label="答案">
  25. <el-radio-group v-model="quesAnswer" @change="answerChange">
  26. <el-radio-button
  27. v-for="option in parentQuestion.options"
  28. :key="option.number"
  29. :label="option.number"
  30. >
  31. {{ (option.number - 1) | optionOrderWordFilter }}
  32. </el-radio-button>
  33. </el-radio-group>
  34. </el-form-item>
  35. <el-form-item label="答案解析">
  36. <v-editor
  37. v-model="modalForm.answerAnalysis"
  38. :enable-audio="false"
  39. ></v-editor>
  40. </el-form-item>
  41. </el-form>
  42. <question-info-edit
  43. ref="QuestionInfoEdit"
  44. :question="modalForm"
  45. label-width="72px"
  46. use-course-property-cache
  47. @change="questionInfoChange"
  48. ></question-info-edit>
  49. </div>
  50. </div>
  51. </template>
  52. <script>
  53. import QuestionInfoEdit from "../QuestionInfoEdit.vue";
  54. import QuestionInfoView from "./QuestionInfoView.vue";
  55. import { getInitQuestionModel } from "./model";
  56. import { mapState, mapMutations } from "vuex";
  57. export default {
  58. name: "MatchQuestion",
  59. components: { QuestionInfoEdit, QuestionInfoView },
  60. props: {
  61. question: {
  62. type: Object,
  63. default() {
  64. return {};
  65. },
  66. },
  67. parentQuestion: {
  68. type: Object,
  69. default() {
  70. return {
  71. options: [],
  72. questionType: "",
  73. };
  74. },
  75. },
  76. },
  77. data() {
  78. return {
  79. modalForm: {},
  80. quesAnswer: null,
  81. rules: {
  82. quesAnswer: [
  83. {
  84. validator: (rule, value, callback) => {
  85. if (!value || !value.length) {
  86. return callback(new Error(`请设置答案`));
  87. }
  88. callback();
  89. },
  90. trigger: "change",
  91. },
  92. ],
  93. },
  94. };
  95. },
  96. computed: {
  97. ...mapState("import-edit", ["curQuestion"]),
  98. isActive() {
  99. return this.curQuestion.id === this.question.id;
  100. },
  101. IS_PARAGRAPH_MATCHING() {
  102. return this.parentQuestion.questionType === "PARAGRAPH_MATCHING";
  103. },
  104. },
  105. created() {
  106. this.initData();
  107. },
  108. methods: {
  109. ...mapMutations("import-edit", ["setCurQuestion"]),
  110. initData() {
  111. this.modalForm = this.$objAssign(getInitQuestionModel(), this.question);
  112. this.modalForm.courseId = this.parentQuestion.courseId;
  113. this.modalForm.quesAnswer = this.question.quesAnswer
  114. ? JSON.parse(this.question.quesAnswer)
  115. : [];
  116. this.quesAnswer = this.modalForm.quesAnswer[0] || null;
  117. },
  118. answerChange() {
  119. this.modalForm.quesAnswer =
  120. this.quesAnswer || this.quesAnswer === 0 ? [this.quesAnswer] : [];
  121. this.$refs.modalFormComp.validateField(`quesAnswer`, () => {});
  122. },
  123. questionInfoChange(questionInfo) {
  124. this.modalForm = Object.assign({}, this.modalForm, questionInfo);
  125. },
  126. validate() {
  127. return this.$refs.modalFormComp.validate();
  128. },
  129. getData() {
  130. let data = { ...this.modalForm };
  131. data.quesAnswer = JSON.stringify(data.quesAnswer || []);
  132. return data;
  133. },
  134. activeQuestion() {
  135. this.setCurQuestion(this.question);
  136. },
  137. },
  138. };
  139. </script>