From a7aab01f051487327e5ce52b6a8905208c546e8c Mon Sep 17 00:00:00 2001 From: "Somhairle H. Marisol" Date: Fri, 18 Sep 2026 15:49:44 +0800 Subject: [变更性质] feat(frontend) [新增功能] 12 页面组件全量 shadcn:Card/Button/Table/Tabs/Select/Alert;375 底部 Tab Bar 改用 Tabs 组件实现 [实现方案] 页面级手写 class 全部移除(.btn/.banner/table.data/.badge/.tabs/.metric-row/.m-tile/.hint 等改为 shadcn + tailwind 工具类);Modal/DatasetWizard/DatasetCard/DiffView/CodeEditor/Status/Layout 同步 [影响范围] src/pages/*.svelte、src/components/*.svelte MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/pages/ProjectBacktestTab.svelte | 136 +++++++++++++++------------ 1 file changed, 75 insertions(+), 61 deletions(-) (limited to 'frontend/src/pages/ProjectBacktestTab.svelte') diff --git a/frontend/src/pages/ProjectBacktestTab.svelte b/frontend/src/pages/ProjectBacktestTab.svelte index a9e7799..b640189 100644 --- a/frontend/src/pages/ProjectBacktestTab.svelte +++ b/frontend/src/pages/ProjectBacktestTab.svelte @@ -17,6 +17,9 @@ import { Badge } from '$lib/components/ui/badge'; import * as Card from '$lib/components/ui/card'; import * as Table from '$lib/components/ui/table'; + import * as Select from '$lib/components/ui/select'; + import { Input } from '$lib/components/ui/input'; + import { Label } from '$lib/components/ui/label'; interface Props { projectId: string; @@ -189,8 +192,6 @@ } } - - async function onCancel() { if (!latest) return; cancelBusy = true; @@ -223,79 +224,92 @@ const canRerun = $derived(latest?.status === 'succeeded' || latest?.status === 'failed' || latest?.status === 'cancelled'); -
- -

发起回测

+
+ +

发起回测

{#if !busyDatasets && datasetsReady.length === 0 && !cfgErr} {/if} {#if datasetsReady.length > 0} -
- - -
- - +
+
+ + (datasetId = v)} + > + + {datasetId + ? (() => { + const d = datasetsReady.find((x) => x.id === datasetId); + return d ? `${d.name ?? d.id.slice(0, 8)} · ${d.request.start_date}~${d.request.end_date}` : '选择数据集…'; + })() + : '选择数据集…'} + + + {#each datasetsReady as d (d.id)} + + {d.name ?? d.id.slice(0, 8)} · {d.request.start_date}~{d.request.end_date} · {d.request.instruments.map((i) => i.symbol).join(',')} + + {/each} + + +
+
+ + +
+
+
+ + +
+
+ + +
+
+
+ + +
+
+ +
- -
{#if needAck} - +
该数据集存在覆盖/预警信息,需要明确知晓后才能启动: -
    +
      {#each datasetWarnMsgs as m, i (i)}
    • {m}
    • {/each}
    -
{/if} -
+
{#if selectedDataset} - 本次回测与该数据集、当前策略快照一同记录,可按原始条件重跑 + 本次回测与该数据集、当前策略快照一同记录,可按原始条件重跑 {/if}
{/if} - -
-

最近一次回测

+ +
+

最近一次回测

{#if latest} - + Run 分支 {latest.version_id?.slice(0,8) ?? '—'} {runStatusLabel[latest.status]} @@ -309,33 +323,33 @@ empty={null} error={latestErr} /> -
+
启动时间{fmtDateTime(latest.created_at)} {#if latest.started_at}开始执行{fmtDateTime(latest.started_at)}{/if} {#if latest.finished_at}结束时间{fmtDateTime(latest.finished_at)}{/if} - 代码版本{latest.version_id.slice(0, 10)} - 数据集{latest.dataset_id?.slice(0, 8)}… + 代码版本{latest.version_id.slice(0, 10)} + 数据集{latest.dataset_id?.slice(0, 8)}… 资金{formatMoney(latest.config.capital)} · 佣金 {fmtPct(latest.config.commission, 4)} · 滑点 {fmtPct(latest.config.slippage, 4)}
{#if latest.error} - {latest.error} + {latest.error} {/if} {#if latest.result?.warnings?.length} - + -
    +
      {#each latest.result.warnings as w, i (i)}
    • {w}
    • {/each}
    {/if} {#if latest.status === 'succeeded' && latest.result} - + {/if} -
    +
    {#if canCancel} @@ -381,7 +395,7 @@ {/each} -
    + {/if}
    -
+
-- cgit v1.2.3