From d070135a7a886422d045f8949bf546d2e41cb402 Mon Sep 17 00:00:00 2001 From: songjie Date: Fri, 23 Jan 2026 15:19:28 +0800 Subject: [PATCH] =?UTF-8?q?=E5=93=8D=E5=BA=94=E6=8B=A6=E6=88=AA=E5=99=A8?= =?UTF-8?q?=E5=8A=A0=E5=85=A5pdf=E6=8B=A6=E6=88=AA=EF=BC=9B=E5=AF=B9?= =?UTF-8?q?=E6=8E=A5=E5=AF=BC=E5=87=BAPDF=E6=8E=A5=E5=8F=A3=E5=AE=8C?= =?UTF-8?q?=E6=88=90=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/platformData.js | 23 +++++++++++++++++++++++ src/utils/myAxios.js | 5 +++++ src/views/PlatformData/UserOverview.vue | 32 ++++++++++++++++++++++++++++++-- 3 files changed, 58 insertions(+), 2 deletions(-) diff --git a/src/api/platformData.js b/src/api/platformData.js index e3e7aba..a07c4ce 100644 --- a/src/api/platformData.js +++ b/src/api/platformData.js @@ -39,3 +39,26 @@ export function getUserFullReportList(params) { data: formData }) } + +// 导出用户数据明细 PDF +export function exportUserFullReport(params) { + const formData = new FormData(); + formData.append('token', localStorage.getItem('token')); + if (params) { + if (params.start_time) formData.append('start_time', params.start_time); + if (params.end_time) formData.append('end_time', params.end_time); + } + + return request({ + url: 'http://280e5e98.r7.cpolar.top/admin/user/fullReport/list/exportPDF', + method: 'post', + headers: { + 'token': localStorage.getItem('token'), + 'client': 'ios', + 'version': '1', + 'Content-Type': 'multipart/form-data' + }, + data: formData, + responseType: 'blob' // Important for file download + }) +} diff --git a/src/utils/myAxios.js b/src/utils/myAxios.js index 9b21b9b..f78cf34 100644 --- a/src/utils/myAxios.js +++ b/src/utils/myAxios.js @@ -37,6 +37,11 @@ myAxios.interceptors.request.use( // 响应拦截器:处理响应数据、统一错误提示 myAxios.interceptors.response.use( (response) => { + // 如果响应类型是 blob,直接返回整个 response.data + if (response.config.responseType === 'blob' || response.headers['content-type']?.includes('application/pdf')) { + return response.data; + } + const res = response.data // 假设后端接口规范:成功时 code=200,其他为错误 diff --git a/src/views/PlatformData/UserOverview.vue b/src/views/PlatformData/UserOverview.vue index 06c5c77..1a8691f 100644 --- a/src/views/PlatformData/UserOverview.vue +++ b/src/views/PlatformData/UserOverview.vue @@ -106,7 +106,7 @@ /> 搜索 重置 - 数据导出 + 数据导出 @@ -185,7 +185,8 @@ import { ref, onMounted, nextTick, watch, computed } from 'vue'; import { useRoute, useRouter } from 'vue-router'; import * as echarts from 'echarts'; -import { getUserOverviewList, getUserFullReportList } from '../../api/platformData'; +import { getUserOverviewList, getUserFullReportList, exportUserFullReport } from '../../api/platformData'; +import { ElMessage } from 'element-plus'; const route = useRoute(); const router = useRouter(); @@ -342,6 +343,33 @@ const handleReset = () => { fetchDetailData(); }; +const handleExport = async () => { + loading.value = true; + let params = {}; + if (dateRange.value && dateRange.value.length === 2) { + params.start_time = formatDate(dateRange.value[0]); + params.end_time = formatDate(dateRange.value[1]); + } + + try { + const res = await exportUserFullReport(params); + // Blob 处理 + const blob = new Blob([res]); + const fileName = '用户数据明细.pdf'; + const link = document.createElement('a'); + link.href = window.URL.createObjectURL(blob); + link.download = fileName; + link.click(); + window.URL.revokeObjectURL(link.href); + ElMessage.success('导出成功'); + } catch (e) { + console.error('导出失败:', e); + ElMessage.error('导出失败'); + } finally { + loading.value = false; + } +}; + const initCharts = () => { if (activeTab.value === 'overview') { nextTick(() => {