ChineseQuestion.vue 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. <!-- 选择题 -->
  2. <template>
  3. <QuestionBase>
  4. <template #content>
  5. <div class="stem">
  6. <el-input
  7. v-if="data.property.stem_type === stemTypeList[0].value"
  8. v-model="data.stem"
  9. rows="3"
  10. resize="none"
  11. type="textarea"
  12. placeholder="输入题干"
  13. />
  14. <RichText v-if="data.property.stem_type === stemTypeList[1].value" v-model="data.stem" placeholder="输入题干" />
  15. <el-input
  16. v-show="data.property.is_enable_description"
  17. v-model="data.description"
  18. rows="3"
  19. resize="none"
  20. type="textarea"
  21. placeholder="输入描述"
  22. />
  23. <UploadAudio
  24. v-show="data.property.is_enable_listening"
  25. :file-id="data.file_id_list?.[0]"
  26. @upload="upload"
  27. @deleteFile="deleteFile"
  28. />
  29. </div>
  30. <div class="content"></div>
  31. </template>
  32. <template #property>
  33. <el-form :model="data.property">
  34. <el-form-item label="题干">
  35. <el-radio
  36. v-for="{ value, label } in stemTypeList"
  37. :key="value"
  38. v-model="data.property.stem_type"
  39. :label="value"
  40. >
  41. {{ label }}
  42. </el-radio>
  43. </el-form-item>
  44. <el-form-item label="题号">
  45. <el-input v-model="data.property.question_number" />
  46. </el-form-item>
  47. <el-form-item label-width="45px">
  48. <el-radio
  49. v-for="{ value, label } in questionNumberTypeList"
  50. :key="value"
  51. v-model="data.other.question_number_type"
  52. :label="value"
  53. >
  54. {{ label }}
  55. </el-radio>
  56. </el-form-item>
  57. <el-form-item label="描述">
  58. <el-radio
  59. v-for="{ value, label } in switchOption"
  60. :key="value"
  61. v-model="data.property.is_enable_description"
  62. :label="value"
  63. >
  64. {{ label }}
  65. </el-radio>
  66. </el-form-item>
  67. <el-form-item label="选项">
  68. <el-radio
  69. v-for="{ value, label } in selectTypeList"
  70. :key="value"
  71. v-model="data.property.select_type"
  72. :label="value"
  73. @input="changeSelectType"
  74. >
  75. {{ label }}
  76. </el-radio>
  77. </el-form-item>
  78. <el-form-item label="听力">
  79. <el-radio
  80. v-for="{ value, label } in switchOption"
  81. :key="value"
  82. v-model="data.property.is_enable_listening"
  83. :label="value"
  84. >
  85. {{ label }}
  86. </el-radio>
  87. </el-form-item>
  88. <el-form-item label="分值">
  89. <el-radio
  90. v-for="{ value, label } in scoreTypeList"
  91. :key="value"
  92. v-model="data.property.score_type"
  93. :label="value"
  94. :disabled="scoreTypeList[1].value === value && data.property.select_type === selectTypeList[0].value"
  95. >
  96. {{ label }}
  97. </el-radio>
  98. </el-form-item>
  99. <el-form-item label-width="45px">
  100. <el-input v-model="data.property.score" type="number" />
  101. </el-form-item>
  102. </el-form>
  103. </template>
  104. </QuestionBase>
  105. </template>
  106. <script>
  107. import UploadAudio from '../common/UploadAudio.vue';
  108. import QuestionMixin from '../common/QuestionMixin.js';
  109. import { selectTypeList, scoreTypeList, changeOptionType } from '@/views/exercise_questions/data/common';
  110. import { selectData, getOption } from '@/views/exercise_questions/data/select';
  111. export default {
  112. name: 'ChineseQuestion',
  113. components: {
  114. UploadAudio,
  115. },
  116. mixins: [QuestionMixin],
  117. data() {
  118. return {
  119. selectTypeList,
  120. changeOptionType,
  121. data: JSON.parse(JSON.stringify(selectData)),
  122. };
  123. },
  124. methods: {
  125. /**
  126. * 智能识别
  127. * @param {String} text 识别数据
  128. */
  129. recognition(text) {
  130. let arr = text
  131. .split(/[\r\n]/)
  132. .map((item) => item.trim())
  133. .filter((item) => item);
  134. if (arr.length > 0) {
  135. this.data.stem = arr[0];
  136. this.data.option_list = arr.slice(1).map((content) => getOption(content));
  137. }
  138. },
  139. changeSelectType(val) {
  140. if (val === selectTypeList[0].value && this.data.answer.select_list.length > 1) {
  141. this.data.answer.select_list = [this.data.answer.select_list[0]];
  142. }
  143. // 当多选题切换到单选题时,分值类型切换为总分
  144. if (val === selectTypeList[0].value && this.data.property.score_type === scoreTypeList[1].value) {
  145. this.data.property.score_type = scoreTypeList[0].value;
  146. }
  147. },
  148. isAnswer(mark) {
  149. return this.data.answer.select_list.indexOf(mark) !== -1;
  150. },
  151. selectAnswer(mark) {
  152. let index = this.data.answer.select_list.indexOf(mark);
  153. if (this.data.property.select_type === selectTypeList[0].value) {
  154. this.data.answer.select_list = [mark];
  155. }
  156. if (this.data.property.select_type === selectTypeList[1].value) {
  157. if (index === -1) {
  158. this.data.answer.select_list.push(mark);
  159. } else {
  160. this.data.answer.select_list.splice(index, 1);
  161. }
  162. }
  163. },
  164. addOption() {
  165. this.data.option_list.push(getOption());
  166. },
  167. },
  168. };
  169. </script>
  170. <style lang="scss" scoped>
  171. .content {
  172. .option-content {
  173. .checkbox {
  174. display: inline-flex;
  175. align-items: center;
  176. justify-content: center;
  177. width: 16px;
  178. height: 16px;
  179. margin-right: 8px;
  180. cursor: pointer;
  181. border: 1px solid #333;
  182. border-radius: 50%;
  183. &.active {
  184. &::before {
  185. display: inline-block;
  186. width: 6px;
  187. height: 6px;
  188. content: '';
  189. background-color: #333;
  190. border-radius: 50%;
  191. }
  192. }
  193. }
  194. }
  195. }
  196. </style>