fix(frontend): 修复文件管理器删除与上传稳定性

补齐文件管理器右键子菜单点击展开,新增拖拽上传目标确认,
并在上传完成后自动刷新当前可见目录

目录删除改为区分仅删空目录与强制递归删除,删除后自动回退
失效路径,避免文件树持续报 No such file

同步后端 sftp:rmdir 的 recursive 分支,并将关于页与版本检查
默认仓库链接切换到 Micah123321/nexus-terminal
This commit is contained in:
yinjianm
2026-03-26 03:48:50 +08:00
parent 1a326cc01f
commit cda7e0a018
32 changed files with 661 additions and 115 deletions
+28 -4
View File
@@ -489,16 +489,40 @@ export class SftpService {
}
}
/** 删除目录 (强制递归) */
async rmdir(sessionId: string, path: string, requestId: string): Promise<void> {
/** 删除目录 */
async rmdir(sessionId: string, path: string, requestId: string, recursive = true): Promise<void> {
const state = this.clientStates.get(sessionId);
if (!state || !state.sshClient) {
console.warn(`[SSH Exec] SSH 客户端未准备好,无法在 ${sessionId} 上执行 rmdir (ID: ${requestId})`);
if (!state || (!state.sshClient && recursive) || (!state.sftp && !recursive)) {
console.warn(`[SSH Exec] 会话未准备好,无法在 ${sessionId} 上执行 rmdir (ID: ${requestId})`);
state?.ws.send(JSON.stringify({ type: 'sftp:rmdir:error', path: path, payload: 'SSH 会话未就绪', requestId: requestId }));
return;
}
console.debug(`[SSH Exec ${sessionId}] Received rmdir request for ${path} (ID: ${requestId})`);
if (!recursive) {
const sftp = state.sftp;
if (!sftp) {
state.ws.send(JSON.stringify({ type: 'sftp:rmdir:error', path: path, payload: 'SFTP 会话未就绪', requestId: requestId }));
return;
}
try {
sftp.rmdir(path, (err) => {
if (err) {
console.error(`[SFTP ${sessionId}] rmdir ${path} failed (ID: ${requestId}):`, err);
state.ws.send(JSON.stringify({ type: 'sftp:rmdir:error', path: path, payload: `删除目录失败: ${err.message}`, requestId: requestId }));
} else {
console.log(`[SFTP ${sessionId}] rmdir ${path} success (ID: ${requestId})`);
state.ws.send(JSON.stringify({ type: 'sftp:rmdir:success', path: path, requestId: requestId }));
}
});
} catch (error: any) {
console.error(`[SFTP ${sessionId}] rmdir ${path} caught unexpected error (ID: ${requestId}):`, error);
state.ws.send(JSON.stringify({ type: 'sftp:rmdir:error', path: path, payload: `删除目录失败: ${error.message}`, requestId: requestId }));
}
return;
}
// 第一种方案:尝试 rm -rf 命令
const tryRmRfCommand = async (isSudo: boolean) => {
const commandPrefix = isSudo ? 'sudo ' : '';
@@ -57,7 +57,7 @@ export async function handleSftpOperation(
else throw new Error("Missing 'path' in payload for mkdir");
break;
case 'sftp:rmdir':
if (payload?.path) sftpService.rmdir(sessionId, payload.path, requestId);
if (payload?.path) sftpService.rmdir(sessionId, payload.path, requestId, payload?.recursive !== false);
else throw new Error("Missing 'path' in payload for rmdir");
break;
case 'sftp:unlink':
@@ -169,4 +169,4 @@ export function handleSftpUploadCancel(ws: AuthenticatedWebSocket, payload: any)
return;
}
sftpService.cancelUpload(sessionId, payload.uploadId);
}
}