short-answer-question.vue 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. <template>
  2. <!-- 简答题2024年1月8日去掉该题,阅读配题改为用问答题 -->
  3. <view class="short-answer-area">
  4. <view class="question_title">
  5. <text class="question_number" :style="{'font-size':questionData.property.stem_question_number_font_size}">
  6. {{ questionNumberEndIsBracket(questionData.property.question_number) }}
  7. </text>
  8. <text class="question_stem" v-html="sanitizeHTML(questionData.stem)"></text>
  9. </view>
  10. <view class="description"
  11. v-if="isEnable(questionData.property.is_enable_description)&&questionData.description.length > 0"
  12. v-html="sanitizeHTML(questionData.description)">
  13. </view>
  14. <!-- <AudioPlay v-if="isEnable(questionData.property.is_enable_listening) && questionData.file_list.length > 0"
  15. :fileId="questionData.file_list[0].file_id" :showSlider="true" /> -->
  16. <view class="write-content">
  17. <textarea :maxlength="word_num" v-model="questionData.user_answer[questionData.question_id].answer_list[0].text"
  18. placeholder="请输入内容" @input="sumfontnum($event,word_num)" @blur="saveUserAnswer"
  19. :disabled="answer_control[questionData.question_id].isReadOnly" />
  20. <view class="fontNum">
  21. <text>{{fontNum}}</text>/{{word_num}}
  22. </view>
  23. </view>
  24. <!-- 语音作答 -->
  25. <SoundRecord @setAudioId="setFileId" :disabled="answer_control[questionData.question_id].isReadOnly"
  26. :wav-blob.sync="questionData.user_answer[questionData.question_id].answer_list[0].audio_file_id">
  27. </SoundRecord>
  28. <view class="reference" v-if="isViewReference&&answer_control[questionData.question_id].isViewRightAnswer">
  29. <text class="reference-title">参考答案</text>
  30. <text class="reference-answer" v-html="sanitizeHTML(questionData.reference_answer)">
  31. </text>
  32. </view>
  33. <uni-popup ref="message" type="message">
  34. <uni-popup-message type="warn" :message="messageText" :duration="2000"></uni-popup-message>
  35. </uni-popup>
  36. </view>
  37. </template>
  38. <script>
  39. import {
  40. questionData,
  41. sanitizeHTML,
  42. isEnable,
  43. answer_mode_list,
  44. answer_control,
  45. } from '@/pages/answer_question/common/data/common.js';
  46. import SoundRecord from '@/components/sound-record/sound-record.vue';
  47. import AnswerControlMixin from '@/pages/answer_question/common/data/AnswerControlMixin.js';
  48. export default {
  49. name: "short-answer-question",
  50. mixins: [AnswerControlMixin],
  51. components: {
  52. SoundRecord
  53. },
  54. props: {
  55. questionData: questionData
  56. },
  57. data() {
  58. return {
  59. sanitizeHTML,
  60. isEnable,
  61. answer_mode_list,
  62. answer_control,
  63. fontNum: 0,
  64. word_num: 1000,
  65. messageText: '',
  66. };
  67. },
  68. watch: {
  69. 'questionData.question_id': {
  70. handler(val) {
  71. this.setUserAnswer();
  72. this.commonComputedAnswerControl(val);
  73. },
  74. immediate: true,
  75. deep: true
  76. }
  77. },
  78. computed: {
  79. isViewReference: function() {
  80. return isEnable(this.questionData.property.is_enable_reference_answer);
  81. }
  82. },
  83. methods: {
  84. sumfontnum(e, totalCount) {
  85. this.setQuestionEdit();
  86. this.fontNum = e.detail.value.length;
  87. if (this.fontNum === totalCount) {
  88. this.messageText = `字数达到${totalCount}字!`;
  89. this.$refs.message.open();
  90. }
  91. },
  92. //异步更新声音ID有问题,所以采用方法手动赋值
  93. setFileId(fileId) {
  94. this.setQuestionEdit();
  95. this.saveUserAnswer();
  96. },
  97. setQuestionEdit() {
  98. this.questionData.user_answer[this.questionData.question_id].isEdit = true;
  99. this.$forceUpdate();
  100. },
  101. //填写答案后保存答案
  102. saveUserAnswer: function(mark) {
  103. var that = this;
  104. var questionId = that.questionData.question_id;
  105. this.questionData.user_answer[questionId].isEdit = true;
  106. var ansed = this.questionData.user_answer[questionId].answer_list;
  107. this.questionData.user_answer[questionId].is_fill_answer = ansed.filter(p => p.text || p.audio_file_id)
  108. .length > 0;
  109. this.questionData.user_answer[questionId].content = JSON.stringify(ansed);
  110. this.questionData.user_answer[questionId].answer_list = ansed;
  111. this.$emit("setSubAnswer", this.questionData.user_answer[questionId], questionId);
  112. },
  113. //获取用户答案
  114. setUserAnswer: function() {
  115. var that = this;
  116. var callback = function() {
  117. var userAnswer = [];
  118. var questionId = that.questionData.question_id;
  119. var _ua = that.questionData.user_answer[questionId];
  120. if (_ua && _ua.answer_list && _ua.answer_list.length > 0) {
  121. userAnswer = _ua.answer_list;
  122. } else {
  123. that.questionData.user_answer[questionId].answer_list = [{
  124. text: '', // 用户文章
  125. audio_file_id: '', // 录音内容
  126. }];
  127. }
  128. that.$forceUpdate();
  129. }
  130. if (this.questionData.isSubSub) {
  131. callback();
  132. } else {
  133. this.$emit("getUserAnswer", this.questionData.question_id, callback);
  134. }
  135. },
  136. },
  137. }
  138. </script>
  139. <style lang="scss" scoped>
  140. .short-answer-area {
  141. margin-bottom: 32rpx;
  142. .question_title {
  143. display: flex;
  144. font-size: $font-size-lg;
  145. .question_number,
  146. .question_stem {
  147. color: #34343A;
  148. }
  149. .question_number {
  150. margin-right: 10rpx;
  151. }
  152. }
  153. .description {
  154. padding: 24rpx 48rpx;
  155. border-radius: 40rpx;
  156. font-size: $font-size-serial;
  157. background-color: $uni-bg-color-grey;
  158. margin-top: 32rpx;
  159. }
  160. .write-content {
  161. margin-top: 32rpx;
  162. height: 300rpx;
  163. width: 100%;
  164. background-color: $uni-bg-color-grey;
  165. border-radius: 16rpx;
  166. textarea {
  167. width: 95%;
  168. height: 100%;
  169. font-size: 28rpx;
  170. line-height: 56rpx;
  171. margin: 0 auto;
  172. }
  173. .fontNum {
  174. position: relative;
  175. right: 20rpx;
  176. top: -48rpx;
  177. text-align: right;
  178. color: #86909C;
  179. }
  180. }
  181. .reference {
  182. margin: 32rpx 0;
  183. background-color: $uni-bg-color-grey;
  184. padding: 24rpx;
  185. font-size: 28rpx;
  186. .reference-title {
  187. display: block;
  188. line-height: 64rpx;
  189. color: #4E5969;
  190. }
  191. .reference-answer {
  192. color: #1D2129;
  193. line-height: 48rpx;
  194. }
  195. }
  196. }
  197. </style>