From c01c1a33d4b8b76cccbab0292113d9c8e40d3809 Mon Sep 17 00:00:00 2001 From: Julian Freeman Date: Wed, 26 Nov 2025 09:37:29 -0400 Subject: [PATCH] custom export --- src/App.vue | 47 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/src/App.vue b/src/App.vue index 3dd379b..09f92f7 100644 --- a/src/App.vue +++ b/src/App.vue @@ -272,7 +272,52 @@ function getProgressStyle(used, total) { function getBatteryColor(p) { return p < 50 ? '#ff4757' : (p < 80 ? '#ffa502' : '#2ed573'); } function formatTime(t) { return !t ? "Unknown Time" : t.replace('T', ' ').substring(0, 19); } -async function exportReport() { /* ... */ if (!isReportValid.value) return; try { const blob = new Blob([JSON.stringify(report.value, null, 2)], { type: "application/json" }); const url = URL.createObjectURL(blob); const link = document.createElement('a'); link.href = url; link.download = `SystemDoctor_Report_${new Date().toISOString().slice(0, 19).replace(/[:T]/g, "-")}.json`; document.body.appendChild(link); link.click(); document.body.removeChild(link); URL.revokeObjectURL(url); triggerToast('导出成功', '文件已保存'); } catch (err) { triggerToast('导出失败', err.message, 'error'); } } +// --- 导出/导入 --- +async function exportReport() { + if (!isReportValid.value) return; + + const fileName = `SystemDoctor_Report_${new Date().toISOString().slice(0, 19).replace(/[:T]/g, "-")}.json`; + const content = JSON.stringify(report.value, null, 2); + + // 1. 尝试使用现代浏览器 API (支持选择保存位置) + if ('showSaveFilePicker' in window) { + try { + const handle = await window.showSaveFilePicker({ + suggestedName: fileName, + types: [{ + description: 'JSON Report', + accept: { 'application/json': ['.json'] }, + }], + }); + const writable = await handle.createWritable(); + await writable.write(content); + await writable.close(); + triggerToast('导出成功', '文件已保存到指定位置', 'success'); + return; + } catch (err) { + if (err.name === 'AbortError') return; // 用户取消 + console.warn("File System Access API warning:", err); + // 继续执行降级方案 + } + } + + // 2. 降级方案:传统的 Blob 下载 (通常保存到下载文件夹) + try { + const blob = new Blob([content], { type: "application/json" }); + const url = URL.createObjectURL(blob); + const link = document.createElement('a'); + link.href = url; + link.download = fileName; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + URL.revokeObjectURL(url); + triggerToast('导出成功', '已保存到默认下载目录', 'success'); + } catch (err) { + triggerToast('导出失败', err.message, 'error'); + } +} + function triggerImport() { fileInput.value.click(); } function handleFileImport(event) { const file = event.target.files[0]; if (!file) return; const reader = new FileReader(); reader.onload = (e) => { try { const json = JSON.parse(e.target.result); if (json && (json.hardware || json.storage)) { report.value = json; scanFinished.value = false; triggerToast('导入成功', '已加载历史报告'); } else { triggerToast('导入失败', '文件格式错误', 'error'); } } catch (err) { triggerToast('解析失败', err.message, 'error'); } }; reader.readAsText(file); event.target.value = ''; }