From 48b2d1493a0bb0b387012a0b30a104e22bf286a6 Mon Sep 17 00:00:00 2001 From: hamster1963 <1410514192@qq.com> Date: Sat, 30 Nov 2024 22:18:04 +0800 Subject: [PATCH] fix: header link --- .github/ISSUE_TEMPLATE/bug-提交.md | 21 -------------- .github/ISSUE_TEMPLATE/功能申请.md | 15 ---------- .github/ISSUE_TEMPLATE/改善建议.md | 14 --------- bun.lockb | Bin 171230 -> 172879 bytes package.json | 10 +++---- src/components/Header.tsx | 6 ++-- src/components/ServerCard.tsx | 4 ++- src/components/ServerDetailChart.tsx | 36 ++++++++++++------------ src/components/ServerDetailOverview.tsx | 2 +- src/lib/utils.ts | 4 +-- src/locales/en/translation.json | 2 ++ src/locales/zh-CN/translation.json | 2 ++ src/locales/zh-TW/translation.json | 2 ++ src/pages/Server.tsx | 6 ++-- 14 files changed, 41 insertions(+), 83 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE/bug-提交.md delete mode 100644 .github/ISSUE_TEMPLATE/功能申请.md delete mode 100644 .github/ISSUE_TEMPLATE/改善建议.md diff --git a/.github/ISSUE_TEMPLATE/bug-提交.md b/.github/ISSUE_TEMPLATE/bug-提交.md deleted file mode 100644 index 531b81a..0000000 --- a/.github/ISSUE_TEMPLATE/bug-提交.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -name: Bug 提交 -about: 提交 bug,让面板变得更好。 -title: "[BUG]" -labels: '' -assignees: '' - ---- - -**面板版本(二选一)** -V0 | V1 - -**描述 bug** -在这里描述 bug 的相关信息 - -**屏幕截图** -有屏幕截图可以帮助更快定位到问题 - - -**额外信息** -可附上其他需要的额外信息 diff --git a/.github/ISSUE_TEMPLATE/功能申请.md b/.github/ISSUE_TEMPLATE/功能申请.md deleted file mode 100644 index cbf082e..0000000 --- a/.github/ISSUE_TEMPLATE/功能申请.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -name: 功能申请 -about: 描述需求 -title: "[FEAT]" -labels: '' -assignees: '' - ---- - -**面板版本(二选一)** -V0 | V1 - -**需要什么?** - -**额外信息** diff --git a/.github/ISSUE_TEMPLATE/改善建议.md b/.github/ISSUE_TEMPLATE/改善建议.md deleted file mode 100644 index ed4c5e0..0000000 --- a/.github/ISSUE_TEMPLATE/改善建议.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -name: 改善建议 -about: 交流面板需要改进的地方 -title: "[SUGGEST]" -labels: '' -assignees: '' - ---- - -**面板版本(二选一)** -V0 | V1 - -**需要改进的?** -* diff --git a/bun.lockb b/bun.lockb index f4c650c3a286a68ce5fe9ff20f165853706f9a0c..373b666d92b871c2342821ecd0d8ceda961ef416 100755 GIT binary patch delta 18496 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 diff --git a/package.json b/package.json index 3e2a241..09b3c91 100644 --- a/package.json +++ b/package.json @@ -19,8 +19,8 @@ "@radix-ui/react-progress": "^1.1.0", "@radix-ui/react-separator": "^1.1.0", "@radix-ui/react-slot": "^1.1.0", - "@tanstack/react-query": "^5.61.5", - "@tanstack/react-query-devtools": "^5.61.5", + "@tanstack/react-query": "^5.62.0", + "@tanstack/react-query-devtools": "^5.62.0", "@tanstack/react-table": "^8.20.5", "@types/luxon": "^3.4.2", "class-variance-authority": "^0.7.1", @@ -32,7 +32,7 @@ "luxon": "^3.5.0", "react": "^18.3.1", "react-dom": "^18.3.1", - "react-i18next": "^15.1.2", + "react-i18next": "^15.1.3", "react-router-dom": "^7.0.1", "react-use-websocket": "^4.11.1", "recharts": "^2.13.3", @@ -41,13 +41,13 @@ "tailwindcss-animate": "^1.0.7" }, "devDependencies": { - "@eslint/js": "^9.15.0", + "@eslint/js": "^9.16.0", "@types/node": "^22.10.1", "@types/react": "^18.3.12", "@types/react-dom": "^18.3.1", "@vitejs/plugin-react-swc": "^3.7.2", "autoprefixer": "^10.4.20", - "eslint": "^9.15.0", + "eslint": "^9.16.0", "eslint-plugin-react-hooks": "^5.0.0", "eslint-plugin-react-refresh": "^0.4.14", "globals": "^15.12.0", diff --git a/src/components/Header.tsx b/src/components/Header.tsx index a3d4623..fa58d08 100644 --- a/src/components/Header.tsx +++ b/src/components/Header.tsx @@ -49,6 +49,7 @@ function Header() { } function DashboardLink() { + const { t } = useTranslation(); const { data: userData } = useQuery({ queryKey: ["login-user"], queryFn: () => fetchLoginUser(), @@ -56,8 +57,6 @@ function DashboardLink() { refetchOnWindowFocus: true, }); - if (!userData?.data?.id) return null; - return (

- Dashboard + {!userData?.data?.id && t("login")} + {userData?.data?.id && t("dashboard")}
); diff --git a/src/components/ServerCard.tsx b/src/components/ServerCard.tsx index d077ee1..ab3f00f 100644 --- a/src/components/ServerCard.tsx +++ b/src/components/ServerCard.tsx @@ -8,14 +8,16 @@ import { useNavigate } from "react-router-dom"; import { useTranslation } from "react-i18next"; export default function ServerCard({ + now, serverInfo, }: { + now: number; serverInfo: NezhaServer; }) { const { t } = useTranslation(); const navigate = useNavigate(); const { name, country_code, online, cpu, up, down, mem, stg } = - formatNezhaInfo(serverInfo); + formatNezhaInfo(now, serverInfo); const showFlag = true; diff --git a/src/components/ServerDetailChart.tsx b/src/components/ServerDetailChart.tsx index 7bb9a81..2f55604 100644 --- a/src/components/ServerDetailChart.tsx +++ b/src/components/ServerDetailChart.tsx @@ -77,20 +77,20 @@ export default function ServerDetailChart({ return (
- - - - - - + + + + + +
); } -function CpuChart({ data }: { data: NezhaServer }) { +function CpuChart({ now,data }: { now: number;data: NezhaServer }) { const [cpuChartData, setCpuChartData] = useState([] as cpuChartData[]); - const { cpu } = formatNezhaInfo(data); + const { cpu } = formatNezhaInfo(now,data); useEffect(() => { if (data) { @@ -183,13 +183,13 @@ function CpuChart({ data }: { data: NezhaServer }) { ); } -function ProcessChart({ data }: { data: NezhaServer }) { +function ProcessChart({ now, data }: { now: number; data: NezhaServer }) { const { t } = useTranslation(); const [processChartData, setProcessChartData] = useState( [] as processChartData[], ); - const { process } = formatNezhaInfo(data); + const { process } = formatNezhaInfo(now,data); useEffect(() => { if (data) { @@ -276,11 +276,11 @@ function ProcessChart({ data }: { data: NezhaServer }) { ); } -function MemChart({ data }: { data: NezhaServer }) { +function MemChart({ now,data }: { now: number;data: NezhaServer }) { const { t } = useTranslation(); const [memChartData, setMemChartData] = useState([] as memChartData[]); - const { mem, swap } = formatNezhaInfo(data); + const { mem, swap } = formatNezhaInfo(now,data); useEffect(() => { if (data) { @@ -406,11 +406,11 @@ function MemChart({ data }: { data: NezhaServer }) { ); } -function DiskChart({ data }: { data: NezhaServer }) { +function DiskChart({ now,data }: { now: number;data: NezhaServer }) { const { t } = useTranslation(); const [diskChartData, setDiskChartData] = useState([] as diskChartData[]); - const { disk } = formatNezhaInfo(data); + const { disk } = formatNezhaInfo(now,data); useEffect(() => { if (data) { @@ -503,13 +503,13 @@ function DiskChart({ data }: { data: NezhaServer }) { ); } -function NetworkChart({ data }: { data: NezhaServer }) { +function NetworkChart({ now,data }: { now: number;data: NezhaServer }) { const { t } = useTranslation(); const [networkChartData, setNetworkChartData] = useState( [] as networkChartData[], ); - const { up, down } = formatNezhaInfo(data); + const { up, down } = formatNezhaInfo(now,data); useEffect(() => { if (data) { @@ -632,12 +632,12 @@ function NetworkChart({ data }: { data: NezhaServer }) { ); } -function ConnectChart({ data }: { data: NezhaServer }) { +function ConnectChart({ now,data }: { now: number;data: NezhaServer }) { const [connectChartData, setConnectChartData] = useState( [] as connectChartData[], ); - const { tcp, udp } = formatNezhaInfo(data); + const { tcp, udp } = formatNezhaInfo(now,data); useEffect(() => { if (data) { diff --git a/src/components/ServerDetailOverview.tsx b/src/components/ServerDetailOverview.tsx index 22e1b01..6512b19 100644 --- a/src/components/ServerDetailOverview.tsx +++ b/src/components/ServerDetailOverview.tsx @@ -37,7 +37,7 @@ export default function ServerDetailOverview({ return ; } - const { name, online, uptime, version } = formatNezhaInfo(server); + const { name, online, uptime, version } = formatNezhaInfo(nezhaWsData.now,server); return (
diff --git a/src/lib/utils.ts b/src/lib/utils.ts index 4a54168..8414980 100644 --- a/src/lib/utils.ts +++ b/src/lib/utils.ts @@ -6,7 +6,7 @@ export function cn(...inputs: ClassValue[]) { return twMerge(clsx(inputs)); } -export function formatNezhaInfo(serverInfo: NezhaServer) { +export function formatNezhaInfo(now: number,serverInfo: NezhaServer) { const lastActiveTime = parseISOTimestamp(serverInfo.last_active); return { ...serverInfo, @@ -14,7 +14,7 @@ export function formatNezhaInfo(serverInfo: NezhaServer) { process: serverInfo.state.process_count || 0, up: serverInfo.state.net_out_speed / 1024 / 1024 || 0, down: serverInfo.state.net_in_speed / 1024 / 1024 || 0, - online: Date.now() - lastActiveTime <= 30000, + online: now - lastActiveTime <= 30000, uptime: serverInfo.state.uptime || 0, version: serverInfo.host.version || null, tcp: serverInfo.state.tcp_conn_count || 0, diff --git a/src/locales/en/translation.json b/src/locales/en/translation.json index 2a120e3..f5f6349 100644 --- a/src/locales/en/translation.json +++ b/src/locales/en/translation.json @@ -1,6 +1,8 @@ { "nezha": "Nezha Monitoring", "overview": "Overview", + "dashboard": "Dashboard", + "login": "Login", "whereTheTimeIs": "Where the time is", "info": { "websocketConnecting": "WebSocket connecting", diff --git a/src/locales/zh-CN/translation.json b/src/locales/zh-CN/translation.json index 786323b..3995e5e 100644 --- a/src/locales/zh-CN/translation.json +++ b/src/locales/zh-CN/translation.json @@ -1,6 +1,8 @@ { "nezha": "哪吒监控", "overview": "概览", + "dashboard": "管理后台", + "login": "登录", "whereTheTimeIs": "当前时间", "info": { "websocketConnecting": "WebSocket 连接中", diff --git a/src/locales/zh-TW/translation.json b/src/locales/zh-TW/translation.json index 296e5c0..9cececf 100644 --- a/src/locales/zh-TW/translation.json +++ b/src/locales/zh-TW/translation.json @@ -1,6 +1,8 @@ { "nezha": "哪吒監控", "overview": "概覽", + "dashboard": "管理後台", + "login": "登錄", "whereTheTimeIs": "目前時間", "info": { "websocketConnecting": "WebSocket 連接中", diff --git a/src/pages/Server.tsx b/src/pages/Server.tsx index 9ad833a..86f7ba3 100644 --- a/src/pages/Server.tsx +++ b/src/pages/Server.tsx @@ -57,10 +57,10 @@ export default function Servers() { const totalServers = nezhaWsData?.servers?.length || 0; const onlineServers = - nezhaWsData?.servers?.filter((server) => formatNezhaInfo(server).online) + nezhaWsData?.servers?.filter((server) => formatNezhaInfo(nezhaWsData.now,server).online) ?.length || 0; const offlineServers = - nezhaWsData?.servers?.filter((server) => !formatNezhaInfo(server).online) + nezhaWsData?.servers?.filter((server) => !formatNezhaInfo(nezhaWsData.now,server).online) ?.length || 0; const up = nezhaWsData?.servers?.reduce( @@ -112,7 +112,7 @@ export default function Servers() { {showServices && }
{filteredServers.map((serverInfo) => ( - + ))}