From c834deb077ae539321f84ce46b38609f717ec011 Mon Sep 17 00:00:00 2001 From: imengying Date: Fri, 28 Aug 2026 12:01:34 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=8E=86=E5=8F=B2=E8=A1=A8?= =?UTF-8?q?=E8=BD=AE=E6=8D=A2=EF=BC=9B=E4=BF=AE=E5=A4=8DD1=20flush=20?= =?UTF-8?q?=E9=94=81=E9=97=AE=E9=A2=98=EF=BC=9B=E6=96=B0=E5=A2=9E=E6=80=BB?= =?UTF-8?q?=E8=A7=88=E6=89=B9=E9=87=8F=E5=94=A4=E9=86=92=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E5=B9=B6=E7=A7=BB=E9=99=A4=E9=80=90=E6=9C=8D=E5=8A=A1=E5=99=A8?= =?UTF-8?q?=20WebSocket=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 5 +- frontend/src/AppProvider.tsx | 10 ++- frontend/src/admin-main.tsx | 5 +- frontend/src/api.ts | 4 + frontend/src/components/AdminPanel.tsx | 2 +- frontend/src/demo.ts | 1 - frontend/src/transport.ts | 56 +++--------- frontend/src/types.ts | 2 +- migrations/initial_01.sql | 1 - scripts/websocket-smoke.mjs | 21 +++++ src/db.rs | 53 +++++++---- src/live.rs | 117 ++++++++++++++++++++----- src/models.rs | 1 - src/routes/admin.rs | 8 +- src/routes/public.rs | 36 +++++++- wrangler.jsonc | 10 +-- 16 files changed, 220 insertions(+), 112 deletions(-) diff --git a/README.md b/README.md index accfed2..fc083bf 100644 --- a/README.md +++ b/README.md @@ -26,8 +26,9 @@ ## 部署到 Cloudflare 1. Fork 本仓库并打开 [Workers & Pages](https://dash.cloudflare.com/?to=/:account/workers-and-pages/create),选择 **Import a repository** 后连接仓库。 -2. 部署命令修改为 `bun run deploy`。 -3. 在 **高级设置** 中填写下表变量后部署。 +2. 在构建设置中将 **Build command(构建命令)清空**。Cloudflare 可能自动识别为 `bun run build`,需要手动删除;如果控制台不允许留空,可填写 `true`。 +3. 将 **Deploy command(部署命令)** 修改为 `bun run deploy`。该命令会按需构建前端和 Worker、应用 D1 迁移并完成部署,无需单独执行构建命令;同时配置 `bun run build` 会导致前端重复构建。 +4. 在 **高级设置** 中填写下表变量后部署。 | 变量 | 必填/可选 | 说明 | | --- | ---: | --- | diff --git a/frontend/src/AppProvider.tsx b/frontend/src/AppProvider.tsx index 0a75ad6..94bdb39 100644 --- a/frontend/src/AppProvider.tsx +++ b/frontend/src/AppProvider.tsx @@ -188,11 +188,12 @@ export function AppProvider({ children }: { children: ReactNode }) { servers: serversRef.current, })), onConnectedChange: (connected) => { liveConnectedRef.current = connected; }, - wakeTargets: () => { + onOverviewConnected: () => { const now = Date.now() / 1000; - return serversRef.current + const serverIds = serversRef.current .filter((server) => server.timestamp && now - server.timestamp <= config.offline_threshold_seconds) .map((server) => server.id); + return serverIds.length ? api.wakeServers(serverIds) : Promise.resolve(); }, }); }, [access, config.offline_threshold_seconds, loading, selectedId]); @@ -211,8 +212,9 @@ export function AppProvider({ children }: { children: ReactNode }) { link.rel = "icon"; document.head.append(link); } - link.href = config.favicon_url || config.logo_url || "/logo.svg"; - }, [config.favicon_url, config.logo_url]); + link.removeAttribute("type"); + link.href = config.logo_url || "/logo.svg"; + }, [config.logo_url]); useEffect(() => { const media = matchMedia("(prefers-color-scheme: dark)"); diff --git a/frontend/src/admin-main.tsx b/frontend/src/admin-main.tsx index 67338e6..5885c7a 100644 --- a/frontend/src/admin-main.tsx +++ b/frontend/src/admin-main.tsx @@ -50,8 +50,9 @@ function AdminApp() { link.rel = "icon"; document.head.append(link); } - link.href = config?.favicon_url || config?.logo_url || "/logo.svg"; - }, [config?.favicon_url, config?.logo_url]); + link.removeAttribute("type"); + link.href = config?.logo_url || "/logo.svg"; + }, [config?.logo_url]); if (error) return
{error}
; if (!config) return
正在加载管理面板
; diff --git a/frontend/src/api.ts b/frontend/src/api.ts index 07db199..2e3e1ce 100644 --- a/frontend/src/api.ts +++ b/frontend/src/api.ts @@ -41,6 +41,10 @@ export const api = { bootstrap: () => request("/api/bootstrap"), config: () => request("/api/config"), exchangeRates: () => request("/api/exchange-rates"), + wakeServers: (serverIds: string[]) => request("/api/live/wake", { + method: "POST", + body: JSON.stringify({ server_ids: serverIds }), + }), refreshExchangeRates: () => request("/api/admin/exchange-rates/refresh", { method: "POST" }, true), servers: () => request<{ servers: Server[] }>("/api/servers"), adminServers: () => request<{ servers: AdminServer[] }>("/api/admin/servers", {}, true), diff --git a/frontend/src/components/AdminPanel.tsx b/frontend/src/components/AdminPanel.tsx index d452b31..a81ebd8 100644 --- a/frontend/src/components/AdminPanel.tsx +++ b/frontend/src/components/AdminPanel.tsx @@ -620,7 +620,7 @@ export function AdminPanel({
外观与展示