From 589e6138f9b7feff80be9ef0fc216e92d33ed7c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A9=AC=E6=A2=93=E5=BD=AD?= Date: Mon, 30 Mar 2026 16:05:01 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B5=9B=E4=BA=8B=E7=BC=96=E6=8E=92=E5=AF=BC?= =?UTF-8?q?=E5=87=BA=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/match/eventarrangement.js | 2 +- src/views/match/manage/work.vue | 36 ++++++++++++++++++++++++++++++- 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/src/api/match/eventarrangement.js b/src/api/match/eventarrangement.js index 7ba281d..fc213bf 100644 --- a/src/api/match/eventarrangement.js +++ b/src/api/match/eventarrangement.js @@ -58,7 +58,7 @@ export const eventarrangementPreviewPost = (eventid) => { /** * 导出编排 * @param {number} eventid - 赛事ID (路径参数) - * @returns {Promise} 返回导出文件URL + * @returns {Promise} 返回Base64编码的文件内容 */ export const eventarrangementExportPost = (eventid) => { return http.post(`/eventarrangement/export/${eventid}`); diff --git a/src/views/match/manage/work.vue b/src/views/match/manage/work.vue index 5b56a99..b191378 100644 --- a/src/views/match/manage/work.vue +++ b/src/views/match/manage/work.vue @@ -380,8 +380,42 @@ const onSave = async () => { } //export default { +const downloadByBlob = (blob, filename = '赛事编排.xlsx') => { + const url = window.URL.createObjectURL(blob); + const link = document.createElement('a'); + link.href = url; + link.download = filename; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + window.URL.revokeObjectURL(url); +}; + const getArr = async () => { - const res = await eventarrangementExportPost(initParam.value.id); + try { + const { succeeded, data, errors } = await eventarrangementExportPost(initParam.value.id); + if (!succeeded) { + ElMessage.error(errors || '导出失败'); + return; + } + if (!data) { + ElMessage.warning('未获取到导出文件'); + return; + } + // data 是 Base64 编码的文件内容,解码为二进制并下载 + const byteCharacters = atob(data); + const byteNumbers = new Array(byteCharacters.length); + for (let i = 0; i < byteCharacters.length; i++) { + byteNumbers[i] = byteCharacters.charCodeAt(i); + } + const byteArray = new Uint8Array(byteNumbers); + const blob = new Blob([byteArray], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' }); + downloadByBlob(blob, '赛事编排.xlsx'); + ElMessage.success('导出成功'); + } catch (error) { + console.error('导出失败:', error); + ElMessage.error('导出失败'); + } }