From 1711981d80dbf5001e6b4c4fb6ed16b9e69d2b9f Mon Sep 17 00:00:00 2001 From: lijiahang Date: Thu, 22 Feb 2024 16:31:45 +0800 Subject: [PATCH] =?UTF-8?q?:sparkles:=20=E4=BC=98=E5=8C=96=E4=B8=8A?= =?UTF-8?q?=E4=BC=A0=E9=80=BB=E8=BE=91.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../transfer/enums/TransferOperatorType.java | 16 ++-- .../transfer/enums/TransferReceiverType.java | 43 +++++++++ .../transfer/handler/TransferHandler.java | 72 +++++++++------ .../components/sftp/sftp-upload-modal.vue | 27 +++++- .../terminal/components/sftp/sftp-view.vue | 1 + .../components/transfer/transfer-drawer.vue | 79 ++++++++++++++--- .../host/terminal/handler/sftp-session.ts | 5 ++ .../terminal/handler/sftp-transfer-manager.ts | 88 ++++++++++++------- .../handler/sftp-transfer-uploader.ts | 12 +++ .../host/terminal/types/terminal.const.ts | 12 ++- .../host/terminal/types/terminal.type.ts | 12 ++- 11 files changed, 277 insertions(+), 90 deletions(-) create mode 100644 orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/transfer/enums/TransferReceiverType.java diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/transfer/enums/TransferOperatorType.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/transfer/enums/TransferOperatorType.java index f35bd4c8..b4813367 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/transfer/enums/TransferOperatorType.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/transfer/enums/TransferOperatorType.java @@ -4,7 +4,7 @@ import lombok.AllArgsConstructor; import lombok.Getter; /** - * 消息操作类型 + * 传输操作类型 * * @author Jiahang Li * @version 1.0.0 @@ -14,20 +14,20 @@ import lombok.Getter; @AllArgsConstructor public enum TransferOperatorType { - /** - * 处理完成 - */ - PROCESSED("processed"), - /** * 开始上传 */ - UPLOAD_START("upload_start"), + UPLOAD_START("uploadStart"), /** * 上传完成 */ - UPLOAD_FINISH("upload_finish"), + UPLOAD_FINISH("uploadFinish"), + + /** + * 上传失败 + */ + UPLOAD_ERROR("uploadError"), ; diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/transfer/enums/TransferReceiverType.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/transfer/enums/TransferReceiverType.java new file mode 100644 index 00000000..95902ca4 --- /dev/null +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/transfer/enums/TransferReceiverType.java @@ -0,0 +1,43 @@ +package com.orion.ops.module.asset.handler.host.transfer.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 传输响应类型 + * + * @author Jiahang Li + * @version 1.0.0 + * @since 2024/2/21 22:03 + */ +@Getter +@AllArgsConstructor +public enum TransferReceiverType { + + /** + * 请求下一块上传数据 + */ + NEXT_BLOCK("nextBlock"), + + /** + * 请求下一个传输任务 + */ + NEXT_TRANSFER("nextTransfer"), + + ; + + private final String type; + + public static TransferReceiverType of(String type) { + if (type == null) { + return null; + } + for (TransferReceiverType value : values()) { + if (value.type.equals(type)) { + return value; + } + } + return null; + } + +} diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/transfer/handler/TransferHandler.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/transfer/handler/TransferHandler.java index a642e05b..b2ab0874 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/transfer/handler/TransferHandler.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/transfer/handler/TransferHandler.java @@ -4,12 +4,14 @@ import com.alibaba.fastjson.JSON; import com.orion.lang.exception.argument.InvalidArgumentException; import com.orion.lang.utils.io.Streams; import com.orion.net.host.SessionStore; +import com.orion.ops.framework.common.constant.Const; import com.orion.ops.framework.common.constant.ErrorMessage; import com.orion.ops.framework.common.constant.ExtraFieldConst; import com.orion.ops.framework.websocket.core.utils.WebSockets; import com.orion.ops.module.asset.entity.dto.HostTerminalConnectDTO; import com.orion.ops.module.asset.enums.HostConnectTypeEnum; import com.orion.ops.module.asset.handler.host.transfer.enums.TransferOperatorType; +import com.orion.ops.module.asset.handler.host.transfer.enums.TransferReceiverType; import com.orion.ops.module.asset.handler.host.transfer.model.TransferOperatorRequest; import com.orion.ops.module.asset.handler.host.transfer.model.TransferOperatorResponse; import com.orion.ops.module.asset.handler.host.transfer.session.ITransferHostSession; @@ -72,6 +74,10 @@ public class TransferHandler implements ITransferHandler { // 上传完成 this.uploadFinish(); break; + case UPLOAD_ERROR: + // 上传失败 + this.uploadError(); + break; default: break; } @@ -79,23 +85,18 @@ public class TransferHandler implements ITransferHandler { @Override public void putContent(byte[] content) { - Exception ex = null; try { // 写入内容 currentSession.putContent(content); + // 响应结果 + this.sendMessage(TransferReceiverType.NEXT_BLOCK, null); } catch (IOException e) { - ex = e; log.error("TransferHandler.putContent error", e); // 写入完成 currentSession.putFinish(); + // 响应结果 + this.sendMessage(TransferReceiverType.NEXT_TRANSFER, e); } - // 响应结果 - TransferOperatorResponse resp = TransferOperatorResponse.builder() - .type(TransferOperatorType.PROCESSED.getType()) - .success(ex == null) - .msg(this.getErrorMessage(ex)) - .build(); - WebSockets.sendText(this.channel, JSON.toJSONString(resp)); } /** @@ -104,20 +105,18 @@ public class TransferHandler implements ITransferHandler { * @param payload payload */ private void uploadStart(TransferOperatorRequest payload) { - Exception ex = null; try { + // 开始上传 currentSession.startUpload(payload.getPath()); + // 响应结果 + this.sendMessage(TransferReceiverType.NEXT_BLOCK, null); } catch (Exception e) { - ex = e; log.error("TransferHandler.uploadStart error", e); + // 传输完成 + currentSession.putFinish(); + // 响应结果 + this.sendMessage(TransferReceiverType.NEXT_TRANSFER, e); } - // 响应结果 - TransferOperatorResponse resp = TransferOperatorResponse.builder() - .type(TransferOperatorType.PROCESSED.getType()) - .success(ex == null) - .msg(this.getErrorMessage(ex)) - .build(); - WebSockets.sendText(this.channel, JSON.toJSONString(resp)); } /** @@ -126,11 +125,16 @@ public class TransferHandler implements ITransferHandler { private void uploadFinish() { currentSession.putFinish(); // 响应结果 - TransferOperatorResponse resp = TransferOperatorResponse.builder() - .type(TransferOperatorType.PROCESSED.getType()) - .success(true) - .build(); - WebSockets.sendText(this.channel, JSON.toJSONString(resp)); + this.sendMessage(TransferReceiverType.NEXT_TRANSFER, null); + } + + /** + * 上传失败 + */ + private void uploadError() { + currentSession.putFinish(); + // 响应结果 + this.sendMessage(TransferReceiverType.NEXT_TRANSFER, new InvalidArgumentException(Const.EMPTY)); } /** @@ -158,16 +162,26 @@ public class TransferHandler implements ITransferHandler { } catch (Exception e) { log.error("TransferHandler.getAndInitSession error", e); // 响应结果 - TransferOperatorResponse resp = TransferOperatorResponse.builder() - .type(TransferOperatorType.PROCESSED.getType()) - .success(false) - .msg(this.getErrorMessage(e)) - .build(); - WebSockets.sendText(this.channel, JSON.toJSONString(resp)); + this.sendMessage(TransferReceiverType.NEXT_TRANSFER, e); return false; } } + /** + * 发送消息 + * + * @param type type + * @param ex ex + */ + private void sendMessage(TransferReceiverType type, Exception ex) { + TransferOperatorResponse resp = TransferOperatorResponse.builder() + .type(type.getType()) + .success(ex == null) + .msg(this.getErrorMessage(ex)) + .build(); + WebSockets.sendText(this.channel, JSON.toJSONString(resp)); + } + /** * 获取错误信息 * diff --git a/orion-ops-ui/src/views/host/terminal/components/sftp/sftp-upload-modal.vue b/orion-ops-ui/src/views/host/terminal/components/sftp/sftp-upload-modal.vue index f82e324c..569a87a7 100644 --- a/orion-ops-ui/src/views/host/terminal/components/sftp/sftp-upload-modal.vue +++ b/orion-ops-ui/src/views/host/terminal/components/sftp/sftp-upload-modal.vue @@ -11,8 +11,11 @@ :on-before-ok="handlerOk" @cancel="handleClose">
-
- 上传至文件夹: {{ parentPath }} +
+ 上传至文件夹: +
@@ -101,13 +104,17 @@ // 确定 const handlerOk = () => { + if (!parentPath.value) { + Message.error('请输入上传目录'); + return false; + } if (!fileList.value.length) { return true; } // 添加到上传列表 const files = fileList.value.map(s => { return { - id: nextId(10), + fileId: nextId(10), type: TransferType.UPLOAD, hostId: hostId.value, name: s.file.webkitRelativePath || s.file.name, @@ -142,6 +149,20 @@ width: 100%; } + .parent-wrapper { + display: flex; + justify-content: space-between; + align-items: center; + + .parent-label { + width: 98px; + } + + .parent-input { + width: 386px; + } + } + .file-list-uploader { margin-top: 24px; diff --git a/orion-ops-ui/src/views/host/terminal/components/sftp/sftp-view.vue b/orion-ops-ui/src/views/host/terminal/components/sftp/sftp-view.vue index 4586dabc..b29cb4e4 100644 --- a/orion-ops-ui/src/views/host/terminal/components/sftp/sftp-view.vue +++ b/orion-ops-ui/src/views/host/terminal/components/sftp/sftp-view.vue @@ -207,6 +207,7 @@ onMounted(async () => { // 创建终端处理器 session.value = await sessionManager.openSftp(props.tab, { + setLoading: setTableLoading, connectCallback, resolveList, resolveSftpMkdir: resolveFileAction, diff --git a/orion-ops-ui/src/views/host/terminal/components/transfer/transfer-drawer.vue b/orion-ops-ui/src/views/host/terminal/components/transfer/transfer-drawer.vue index 4ff7a469..6fbd4973 100644 --- a/orion-ops-ui/src/views/host/terminal/components/transfer/transfer-drawer.vue +++ b/orion-ops-ui/src/views/host/terminal/components/transfer/transfer-drawer.vue @@ -2,7 +2,6 @@ @@ -42,7 +41,15 @@ - {{ getFileSize(item.currentSize) }}/{{ getFileSize(item.totalSize) }} + + {{ getFileSize(item.currentSize) }} + / + + {{ getFileSize(item.totalSize) }} + + + {{ (item.currentSize / item.totalSize * 100).toFixed(2) }}% +
- - - - + +
+ + + + +
+ +
+ + + + +
@@ -112,6 +129,11 @@ defineExpose({ open }); + // 移除任务 + const removeTask = (fileId: string) => { + transferManager.cancelTransfer(fileId); + }; + // 关闭 const handleClose = () => { handlerClear(); @@ -125,6 +147,7 @@