From bb09255dbd63da86a390d390237cea56e0723647 Mon Sep 17 00:00:00 2001 From: niannian zheng Date: Mon, 2 Mar 2026 17:19:55 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E7=BB=9F=E4=B8=80=E7=AD=96=E7=95=A5?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=AD=97=E6=AE=B5=E5=91=BD=E5=90=8D=E5=B9=B6?= =?UTF-8?q?=E9=87=8D=E6=9E=84=E5=8F=82=E6=95=B0=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将策略数据字段从大驼峰命名改为小驼峰命名,保持前后端一致性 重构参数处理逻辑,将参数配置统一序列化为JSON字符串存储 --- pages/config/config.vue | 6 +-- pages/strategies/edit/edit.vue | 65 ++++++++++++++++----------------- pages/strategies/strategies.vue | 17 +++++---- 3 files changed, 43 insertions(+), 45 deletions(-) diff --git a/pages/config/config.vue b/pages/config/config.vue index be18f36..d399d4e 100644 --- a/pages/config/config.vue +++ b/pages/config/config.vue @@ -130,9 +130,9 @@ const fetchStrategies = async () => { const response = await api.strategies.getStrategies(); if (response.code === 200) { strategies.value = response.data.map(item => ({ - id: item.Id, - name: item.Title, - desc: item.Description, + id: item.id, + name: item.name, + desc: item.description, color: '#10B981' })); } diff --git a/pages/strategies/edit/edit.vue b/pages/strategies/edit/edit.vue index f122447..37fe391 100644 --- a/pages/strategies/edit/edit.vue +++ b/pages/strategies/edit/edit.vue @@ -307,26 +307,18 @@ const submit = async () => { tags = [currentStrategyInfo.value.tag]; } - const strategyData = { - name: formData.value.name, - type: currentType.value, - description: formData.value.description || currentStrategyInfo.value.description, - riskLevel: formData.value.riskLevel, - tags: tags, - parameters: {} - }; - + // 构建参数对象 + const parameters = {}; + switch (currentType.value) { case 'ma_trend': if (!formData.value.shortPeriod || !formData.value.longPeriod) { uni.showToast({ title: '请输入短期和长期周期', icon: 'none' }); return; } - strategyData.parameters = { - maType: formData.value.maType, - shortPeriod: parseInt(formData.value.shortPeriod), - longPeriod: parseInt(formData.value.longPeriod) - }; + parameters.maType = formData.value.maType; + parameters.shortPeriod = parseInt(formData.value.shortPeriod); + parameters.longPeriod = parseInt(formData.value.longPeriod); break; case 'risk_parity': if (!formData.value.lookbackPeriod || !formData.value.rebalanceThreshold) { @@ -336,28 +328,33 @@ const submit = async () => { if (!validateRiskParityAssets()) { return; } - strategyData.parameters = { - lookbackPeriod: parseInt(formData.value.lookbackPeriod), - rebalanceThreshold: parseFloat(formData.value.rebalanceThreshold), - assets: formData.value.assets.map(asset => ({ - symbol: asset.symbol, - targetWeight: parseFloat(asset.targetWeight) - })) - }; + parameters.lookbackPeriod = parseInt(formData.value.lookbackPeriod); + parameters.rebalanceThreshold = parseFloat(formData.value.rebalanceThreshold); + parameters.assets = formData.value.assets.map(asset => ({ + symbol: asset.symbol, + targetWeight: parseFloat(asset.targetWeight) + })); break; case 'chandelier_exit': if (!formData.value.period || !formData.value.multiplier) { uni.showToast({ title: '请输入ATR周期和倍数', icon: 'none' }); return; } - strategyData.parameters = { - period: parseInt(formData.value.period), - multiplier: parseFloat(formData.value.multiplier), - useClose: formData.value.useClose - }; + parameters.period = parseInt(formData.value.period); + parameters.multiplier = parseFloat(formData.value.multiplier); + parameters.useClose = formData.value.useClose; break; } + const strategyData = { + name: formData.value.name, + type: currentType.value, + description: formData.value.description || currentStrategyInfo.value.description, + riskLevel: formData.value.riskLevel, + tags: tags, + config: JSON.stringify(parameters) + }; + console.log('保存策略:', strategyData); uni.showLoading({ title: isEditMode.value ? '更新中' : '保存中' }); @@ -391,17 +388,17 @@ const loadStrategyDetail = async (id) => { if (response.code === 200) { const data = response.data; isEditMode.value = true; - strategyId.value = data.Id; - currentType.value = data.Type; + strategyId.value = data.id; + currentType.value = data.type; // 填充表单数据 - formData.value.name = data.Title || ''; - formData.value.description = data.Description || ''; - formData.value.riskLevel = data.RiskLevel || 'medium'; - formData.value.tags = data.Tags ? data.Tags.join(', ') : ''; + formData.value.name = data.name || ''; + formData.value.description = data.description || ''; + formData.value.riskLevel = data.riskLevel || 'medium'; + formData.value.tags = data.tags ? data.tags.join(', ') : ''; // 根据策略类型填充参数 - const params = data.Parameters || {}; + const params = data.config ? JSON.parse(data.config) : {}; switch (data.Type) { case 'ma_trend': formData.value.maType = params.maType || 'SMA'; diff --git a/pages/strategies/strategies.vue b/pages/strategies/strategies.vue index c0a0369..5e071da 100644 --- a/pages/strategies/strategies.vue +++ b/pages/strategies/strategies.vue @@ -73,14 +73,15 @@ const fetchStrategies = async () => { const response = await api.strategies.getStrategies(); if (response.code === 200) { strategies.value = response.data.map(item => ({ - id: item.Id, - title: item.Title, - tag: item.Tags?.[0] || '策略', - desc: item.Description, - tags: item.Tags || [], - bgClass: item.Type === 'ma_trend' ? 'bg-emerald-900' : item.Type === 'risk_parity' ? 'bg-blue-600' : 'bg-orange-500', - tagClass: item.Type === 'ma_trend' ? 'text-emerald-700' : item.Type === 'risk_parity' ? 'text-blue-700' : 'text-orange-700', - iconChar: item.Title?.charAt(0) || 'S', + id: item.id, + title: item.name, + tag: item.tags?.[0] || '策略', + desc: item.description, + tags: item.tags || [], + riskLevel: item.riskLevel, + bgClass: item.type === 'ma_trend' ? 'bg-emerald-900' : item.type === 'risk_parity' ? 'bg-blue-600' : 'bg-orange-500', + tagClass: item.type === 'ma_trend' ? 'text-emerald-700' : item.type === 'risk_parity' ? 'text-blue-700' : 'text-orange-700', + iconChar: item.name?.charAt(0) || 'S', btnClass: 'btn-primary', btnText: '配置' }));