修改SSH链接属性字段

This commit is contained in:
dengqichen 2025-12-06 18:01:05 +08:00
parent 24f62c5719
commit 9325166132
4 changed files with 86 additions and 19 deletions

View File

@ -44,7 +44,7 @@ type ConnectionStatus = 'connecting' | 'connected' | 'reconnecting' | 'disconnec
interface WebSocketMessage {
type: 'output' | 'input' | 'status' | 'error';
data: string;
data: string | { response: { type: string; data: string } }; // 支持字符串或 response 包装格式
timestamp?: number;
metadata?: Record<string, any> | null;
}
@ -213,11 +213,34 @@ export const SSHTerminalContent: React.FC<SSHTerminalContentProps> = ({
if (wsRef.current?.readyState === WebSocket.OPEN) {
wsRef.current.send(JSON.stringify({
type: 'input',
data: data,
data: {
request: {
type: 'input',
command: data,
}
}
}));
}
});
// 监听终端尺寸变化
terminal.onResize((size) => {
console.log('📐 终端尺寸变化:', size);
if (wsRef.current?.readyState === WebSocket.OPEN) {
wsRef.current.send(JSON.stringify({
type: 'resize',
data: {
request: {
type: 'resize',
rows: size.rows,
cols: size.cols,
}
}
}));
console.log('📤 已发送尺寸调整消息:', size);
}
});
// 延迟连接
setTimeout(() => {
connectWebSocket();
@ -254,6 +277,22 @@ export const SSHTerminalContent: React.FC<SSHTerminalContentProps> = ({
ws.onopen = () => {
console.log('🔗 WebSocket已连接:', wsUrl);
console.log('📺 Terminal实例存在:', !!terminalInstanceRef.current);
// 发送初始终端尺寸
if (terminalInstanceRef.current) {
const terminal = terminalInstanceRef.current;
ws.send(JSON.stringify({
type: 'resize',
data: {
request: {
type: 'resize',
rows: terminal.rows,
cols: terminal.cols,
}
}
}));
console.log('📤 已发送初始终端尺寸:', { rows: terminal.rows, cols: terminal.cols });
}
};
ws.onmessage = (event) => {
@ -262,28 +301,33 @@ export const SSHTerminalContent: React.FC<SSHTerminalContentProps> = ({
const msg: WebSocketMessage = JSON.parse(event.data);
console.log('📦 解析后的消息:', msg);
// 提取实际数据:处理后端 response 包装格式
const actualData = typeof msg.data === 'string'
? msg.data
: msg.data?.response?.data || '';
switch (msg.type) {
case 'output':
console.log('📝 输出数据:', msg.data?.substring(0, 100));
console.log('📝 输出数据:', actualData?.substring(0, 100));
console.log('📺 Terminal实例:', !!terminalInstanceRef.current);
if (msg.data && terminalInstanceRef.current) {
terminalInstanceRef.current.write(msg.data);
if (actualData && terminalInstanceRef.current) {
terminalInstanceRef.current.write(actualData);
console.log('✅ 数据已写入终端');
} else {
console.warn('⚠️ 无法写入终端:', { hasData: !!msg.data, hasTerminal: !!terminalInstanceRef.current });
console.warn('⚠️ 无法写入终端:', { hasData: !!actualData, hasTerminal: !!terminalInstanceRef.current });
}
break;
case 'error':
console.error('❌ SSH错误:', msg.data);
terminalInstanceRef.current?.writeln(`\r\n\x1b[31m错误: ${msg.data}\x1b[0m\r\n`);
message.error(msg.data || '连接错误');
console.error('❌ SSH错误:', actualData);
terminalInstanceRef.current?.writeln(`\r\n\x1b[31m错误: ${actualData}\x1b[0m\r\n`);
message.error(actualData || '连接错误');
break;
case 'status':
console.log('📊 状态变化:', msg.data);
setConnectionStatus(msg.data as ConnectionStatus);
if (msg.data === 'connected') {
console.log('📊 状态变化:', actualData);
setConnectionStatus(actualData as ConnectionStatus);
if (actualData === 'connected') {
// 显示审计警告
terminalInstanceRef.current?.writeln('\r\n\x1b[33m┌─────────────────────────────────────────────────────────────\x1b[0m');
terminalInstanceRef.current?.writeln('\x1b[33m│ ⚠️ 链宇技术有限公司 - 安全提示\x1b[0m');

View File

@ -168,18 +168,16 @@ const ServerList: React.FC = () => {
setTestingServerId(server.id);
try {
const result = await testServerConnection(server.id);
// 后端返回 { success: true, data: true/false }
// data 为 true 表示连接成功, false 表示连接失败
if (result === true) {
if (result.connected) {
toast({
title: '连接成功',
description: '服务器连接正常',
description: `${result.hostname} - ${result.osVersion} (响应时间: ${result.responseTime}ms)`,
});
} else {
toast({
variant: 'destructive',
title: '连接失败',
description: '无法连接到服务器',
description: result.errorMessage || '无法连接到服务器',
});
}
} catch (error: any) {

View File

@ -5,6 +5,7 @@ import type {
ServerCategoryRequest,
ServerResponse,
ServerRequest,
ServerConnectionTestResult,
} from './types';
import type { ServerFormValues } from './schema';
import type { Page } from '@/types/base';
@ -111,8 +112,8 @@ export const batchDeleteServers = (ids: number[]) =>
/**
*
* true , false
*
*/
export const testServerConnection = (id: number) =>
request.post<boolean>(`${SERVER_URL}/${id}/test-connection`);
request.post<ServerConnectionTestResult>(`${SERVER_URL}/${id}/test-connection`);

View File

@ -224,3 +224,27 @@ export const AuthTypeLabels: Record<AuthType, { label: string; description: stri
[AuthType.KEY]: { label: '密钥认证', description: '使用SSH私钥进行认证' },
};
/**
*
*/
export interface ServerConnectionTestResult {
/** 是否连接成功 */
connected: boolean;
/** 错误信息(连接失败时返回) */
errorMessage: string | null;
/** 连接时间 */
connectTime: string;
/** 响应时间(ms) */
responseTime: number;
/** 主机名 */
hostname: string;
/** 操作系统版本 */
osVersion: string;
/** CPU核心数 */
cpuCores: number;
/** 内存大小(GB) */
memorySize: number;
/** 磁盘大小(GB) */
diskSize: number;
}