WritePreview.vue 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  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="isEnable(data.property.is_enable_description)" 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="isEnable(data.property.is_enable_voice_answer)">
  19. <!-- 语音作答 -->
  20. <SoundRecordPreview :wav-blob.sync="user_answer.voice_file_id" />
  21. </template>
  22. <template v-if="isEnable(data.property.is_enable_upload_accessory)">
  23. <!-- 上传附件 -->
  24. <UploadFiles
  25. :fille-number="999"
  26. file-type-name="文件"
  27. :upload-type="'*'"
  28. :file-id-list="user_answer.accessory_file_id"
  29. upload-title="上传附件:"
  30. @upload="handleUpload"
  31. @deleteFile="handleDelete"
  32. />
  33. </template>
  34. <template v-if="isEnable(data.property.is_enable_sample_text)">
  35. <el-divider content-position="center"
  36. ><span
  37. :class="['sample-text', show_sample_text ? 'sample-show' : 'sample-hide']"
  38. @click="show_sample_text = !show_sample_text"
  39. >{{ show_sample_text ? '隐藏范文' : '查看范文' }}</span
  40. ></el-divider
  41. >
  42. <div v-if="show_sample_text" class="article-content" v-html="sanitizeHTML(data.sample_text)"></div>
  43. </template>
  44. </div>
  45. </template>
  46. <script>
  47. import SoundRecordPreview from './components/common/SoundRecordPreview.vue';
  48. import PreviewMixin from './components/PreviewMixin';
  49. import UploadFiles from './components/common/UploadFiles.vue';
  50. export default {
  51. name: 'WritePreview',
  52. components: {
  53. SoundRecordPreview,
  54. UploadFiles,
  55. },
  56. mixins: [PreviewMixin],
  57. data() {
  58. return {
  59. show_sample_text: false,
  60. user_answer: {
  61. text: '', // 用户文章
  62. voice_file_id: '', // 录音内容
  63. accessory_file_id: [], // 上传文件列表
  64. },
  65. };
  66. },
  67. created() {},
  68. methods: {
  69. // 文件上传成功
  70. handleUpload(fileId) {
  71. this.user_answer.accessory_file_id.push(fileId);
  72. },
  73. // 删除文件
  74. handleDelete(fileId) {
  75. this.user_answer.accessory_file_id.splice(this.user_answer.accessory_file_id.indexOf(fileId), 1);
  76. },
  77. },
  78. };
  79. </script>
  80. <style lang="scss" scoped>
  81. @use '@/styles/mixin.scss' as *;
  82. .write-preview {
  83. @include preview;
  84. .el-divider--horizontal {
  85. margin: 12px 0;
  86. }
  87. .sample-text {
  88. font-size: 14px;
  89. font-weight: 400;
  90. line-height: 30px;
  91. color: #000;
  92. cursor: pointer;
  93. &.sample-show {
  94. color: #306eff;
  95. }
  96. }
  97. .article-content {
  98. :deep p {
  99. margin: 0;
  100. }
  101. }
  102. :deep .el-textarea .el-input__count {
  103. background-color: #f2f3f5;
  104. }
  105. }
  106. </style>