From 02a1a087abfc82fbe6d7c027d24f306a3ed66f52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=96=87=E8=96=87=E5=AE=89?= Date: Tue, 3 Feb 2026 13:51:49 +0800 Subject: [PATCH] 1 --- frontend/src/components/TradeList.jsx | 129 +++++++++++++++----------- 1 file changed, 75 insertions(+), 54 deletions(-) diff --git a/frontend/src/components/TradeList.jsx b/frontend/src/components/TradeList.jsx index 9e0b458..539c2e6 100644 --- a/frontend/src/components/TradeList.jsx +++ b/frontend/src/components/TradeList.jsx @@ -83,7 +83,8 @@ const TradeList = () => { } // 导出当前订单数据(含入场/离场原因、入场思路等完整字段,便于后续分析) - const handleExport = () => { + // type: 'csv' | 'json' + const handleExport = (type = 'csv') => { if (trades.length === 0) { alert('暂无数据可导出') return @@ -137,58 +138,73 @@ const TradeList = () => { return row }) - // 转换为CSV格式 helper - const convertToCSV = (objArray) => { - const array = typeof objArray !== 'object' ? JSON.parse(objArray) : objArray; - let str = ''; - - if (array.length === 0) return ''; - - // Header - const headers = Object.keys(array[0]); - str += headers.join(',') + '\r\n'; - - // Rows - for (let i = 0; i < array.length; i++) { - let line = ''; - for (const index in array[i]) { - if (line !== '') line += ','; - - let value = array[i][index]; - if (value === null || value === undefined) { - value = ''; - } else { - value = String(value); - } - - // Escape quotes and wrap in quotes if necessary - // Excel needs double quotes to be escaped as "" - if (value.search(/("|,|\n|\r)/g) >= 0) { - value = '"' + value.replace(/"/g, '""') + '"'; - } - line += value; - } - str += line + '\r\n'; - } - return str; - } - - // 生成文件名 const timestamp = new Date().toISOString().slice(0, 19).replace(/:/g, '-') - const filename = `交易记录_${timestamp}.csv` + + if (type === 'json') { + const filename = `交易记录_${timestamp}.json` + const dataStr = JSON.stringify(exportData, null, 2) + const dataBlob = new Blob([dataStr], { type: 'application/json' }) + const url = URL.createObjectURL(dataBlob) + const link = document.createElement('a') + link.href = url + link.download = filename + document.body.appendChild(link) + link.click() + document.body.removeChild(link) + URL.revokeObjectURL(url) + } else { + // 转换为CSV格式 helper + const convertToCSV = (objArray) => { + const array = typeof objArray !== 'object' ? JSON.parse(objArray) : objArray; + let str = ''; + + if (array.length === 0) return ''; - // 创建并下载文件 (CSV with BOM for Excel) - const csvStr = convertToCSV(exportData) - const bom = '\uFEFF' - const dataBlob = new Blob([bom + csvStr], { type: 'text/csv;charset=utf-8;' }) - const url = URL.createObjectURL(dataBlob) - const link = document.createElement('a') - link.href = url - link.download = filename - document.body.appendChild(link) - link.click() - document.body.removeChild(link) - URL.revokeObjectURL(url) + // Header + const headers = Object.keys(array[0]); + str += headers.join(',') + '\r\n'; + + // Rows + for (let i = 0; i < array.length; i++) { + let line = ''; + for (const index in array[i]) { + if (line !== '') line += ','; + + let value = array[i][index]; + if (value === null || value === undefined) { + value = ''; + } else if (typeof value === 'object') { + value = JSON.stringify(value); + } else { + value = String(value); + } + + // Escape quotes and wrap in quotes if necessary + // Excel needs double quotes to be escaped as "" + if (value.search(/("|,|\n|\r)/g) >= 0) { + value = '"' + value.replace(/"/g, '""') + '"'; + } + line += value; + } + str += line + '\r\n'; + } + return str; + } + + const filename = `交易记录_${timestamp}.csv` + // 创建并下载文件 (CSV with BOM for Excel) + const csvStr = convertToCSV(exportData) + const bom = '\uFEFF' + const dataBlob = new Blob([bom + csvStr], { type: 'text/csv;charset=utf-8;' }) + const url = URL.createObjectURL(dataBlob) + const link = document.createElement('a') + link.href = url + link.download = filename + document.body.appendChild(link) + link.click() + document.body.removeChild(link) + URL.revokeObjectURL(url) + } } // 复制统计数据到剪贴板 @@ -373,9 +389,14 @@ const TradeList = () => { 重置 {trades.length > 0 && ( - + <> + + + )}