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/AccountPage.svelte | 24 ++-- frontend/src/pages/AdminPage.svelte | 74 +++++------ frontend/src/pages/AuthPages.svelte | 154 ++++++++++------------- frontend/src/pages/ProjectBacktestTab.svelte | 136 +++++++++++--------- frontend/src/pages/ProjectDataTab.svelte | 2 +- frontend/src/pages/ProjectPage.svelte | 35 +----- frontend/src/pages/ProjectStrategyTab.svelte | 182 +++++++++++++-------------- frontend/src/pages/ProjectsPage.svelte | 52 ++++---- frontend/src/pages/RunsPage.svelte | 28 ++--- frontend/src/pages/UsagePage.svelte | 22 ++-- 10 files changed, 334 insertions(+), 375 deletions(-) (limited to 'frontend/src/pages') diff --git a/frontend/src/pages/AccountPage.svelte b/frontend/src/pages/AccountPage.svelte index 9e90e78..c85dc53 100644 --- a/frontend/src/pages/AccountPage.svelte +++ b/frontend/src/pages/AccountPage.svelte @@ -104,11 +104,11 @@ -
- +
+ 个人信息 -
-
+ +
@@ -127,10 +127,10 @@ - + 修改密码 - -
+ +
@@ -144,7 +144,7 @@
-
+
@@ -153,7 +153,7 @@ - + 登录会话 {#if !sessBusy && !sessErr && sessions.length === 0} @@ -174,9 +174,9 @@ {fmtDateTime(s.created_at)} {fmtDateTime(s.last_seen_at)} - {s.user_agent?.slice(0, 60) ?? '—'} + {s.user_agent?.slice(0, 60) ?? '—'} -
+
{#if s.current}当前会话{/if}
\ No newline at end of file diff --git a/frontend/src/pages/AdminPage.svelte b/frontend/src/pages/AdminPage.svelte index d9bea83..2a10266 100644 --- a/frontend/src/pages/AdminPage.svelte +++ b/frontend/src/pages/AdminPage.svelte @@ -17,6 +17,7 @@ import { Alert } from '$lib/components/ui/alert'; import { Badge } from '$lib/components/ui/badge'; import { Label } from '$lib/components/ui/label'; + import * as Select from '$lib/components/ui/select'; import * as Tabs from '$lib/components/ui/tabs'; import * as Card from '$lib/components/ui/card'; import * as Table from '$lib/components/ui/table'; @@ -185,12 +186,12 @@ {/snippet} -
+
{#if tab === 'users'} - -

用户

+ +

用户

{#if !usersBusy && !usersErr && users.length > 0} @@ -211,26 +212,29 @@ {u.email} {u.name} - + {u.role === 'admin' ? '管理员' : '成员'} + + 成员 + 管理员 + + {u.active ? '启用' : '停用'} - -
+
@@ -251,17 +255,17 @@ {/if} -

停用账户会立即吊销其会话并阻止其回测与 AI 请求。角色不能作用于他人项目,私阅策略代码不提供。

+

停用账户会立即吊销其会话并阻止其回测与 AI 请求。角色不能作用于他人项目,私阅策略代码不提供。

{:else if tab === 'invites'} - -

签发邀请

-
-
+ +

签发邀请

+ +
-
+
@@ -269,20 +273,20 @@ {#if newInvite} - +
-
邀请令牌(只显示这一次,请立即复制):
-
{newInvite.token}
-
到期:{fmtDateTime(newInvite.expires_at)} · 单次使用 · 注册页链接:
-
{inviteUrl}
+
邀请令牌(只显示这一次,请立即复制):
+
{newInvite.token}
+
到期:{fmtDateTime(newInvite.expires_at)} · 单次使用 · 注册页链接:
+
{inviteUrl}
{/if} - -

历史邀请

+ +

历史邀请

{#if !inviteBusy && !inviteErr && invites.length === 0} @@ -323,11 +327,11 @@ {/if} -

恢复链接由“生成恢复”按钮产生,仅出现一次;不会自动发邮件。

+

恢复链接由“生成恢复”按钮产生,仅出现一次;不会自动发邮件。

{:else} - -

安全审计(收尾尾部)

+ +

安全审计(收尾尾部)

{#if !auditBusy && !auditErr && audit.length === 0} @@ -349,29 +353,29 @@ {fmtDateTime(e.time)} {e.actor ?? '—'} {e.action} - {e.target ?? '—'} + {e.target ?? '—'} {e.status} {/each} {/if} -

审计仅记录操作行为与结果,不含密码/密钥/策略代码内容。

+

审计仅记录操作行为与结果,不含密码/密钥/策略代码内容。

{/if}
{#if resetFor} (resetFor = null)}> -
- +
+
恢复链接(管理员线下告知对方,只出现一次):
-
{resetUrl}
-
令牌 {resetToken.slice(0, 8)}… 会即刻失效前提示时间(见链接有效期)。
+
{resetUrl}
+
令牌 {resetToken.slice(0, 8)}… 会即刻失效前提示时间(见链接有效期)。
-

单次有效、限时;重置会吊销对方的全部历史会话。

+

单次有效、限时;重置会吊销对方的全部历史会话。

{/if} diff --git a/frontend/src/pages/AuthPages.svelte b/frontend/src/pages/AuthPages.svelte index 88ca07a..da5d54c 100644 --- a/frontend/src/pages/AuthPages.svelte +++ b/frontend/src/pages/AuthPages.svelte @@ -92,114 +92,86 @@ } -
- -
- -

策研 Strategy Lab

-

内部策略研究平台 · 仅限受邀成员

+
+ +
+ +

策研 Strategy Lab

+

内部策略研究平台 · 仅限受邀成员

{#if mode === 'register'}
-
- - -

单次有效,来自管理员邀请

-
-
- - -
-
- - -
-
- - -
至少 8 位
+
+
+ + +

单次有效,来自管理员邀请

+
+
+ + +
+
+ + +
+
+ + +

至少 8 位

+
+ {#if resultError}{resultError}{/if} + +

已有账户? 登录

- {#if resultError}{resultError}{/if} - -

已有账户? 登录

{:else if mode === 'reset'} {#if done} - {done} -

前往登录

+ {done} +

前往登录

{:else}
-
- - -

由管理员线下发放的恢复链接自动填入;不支持邮箱自动发送

+
+
+ + +

由管理员线下发放的恢复链接自动填入;不支持邮箱自动发送

+
+
+ + +
+
+ + +
+ {#if resultError}{resultError}{/if} + +

想起密码了? 直接登录

-
- - -
-
- - -
- {#if resultError}{resultError}{/if} - -

想起密码了? 直接登录

{/if} {:else}
-
- - -
-
- - +
+
+ + +
+
+ + +
+ {#if resultError}{resultError}{/if} + +

+ 开通新账户需要管理员邀请: 用邀请令牌注册 + {#if route.query.get('invite')}(邀请令牌已自动填入){/if} +

+

忘记密码?请联系管理员获取 恢复链接

- {#if resultError}{resultError}{/if} - -

- 开通新账户需要管理员邀请: 用邀请令牌注册 - {#if route.query.get('invite')}(邀请令牌已自动填入){/if} -

-

忘记密码?请联系管理员获取 恢复链接

{/if}
- - 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}
    -
+
diff --git a/frontend/src/pages/ProjectDataTab.svelte b/frontend/src/pages/ProjectDataTab.svelte index 284aec7..7b9f8ea 100644 --- a/frontend/src/pages/ProjectDataTab.svelte +++ b/frontend/src/pages/ProjectDataTab.svelte @@ -59,7 +59,7 @@ } -
+
{#if wizardOpen} void load()} /> diff --git a/frontend/src/pages/ProjectPage.svelte b/frontend/src/pages/ProjectPage.svelte index fe9be7f..61db874 100644 --- a/frontend/src/pages/ProjectPage.svelte +++ b/frontend/src/pages/ProjectPage.svelte @@ -24,12 +24,12 @@ }); -