From 5e653c2ec1cdbb6f020630a27fe97568c89deaca Mon Sep 17 00:00:00 2001 From: "2569718930@qq.com" <2569718930@qq.com> Date: Thu, 14 May 2026 00:04:26 +0800 Subject: [PATCH] =?UTF-8?q?=E5=89=8D=E7=AB=AF=E6=8E=A5=E5=85=A5=E7=9B=91?= =?UTF-8?q?=E6=8E=A7=E9=A1=B5=E9=9D=A2=EF=BC=9A=E6=96=B0=E5=A2=9E=20Monito?= =?UTF-8?q?r=20=E6=A0=87=E7=AD=BE=E9=A1=B5=20+=20/api/m=20=E4=BB=A3?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/app/api/m/route.ts | 19 ++++++++++++++++ .../dashboard/ScanTerminalDashboard.tsx | 22 ++++++++++++++++++- 2 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 frontend/app/api/m/route.ts diff --git a/frontend/app/api/m/route.ts b/frontend/app/api/m/route.ts new file mode 100644 index 00000000..41f78fc5 --- /dev/null +++ b/frontend/app/api/m/route.ts @@ -0,0 +1,19 @@ +import { NextRequest, NextResponse } from "next/server"; +import { buildBackendRequestHeaders } from "@/lib/backend-auth"; + +const API_BASE = process.env.POLYWEATHER_API_BASE_URL; + +export async function GET(req: NextRequest) { + if (!API_BASE) { + return new NextResponse("API not configured", { status: 500 }); + } + const isCards = req.nextUrl.searchParams.get("cards") === "1"; + const path = isCards ? "/m/cards" : "/m"; + const auth = await buildBackendRequestHeaders(req, { includeSupabaseIdentity: false }); + const res = await fetch(`${API_BASE}${path}`, { headers: auth.headers }); + const html = await res.text(); + return new NextResponse(html, { + status: res.status, + headers: { "Content-Type": "text/html; charset=utf-8" }, + }); +} diff --git a/frontend/components/dashboard/ScanTerminalDashboard.tsx b/frontend/components/dashboard/ScanTerminalDashboard.tsx index 30dff0e4..81610334 100644 --- a/frontend/components/dashboard/ScanTerminalDashboard.tsx +++ b/frontend/components/dashboard/ScanTerminalDashboard.tsx @@ -47,7 +47,7 @@ import { useUserLocalClock, } from "@/components/dashboard/scan-terminal/use-scan-terminal-ui-state"; -type ContentView = "analysis" | "map"; +type ContentView = "analysis" | "map" | "monitor"; const CityDetailPanel = dynamic( () => @@ -334,6 +334,17 @@ function ScanTerminalScreen() { /> ); } + if (resolvedView === "monitor") { + return ( +
+