VideoInteractionPreview.vue 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. <!-- eslint-disable vue/no-v-html -->
  2. <template>
  3. <div class="imageText-preview" :style="getAreaStyle()">
  4. <SerialNumberPosition v-if="isEnable(data.property.sn_display_mode)" :property="data.property" />
  5. <div class="interaction-box" v-if="data.video_list.length > 0">
  6. <video
  7. id="interaction-preview-video"
  8. :src="data.video_list[0].file_url"
  9. width="100%"
  10. height="400"
  11. controls
  12. @timeupdate="handleTimeUpdate"
  13. controlsList="nodownload"
  14. ></video>
  15. </div>
  16. <el-button
  17. type="primary"
  18. v-if="Object.keys(this.userAnswer).length === data.file_info_list.length"
  19. @click="lookReport"
  20. >查看答题报告</el-button
  21. >
  22. <el-dialog
  23. v-if="visible"
  24. :visible.sync="visible"
  25. :show-close="false"
  26. :close-on-click-modal="true"
  27. :modal-append-to-body="true"
  28. :append-to-body="true"
  29. :lock-scroll="true"
  30. width="80%"
  31. @close="handleClose"
  32. >
  33. <ExercisePreview :exercise_id="exercise_id" @handleCancle="handleClose" @submitAdd="submitAdd"></ExercisePreview>
  34. <!-- <iframe v-if="visible" :src="newpath" width="100%" :height="iframeHeight" frameborder="0"></iframe> -->
  35. </el-dialog>
  36. </div>
  37. </template>
  38. <script>
  39. import ExercisePreview from './ExercisePreview.vue';
  40. import PreviewMixin from '../common/PreviewMixin';
  41. import { getVideoInteractionData } from '@/views/book/courseware/data/videoInteraction';
  42. import { GetFileURLMap } from '@/api/app';
  43. import { getConfig } from '@/utils/auth';
  44. export default {
  45. name: 'VideoInteractionPreview',
  46. components: { ExercisePreview },
  47. mixins: [PreviewMixin],
  48. data() {
  49. return {
  50. data: getVideoInteractionData(),
  51. video_info: null,
  52. file_preview_url: getConfig() ? getConfig().doc_preview_service_address : '',
  53. visible: false,
  54. newpath: '',
  55. iframeHeight: `${window.innerHeight - 100}px`,
  56. first: '',
  57. exercise_id: '',
  58. userAnswer: {}, // 用户答题答案
  59. exerciseList: {}, // 题目列表
  60. reportFlag: false,
  61. reportResult: {
  62. total: 0,
  63. right: 0,
  64. error: 0,
  65. rightRate: 0,
  66. },
  67. };
  68. },
  69. watch: {},
  70. created() {
  71. this.initData();
  72. },
  73. mounted() {},
  74. methods: {
  75. initData() {
  76. this.data.video_list.forEach((item) => {
  77. GetFileURLMap({ file_id_list: [item.file_id] }).then(({ url_map }) => {
  78. this.video_info = url_map[item.file_id];
  79. });
  80. });
  81. this.data.file_info_list = this.data.file_info_list.sort((a, b) => Number(a.currentTime) - Number(b.currentTime));
  82. },
  83. handleTimeUpdate(event) {
  84. let currentTime = event.target.currentTime;
  85. this.data.file_info_list.forEach((item) => {
  86. if (
  87. Number(item.currentTime) > Math.floor(currentTime) &&
  88. Number(item.currentTime) < Math.floor(currentTime) + 1 &&
  89. item.id !== this.first
  90. ) {
  91. this.first = item.id;
  92. document.getElementById('interaction-preview-video').pause();
  93. this.exercise_id = item.id;
  94. this.visible = true;
  95. // GetFileURLMap({ file_id_list: [item.file_id] }).then(({ url_map }) => {
  96. // this.newpath = `${this.file_preview_url}onlinePreview?url=${Base64.encode(url_map[item.file_id])}`;
  97. // this.visible = true;
  98. // });
  99. }
  100. });
  101. },
  102. handleClose() {
  103. this.visible = false;
  104. document.getElementById('interaction-preview-video').play();
  105. setTimeout(() => {
  106. this.first = '';
  107. }, 1000);
  108. },
  109. submitAdd(id, answer, content) {
  110. this.visible = false;
  111. document.getElementById('interaction-preview-video').play();
  112. setTimeout(() => {
  113. this.first = '';
  114. }, 1000);
  115. this.$set(this.userAnswer, id, answer);
  116. this.$set(this.exerciseList, id, content);
  117. },
  118. lookReport() {
  119. document.getElementById('interaction-preview-video').pause();
  120. },
  121. },
  122. };
  123. </script>
  124. <style lang="scss" scoped>
  125. @use '@/styles/mixin.scss' as *;
  126. video:full-screen {
  127. :fullscreen::-webkit-media-controls-fullscreen-button {
  128. display: none;
  129. }
  130. }
  131. video::-webkit-media-controls-fullscreen-button {
  132. display: none;
  133. }
  134. </style>