From 1d42d6b0b26a7560f51754001e08895ac70df308 Mon Sep 17 00:00:00 2001 From: lion <120344285@qq.com> Date: Wed, 24 Sep 2025 17:47:01 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B5=84=E9=87=91=E6=89=A7=E8=A1=8C=E7=8E=87?= =?UTF-8?q?=E5=AF=BC=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/departmentProgress/index.js | 33 ++--- src/utils/downloadRequest.js | 125 ++++++++++++++++++ .../components/departmentProgressDetail.vue | 29 +++- 3 files changed, 168 insertions(+), 19 deletions(-) create mode 100644 src/utils/downloadRequest.js diff --git a/src/api/departmentProgress/index.js b/src/api/departmentProgress/index.js index a6b1740..b2f6624 100644 --- a/src/api/departmentProgress/index.js +++ b/src/api/departmentProgress/index.js @@ -1,28 +1,31 @@ import request from '@/utils/request' function customParamsSerializer(params) { - let result = '' - for (const key in params) { + let result = ''; + for (let key in params) { if (params.hasOwnProperty(key)) { if (Array.isArray(params[key])) { - params[key].forEach((item, index) => { - if (item instanceof Array) { - item.forEach((item1, index1) => { - result += `${key}[${index}][${index1}]=${item1}&` - }) - } else if (typeof item === 'object') { - for (const key1 in item) { - result += `${key}[${index}][${key1}]=${item[key1]}&` - } + params[key].forEach((item,index) => { + if(item.key){ + result += `${key}[${index}][key]=${item.key}&${key}[${index}][op]=${item.op}&${key}[${index}][value]=${item.value}&`; + + }else{ + result +=`${key}[${index}]=${item}&` } - // result += `${key}[${index}][key]=${item.key}&${key}[${index}][op]=${item.op}&${key}[${index}][value]=${item.value}&`; - }) + }); + }else if( typeof params[key] === 'object' ){ + for(var k in params[key]){ + result +=`${key}[${k}]=${params[key][k]}&` + } } else { - result += `${key}=${params[key]}&` + result += `${key}=${params[key]}&`; } } } - return result.slice(0, -1) + + // result += 'token='+getToken() + console.log("result",result, result.slice(0, -1)) + return result.slice(0, -1); } export function endIndex(params, noloading = false) { return request({ diff --git a/src/utils/downloadRequest.js b/src/utils/downloadRequest.js new file mode 100644 index 0000000..166c419 --- /dev/null +++ b/src/utils/downloadRequest.js @@ -0,0 +1,125 @@ +import axios from "axios"; +import { getToken } from "@/utils/auth"; +import { Loading, Message } from "element-ui"; + +/* + * @params {string} url 请求拼接地址 + * @params {object} info 请求参数params或data + */ + +let loading; +function customParamsSerializer(params) { + let result = ''; + for (let key in params) { + if (params.hasOwnProperty(key)) { + if (Array.isArray(params[key])) { + params[key].forEach((item,index) => { + if(item.key){ + result += `${key}[${index}][key]=${item.key}&${key}[${index}][op]=${item.op}&${key}[${index}][value]=${item.value}&`; + + }else{ + result +=`${key}[${index}]=${item}&` + } + }); + }else if( typeof params[key] === 'object' ){ + for(var k in params[key]){ + result +=`${key}[${k}]=${params[key][k]}&` + } + } else { + result += `${key}=${params[key]}&`; + } + } + } + + // result += 'token='+getToken() + console.log("result",result, result.slice(0, -1)) + return result.slice(0, -1); +} + +export async function download(url, method = "get", info, filename) { + loading = Loading.service({ + lock: true, + background: "rgba(0,0,0,0.4)", + text: "文件正在生成中...", + }); + + let options = { + baseURL: process.env.VUE_APP_BASE_API, + url, + method, + responseType: "blob", + timeout: 10000, + headers: { + Accept: "application/json", + "Content-Type": "application/json; charset=utf-8", + withCredentials: true, + Authorization: "Bearer " + getToken(), + }, + }; + if (method === "get") { + // options.url = url+'?'+customParamsSerializer(info) + Object.defineProperty(options, "params", { + value: info, + enumerable: true, + writable: false, + }); + } + if (method === "post") { + Object.defineProperty(options, "data", { + value: info, + enumerable: true, + writable: false, + }); + } + + try { + if(options.method==='get'){ + options.paramsSerializer = customParamsSerializer + } + console.log("options",options) + const response = await axios.request(options); + + loading.close(); + + // 提取文件名 + if (!filename) { + filename = + response.headers["content-disposition"]?.match(/filename=(.*)/)[1] || + ""; + } + + // 将二进制流转为blob + const blob = new Blob([response.data], { + type: "application/octet-stream", + }); + if (typeof window.navigator.msSaveBlob !== "undefined") { + // 兼容IE,window.navigator.msSaveBlob:以本地方式保存文件 + window.navigator.msSaveBlob(blob, decodeURI(filename)); + } else { + // 创建新的URL并指向File对象或者Blob对象的地址 + const blobURL = window.URL.createObjectURL(blob); + // 创建a标签,用于跳转至下载链接 + const tempLink = document.createElement("a"); + tempLink.style.display = "none"; + tempLink.href = blobURL; + tempLink.setAttribute("download", decodeURI(filename)); + // 兼容:某些浏览器不支持HTML5的download属性 + if (typeof tempLink.download === "undefined") { + tempLink.setAttribute("target", "_blank"); + } + // 挂载a标签 + document.body.appendChild(tempLink); + tempLink.click(); + document.body.removeChild(tempLink); + // 释放blob URL地址 + window.URL.revokeObjectURL(blobURL); + } + } catch (err) { + console.error(err); + loading.close(); + Message({ + type: "error", + message: err, + }); + } +} diff --git a/src/views/departmentProgress/components/departmentProgressDetail.vue b/src/views/departmentProgress/components/departmentProgressDetail.vue index d761aad..a166f13 100644 --- a/src/views/departmentProgress/components/departmentProgressDetail.vue +++ b/src/views/departmentProgress/components/departmentProgressDetail.vue @@ -36,7 +36,9 @@ -
已执行项目(财务付款确认) +
+ 已执行项目(财务付款确认) + 导出