减少 portal 目录层级和多余出口文件

This commit is contained in:
dushixiang committed 2026-01-08 20:26:07 +08:00
1 parent 84ec777e49
commit 41a946d39c
41 files changed
+67 -255

No files matched your search

File renamed without changes.
@@ -1,7 +0,0 @@
export {LoadingSpinner} from './LoadingSpinner';
export {EmptyState} from './EmptyState';
export {ChartPlaceholder} from './ChartPlaceholder';
export {CustomTooltip} from './CustomTooltip';
export {TimeRangeSelector} from './TimeRangeSelector';
export {Card} from './Card';
export {MobileLegend} from './MobileLegend';
@@ -1,5 +1,5 @@
import {AlertCircle, Clock, MapPin} from 'lucide-react';
import {StatusBadge} from '../common/StatusBadge.tsx';
import {StatusBadge} from '@portal/components/StatusBadge';
import {CertBadge} from './CertBadge';
import {AGENT_COLORS} from '@portal/constants/colors';
import {formatDateTime, formatTime} from '@portal/utils/util';
@@ -4,28 +4,13 @@ import {useQuery} from "@tanstack/react-query";
import {type GetMetricsResponse, getMonitorHistory} from "@/api/monitor.ts";
import {useMemo} from "react";
import CyberCard from "@portal/components/CyberCard.tsx";
import {StatusBadge} from "@portal/components/common/StatusBadge.tsx";
import {StatusBadge} from "@portal/components/StatusBadge";
import {CertBadge} from "@portal/components/monitor/CertBadge.tsx";
import {formatDateTime} from "@portal/utils/util.ts";
import {MiniChart} from "@portal/components/monitor/MiniChart.tsx";
import type {DisplayMode} from "@portal/components/monitor/index.ts";
import {Activity, Globe, Server, ShieldCheck, Wifi} from "lucide-react";
import {TypeIcon} from "@portal/components/monitor/TypeIcon";
// 类型图标组件
const TypeIcon = ({type}: { type: string }) => {
switch (type.toUpperCase()) {
case 'HTTPS':
return <ShieldCheck className="w-4 h-4 text-purple-400"/>;
case 'HTTP':
return <Globe className="w-4 h-4 text-blue-400"/>;
case 'TCP':
return <Server className="w-4 h-4 text-amber-400"/>;
case 'ICMP':
return <Wifi className="w-4 h-4 text-cyan-500"/>;
default:
return <Activity className="w-4 h-4 text-slate-400"/>;
}
};
export type DisplayMode = 'avg' | 'max';
const MonitorCard = ({monitor, displayMode}: {
monitor: PublicMonitor;
@@ -1,8 +1,8 @@
import {ArrowLeft} from 'lucide-react';
import {TypeIcon} from './TypeIcon';
import {StatusBadge} from '../common/StatusBadge.tsx';
import {StatusBadge} from '@portal/components/StatusBadge';
import {CertBadge} from './CertBadge';
import LittleStatCard from '@portal/components/common/LittleStatCard';
import LittleStatCard from '@portal/components/LittleStatCard';
import type {PublicMonitor} from '@/types';
import CyberCard from "@portal/components/CyberCard.tsx";
import {formatDateTime} from "@portal/utils/util.ts";
@@ -7,7 +7,10 @@ import {MONITOR_TIME_RANGE_OPTIONS} from '@portal/constants/time';
import {useIsMobile} from '@portal/hooks/use-mobile';
import type {AgentMonitorStat} from '@/types';
import CyberCard from "@portal/components/CyberCard.tsx";
import {ChartPlaceholder, CustomTooltip, MobileLegend, TimeRangeSelector} from "@portal/components/common";
import {ChartPlaceholder} from "@portal/components/ChartPlaceholder";
import {CustomTooltip} from "@portal/components/CustomTooltip";
import {MobileLegend} from "@portal/components/MobileLegend";
import {TimeRangeSelector} from "@portal/components/TimeRangeSelector";
import {formatChartTime} from '@portal/utils/util';
interface ResponseTimeChartProps {
@@ -1,11 +0,0 @@
export {CertBadge} from './CertBadge';
export {MiniChart} from './MiniChart';
export {StatusBadge} from '../common/StatusBadge.tsx';
export {TypeIcon} from './TypeIcon';
export {MonitorHero} from './MonitorHero';
export {ResponseTimeChart} from './ResponseTimeChart';
export {AgentStatsTable} from './AgentStatsTable';
export type DisplayMode = 'avg' | 'max';
export type FilterStatus = 'all' | 'up' | 'down' | 'unknown';
@@ -1,8 +1,9 @@
import {useMemo} from 'react';
import {Cpu} from 'lucide-react';
import {Area, AreaChart, CartesianGrid, ResponsiveContainer, Tooltip, XAxis, YAxis} from 'recharts';
import {ChartPlaceholder, CustomTooltip} from '@portal/components/common';
import {useMetricsQuery} from '@portal/hooks/server/queries';
import {ChartPlaceholder} from '@portal/components/ChartPlaceholder';
import {CustomTooltip} from '@portal/components/CustomTooltip';
import {useMetricsQuery} from '@portal/hooks/server';
import {ChartContainer} from './ChartContainer';
import {formatChartTime} from '@portal/utils/util';
@@ -1,8 +1,9 @@
import {useMemo} from 'react';
import {HardDrive} from 'lucide-react';
import {Area, AreaChart, CartesianGrid, Legend, ResponsiveContainer, Tooltip, XAxis, YAxis} from 'recharts';
import {ChartPlaceholder, CustomTooltip} from '@portal/components/common';
import {useMetricsQuery} from '@portal/hooks/server/queries';
import {ChartPlaceholder} from '@portal/components/ChartPlaceholder';
import {CustomTooltip} from '@portal/components/CustomTooltip';
import {useMetricsQuery} from '@portal/hooks/server';
import {ChartContainer} from './ChartContainer';
import {formatChartTime} from '@portal/utils/util';
@@ -1,8 +1,9 @@
import {useMemo} from 'react';
import {Zap} from 'lucide-react';
import {CartesianGrid, Legend, Line, LineChart, ResponsiveContainer, Tooltip, XAxis, YAxis} from 'recharts';
import {ChartPlaceholder, CustomTooltip} from '@portal/components/common';
import {useMetricsQuery} from '@portal/hooks/server/queries';
import {ChartPlaceholder} from '@portal/components/ChartPlaceholder';
import {CustomTooltip} from '@portal/components/CustomTooltip';
import {useMetricsQuery} from '@portal/hooks/server';
import {ChartContainer} from './ChartContainer';
import {formatChartTime} from '@portal/utils/util';
@@ -1,5 +1,5 @@
import {Zap} from 'lucide-react';
import {Card} from '@portal/components/common';
import {Card} from '@portal/components/Card';
import {formatBytes} from '@portal/utils/util';
import type {LatestMetrics} from '@/types';
@@ -1,8 +1,9 @@
import {useMemo} from 'react';
import {MemoryStick} from 'lucide-react';
import {Area, AreaChart, CartesianGrid, ResponsiveContainer, Tooltip, XAxis, YAxis} from 'recharts';
import {ChartPlaceholder, CustomTooltip} from '@portal/components/common';
import {useMetricsQuery} from '@portal/hooks/server/queries';
import {ChartPlaceholder} from '@portal/components/ChartPlaceholder';
import {CustomTooltip} from '@portal/components/CustomTooltip';
import {useMetricsQuery} from '@portal/hooks/server';
import {ChartContainer} from './ChartContainer';
import {formatChartTime} from '@portal/utils/util';
@@ -1,8 +1,10 @@
import {useMemo} from 'react';
import {Activity} from 'lucide-react';
import {Area, AreaChart, CartesianGrid, Legend, ResponsiveContainer, Tooltip, XAxis, YAxis} from 'recharts';
import {ChartPlaceholder, CustomTooltip, MobileLegend} from '@portal/components/common';
import {useMetricsQuery} from '@portal/hooks/server/queries';
import {ChartPlaceholder} from '@portal/components/ChartPlaceholder';
import {CustomTooltip} from '@portal/components/CustomTooltip';
import {MobileLegend} from '@portal/components/MobileLegend';
import {useMetricsQuery} from '@portal/hooks/server';
import {useIsMobile} from '@portal/hooks/use-mobile';
import {ChartContainer} from './ChartContainer';
import {formatChartTime} from '@portal/utils/util';
@@ -1,8 +1,9 @@
import {useEffect, useMemo, useState} from 'react';
import {Network} from 'lucide-react';
import {Area, AreaChart, CartesianGrid, Legend, ResponsiveContainer, Tooltip, XAxis, YAxis} from 'recharts';
import {ChartPlaceholder, CustomTooltip} from '@portal/components/common';
import {useMetricsQuery, useNetworkInterfacesQuery} from '@portal/hooks/server/queries';
import {ChartPlaceholder} from '@portal/components/ChartPlaceholder';
import {CustomTooltip} from '@portal/components/CustomTooltip';
import {useMetricsQuery, useNetworkInterfacesQuery} from '@portal/hooks/server';
import {INTERFACE_COLORS} from '@portal/constants/server';
import {ChartContainer} from './ChartContainer';
import {formatChartTime} from '@portal/utils/util';
@@ -1,8 +1,9 @@
import {useMemo} from 'react';
import {Network} from 'lucide-react';
import {CartesianGrid, Legend, Line, LineChart, ResponsiveContainer, Tooltip, XAxis, YAxis} from 'recharts';
import {ChartPlaceholder, CustomTooltip} from '@portal/components/common';
import {useMetricsQuery} from '@portal/hooks/server/queries';
import {ChartPlaceholder} from '@portal/components/ChartPlaceholder';
import {CustomTooltip} from '@portal/components/CustomTooltip';
import {useMetricsQuery} from '@portal/hooks/server';
import {ChartContainer} from './ChartContainer';
import {formatChartTime} from '@portal/utils/util';
@@ -1,5 +1,5 @@
import {Network} from 'lucide-react';
import {Card} from '@portal/components/common';
import {Card} from '@portal/components/Card';
import type {LatestMetrics} from '@/types';
interface NetworkConnectionSectionProps {
@@ -1,9 +1,9 @@
import {ArrowLeft} from 'lucide-react';
import {formatBytes, formatDateTime, formatUptime} from '@portal/utils/util';
import type {Agent, LatestMetrics} from '@/types';
import LittleStatCard from '@portal/components/common/LittleStatCard';
import LittleStatCard from '@portal/components/LittleStatCard';
import CyberCard from "@portal/components/CyberCard.tsx";
import {StatusBadge} from "@portal/components/common/StatusBadge.tsx";
import {StatusBadge} from "@portal/components/StatusBadge";
interface ServerHeroProps {
agent: Agent;
@@ -1,5 +1,7 @@
import {Cpu, HardDrive, MemoryStick, Network} from 'lucide-react';
import {InfoGrid, type SnapshotCardData, SnapshotSection} from '@portal/components/server';
import {InfoGrid} from '@portal/components/server/InfoGrid';
import {SnapshotSection} from '@portal/components/server/SnapshotSection';
import type {SnapshotCardData} from '@portal/components/server/SnapshotGrid';
import {formatBytes, formatDateTime, formatPercentValue, formatUptime} from '@portal/utils/util';
import type {Agent, LatestMetrics} from '@/types';
import CyberCard from "@portal/components/CyberCard.tsx";
@@ -1,8 +1,9 @@
import {useEffect, useMemo, useState} from 'react';
import {Thermometer} from 'lucide-react';
import {CartesianGrid, Legend, Line, LineChart, ResponsiveContainer, Tooltip, XAxis, YAxis} from 'recharts';
import {ChartPlaceholder, CustomTooltip} from '@portal/components/common';
import {useMetricsQuery} from '@portal/hooks/server/queries';
import {ChartPlaceholder} from '@portal/components/ChartPlaceholder';
import {CustomTooltip} from '@portal/components/CustomTooltip';
import {useMetricsQuery} from '@portal/hooks/server';
import {TEMPERATURE_COLORS} from '@portal/constants/server';
import {ChartContainer} from './ChartContainer';
import {formatChartTime} from '@portal/utils/util';
@@ -1,5 +1,5 @@
import {Thermometer} from 'lucide-react';
import {Card} from '@portal/components/common';
import {Card} from '@portal/components/Card';
import type {LatestMetrics} from '@/types';
interface TemperatureMonitorSectionProps {
@@ -1,9 +0,0 @@
export {ChartContainer} from './ChartContainer';
export {CpuChart} from './CpuChart';
export {MemoryChart} from './MemoryChart';
export {NetworkChart} from './NetworkChart';
export {DiskIOChart} from './DiskIOChart';
export {NetworkConnectionChart} from './NetworkConnectionChart';
export {GpuChart} from './GpuChart';
export {TemperatureChart} from './TemperatureChart';
export {MonitorChart} from './MonitorChart';
@@ -1,9 +0,0 @@
export {InfoGrid} from './InfoGrid';
export {SnapshotGrid} from './SnapshotGrid';
export {SnapshotSection} from './SnapshotSection';
export type {SnapshotCardData} from './SnapshotGrid';
export {ServerHero} from './ServerHero';
export {SystemInfoSection} from './SystemInfoSection';
export {NetworkConnectionSection} from './NetworkConnectionSection';
export {GpuMonitorSection} from './GpuMonitorSection';
export {TemperatureMonitorSection} from './TemperatureMonitorSection';
-5
View File
@@ -1,5 +0,0 @@
// React Query hooks
export {useAgentQuery} from './queries/useAgentQuery';
export {useLatestMetricsQuery} from './queries/useLatestMetricsQuery';
export {useMetricsQuery} from './queries/useMetricsQuery';
export {useNetworkInterfacesQuery} from './queries/useNetworkInterfacesQuery';
@@ -1,4 +0,0 @@
export {useAgentQuery} from './useAgentQuery';
export {useLatestMetricsQuery} from './useLatestMetricsQuery';
export {useMetricsQuery} from './useMetricsQuery';
export {useNetworkInterfacesQuery} from './useNetworkInterfacesQuery';
@@ -1,16 +0,0 @@
import {useQuery} from '@tanstack/react-query';
import {getAgent} from '@/api/agent';
/**
* 查询 Agent 基础信息
* @param agentId Agent ID
* @returns Agent 查询结果
*/
export const useAgentQuery = (agentId?: string) => {
return useQuery({
queryKey: ['agent', agentId],
queryFn: () => getAgent(agentId!),
enabled: !!agentId,
staleTime: 60000, // 1分钟缓存
});
};
@@ -1,17 +0,0 @@
import {useQuery} from '@tanstack/react-query';
import {getAgentLatestMetrics} from '@/api/agent';
/**
* 查询 Agent 最新指标
* 自动每 5 秒刷新一次
* @param agentId Agent ID
* @returns 最新指标查询结果
*/
export const useLatestMetricsQuery = (agentId?: string) => {
return useQuery({
queryKey: ['agent', agentId, 'metrics', 'latest'],
queryFn: () => getAgentLatestMetrics(agentId!),
enabled: !!agentId,
refetchInterval: 5000, // 5秒自动刷新
});
};
@@ -1,33 +0,0 @@
import {useQuery} from '@tanstack/react-query';
import {getAgentMetrics, type GetAgentMetricsRequest} from '@/api/agent';
interface UseMetricsQueryOptions {
agentId: string;
type: GetAgentMetricsRequest['type'];
range?: string;
start?: number;
end?: number;
interfaceName?: string;
}
/**
* 查询 Agent 历史指标数据
* @param options 查询选项
* @returns 历史指标查询结果
*/
export const useMetricsQuery = ({agentId, type, range, start, end, interfaceName}: UseMetricsQueryOptions) => {
return useQuery({
queryKey: ['agent', agentId, 'metrics', type, range, start, end, interfaceName],
queryFn: () =>
getAgentMetrics({
agentId,
type,
range,
start,
end,
interface: interfaceName,
}),
enabled: !!agentId,
// refetchInterval: 30000, // 30秒自动刷新
});
};
@@ -1,15 +0,0 @@
import {useQuery} from '@tanstack/react-query';
import {getAvailableNetworkInterfaces} from '@/api/agent';
/**
* 查询 Agent 可用网卡列表
* @param agentId Agent ID
* @returns 网卡列表查询结果
*/
export const useNetworkInterfacesQuery = (agentId?: string) => {
return useQuery({
queryKey: ['agent', agentId, 'network-interfaces'],
queryFn: () => getAvailableNetworkInterfaces(agentId!),
enabled: !!agentId,
});
};
-62
View File
@@ -1,62 +0,0 @@
import {Shield} from "lucide-react";
import {cn} from "@/lib/utils.ts";
import type {CertStats} from "@/types";
import {formatDate} from "@portal/utils/util.ts";
export const renderCert = (stats: CertStats) => {
const hasCert = stats.certExpiryTime > 0;
const certExpired = hasCert && stats.certDaysLeft < 0;
const certExpiringSoon = hasCert && stats.certDaysLeft >= 0 && stats.certDaysLeft < 30;
if (!hasCert) {
return <span className="text-sm text-slate-400 dark:text-slate-500">-</span>
}
return <div className="flex items-center gap-2">
<Shield
className={cn(
"h-4 w-4",
certExpired
? 'text-red-600 dark:text-red-400'
: certExpiringSoon
? 'text-yellow-600 dark:text-yellow-500'
: 'text-slate-400 dark:text-slate-500'
)}/>
<div className="text-xs">
<div
className={cn(
"font-medium",
certExpired
? 'text-red-700 dark:text-red-300'
: certExpiringSoon
? 'text-yellow-700 dark:text-yellow-300'
: 'text-slate-700 dark:text-slate-200'
)}>
{formatDate(stats.certExpiryTime)}
</div>
<div
className={cn(
certExpired
? 'text-red-600 dark:text-red-400'
: certExpiringSoon
? 'text-yellow-600 dark:text-yellow-400'
: 'text-slate-500 dark:text-slate-400'
)}>
{certExpired ? `已过期 ${Math.abs(stats.certDaysLeft)} 天` : `剩余 ${stats.certDaysLeft} 天`}
</div>
</div>
</div>
}
export const UptimeBar = ({uptime}: { uptime: number }) => {
const percentage = Math.min(Math.max(uptime, 0), 100);
const colorClass = percentage >= 99 ? 'bg-emerald-500' : percentage >= 95 ? 'bg-yellow-500' : 'bg-red-500';
return (
<div className="relative h-2 w-full overflow-hidden rounded-lg bg-slate-100 dark:bg-slate-800">
<div
className={cn("absolute inset-y-0 left-0 transition-all duration-500", colorClass)}
style={{width: `${percentage}%`}}
/>
</div>
);
};
@@ -2,8 +2,11 @@ import {useNavigate, useParams} from 'react-router-dom';
import {useQuery} from '@tanstack/react-query';
import {getMonitorAgentStats, getMonitorStatsById} from '@/api/monitor.ts';
import type {AgentMonitorStat, PublicMonitor} from '@/types';
import {MonitorHero, ResponseTimeChart, AgentStatsTable} from '@portal/components/monitor';
import {EmptyState, LoadingSpinner} from '@portal/components/common';
import {MonitorHero} from '@portal/components/monitor/MonitorHero';
import {ResponseTimeChart} from '@portal/components/monitor/ResponseTimeChart';
import {AgentStatsTable} from '@portal/components/monitor/AgentStatsTable';
import {EmptyState} from '@portal/components/EmptyState';
import {LoadingSpinner} from '@portal/components/LoadingSpinner';
/**
* 监控详情页面
+1 -2
View File
@@ -6,8 +6,7 @@ import {getPublicMonitors} from '@/api/monitor.ts';
import type {PublicMonitor} from '@/types';
import {cn} from '@/lib/utils';
import StatBlock from "@portal/components/StatBlock.tsx";
import type {DisplayMode, FilterStatus} from "@portal/components/monitor";
import MonitorCard from "@portal/components/monitor/MonitorCard.tsx";
import MonitorCard, {type DisplayMode} from "@portal/components/monitor/MonitorCard";
const LoadingSpinner = () => (
<div className="flex min-h-[400px] w-full items-center justify-center">
+18 -19
View File
@@ -1,24 +1,23 @@
import {useState} from 'react';
import {useNavigate, useParams} from 'react-router-dom';
import {Card, EmptyState, LoadingSpinner, TimeRangeSelector} from '@portal/components/common';
import {
GpuMonitorSection,
NetworkConnectionSection,
ServerHero,
SystemInfoSection,
TemperatureMonitorSection,
} from '@portal/components/server';
import {
CpuChart,
DiskIOChart,
GpuChart,
MemoryChart,
MonitorChart,
NetworkChart,
NetworkConnectionChart,
TemperatureChart,
} from '@portal/components/server/charts';
import {useAgentQuery, useLatestMetricsQuery} from '@portal/hooks/server/queries';
import {Card} from '@portal/components/Card';
import {EmptyState} from '@portal/components/EmptyState';
import {LoadingSpinner} from '@portal/components/LoadingSpinner';
import {TimeRangeSelector} from '@portal/components/TimeRangeSelector';
import {GpuMonitorSection} from '@portal/components/server/GpuMonitorSection';
import {NetworkConnectionSection} from '@portal/components/server/NetworkConnectionSection';
import {ServerHero} from '@portal/components/server/ServerHero';
import {SystemInfoSection} from '@portal/components/server/SystemInfoSection';
import {TemperatureMonitorSection} from '@portal/components/server/TemperatureMonitorSection';
import {CpuChart} from '@portal/components/server/CpuChart';
import {DiskIOChart} from '@portal/components/server/DiskIOChart';
import {GpuChart} from '@portal/components/server/GpuChart';
import {MemoryChart} from '@portal/components/server/MemoryChart';
import {MonitorChart} from '@portal/components/server/MonitorChart';
import {NetworkChart} from '@portal/components/server/NetworkChart';
import {NetworkConnectionChart} from '@portal/components/server/NetworkConnectionChart';
import {TemperatureChart} from '@portal/components/server/TemperatureChart';
import {useAgentQuery, useLatestMetricsQuery} from '@portal/hooks/server';
import {SERVER_TIME_RANGE_OPTIONS} from '@portal/constants/time';
/**