From e5bd51b4b5eb3442fc5fda4afa0d537e558a7612 Mon Sep 17 00:00:00 2001 From: dengqichen Date: Sun, 7 Dec 2025 21:12:15 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E5=86=99ssh=E5=89=8D=E7=AB=AF?= =?UTF-8?q?=E7=BB=84=E4=BB=B6=EF=BC=8C=E9=80=9A=E7=94=A8=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/components/FileManager/index.ts | 2 + frontend/src/components/Terminal/Terminal.tsx | 72 ++++--------------- .../Server/List/components/ServerCard.tsx | 46 +++++++++--- .../src/pages/Resource/Server/List/index.tsx | 4 ++ .../src/pages/Resource/Server/List/types.ts | 14 ++++ 5 files changed, 69 insertions(+), 69 deletions(-) diff --git a/frontend/src/components/FileManager/index.ts b/frontend/src/components/FileManager/index.ts index 4508002d..4db51ce9 100644 --- a/frontend/src/components/FileManager/index.ts +++ b/frontend/src/components/FileManager/index.ts @@ -1 +1,3 @@ export { FileManager } from './FileManager'; +export { FileManagerWindowManager } from './FileManagerWindowManager'; +export type { FileManagerProps } from './types'; diff --git a/frontend/src/components/Terminal/Terminal.tsx b/frontend/src/components/Terminal/Terminal.tsx index b80045e2..6d28da0a 100644 --- a/frontend/src/components/Terminal/Terminal.tsx +++ b/frontend/src/components/Terminal/Terminal.tsx @@ -7,7 +7,6 @@ import { Input } from '@/components/ui/input'; import 'xterm/css/xterm.css'; import styles from './index.module.less'; import { TerminalToolbar } from './TerminalToolbar'; -import { FileManager } from '@/components/FileManager'; import type { TerminalProps, TerminalToolbarConfig } from './types'; import { TERMINAL_THEMES, getThemeByName } from './themes'; import { Loader2, XCircle, ChevronUp, ChevronDown, X, WifiOff } from 'lucide-react'; @@ -44,9 +43,6 @@ export const Terminal: React.FC = ({ const [connectionStatus, setConnectionStatus] = useState('disconnected'); // 初始状态,会被实例状态覆盖 const [errorMessage, setErrorMessage] = useState(''); const [connectedTime, setConnectedTime] = useState(null); - const [showFileManager, setShowFileManager] = useState(false); - const [fileManagerMinimized, setFileManagerMinimized] = useState(false); - const [fileManagerActive, setFileManagerActive] = useState(false); // 默认工具栏配置 const toolbarConfig: TerminalToolbarConfig = { @@ -278,40 +274,24 @@ export const Terminal: React.FC = ({ } }, []); - // 打开文件管理器 + // 打开文件管理器(调用全局方法) const handleFileManager = useCallback(() => { if (connection.type !== 'ssh') { message.warning('文件管理仅支持SSH连接'); return; } - setShowFileManager(true); - setFileManagerMinimized(false); - setFileManagerActive(true); - }, [connection.type]); - - // 最小化文件管理器 - const handleFileManagerMinimize = useCallback(() => { - setFileManagerMinimized(true); - setFileManagerActive(false); - }, []); - - // 恢复文件管理器 - const handleFileManagerRestore = useCallback(() => { - setFileManagerMinimized(false); - setFileManagerActive(true); - }, []); - - // 激活文件管理器 - const handleFileManagerFocus = useCallback(() => { - setFileManagerActive(true); - }, []); - - // 关闭文件管理器 - const handleFileManagerClose = useCallback(() => { - setShowFileManager(false); - setFileManagerMinimized(false); - setFileManagerActive(false); - }, []); + if (!connection.serverId || !connection.serverName) { + message.error('缺少服务器信息'); + return; + } + // 调用全局方法打开文件管理器 + const openFileManager = (window as any).openFileManager; + if (openFileManager) { + openFileManager(Number(connection.serverId), connection.serverName); + } else { + message.error('文件管理器未初始化'); + } + }, [connection.type, connection.serverId, connection.serverName]); return (
@@ -454,31 +434,7 @@ export const Terminal: React.FC = ({ )}
- {/* 最小化窗口状态栏 */} - {connection.type === 'ssh' && showFileManager && fileManagerMinimized && ( -
- -
- )} - - {/* 文件管理器 */} - {connection.type === 'ssh' && showFileManager && connection.serverId && !fileManagerMinimized && ( - - )} + {/* 文件管理器已移至独立的窗口管理器 */} ); }; diff --git a/frontend/src/pages/Resource/Server/List/components/ServerCard.tsx b/frontend/src/pages/Resource/Server/List/components/ServerCard.tsx index ceae4696..ad144674 100644 --- a/frontend/src/pages/Resource/Server/List/components/ServerCard.tsx +++ b/frontend/src/pages/Resource/Server/List/components/ServerCard.tsx @@ -342,18 +342,42 @@ export const ServerCard: React.FC = ({ server, onTest, onEdit, { skeleton: true, skeletonHeight: 'h-4' } )} -
-
- -
- {renderValue( - server.diskSize ? ( - {server.diskSize}GB - ) : null, - 'w-10', - { skeleton: true, skeletonHeight: 'h-4' } + + +
+
+ +
+ {renderValue( + server.diskSize ? ( + {server.diskSize}GB + ) : null, + 'w-10', + { skeleton: true, skeletonHeight: 'h-4' } + )} +
+
+ {server.diskInfo && server.diskInfo.length > 0 && ( + +
+
磁盘详情
+ {server.diskInfo.map((disk, index) => ( +
+
+ {disk.mountPoint} + ({disk.fileSystem}) +
+ {disk.totalSize}GB +
+ ))} +
+ 总计 + {server.diskSize}GB +
+
+
)} -
+ )} diff --git a/frontend/src/pages/Resource/Server/List/index.tsx b/frontend/src/pages/Resource/Server/List/index.tsx index 9ffeeaff..c6e1a7f0 100644 --- a/frontend/src/pages/Resource/Server/List/index.tsx +++ b/frontend/src/pages/Resource/Server/List/index.tsx @@ -41,6 +41,7 @@ import { ServerEditDialog } from './components/ServerEditDialog'; import { ServerCard } from './components/ServerCard'; import { ServerTable } from './components/ServerTable'; import { SSHWindowManager } from './components/SSHWindowManager'; +import { FileManagerWindowManager } from '@/components/FileManager'; const ServerList: React.FC = () => { const { toast } = useToast(); @@ -611,6 +612,9 @@ const ServerList: React.FC = () => { {/* SSH多窗口管理器 */} + + {/* 文件管理器窗口管理器 */} + ); }; diff --git a/frontend/src/pages/Resource/Server/List/types.ts b/frontend/src/pages/Resource/Server/List/types.ts index ff1e4586..ff0422c8 100644 --- a/frontend/src/pages/Resource/Server/List/types.ts +++ b/frontend/src/pages/Resource/Server/List/types.ts @@ -92,6 +92,18 @@ export interface ServerCategoryRequest { // ==================== 服务器 ==================== +/** + * 磁盘信息 + */ +export interface DiskInfo { + /** 挂载点 */ + mountPoint: string; + /** 文件系统类型 */ + fileSystem: string; + /** 总大小(GB) */ + totalSize: number; +} + /** * 服务器响应类型 */ @@ -130,6 +142,8 @@ export interface ServerResponse extends BaseResponse { memorySize?: number; /** 磁盘大小(GB) */ diskSize?: number; + /** 磁盘详细信息 */ + diskInfo?: DiskInfo[]; /** 标签(JSON字符串) */ tags?: string; /** 最后连接时间 */