import ServerFlag from "@/components/ServerFlag" 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 { useTranslation } from "react-i18next" import { useNavigate } from "react-router-dom" import PlanInfo from "./PlanInfo" import BillingInfo from "./billingInfo" import { Badge } from "./ui/badge" import { Card } from "./ui/card" import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "./ui/tooltip" 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, net_in_transfer, net_out_transfer, public_note, platform, cpu_info, mem_total, disk_total, tcp, udp, process, uptime } = formatNezhaInfo( now, serverInfo, ) const cardClick = () => { sessionStorage.setItem("fromMainPage", "true") navigate(`/server/${serverInfo.id}`) } const showFlag = true const customBackgroundImage = (window.CustomBackgroundImage as string) !== "" ? window.CustomBackgroundImage : undefined // @ts-expect-error ShowNetTransfer is a global variable const showNetTransfer = window.ShowNetTransfer as boolean // @ts-expect-error FixedTopServerName is a global variable const fixedTopServerName = window.FixedTopServerName as boolean // @ts-expect-error ShowServerDetails is a global variable const showServerDetails = window.ShowServerDetails !== undefined ? window.ShowServerDetails as boolean : true const parsedData = parsePublicNote(public_note) // 格式化运行时间 const formatUptime = (seconds: number, t: any) => { if (seconds >= 86400) { return `${Math.floor(seconds / 86400)} ${t("serverCard.days")}` } else { return `${Math.floor(seconds / 3600)} ${t("serverCard.hours")}` } } return online ? ( {/* 服务器名称和标识区域 */} {showFlag ? : null} {name} {parsedData?.billingDataMod && } {/* 计费信息移动端展示 */} {parsedData?.billingDataMod && } {/* 系统和资源使用情况 */} {fixedTopServerName && ( {platform.includes("Windows") ? ( ) : ( )} {t("serverCard.system")} {platform.includes("Windows") ? "Windows" : GetOsName(platform)} )} {/* CPU使用率 */} {"CPU"} {cpu.toFixed(2)}% {/* 内存使用率 */} {t("serverCard.mem")} {mem.toFixed(2)}% {/* 存储使用率 */} {t("serverCard.stg")} {stg.toFixed(2)}% {/* 上传速度 */} {t("serverCard.upload")} {up >= 1024 ? `${(up / 1024).toFixed(2)}G/s` : up >= 1 ? `${up.toFixed(2)}M/s` : `${(up * 1024).toFixed(2)}K/s`} {/* 下载速度 */} {t("serverCard.download")} {down >= 1024 ? `${(down / 1024).toFixed(2)}G/s` : down >= 1 ? `${down.toFixed(2)}M/s` : `${(down * 1024).toFixed(2)}K/s`} {/* 服务器详细信息区域 */} {showServerDetails && ( {/* 服务器配置信息 */} {/* 运行时间 */} {uptime > 0 && ( {t("serverCard.uptime")}: {formatUptime(uptime, t)} {t("serverCard.uptime")}: {formatUptime(uptime, t)} )} {/* CPU信息 */} {cpu_info && cpu_info.length > 0 && ( {cpu_info[0].includes("Physical") ? "pCPU: " : "vCPU: "} {cpu_info[0].match(/(\d+)\s+(?:Physical|Virtual)\s+Core/)?.[1] || "?"} {cpu_info.join(", ")} )} {/* 内存大小 */} {mem_total > 0 && ( {t("serverCard.mem")}: {formatBytes(mem_total)} )} {/* 存储大小 */} {disk_total > 0 && ( {t("serverCard.stg")}: {formatBytes(disk_total)} )} {/* TCP连接数 */} {tcp > 0 && ( TCP: {tcp} )} {/* UDP连接数 */} {udp > 0 && ( UDP: {udp} )} {/* 进程数 */} {process > 0 && ( {t("serverDetailChart.process")}: {process} )} {/* 套餐信息 */} {parsedData?.planDataMod && ( )} )} {/* 网络传输信息 */} {showNetTransfer && ( {t("serverCard.upload")}: {formatBytes(net_out_transfer)} {t("serverCard.download")}: {formatBytes(net_in_transfer)} )} ) : ( {showFlag ? : null} {name} {parsedData?.billingDataMod && } {parsedData?.billingDataMod && } {parsedData?.planDataMod && } ) }
{name}
{t("serverCard.system")}
{"CPU"}
{t("serverCard.mem")}
{t("serverCard.stg")}
{t("serverCard.upload")}
{t("serverCard.download")}