From e07cf7cd81b82decac47309390cb96a4b913462e Mon Sep 17 00:00:00 2001 From: claude_dev Date: Thu, 13 Aug 2026 08:05:46 +0800 Subject: [PATCH] =?UTF-8?q?fix(portfolio):=20=E9=BB=98=E8=AE=A4=E6=97=A5?= =?UTF-8?q?=E6=9C=9F=E6=94=B9=E6=9C=80=E8=BF=911=E5=B9=B4+=E8=AE=B0?= =?UTF-8?q?=E5=BF=86;=20MOCK=5FON=3Dimport.meta.env.DEV(NAS=E6=9E=84?= =?UTF-8?q?=E5=BB=BA=E8=B5=B0=E7=9C=9F=E5=AE=9E,=E6=B2=BB=E7=BB=84?= =?UTF-8?q?=E5=90=88=E5=9B=9E=E6=B5=8B2022=E6=97=A5=E6=9C=9F/=E4=B8=8D?= =?UTF-8?q?=E5=9C=A8=E5=8E=86=E5=8F=B2mock=E5=81=87=E8=B1=A1)=20[nas]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/mock/index.ts | 4 ++- .../src/views/backtest/PortfolioBacktest.vue | 28 +++++++++++++++++-- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/frontend/src/mock/index.ts b/frontend/src/mock/index.ts index 35b3428..756e331 100644 --- a/frontend/src/mock/index.ts +++ b/frontend/src/mock/index.ts @@ -4,7 +4,9 @@ * 样板阶段用于让每个页面都有内容可看。接真实后端时无需改这里。 */ import * as D from './data' -export const MOCK_ON = true +// dev(npm run dev)=true 走 mock 假数据(本地无后端看原型);build(vite build)=false 走真实后端。 +// 这样 NAS/生产 dist 自动真实,Mac 本地 dev 自动 mock。 +export const MOCK_ON = import.meta.env.DEV type Builder = (url: string) => unknown interface Route { diff --git a/frontend/src/views/backtest/PortfolioBacktest.vue b/frontend/src/views/backtest/PortfolioBacktest.vue index c58dd38..972eeb3 100644 --- a/frontend/src/views/backtest/PortfolioBacktest.vue +++ b/frontend/src/views/backtest/PortfolioBacktest.vue @@ -26,15 +26,39 @@ const errorMsg = ref('') const stageHint = ref('') let pollTimer: ReturnType | null = null +function loadDateRange(): { start: string; end: string } { + try { + const s = localStorage.getItem('portfolio_date_range') + if (s) return JSON.parse(s) as { start: string; end: string } + } catch { + /* ignore */ + } + const end = new Date() + const start = new Date(end) + start.setFullYear(start.getFullYear() - 1) + const f = (d: Date): string => d.toISOString().slice(0, 10) + return { start: f(start), end: f(end) } +} +const dr = loadDateRange() const form = reactive({ pool: 'hs300_subset', strategy: 'all_weather', max_pool: 30, - start: '2024-01-01', - end: '2024-02-29', + start: dr.start, + end: dr.end, cash: 1_000_000, benchmark: '000300.XSHG', }) +watch( + () => [form.start, form.end], + ([s, e]) => { + try { + localStorage.setItem('portfolio_date_range', JSON.stringify({ start: s, end: e })) + } catch { + /* ignore */ + } + }, +) const poolOptions = [ { label: 'HS300 子集(小范围验证)', value: 'hs300_subset' },