WritePreview.vue 3.2 KB

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