赫艾前端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

219 lines
6.9 KiB

6 months ago
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
  1. <script>
  2. import {downLoadObjectFile, downLoadObjectFileMes} from '@/api/eam/eam_object_list.js'
  3. import {deleteObjectFile} from '@/api/eam/eam.js'
  4. export default {
  5. name: "sqcFileTable",
  6. props:{
  7. dataList:{
  8. type:Array,
  9. required:true
  10. },
  11. queryLoading:{
  12. type:Boolean,
  13. default:false,
  14. },
  15. columns:{
  16. type:Array,
  17. required: true,
  18. }
  19. },
  20. methods: {
  21. // 预览
  22. previewFile (row) {
  23. // 预览文件
  24. let image = ['jpg', 'jpeg', 'png', 'gif', 'bmp']
  25. let type = ''
  26. if (image.includes(row.fileType.toLowerCase())) {
  27. type = 'image/' + row.fileType
  28. }
  29. let video = ['mp4', 'avi', 'mov', 'wmv', 'flv']
  30. if (video.includes(row.fileType.toLowerCase())) {
  31. type = 'video/' + row.fileType
  32. }
  33. let txt = ['txt']
  34. if (txt.includes(row.fileType.toLowerCase())) {
  35. type = 'text/plain'
  36. }
  37. let office = ['doc', 'docx', 'ppt', 'pptx', 'xls', 'xlsx']
  38. if (office.includes(row.fileType.toLowerCase())) {
  39. this.$message.warning(`暂不支持预览${row.fileType.toLowerCase()}文件`)
  40. return
  41. }
  42. let pdf = ['pdf']
  43. if (pdf.includes(row.fileType.toLowerCase())) {
  44. type = 'application/pdf'
  45. }
  46. if (type === ''){
  47. this.$message.warning(`暂不支持预览${row.fileType.toLowerCase()}文件`)
  48. return;
  49. }
  50. downLoadObjectFile(row).then(({data}) => {
  51. const type = 'text/plain;charset=utf-8'; // 指定编码
  52. const blob = new Blob([data], { type });
  53. const reader = new FileReader();
  54. reader.onload = function(e) {
  55. const content = e.target.result;
  56. // 新窗口展示内容
  57. const newTab = window.open();
  58. newTab.document.write('<pre>' + content + '</pre>');
  59. };
  60. reader.readAsText(blob, 'utf-8');
  61. })
  62. },
  63. // 预览
  64. previewFileMes (row) {
  65. // 预览文件
  66. let image = ['jpg', 'jpeg', 'png', 'gif', 'bmp']
  67. let type = ''
  68. if (image.includes(row.fileType.toLowerCase())) {
  69. type = 'image/' + row.fileType
  70. }
  71. let video = ['mp4', 'avi', 'mov', 'wmv', 'flv']
  72. if (video.includes(row.fileType.toLowerCase())) {
  73. type = 'video/' + row.fileType
  74. }
  75. let txt = ['txt']
  76. if (txt.includes(row.fileType.toLowerCase())) {
  77. type = 'text/plain'
  78. }
  79. let office = ['doc', 'docx', 'ppt', 'pptx', 'xls', 'xlsx']
  80. if (office.includes(row.fileType.toLowerCase())) {
  81. this.$message.warning(`暂不支持预览${row.fileType.toLowerCase()}文件`)
  82. return
  83. }
  84. let pdf = ['pdf']
  85. if (pdf.includes(row.fileType.toLowerCase())) {
  86. type = 'application/pdf'
  87. }
  88. if (type === ''){
  89. this.$message.warning(`暂不支持预览${row.fileType.toLowerCase()}文件`)
  90. return;
  91. }
  92. downLoadObjectFileMes(row).then(({data}) => {
  93. const blob = new Blob([data], { type: type });
  94. // 创建URL来生成预览
  95. const fileURL = URL.createObjectURL(blob);
  96. // 在新标签页中打开文件预览
  97. window.open(fileURL, '_blank')
  98. })
  99. },
  100. // 文件下载
  101. downloadFile (row) {
  102. downLoadObjectFile(row)
  103. .then(({data}) => {
  104. // 不限制文件下载类型
  105. const blob = new Blob([data], {type: "application/octet-stream"})
  106. // 下载文件名称
  107. const fileName = row.fileName
  108. // a标签下载
  109. const linkNode = document.createElement('a')
  110. // a标签的download属性规定下载文件的名称
  111. linkNode.download = fileName
  112. linkNode.style.display = 'none'
  113. // 生成一个Blob URL
  114. linkNode.href = URL.createObjectURL(blob)
  115. document.body.appendChild(linkNode)
  116. // 模拟在按钮上的一次鼠标单击
  117. linkNode.click()
  118. // 释放URL 对象
  119. URL.revokeObjectURL(linkNode.href)
  120. document.body.removeChild(linkNode)
  121. })
  122. },
  123. // 文件下载
  124. downloadFileMes (row) {
  125. downLoadObjectFileMes(row)
  126. .then(({data}) => {
  127. // 不限制文件下载类型
  128. const blob = new Blob([data], {type: "application/octet-stream"})
  129. // 下载文件名称
  130. const fileName = row.fileName
  131. // a标签下载
  132. const linkNode = document.createElement('a')
  133. // a标签的download属性规定下载文件的名称
  134. linkNode.download = fileName
  135. linkNode.style.display = 'none'
  136. // 生成一个Blob URL
  137. linkNode.href = URL.createObjectURL(blob)
  138. document.body.appendChild(linkNode)
  139. // 模拟在按钮上的一次鼠标单击
  140. linkNode.click()
  141. // 释放URL 对象
  142. URL.revokeObjectURL(linkNode.href)
  143. document.body.removeChild(linkNode)
  144. })
  145. },
  146. // 删除文件
  147. deleteFile (row) {
  148. this.$confirm('确定要删除此文件?', '提示', {
  149. confirmButtonText: '确定',
  150. cancelButtonText: '取消',
  151. type: 'warning'
  152. }).then(() => {
  153. deleteObjectFile(row).then(({data}) => {
  154. if (data && data.code == 0) {
  155. this.$emit('refresh')
  156. this.$message({
  157. message: '操作成功',
  158. type: 'success',
  159. duration: 1500,
  160. onClose: () => {}
  161. })
  162. } else {
  163. this.$alert(data.msg, '错误', {
  164. confirmButtonText: '确定'
  165. })
  166. }
  167. })
  168. }).catch(() => {
  169. })
  170. },
  171. }
  172. }
  173. </script>
  174. <template>
  175. <el-table
  176. :height="350"
  177. :data="dataList"
  178. border
  179. v-loading="queryLoading"
  180. element-loading-text="拼命加载中"
  181. style="width: 100%; ">
  182. <el-table-column
  183. v-for="(item,index) in columns" :key="index"
  184. :sortable="item.columnSortable"
  185. :prop="item.columnProp"
  186. :header-align="item.headerAlign"
  187. :show-overflow-tooltip="item.showOverflowTooltip"
  188. :align="item.align"
  189. :fixed="item.fixed===''?false:item.fixed"
  190. :min-width="item.columnWidth"
  191. :label="item.columnLabel">
  192. <template slot-scope="scope">
  193. <span v-if="!item.columnHidden">{{scope.row[item.columnProp]}}</span>
  194. <span v-if="item.columnImage"><img :src="scope.row[item.columnProp]" style="width: 100px; height: 80px"/></span>
  195. </template>
  196. </el-table-column>
  197. <el-table-column
  198. header-align="center"
  199. align="center"
  200. width="100"
  201. label="操作">
  202. <template slot-scope="scope">
  203. <el-link v-if="scope.row.orderReftype !== 'mes'" style="cursor: pointer" @click="previewFile(scope.row)">预览</el-link>
  204. <el-link v-if="scope.row.orderReftype !== 'mes'" style="cursor: pointer" @click="downloadFile(scope.row)">下载</el-link>
  205. <el-link v-if="scope.row.orderReftype !== 'mes'" style="cursor: pointer" @click="deleteFile(scope.row)">删除</el-link>
  206. </template>
  207. </el-table-column>
  208. </el-table>
  209. </template>
  210. <style scoped>
  211. </style>