From 5159d19ed210ec3e14d157f9ae6221299bd46e34 Mon Sep 17 00:00:00 2001 From: yangfeng <wanwan926_4@163.com> Date: 星期二, 29 八月 2023 17:04:47 +0800 Subject: [PATCH] 供应商文件预览、下载、删除 --- src/api/supplierManage/supplier.js | 6 + src/views/supplierManage/supplier/index.vue | 3 src/views/supplierManage/supplier/DetailSupplier.vue | 4 package-lock.json | 95 ++++++++++++++++-- src/views/supplierManage/supplier/AddSupplier.vue | 69 ++++++++++--- package.json | 2 src/router/index.js | 9 + src/views/supplierManage/supplier/PreviewFile.vue | 61 ++++++++++++ 8 files changed, 216 insertions(+), 33 deletions(-) diff --git a/package-lock.json b/package-lock.json index c36dd14..2c51123 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,15 +1,17 @@ { - "name": "srm-web", + "name": "crm-web", "version": "0.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "srm-web", + "name": "crm-web", "version": "0.1.0", "dependencies": { "axios": "^1.4.0", "core-js": "^3.8.3", + "docx-preview": "^0.1.18", + "downloadjs": "^1.4.7", "element-ui": "^2.15.13", "vue": "^2.6.14", "vue-router": "^3.5.1", @@ -4289,8 +4291,7 @@ "node_modules/core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, "node_modules/cosmiconfig": { "version": "7.1.0", @@ -4879,6 +4880,14 @@ "node": ">=6.0.0" } }, + "node_modules/docx-preview": { + "version": "0.1.18", + "resolved": "https://registry.npmmirror.com/docx-preview/-/docx-preview-0.1.18.tgz", + "integrity": "sha512-nmkeghp9k4Qw+T3/sttwuMhTnn0gQaq23EN8dLoB7nxb/fEd8S57mh9l8j7SpVgpGg5MSW1WZJffv6Yoy29KaA==", + "dependencies": { + "jszip": ">=3.0.0" + } + }, "node_modules/dom-converter": { "version": "0.2.0", "resolved": "https://registry.npmmirror.com/dom-converter/-/dom-converter-0.2.0.tgz", @@ -4952,6 +4961,11 @@ "resolved": "https://registry.npmmirror.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz", "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", "dev": true + }, + "node_modules/downloadjs": { + "version": "1.4.7", + "resolved": "https://registry.npmmirror.com/downloadjs/-/downloadjs-1.4.7.tgz", + "integrity": "sha512-LN1gO7+u9xjU5oEScGFKvXhYf7Y/empUIIEAGBs1LzUq/rg5duiDrkuH5A2lQGd5jfMOb9X9usDa2oVXwJ0U/Q==" }, "node_modules/duplexer": { "version": "0.1.2", @@ -6534,6 +6548,11 @@ "node": ">= 4" } }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmmirror.com/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" + }, "node_modules/immutable": { "version": "4.3.2", "resolved": "https://registry.npmmirror.com/immutable/-/immutable-4.3.2.tgz", @@ -6584,8 +6603,7 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/ipaddr.js": { "version": "2.1.0", @@ -6776,8 +6794,7 @@ "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, "node_modules/isexe": { "version": "2.0.0", @@ -6936,6 +6953,44 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmmirror.com/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "node_modules/jszip/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/jszip/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/jszip/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-6.0.3.tgz", @@ -6984,6 +7039,14 @@ }, "engines": { "node": ">= 0.8.0" + } + }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmmirror.com/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dependencies": { + "immediate": "~3.0.5" } }, "node_modules/lilconfig": { @@ -8320,6 +8383,11 @@ "node": ">=6" } }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmmirror.com/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, "node_modules/param-case": { "version": "3.0.4", "resolved": "https://registry.npmmirror.com/param-case/-/param-case-3.0.4.tgz", @@ -9085,8 +9153,7 @@ "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmmirror.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, "node_modules/progress": { "version": "2.0.3", @@ -9768,6 +9835,11 @@ "engines": { "node": ">= 0.8.0" } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" }, "node_modules/setprototypeof": { "version": "1.2.0", @@ -10624,8 +10696,7 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "node_modules/utila": { "version": "0.4.0", diff --git a/package.json b/package.json index 3ceff7f..c408a92 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,8 @@ "dependencies": { "axios": "^1.4.0", "core-js": "^3.8.3", + "docx-preview": "^0.1.18", + "downloadjs": "^1.4.7", "element-ui": "^2.15.13", "vue": "^2.6.14", "vue-router": "^3.5.1", diff --git a/src/api/supplierManage/supplier.js b/src/api/supplierManage/supplier.js index f044c73..94cad95 100644 --- a/src/api/supplierManage/supplier.js +++ b/src/api/supplierManage/supplier.js @@ -81,6 +81,12 @@ params: data }) } +// 涓嬭浇鍚堝悓 +export const downloadContract = async (data) => { + return await axios.get(`/api/con/downloadContract`, { + params: data + }) +} // 鏇存柊鎵�灞炶涓� export function updateIndustry(data) { diff --git a/src/router/index.js b/src/router/index.js index 0a8541f..4834a64 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -11,6 +11,7 @@ const supplierManage = (resolve) => require(["@/views/supplierManage/index"], resolve) const purchaseManage = (resolve) => require(["@/views/purchaseManage/index"], resolve) const productManage = (resolve) => require(["@/views/productManage/index"], resolve) +const PreviewFile = (resolve) => require(["@/views/supplierManage/supplier/PreviewFile"], resolve) export const routes = [ { @@ -68,6 +69,14 @@ } }, { + path: "/PreviewFile", + component: PreviewFile, + meta: { + isLogin: true, + title: "棰勮" + } + }, + { path: "*", component: () => import("@/views/other/error/404"), meta: { diff --git a/src/views/supplierManage/supplier/AddSupplier.vue b/src/views/supplierManage/supplier/AddSupplier.vue index 52038bd..2fb6519 100644 --- a/src/views/supplierManage/supplier/AddSupplier.vue +++ b/src/views/supplierManage/supplier/AddSupplier.vue @@ -160,7 +160,7 @@ <span style="margin-left: 5px">鍚堝悓闄勪欢</span> </div> </template> - <div class="annex-view"> + <div v-if="file_id === 0" class="annex-view"> <div @click="addAnnexClick"> <el-upload class="upload-demo" @@ -178,13 +178,15 @@ </el-upload> </div> </div> - <div v-if="file_name && file_name.length > 0" class="file-content"> + <!-- v-if="file_name && file_name.length > 0" --> + <div v-else class="file-content"> <div>{{ file_name }}</div> <div> - <el-button type="text">棰勮</el-button> - <el-button type="text">涓嬭浇</el-button> - <el-button type="text">鍒犻櫎</el-button> + <el-button type="text" @click="previewClick" style="margin-left: 10px">棰勮</el-button> + <el-button type="text" @click="downloadClick">涓嬭浇</el-button> + <el-button type="text" @click="delContractClick">鍒犻櫎</el-button> </div> + <div ref="file"></div> </div> </el-form-item> </el-col> @@ -208,11 +210,15 @@ createContract, updateSupplier, getIndustryList, - previewContract + getSupplierTypeList, + deleteContract + // previewContract } from "@/api/supplierManage/supplier" import EditDropdownDialog from "@/views/other/commonDialog/EditDropdownDialog" -import { getSupplierTypeList } from "@/api/supplierManage/supplier" import { getMemberListFromGrpc } from "@/api/common/other" +import download from "downloadjs" +// import { renderAsync } from "docx-preview" +// import axios from "axios" export default { name: "AddSupplierDialog", props: { @@ -263,8 +269,10 @@ infomation: {} }, fileList: [], - file_name: "", - file_id: this.addCommonConfig.infomation.fileId + file_name: this.addCommonConfig.infomation.file_name, + file_id: this.addCommonConfig.infomation.fileId, + previewUrl: "", + loading: false } }, created() { @@ -272,7 +280,7 @@ this.getIndustryList() this.getMemberList() if (this.editConfig.title === "淇敼") { - this.previewContract() + // this.previewContract() } }, methods: { @@ -302,14 +310,6 @@ pageSize: 100 }).then((res) => { this.industryOptions = res.data.data.list - }) - }, - // 鍚堝悓闄勪欢淇℃伅 - async previewContract() { - await previewContract({ - id: 1 - }).then((res) => { - console.log(res.data) }) }, handleClose() { @@ -364,7 +364,7 @@ name: data.name || "", number: data.number || "", phone: data.phone || "", - responsiblePersonId: data.responsiblePersonId || 0, + responsiblePersonName: data.responsiblePersonName || "", status: data.status || 0, supplierType: data.supplierType || "", url: data.url || "" @@ -416,6 +416,37 @@ handleExceed(files, fileList) { console.log(fileList) this.$message.warning(`褰撳墠闄愬埗閫夋嫨 1 涓枃浠讹紝鏈閫夋嫨浜� ${files.length} 涓枃浠禶) + }, + // 涓嬭浇鍚堝悓 + downloadClick() { + let url = "/api/con/downloadContract?id=" + this.file_id + download(url, "", "") + }, + // 鍒犻櫎鍚堝悓 + delContractClick() { + deleteContract({ + id: this.file_id + }).then((res) => { + console.log(res) + this.$message.success(res.msg) + this.file_id = 0 + }) + }, + // 棰勮鍚堝悓 + async previewClick() { + this.previewUrl = "/api/con/previewContract?id=" + this.file_id + if (this.file_name.includes("pdf")) { + window.open(this.previewUrl, "_blank") + } else { + let routeUrl = this.$router.resolve({ + path: "/PreviewFile", + query: { + //瑕佷紶鐨勫弬鏁� + previewUrl: this.previewUrl + } + }) + window.open(routeUrl.href, "_blank") + } } } } diff --git a/src/views/supplierManage/supplier/DetailSupplier.vue b/src/views/supplierManage/supplier/DetailSupplier.vue index 432702a..8155de0 100644 --- a/src/views/supplierManage/supplier/DetailSupplier.vue +++ b/src/views/supplierManage/supplier/DetailSupplier.vue @@ -69,7 +69,9 @@ </ul> <div class="business_scope"> <div class="content-title">{{ "鍚堝悓闄勪欢" }}</div> - <div class="content-data">{{ record ? record : "--" }}</div> + <div class="content-data"> + {{ detailConfig.infomation.contract.fileName ? detailConfig.infomation.contract.fileName : "--" }} + </div> </div> </div> </div> diff --git a/src/views/supplierManage/supplier/PreviewFile.vue b/src/views/supplierManage/supplier/PreviewFile.vue new file mode 100644 index 0000000..a0c198e --- /dev/null +++ b/src/views/supplierManage/supplier/PreviewFile.vue @@ -0,0 +1,61 @@ +<template> + <div class="docx-container"> + <div ref="file"></div> + </div> +</template> + +<script> +import axios from "axios" +import { renderAsync } from "docx-preview" + +export default { + props: { + url: { + type: String, + default: "" + } + }, + data() { + return { + docxOptions: { + className: "kaimo-docx-666", // string锛氶粯璁ゅ拰鏂囨。鏍峰紡绫荤殑绫诲悕/鍓嶇紑 + inWrapper: true, // boolean锛氬惎鐢ㄥ洿缁曟枃妗e唴瀹圭殑鍖呰鍣ㄦ覆鏌� + ignoreWidth: false, // boolean锛氱鐢ㄩ〉闈㈢殑娓叉煋瀹藉害 + ignoreHeight: false, // boolean锛氱姝㈡覆鏌撻〉闈㈤珮搴� + ignoreFonts: false, // boolean锛氱鐢ㄥ瓧浣撴覆鏌� + breakPages: true, // boolean锛氬湪鍒嗛〉绗︿笂鍚敤鍒嗛〉 + ignoreLastRenderedPageBreak: false, // boolean锛氬湪 lastRenderedPageBreak 鍏冪礌涓婄鐢ㄥ垎椤� + experimental: true, // boolean锛氬惎鐢ㄥ疄楠屽姛鑳斤紙鍒惰〃绗﹀仠姝㈣绠楋級 + trimXmlDeclaration: true, // boolean锛氬鏋滀负true锛岃В鏋愬墠浼氫粠xmlTemplate 鏂囨。涓Щ闄� xmlTemplate 澹版槑 + useBase64URL: false, // boolean锛氬鏋滀负true锛屽浘鐗囥�佸瓧浣撶瓑浼氳浆涓篵ase 64 URL锛屽惁鍒欎娇鐢║RL.createObjectURL + useMathMLPolyfill: false, // boolean锛氬寘鎷敤浜� chrome銆乪dge 绛夌殑 MathML polyfill銆� + showChanges: false, // boolean锛氬惎鐢ㄦ枃妗f洿鏀圭殑瀹為獙鎬ф覆鏌擄紙鎻掑叆/鍒犻櫎锛� + debug: false // boolean锛氬惎鐢ㄩ澶栫殑鏃ュ織璁板綍 + } + } + }, + mounted() { + this.renderFile() + }, + methods: { + renderFile() { + console.log(this.url) + var previewUrl = this.$route.query.previewUrl + axios({ + method: "get", + responseType: "blob", + url: previewUrl + }).then((response) => { + renderAsync(response.data, this.$refs.file, null, this.docxOptions) + }) + } + } +} +</script> + +<style scoped> +.docx-container ::v-deep .docx-wrapper { + background-color: #fff; + padding: 40px 40px; +} +</style> diff --git a/src/views/supplierManage/supplier/index.vue b/src/views/supplierManage/supplier/index.vue index c192460..77a5721 100644 --- a/src/views/supplierManage/supplier/index.vue +++ b/src/views/supplierManage/supplier/index.vue @@ -282,6 +282,7 @@ addBtnClick() { this.editConfig.visible = true this.editConfig.title = "鏂板缓" + this.editConfig.infomation = { fileId: 0 } }, // 鍚敤渚涘簲鍟� async enableClick(row, value) { @@ -300,7 +301,7 @@ modifyClick(row) { this.editConfig.visible = true this.editConfig.title = "淇敼" - this.editConfig.infomation = { ...row } + this.editConfig.infomation = { ...row, file_name: row.contract.fileName } }, // 鐩稿叧渚涘簲鍟� raleteClick(row) { -- Gitblit v1.8.0