WritePreview.vue 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. <!-- eslint-disable vue/no-v-html -->
  2. <template>
  3. <div class="write-preview">
  4. <div class="stem">
  5. <span class="question-number">{{ data.property.question_number }}.</span>
  6. <span v-html="sanitizeHTML(data.stem)"></span>
  7. </div>
  8. <div class="article-content" v-html="sanitizeHTML(data.article)"></div>
  9. <div v-if="data.property.is_enable_description === 'true'" class="description">{{ data.description }}</div>
  10. <el-input
  11. v-model="user_answer.text"
  12. rows="3"
  13. type="textarea"
  14. placeholder="请输入内容"
  15. :maxlength="data.property.word_num"
  16. show-word-limit
  17. />
  18. <template v-if="data.property.is_enable_voice_answer === 'true'">
  19. <!-- 语音作答 -->
  20. <SoundRecordPreview
  21. :wav-blob="user_answer.voice_file_id"
  22. :record-time="user_answer.audio_wav_time"
  23. @deleteWav="deleteWav"
  24. @updataWav="updataWav"
  25. />
  26. </template>
  27. <template v-if="data.property.is_enable_upload_accessory === 'true'">
  28. <!-- 上传附件 -->
  29. <UploadFiles />
  30. </template>
  31. <template v-if="data.property.is_enable_sample_text === 'true'">
  32. <el-divider content-position="center"
  33. ><span
  34. :class="['sample-text', show_sample_text ? 'sample-show' : 'sample-hide']"
  35. @click="show_sample_text = !show_sample_text"
  36. >{{ show_sample_text ? '隐藏范文' : '查看范文' }}</span
  37. ></el-divider
  38. >
  39. <div v-if="show_sample_text" class="article-content" v-html="sanitizeHTML(data.sample_text)"></div>
  40. </template>
  41. </div>
  42. </template>
  43. <script>
  44. import SoundRecordPreview from './components/common/SoundRecordPreview.vue';
  45. import PreviewMixin from './components/PreviewMixin';
  46. import UploadFiles from './components/common/UploadFiles.vue';
  47. export default {
  48. name: 'WritePreview',
  49. components: {
  50. SoundRecordPreview,
  51. UploadFiles,
  52. },
  53. mixins: [PreviewMixin],
  54. data() {
  55. return {
  56. show_sample_text: false,
  57. user_answer: {
  58. text: '', // 用户文章
  59. voice_file_id: '', // 录音内容
  60. audio_wav_time: 0, // 录音时间
  61. accessory_file_id: [], // 上传文件列表
  62. },
  63. };
  64. },
  65. created() {
  66. console.log(this.data);
  67. },
  68. methods: {
  69. // 清除录音
  70. deleteWav() {
  71. this.user_answer.voice_file_id = '';
  72. this.user_answer.audio_wav_time = 0;
  73. },
  74. // 更新录音内容和时间
  75. updataWav(wav, time) {
  76. this.user_answer.voice_file_id = wav;
  77. this.user_answer.audio_wav_time = time;
  78. },
  79. },
  80. };
  81. </script>
  82. <style lang="scss" scoped>
  83. @use '@/styles/mixin.scss' as *;
  84. .write-preview {
  85. @include preview;
  86. .el-divider--horizontal {
  87. margin: 12px 0;
  88. }
  89. .sample-text {
  90. font-size: 14px;
  91. font-weight: 400;
  92. line-height: 30px;
  93. color: #000;
  94. cursor: pointer;
  95. &.sample-show {
  96. color: #306eff;
  97. }
  98. }
  99. .article-content {
  100. :deep p {
  101. margin: 0;
  102. }
  103. }
  104. :deep .el-textarea .el-input__count {
  105. background-color: #f2f3f5;
  106. }
  107. }
  108. </style>