diff --git a/src/components/ServerCard.tsx b/src/components/ServerCard.tsx index e973f76..68069ff 100644 --- a/src/components/ServerCard.tsx +++ b/src/components/ServerCard.tsx @@ -3,7 +3,7 @@ import ServerUsageBar from "@/components/ServerUsageBar" import { formatBytes } from "@/lib/format" import { GetFontLogoClass, GetOsName, MageMicrosoftWindows } from "@/lib/logo-class" import { cn, formatNezhaInfo, parsePublicNote } from "@/lib/utils" -import { NezhaServer } from "@/types/nezha-api" +import { CycleTransferData, NezhaServer } from "@/types/nezha-api" import { useTranslation } from "react-i18next" import { useNavigate } from "react-router-dom" @@ -12,9 +12,17 @@ import BillingInfo from "./billingInfo" import { Badge } from "./ui/badge" import { Card, CardContent, CardHeader, CardFooter } from "./ui/card" import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "./ui/tooltip" -import { ArrowDown, ArrowUp, Clock, Cpu, HardDrive, Server, Activity } from "lucide-react" +import { ArrowDown, ArrowUp, Clock, Cpu, HardDrive, Server, Activity, BarChart3 } from "lucide-react" -export default function ServerCard({ now, serverInfo }: { now: number; serverInfo: NezhaServer }) { +interface ServerCardProps { + now: number; + serverInfo: NezhaServer; + cycleStats?: { + [key: string]: CycleTransferData + }; +} + +export default function ServerCard({ now, serverInfo, cycleStats }: ServerCardProps) { const { t } = useTranslation() const navigate = useNavigate() const { @@ -55,6 +63,49 @@ export default function ServerCard({ now, serverInfo }: { now: number; serverInf const showServerDetails = window.ShowServerDetails !== undefined ? window.ShowServerDetails as boolean : true const parsedData = parsePublicNote(public_note) + + // 获取匹配当前服务器的流量计费周期 + const getServerCycleData = () => { + if (!cycleStats) return null + + const serverId = serverInfo.id.toString() + const matchedCycles: Array<{ + name: string; + from: string; + to: string; + max: number; + transfer: number; + nextUpdate: string; + progress: number; + }> = [] + + // 遍历所有流量周期,查找匹配当前服务器ID的数据 + Object.values(cycleStats).forEach(cycleData => { + if ( + cycleData.server_name && + cycleData.server_name[serverId] && + cycleData.transfer && + cycleData.transfer[serverId] !== undefined + ) { + const transfer = cycleData.transfer[serverId] + const progress = (transfer / cycleData.max) * 100 + + matchedCycles.push({ + name: cycleData.name, + from: cycleData.from, + to: cycleData.to, + max: cycleData.max, + transfer: transfer, + nextUpdate: cycleData.next_update?.[serverId] || "", + progress: progress + }) + } + }) + + return matchedCycles.length > 0 ? matchedCycles : null + } + + const serverCycleData = getServerCycleData() // 格式化运行时间 const formatUptime = (seconds: number, t: any) => { @@ -80,6 +131,13 @@ export default function ServerCard({ now, serverInfo }: { now: number; serverInf if (value > 70) return "text-orange-400" return "text-green-500" } + + // 根据进度获取状态颜色 + const getProgressColorClass = (value: number) => { + if (value > 90) return "bg-red-500" + if (value > 70) return "bg-orange-500" + return "bg-emerald-500" + } if (!online) { return ( @@ -111,6 +169,39 @@ export default function ServerCard({ now, serverInfo }: { now: number; serverInf )} + + {/* 添加流量使用统计 */} + {serverCycleData && ( +