homework-detail.vue 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. <template>
  2. <div class="studentWroks">
  3. <template v-if="listMusic.length > 0">
  4. <el-alert title="练习曲目" :closable="false" style="width: 99%;margin-bottom: 8px;"></el-alert>
  5. <el-table
  6. max-height="300px"
  7. :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
  8. :data="listMusic"
  9. style="margin-bottom: 20px;"
  10. >
  11. <el-table-column prop="musicScoreName" width="260px" align="left" label="名称">
  12. </el-table-column>
  13. <el-table-column prop="subjectName" align="left" label="级别">
  14. <template slot-scope="scope">
  15. <div v-if="scope.row.heardLevel">{{ scope.row.heardLevel | palyLevelFilter }}</div>
  16. </template>
  17. </el-table-column>
  18. <el-table-column prop="finishFlag" align="left" label="分数">
  19. <template slot-scope="scope"
  20. ><span
  21. :class="
  22. scope.row.trainingScore >= scope.row.standardScore ? '' : 'red'
  23. "
  24. >{{ scope.row.trainingScore }}</span
  25. >
  26. / {{ scope.row.standardScore }} 分</template
  27. >
  28. </el-table-column>
  29. <el-table-column prop="finishFlag" align="right" label="操作">
  30. <template slot-scope="scope">
  31. <el-button v-if="scope.row.fileJson && scope.row.fileJson.length > 0" @click="onDetail(scope.row)" type="text">查看详情</el-button>
  32. </template>
  33. </el-table-column>
  34. </el-table>
  35. </template>
  36. <template v-if="listVideo.length > 0">
  37. <el-alert title="练习视频" :closable="false" style="width: 99%;margin-bottom: 8px;"></el-alert>
  38. <el-table
  39. max-height="300px"
  40. :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
  41. :data="listVideo"
  42. >
  43. <el-table-column prop="musicScoreName" align="left" label="名称">
  44. </el-table-column>
  45. <el-table-column prop="subjectName" align="left" label="级别">
  46. <template slot-scope="scope">
  47. <div v-if="scope.row.heardLevel">{{ scope.row.heardLevel | palyLevelFilter }}</div>
  48. </template>
  49. </el-table-column>
  50. <el-table-column prop="finishFlag" align="left" label="分数">
  51. <template slot-scope="scope"
  52. ><span
  53. :class="
  54. scope.row.trainingScore >= scope.row.standardScore ? '' : 'red'
  55. "
  56. >{{ scope.row.trainingScore }}</span
  57. >
  58. / {{ scope.row.standardScore }} 分</template
  59. >
  60. </el-table-column>
  61. <el-table-column prop="finishFlag" align="right" label="操作">
  62. <template slot-scope="scope">
  63. <el-button @click="onDetail(scope.row)" type="text">查看详情</el-button>
  64. </template>
  65. </el-table-column>
  66. </el-table>
  67. </template>
  68. <template v-if="listTxt.length > 0">
  69. <el-alert title="练习" :closable="false" style="width: 99%;margin-bottom: 8px;"></el-alert>
  70. <el-table
  71. max-height="300px"
  72. :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
  73. :data="listTxt"
  74. >
  75. <el-table-column prop="desc" align="left" label="练习内容">
  76. </el-table-column>
  77. <el-table-column prop="finishFlag" align="right" label="操作">
  78. <template slot-scope="scope">
  79. <el-button v-if="scope.row.fileJson && scope.row.fileJson.length > 0" @click="onDetail(scope.row)" type="text">查看详情</el-button>
  80. </template>
  81. </el-table-column>
  82. </el-table>
  83. </template>
  84. <el-dialog
  85. title="查看"
  86. width="680px"
  87. append-to-body
  88. :visible.sync="videoVisible"
  89. v-if="videoVisible"
  90. >
  91. <div class="activeVideoWrap">
  92. <videoTcplayer v-if="selectItem.fileType === 'VIDEO'" class="ql-video" :src="selectItem.filePath" />
  93. <audio
  94. id="audio"
  95. controls
  96. v-if="selectItem.fileType === 'SOUND'"
  97. style="width: 100%"
  98. :src="selectItem.filePath"
  99. >
  100. 您的浏览器不支持视频播放
  101. </audio>
  102. <el-image
  103. v-if="selectItem.fileType === 'IMG'"
  104. fit="contain"
  105. style="width: 100%; height: 350px"
  106. :src="selectItem.filePath"
  107. :preview-src-list="[selectItem.filePath]">
  108. </el-image>
  109. </div>
  110. </el-dialog>
  111. </div>
  112. </template>
  113. <script>
  114. import videoTcplayer from "@/components/video-tcplayer";
  115. export default {
  116. props: ["list", "groupType"],
  117. components: { videoTcplayer },
  118. data() {
  119. return {
  120. videoVisible: false,
  121. listMusic: [],
  122. listVideo: [],
  123. listTxt: [],
  124. selectItem: {}
  125. };
  126. },
  127. mounted() {
  128. this.__init()
  129. },
  130. methods: {
  131. __init() {
  132. const list = this.list || []
  133. const tempMusic = []
  134. const tempVideo = []
  135. const tempTxt = []
  136. list.forEach(item => {
  137. if(item.homeworkType === "MUSIC_SCORE") {
  138. tempMusic.push(item)
  139. } else if(item.homeworkType === "VIDEO") {
  140. tempVideo.push(item)
  141. } else {
  142. tempTxt.push(item)
  143. }
  144. })
  145. this.listMusic = tempMusic
  146. this.listVideo = tempVideo
  147. this.listTxt = tempTxt
  148. console.log(this.listMusic, this.listVideo, this.listTxt, 'text')
  149. },
  150. onDetail(row) {
  151. this.selectItem = row.fileJson && row.fileJson.length > 0 ? row.fileJson[0] : {}
  152. console.log(this.selectItem, 'this.selectItem')
  153. if(this.selectItem.expireFlag) {
  154. this.$message.error('文件已过期')
  155. return
  156. }
  157. this.videoVisible = true
  158. }
  159. }
  160. };
  161. </script>
  162. <style lang="scss" scoped>
  163. .activeVideoWrap {
  164. display: flex;
  165. flex-direction: column;
  166. align-items: center;
  167. }
  168. /deep/.video-js {
  169. height: 360px;
  170. }
  171. .red {
  172. color: #f44743;
  173. }
  174. </style>