diff --git a/cwd-admin/src/api/admin.ts b/cwd-admin/src/api/admin.ts index c0e0405..5838bba 100644 --- a/cwd-admin/src/api/admin.ts +++ b/cwd-admin/src/api/admin.ts @@ -424,5 +424,9 @@ export function deleteS3Backup(key: string): Promise<{ message: string }> { } export function downloadS3BackupUrl(key: string): string { - return `/admin/backup/s3/download?key=${encodeURIComponent(key)}`; + const rawEnvApiBaseUrl = (import.meta.env.VITE_API_BASE_URL || '').trim(); + const stored = (localStorage.getItem('cwd_admin_api_base_url') || '').trim(); + const source = stored || rawEnvApiBaseUrl; + const apiBaseUrl = source.replace(/\/+$/, ''); + return `${apiBaseUrl}/admin/backup/s3/download?key=${encodeURIComponent(key)}`; } diff --git a/cwd-admin/src/api/http.ts b/cwd-admin/src/api/http.ts index 1213f8d..ed97cce 100644 --- a/cwd-admin/src/api/http.ts +++ b/cwd-admin/src/api/http.ts @@ -1,6 +1,6 @@ const rawEnvApiBaseUrl = (import.meta.env.VITE_API_BASE_URL || '').trim(); -function getApiBaseUrl(): string { +export function getApiBaseUrl(): string { const stored = (localStorage.getItem('cwd_admin_api_base_url') || '').trim(); const source = stored || rawEnvApiBaseUrl; const apiBaseUrl = source.replace(/\/+$/, ''); diff --git a/cwd-admin/src/views/DataView/components/S3BackupModal.vue b/cwd-admin/src/views/DataView/components/S3BackupModal.vue index 3669341..d829951 100644 --- a/cwd-admin/src/views/DataView/components/S3BackupModal.vue +++ b/cwd-admin/src/views/DataView/components/S3BackupModal.vue @@ -57,9 +57,9 @@ import { useI18n } from "vue-i18n"; import { fetchS3BackupList, deleteS3Backup, - downloadS3BackupUrl, S3BackupItem, } from "../../../api/admin"; +import { getApiBaseUrl } from "../../../api/http"; const props = defineProps<{ visible: boolean; @@ -83,9 +83,34 @@ const handleClose = () => { emit("close"); }; -const handleDownload = (key: string) => { - const url = downloadS3BackupUrl(key); - window.open(url, "_blank"); +const handleDownload = async (key: string) => { + try { + const apiBaseUrl = getApiBaseUrl(); + const token = localStorage.getItem('cwd_admin_token'); + const url = `${apiBaseUrl}/admin/backup/s3/download?key=${encodeURIComponent(key)}`; + + const res = await fetch(url, { + method: 'GET', + headers: token ? { 'Authorization': `Bearer ${token}` } : {}, + }); + + if (!res.ok) { + throw new Error(`下载失败: ${res.status} ${res.statusText}`); + } + + const blob = await res.blob(); + const fileName = key; + + const a = document.createElement('a'); + a.href = window.URL.createObjectURL(blob); + a.download = fileName; + document.body.appendChild(a); + a.click(); + window.URL.revokeObjectURL(a.href); + document.body.removeChild(a); + } catch (e: any) { + console.error('Download error:', e); + } }; const handleDelete = async (key: string) => {