From e297e2fac73fd417f29630bc32b90c33b046b545 Mon Sep 17 00:00:00 2001 From: WangDL Date: Fri, 22 May 2026 14:09:07 +0800 Subject: [PATCH] fix: App context for copy toast + remove polling + disk progress layout + process aliases --- src/pages/Dashboard.tsx | 2 +- src/pages/Servers.tsx | 53 ++++++++++++++++++++++------------------- 2 files changed, 29 insertions(+), 26 deletions(-) diff --git a/src/pages/Dashboard.tsx b/src/pages/Dashboard.tsx index 66d5a4b..c479f5d 100644 --- a/src/pages/Dashboard.tsx +++ b/src/pages/Dashboard.tsx @@ -33,7 +33,7 @@ export default function Dashboard() { const { data: serverData } = useQuery({ queryKey: ['servers', 'metrics'], queryFn: getServerMetrics, - refetchInterval: 15_000, + staleTime: 30_000, }) const userTrendOption = useMemo(() => ({ diff --git a/src/pages/Servers.tsx b/src/pages/Servers.tsx index 4d0638a..1d37f57 100644 --- a/src/pages/Servers.tsx +++ b/src/pages/Servers.tsx @@ -1,15 +1,19 @@ import { useState } from 'react' import { useQuery, useQueryClient } from '@tanstack/react-query' -import { Card, Row, Col, Progress, Table, Tag, Typography, Button, Space, Tooltip, message } from 'antd' +import { Card, Row, Col, Progress, Table, Tag, Typography, Button, Space, Tooltip, App } from 'antd' import { CloudServerOutlined, ReloadOutlined, CopyOutlined, GlobalOutlined } from '@ant-design/icons' import { getServerMetrics, type ServerInfo, type ProcessInfo } from '@/services/server-api' const { Text, Title } = Typography function CopyTag({ text, icon, color }: { text: string; icon?: React.ReactNode; color?: string }) { + const { message } = App.useApp() return ( { await navigator.clipboard.writeText(text); message.success(`已复制: ${text}`) }}> + onClick={async () => { + try { await navigator.clipboard.writeText(text); message.success(`已复制: ${text}`) } + catch { message.error('复制失败') } + }}> {icon}{text} ) @@ -21,7 +25,7 @@ function ServerCard({ server }: { server: ServerInfo }) { return ( {server.name}{server.role}} style={{ height: '100%' }}> - + @@ -33,11 +37,10 @@ function ServerCard({ server }: { server: ServerInfo }) { - + CPU · {server.cpu.cores}核 `${p}%`} /> - {server.cpu.model?.slice(0, 28)} 内存 @@ -45,58 +48,54 @@ function ServerCard({ server }: { server: ServerInfo }) { {server.memory.used}/{server.memory.total} - 磁盘 - {server.disks.filter(d => d.total !== '-').length === 0 && 暂无数据} - {server.disks.filter(d => d.total !== '-').map(d => ( -
- + 磁盘 + {(server.disks || []).map(d => ( +
+
{d.mount} - 80 ? '#ff4d4f' : '#1677ff'} style={{ flex: 1, margin: 0 }} /> - {d.used}/{d.total} - +
80 ? '#ff4d4f' : '#1677ff'} style={{ margin: 0 }} />
+ {d.used} / {d.total} +
))} - 运行时间 -
{server.uptime}
+ 运行 {server.uptime} ( - - {name} - + { title: '进程', dataIndex: 'name', width: 120, ellipsis: true, render: (name: string, r: ProcessInfo) => ( + {name} )}, - { title: '说明', dataIndex: 'desc', width: 120, ellipsis: true, render: (d: string) => {d || '-'} }, + { title: '说明', dataIndex: 'desc', width: 100, ellipsis: true, render: (d: string) => {d || '-'} }, { title: 'CPU', dataIndex: 'cpu', width: 55 }, { title: 'MEM', dataIndex: 'mem', width: 55 }, ]} - locale={{ emptyText: '暂无进程' }} + locale={{ emptyText: '暂无' }} /> ) } -export default function ServersPage() { +function ServersContent() { const qc = useQueryClient() const [refreshing, setRefreshing] = useState(false) const { data } = useQuery({ queryKey: ['servers', 'metrics'], queryFn: getServerMetrics, - refetchInterval: 15_000, + staleTime: 30_000, }) const handleRefresh = async () => { setRefreshing(true) await qc.invalidateQueries({ queryKey: ['servers', 'metrics'] }) - setTimeout(() => setRefreshing(false), 1000) + setTimeout(() => setRefreshing(false), 800) } return ( @@ -115,3 +114,7 @@ export default function ServersPage() { ) } + +export default function ServersPage() { + return +}