From fc1f084053447bbf12edbcd1a551cf62da39e5c2 Mon Sep 17 00:00:00 2001 From: Rhen Cloud Date: Fri, 2 Jan 2026 22:49:14 +0800 Subject: [PATCH] update --- app/components/main/header.vue | 146 +++++++++++++++++++++++++++++++-- app/config/index.ts | 6 ++ 2 files changed, 147 insertions(+), 5 deletions(-) diff --git a/app/components/main/header.vue b/app/components/main/header.vue index a67fe34..22e4adb 100644 --- a/app/components/main/header.vue +++ b/app/components/main/header.vue @@ -17,11 +17,55 @@ function toggleMenu() { isMenuOpen.value = !isMenuOpen.value; } +const isLinesOpen = ref(false); +function toggleLines() { + isLinesOpen.value = !isLinesOpen.value; +} + +const linePings = ref>({}); + +async function pingLine(url: string) { + const start = Date.now(); + try { + // 使用 fetch 测量延迟,no-cors 模式可以避开大部分 CORS 问题 + await fetch(url, { mode: "no-cors", cache: "no-cache" }); + linePings.value[url] = Date.now() - start; + } catch (e) { + linePings.value[url] = "Timeout"; + console.error(e); + } +} + +function updateAllPings() { + if (siteConfig.lines) { + siteConfig.lines.forEach((line) => { + if (line.ping !== false) { + linePings.value[line.url] = "..."; + pingLine(line.url); + } + }); + } +} + +function getPingColor(ping: number | string | undefined) { + if (typeof ping !== "number") return "text-zinc-400"; + if (ping < 300) return "text-emerald-500"; + if (ping < 800) return "text-amber-500"; + return "text-rose-500"; +} + +watch(isLinesOpen, (val) => { + if (val) { + updateAllPings(); + } +}); + // 路由变化时关闭菜单 watch( () => route.path, () => { isMenuOpen.value = false; + isLinesOpen.value = false; }, ); @@ -40,6 +84,49 @@ watch( +