增加系统版本维护页面

This commit is contained in:
dengqichen 2025-12-09 15:16:54 +08:00
parent 051a3c827c
commit 35c65b0510
3 changed files with 87 additions and 59 deletions

View File

@ -685,40 +685,6 @@ export const ServerEditDialog: React.FC<ServerEditDialogProps> = ({
)} )}
</div> </div>
{/* 测试连接按钮 */}
<div className="mt-4 flex items-center gap-3">
<Button
type="button"
variant="outline"
onClick={handleTestAndCollect}
disabled={testing || collecting || loading}
className="flex-1"
>
{testing ? (
<>
<Loader2 className="mr-2 h-4 w-4 animate-spin" />
...
</>
) : collecting ? (
<>
<Loader2 className="mr-2 h-4 w-4 animate-spin" />
...
</>
) : testSuccess ? (
<>
<CheckCircle className="mr-2 h-4 w-4 text-green-500" />
</>
) : (
'测试连接并采集信息'
)}
</Button>
{testSuccess && !isEdit && (
<span className="text-xs text-green-600 dark:text-green-400">
</span>
)}
</div>
</div> </div>
<Separator /> <Separator />

View File

@ -36,7 +36,7 @@ import { DataTablePagination } from '@/components/ui/pagination';
import { Input } from '@/components/ui/input'; import { Input } from '@/components/ui/input';
import type { ServerResponse, ServerCategoryResponse, ServerStatus, OsType } from './types'; import type { ServerResponse, ServerCategoryResponse, ServerStatus, OsType } from './types';
import { ServerStatusLabels, OsTypeLabels } from './types'; import { ServerStatusLabels, OsTypeLabels } from './types';
import { getServers, getServerCategories, deleteServer, testServerConnection, collectServerHardware } from './service'; import { getServers, getServerList, getServerCategories, deleteServer, testServerConnection, collectServerHardware } from './service';
import { CategoryManageDialog } from './components/CategoryManageDialog'; import { CategoryManageDialog } from './components/CategoryManageDialog';
import { AlertRuleManageDialog } from './components/AlertRuleManageDialog'; import { AlertRuleManageDialog } from './components/AlertRuleManageDialog';
import { ServerEditDialog } from './components/ServerEditDialog'; import { ServerEditDialog } from './components/ServerEditDialog';
@ -142,13 +142,30 @@ const ServerList: React.FC = () => {
}; };
// 加载服务器列表 // 加载服务器列表
const loadServers = async () => { const loadServers = async (silent: boolean = false) => {
// silent 为 true 时不显示全局 loading 状态(用于操作后的静默刷新)
if (!silent) {
setLoading(true); setLoading(true);
}
try { try {
const result = await getServers({ const params = {
categoryId: selectedCategoryId, categoryId: selectedCategoryId,
status: selectedStatus, status: selectedStatus,
osType: selectedOsType, osType: selectedOsType,
};
// 卡片模式使用 list 接口(无分页),列表模式使用 page 接口(有分页)
if (viewMode === 'grid') {
// 卡片模式:调用 list 接口获取所有数据
const result = await getServerList(params);
if (result) {
setServers(result);
setTotalElements(result.length);
}
} else {
// 列表模式:调用 page 接口获取分页数据
const result = await getServers({
...params,
pageNum: pageIndex, pageNum: pageIndex,
size: pageSize, size: pageSize,
}); });
@ -156,6 +173,7 @@ const ServerList: React.FC = () => {
setServers(result.content || []); setServers(result.content || []);
setTotalElements(result.totalElements || 0); setTotalElements(result.totalElements || 0);
} }
}
} catch (error) { } catch (error) {
console.error('加载服务器列表失败:', error); console.error('加载服务器列表失败:', error);
toast({ toast({
@ -164,8 +182,10 @@ const ServerList: React.FC = () => {
description: '无法加载服务器列表', description: '无法加载服务器列表',
}); });
} finally { } finally {
if (!silent) {
setLoading(false); setLoading(false);
} }
}
}; };
// 测试连接(轻量级) // 测试连接(轻量级)
@ -178,6 +198,9 @@ const ServerList: React.FC = () => {
title: '连接成功', title: '连接成功',
description: `响应时间: ${result.responseTime}ms`, description: `响应时间: ${result.responseTime}ms`,
}); });
// 静默刷新服务器列表(不显示加载状态)
await loadServers(true);
await loadStats();
} else { } else {
toast({ toast({
variant: 'destructive', variant: 'destructive',
@ -199,20 +222,39 @@ const ServerList: React.FC = () => {
// 刷新硬件信息 // 刷新硬件信息
const handleCollectHardware = async (server: ServerResponse) => { const handleCollectHardware = async (server: ServerResponse) => {
setCollectingServerId(server.id); setCollectingServerId(server.id);
// 显示开始采集的提示
toast({
title: '正在采集硬件信息...',
description: `正在从 ${server.serverName} 采集最新硬件信息`,
});
try { try {
const result = await collectServerHardware(server.id); const result = await collectServerHardware(server.id);
toast({
title: '硬件信息已更新', // 静默刷新服务器列表(不显示加载状态)
description: `${result.hostname} - CPU: ${result.cpuCores}核 内存: ${result.memorySize}GB`, await loadServers(true);
});
// 刷新服务器列表
await loadServers();
await loadStats(); await loadStats();
// 显示详细的成功信息
toast({
title: '✓ 硬件信息更新成功',
description: (
<div className="space-y-1">
<div><strong>{result.hostname}</strong></div>
<div className="text-xs space-y-0.5">
<div> CPU: {result.cpuCores} </div>
<div> : {result.memorySize} GB</div>
<div> : {result.diskSize} GB</div>
</div>
</div>
),
});
} catch (error: any) { } catch (error: any) {
toast({ toast({
variant: 'destructive', variant: 'destructive',
title: '采集失败', title: '采集失败',
description: error.response?.data?.message || '无法采集硬件信息', description: error.response?.data?.message || '无法采集硬件信息,请检查服务器连接',
}); });
} finally { } finally {
setCollectingServerId(null); setCollectingServerId(null);
@ -250,10 +292,10 @@ const ServerList: React.FC = () => {
await deleteServer(serverToDelete.id); await deleteServer(serverToDelete.id);
}; };
// 成功回调 // 成功回调(新增/编辑服务器后)
const handleSuccess = () => { const handleSuccess = () => {
loadCategories(); loadCategories();
loadServers(); loadServers(true); // 静默刷新
loadStats(); loadStats();
}; };
@ -293,10 +335,10 @@ const ServerList: React.FC = () => {
); );
}); });
// 监听筛选条件和分页变化 // 监听筛选条件、分页和视图模式变化
useEffect(() => { useEffect(() => {
loadServers(); loadServers();
}, [pageIndex, pageSize, selectedCategoryId, selectedStatus, selectedOsType]); }, [pageIndex, pageSize, selectedCategoryId, selectedStatus, selectedOsType, viewMode]);
// 使用statsData作为统计数据 // 使用statsData作为统计数据
const stats = statsData; const stats = statsData;
@ -579,8 +621,8 @@ const ServerList: React.FC = () => {
/> />
)} )}
{/* 分页 */} {/* 分页(仅列表模式) */}
{!loading && servers.length > 0 && ( {!loading && servers.length > 0 && viewMode === 'table' && (
<div className="mt-6 flex items-center justify-between"> <div className="mt-6 flex items-center justify-between">
<div className="text-sm text-muted-foreground"> <div className="text-sm text-muted-foreground">
{totalElements} {pageIndex + 1} / {Math.ceil(totalElements / pageSize)} {totalElements} {pageIndex + 1} / {Math.ceil(totalElements / pageSize)}
@ -596,6 +638,16 @@ const ServerList: React.FC = () => {
/> />
</div> </div>
)} )}
{/* 卡片模式统计信息 */}
{!loading && servers.length > 0 && viewMode === 'grid' && (
<div className="mt-6 text-sm text-muted-foreground text-center">
{totalElements}
{searchKeyword && filteredServers.length > 0 && (
<span> {filteredServers.length} </span>
)}
</div>
)}
</div> </div>
</CardContent> </CardContent>
</ScrollArea> </ScrollArea>
@ -639,7 +691,7 @@ const ServerList: React.FC = () => {
description: `服务器"${serverToDelete?.serverName}"已删除`, description: `服务器"${serverToDelete?.serverName}"已删除`,
}); });
setServerToDelete(null); setServerToDelete(null);
loadServers(); loadServers(true); // 静默刷新
loadStats(); loadStats();
}} }}
variant="destructive" variant="destructive"

View File

@ -65,6 +65,16 @@ export const batchDeleteServerCategories = (ids: number[]) =>
// ==================== 服务器 ==================== // ==================== 服务器 ====================
/**
*
*/
export const getServerList = (params?: {
categoryId?: number;
status?: string;
osType?: string;
}) =>
request.get<ServerResponse[]>(`${SERVER_URL}/list`, { params });
/** /**
* *
*/ */