ExercisePreview.vue 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. <template>
  2. <div v-loading="loading" class="Exercise-preview">
  3. <div class="type-content">
  4. <div class="type-content-inner">
  5. <div class="rich-text" v-html="sanitizeHTML(title)"></div>
  6. <component :is="getViewCom" ref="preview" :content="content" type="interaction" />
  7. </div>
  8. </div>
  9. <footer style="text-align: right">
  10. <el-button :loading="loading" type="primary" @click="submitAdd">确 定</el-button>
  11. </footer>
  12. </div>
  13. </template>
  14. <script>
  15. import SelectPreview from '@/views/book/courseware/preview/components/select/SelectPreview.vue';
  16. import JudgePreview from '@/views/book/courseware/preview/components/judge/JudgePreview.vue';
  17. import MatchingPreview from '@/views/book/courseware/preview/components/matching/MatchingPreview.vue';
  18. import SortPreview from '@/views/book/courseware/preview/components/sort/SortPreview.vue';
  19. import FillPreview from '@/views/book/courseware/preview/components/fill/FillPreview.vue';
  20. import RecordInputPreview from '@/views/book/courseware/preview/components/record_input/RecordInputPreview.vue';
  21. import { GetCoursewareExerciseView } from '@/api/book';
  22. import { sanitizeHTML } from '@/utils/common';
  23. export default {
  24. name: 'ExercisePreview',
  25. components: { SelectPreview, JudgePreview, MatchingPreview, SortPreview, FillPreview, RecordInputPreview },
  26. provide() {
  27. return {
  28. getPermissionControl: () => this.permissionControl,
  29. };
  30. },
  31. props: ['exercise_id', 'feed_back'],
  32. data() {
  33. return {
  34. sanitizeHTML,
  35. typeValue: '',
  36. title: '',
  37. content: null,
  38. loading: false,
  39. permissionControl: {
  40. can_answer: true, // 可作答
  41. can_judge_correct: false, // 可判断对错(客观题)
  42. can_show_answer: false, // 可查看答案
  43. can_correct: false, // 可批改
  44. can_check_correct: false, // 可查看批改
  45. },
  46. };
  47. },
  48. computed: {
  49. getViewCom() {
  50. switch (this.typeValue) {
  51. case 'select':
  52. return SelectPreview;
  53. case 'judge':
  54. return JudgePreview;
  55. case 'sort':
  56. return SortPreview;
  57. case 'matching':
  58. return MatchingPreview;
  59. case 'fill':
  60. return FillPreview;
  61. case 'record_input':
  62. return RecordInputPreview;
  63. default:
  64. return null;
  65. }
  66. },
  67. },
  68. // 生命周期 - 创建完成(可以访问当前this实例)
  69. created() {
  70. this.handleData();
  71. },
  72. methods: {
  73. componentMove() {},
  74. handleCancle() {
  75. this.$emit('handleCancle');
  76. },
  77. submitAdd() {
  78. let obj = {
  79. content: this.content,
  80. title: this.title,
  81. };
  82. this.$emit('submitAdd', this.exercise_id, this.$refs.preview.answer, obj, this.permissionControl.can_show_answer);
  83. if (!this.permissionControl.can_show_answer && this.feed_back === 'timely') {
  84. this.permissionControl.can_show_answer = true;
  85. }
  86. },
  87. handleData() {
  88. this.loading = true;
  89. let data = {
  90. exercise_id: this.exercise_id,
  91. courseware_id: this.$route.params.id,
  92. };
  93. GetCoursewareExerciseView(data)
  94. .then((res) => {
  95. this.loading = false;
  96. if (res.status === 1) {
  97. this.content = res.content_exercise;
  98. this.title = res.content_title;
  99. this.typeValue = res.content_exercise ? JSON.parse(res.content_exercise).type : '';
  100. // setTimeout(() => {
  101. // this.$refs.preview.showAnswer(true, false, this.$refs.preview.answer, true);
  102. // }, 100);
  103. }
  104. })
  105. .catch(() => {
  106. this.loading = false;
  107. });
  108. },
  109. },
  110. };
  111. </script>
  112. <style lang="scss" scoped>
  113. .type-content {
  114. margin: 5px 0;
  115. }
  116. .type-content-inner {
  117. width: 100%;
  118. }
  119. :deep .sn-position {
  120. display: none;
  121. }
  122. </style>