Ver Fonte

代码上传

zhangqi há 10 meses atrás
pai
commit
c5a267f947
3 ficheiros alterados com 82 adições e 42 exclusões
  1. 32 33
      package-lock.json
  2. 1 0
      package.json
  3. 49 9
      src/components/detailTemplate/modules/files.vue

+ 32 - 33
package-lock.json

@@ -22,6 +22,7 @@
         "pinia": "^2.0.33",
         "pinia-plugin-persist": "^1.0.0",
         "vue": "^3.2.45",
+        "vue-demi": "^0.14.6",
         "vue-router": "^4.1.6"
       },
       "devDependencies": {
@@ -3403,31 +3404,6 @@
         }
       }
     },
-    "node_modules/pinia/node_modules/vue-demi": {
-      "version": "0.13.11",
-      "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.13.11.tgz",
-      "integrity": "sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==",
-      "hasInstallScript": true,
-      "bin": {
-        "vue-demi-fix": "bin/vue-demi-fix.js",
-        "vue-demi-switch": "bin/vue-demi-switch.js"
-      },
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      },
-      "peerDependencies": {
-        "@vue/composition-api": "^1.0.0-rc.1",
-        "vue": "^3.0.0-0 || ^2.6.0"
-      },
-      "peerDependenciesMeta": {
-        "@vue/composition-api": {
-          "optional": true
-        }
-      }
-    },
     "node_modules/postcss": {
       "version": "8.4.21",
       "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz",
@@ -4171,6 +4147,31 @@
         "@vue/shared": "3.2.47"
       }
     },
+    "node_modules/vue-demi": {
+      "version": "0.14.6",
+      "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.6.tgz",
+      "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==",
+      "hasInstallScript": true,
+      "bin": {
+        "vue-demi-fix": "bin/vue-demi-fix.js",
+        "vue-demi-switch": "bin/vue-demi-switch.js"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      },
+      "peerDependencies": {
+        "@vue/composition-api": "^1.0.0-rc.1",
+        "vue": "^3.0.0-0 || ^2.6.0"
+      },
+      "peerDependenciesMeta": {
+        "@vue/composition-api": {
+          "optional": true
+        }
+      }
+    },
     "node_modules/vue-router": {
       "version": "4.1.6",
       "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.1.6.tgz",
@@ -6896,14 +6897,6 @@
       "requires": {
         "@vue/devtools-api": "^6.5.0",
         "vue-demi": "*"
-      },
-      "dependencies": {
-        "vue-demi": {
-          "version": "0.13.11",
-          "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.13.11.tgz",
-          "integrity": "sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==",
-          "requires": {}
-        }
       }
     },
     "pinia-plugin-persist": {
@@ -7432,6 +7425,12 @@
         "@vue/shared": "3.2.47"
       }
     },
+    "vue-demi": {
+      "version": "0.14.6",
+      "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.6.tgz",
+      "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==",
+      "requires": {}
+    },
     "vue-router": {
       "version": "4.1.6",
       "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.1.6.tgz",

+ 1 - 0
package.json

@@ -23,6 +23,7 @@
     "pinia": "^2.0.33",
     "pinia-plugin-persist": "^1.0.0",
     "vue": "^3.2.45",
+    "vue-demi": "^0.14.6",
     "vue-router": "^4.1.6"
   },
   "devDependencies": {

+ 49 - 9
src/components/detailTemplate/modules/files.vue

@@ -26,42 +26,80 @@
             <div class="image-panel panel">
               <a-image
                 v-if="fileType(record) == '图片'"
-                :width="40"
-                :height="40"
+                :width="80"
+                :height="80"
                 :src="record.url"
               />
               <PlayCircleFilled style="font-size: 30px;" v-else-if="fileType(record) == '视频'"/>
               <FileTextFilled style="font-size: 30px;" v-else-if="fileType(record) == '文本'"/>
               <FileWordFilled style="font-size: 30px;" v-else-if="fileType(record) == 'office'"/>
+              <FilePdfFilled style="font-size: 30px;" v-else-if="fileType(record) == 'pdf'"/>
               <FileUnknownFilled style="font-size: 30px;" v-else/>
             </div>
-            <span>{{record.document}}{{fileType(record)}}</span>
+            <span>{{record.document}}</span>
           </a-space>
         </template>
         <template v-if="column.key === 'op'">
           <a-space :size="[10,10]">
-            <a :href="record.url" target="_blank">预览</a>
+            <a target="_blank" v-if="fileType(record) !== '图片' && fileType(record) !== '其他'" @click="showModal(record,fileType(record))">预览</a>
+            <a :href="record.url" target="_blank">下载</a>
             <a type="link" v-if="isShow" @click="deleteFiledeleteFileLink(record)">删除</a>
           </a-space>
         </template>
       </template>
     </a-table>
   </div>
+  <a-modal v-model:open="open" title="预览" @ok="handleOk" :width="900">
+    <iframe
+			:src="`https://view.officeapps.live.com/op/view.aspx?src=${encodeURIComponent(at_url)}`"
+			frameborder="0"
+			style="height: 100vh; width: 100%"
+		></iframe>
+  </a-modal>
+  <a-modal v-model:open="videoOpen" title="预览" @ok="handleOk" :width="900">
+    <video :src="at_url" style="width: 100%;" controls></video>
+  </a-modal>
 </div>
 </template>
 <script setup>
-import { PlayCircleFilled, FileTextFilled,FileWordFilled,FileUnknownFilled } from '@ant-design/icons-vue';
+
+import { PlayCircleFilled, FileTextFilled,FileWordFilled,FileUnknownFilled,FilePdfFilled } from '@ant-design/icons-vue';
 import upload from '@/components/upload/index.vue'
 import {defineProps, ref,onMounted,computed} from 'vue'
 
 import { useRouter } from "vue-router";
 import Api from '@/api/api'
 import utils from '@/utils/utils'
+const open = ref(false);
+const videoOpen = ref(false);
+const at_url = ref('');
+const showModal = (record,type) => {
+  at_url.value = record.url;
+  switch (type) {
+    case 'office':
+    open.value = true;
+      break;
+    case 'pdf':
+    open.value = true;
+      break;
+    case '视频':
+    videoOpen.value = true;
+      break;
+    default:
+      break;
+  }
+  
+};
+const handleOk = e => {
+  open.value = false;
+};
 const fileType = (item)=>{
   const isImage = item.url.match(/\.(jpg|jpeg|png|gif|svg)$/i) !== null;
   const isVideo = item.url.match(/\.(mp4|avi|mkv|flv|mov)$/i) !== null;
   const isText = item.url.match(/\.(txt|md|csv|xml)$/i) !== null;
   const isOffice = item.url.match(/\.(doc|docx|xls|xlsx|ppt|pptx)$/i) !== null;
+  const isPdf = item.url.match(/\.(pdf)$/i) !== null;
+
   if (isImage) {
     return '图片';
   } else if (isVideo) {
@@ -70,6 +108,8 @@ const fileType = (item)=>{
     return '文本';
   } else if (isOffice) {
     return 'office';
+  }else if (isPdf) {
+    return 'pdf';
   } else {
     return '其他';
   }
@@ -157,14 +197,14 @@ onMounted(()=>{
   display: flex;
   align-items: center;
   justify-content: center;
-  width: 40px;
-  height: 40px;
+  width: 80px;
+  height: 80px;
   overflow: hidden;
   
 }
 .file-panel{
-  height:40px;
-  width: 40px;
+  height:80px;
+  width: 80px;
   font-size: 12px;
 }
 </style>