diff --git a/orion-ops-framework/orion-ops-spring-boot-starter-websocket/src/main/java/com/orion/ops/framework/websocket/core/handler/TextWebSocketHandler.java b/orion-ops-framework/orion-ops-spring-boot-starter-websocket/src/main/java/com/orion/ops/framework/websocket/core/handler/TextWebSocketHandler.java deleted file mode 100644 index 65b24e03..00000000 --- a/orion-ops-framework/orion-ops-spring-boot-starter-websocket/src/main/java/com/orion/ops/framework/websocket/core/handler/TextWebSocketHandler.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.orion.ops.framework.websocket.core.handler; - -import org.springframework.web.socket.*; - -/** - * 文本类型消息处理器 - * - * @author Jiahang Li - * @version 1.0.0 - * @since 2023/12/29 18:23 - */ -public abstract class TextWebSocketHandler implements WebSocketHandler { - - @Override - public void afterConnectionEstablished(WebSocketSession session) { - } - - @Override - public void handleMessage(WebSocketSession session, WebSocketMessage message) { - // 非 text message 不处理 - if (!(message instanceof TextMessage)) { - return; - } - // 处理消息 - this.onMessage(session, (String) message.getPayload()); - } - - /** - * 处理消息 - * - * @param session session - * @param payload payload - */ - public abstract void onMessage(WebSocketSession session, String payload); - - @Override - public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception { - } - - @Override - public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception { - } - - @Override - public boolean supportsPartialMessages() { - return false; - } - -} diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/config/AssetWebSocketConfiguration.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/config/AssetWebSocketConfiguration.java index 4b5ac9a9..b6d0f5f4 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/config/AssetWebSocketConfiguration.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/config/AssetWebSocketConfiguration.java @@ -1,5 +1,6 @@ package com.orion.ops.module.asset.config; +import com.orion.ops.module.asset.handler.host.sftp.TransferMessageHandler; import com.orion.ops.module.asset.handler.host.terminal.TerminalMessageDispatcher; import com.orion.ops.module.asset.interceptor.TerminalAccessInterceptor; import org.springframework.beans.factory.annotation.Value; @@ -28,12 +29,19 @@ public class AssetWebSocketConfiguration implements WebSocketConfigurer { @Resource private TerminalMessageDispatcher terminalMessageDispatcher; + @Resource + private TransferMessageHandler transferMessageHandler; + @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { // 终端 registry.addHandler(terminalMessageDispatcher, prefix + "/host/terminal/{accessToken}") .addInterceptors(terminalAccessInterceptor) .setAllowedOrigins("*"); + // 文件传输 + registry.addHandler(transferMessageHandler, prefix + "/host/transfer/{accessToken}") + .addInterceptors(terminalAccessInterceptor) + .setAllowedOrigins("*"); } } diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/sftp/TransferManager.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/sftp/TransferManager.java new file mode 100644 index 00000000..5e91077b --- /dev/null +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/sftp/TransferManager.java @@ -0,0 +1,23 @@ +package com.orion.ops.module.asset.handler.host.sftp; + +import com.orion.lang.define.collect.MultiConcurrentHashMap; +import com.orion.ops.module.asset.handler.host.terminal.session.ITerminalSession; +import org.springframework.stereotype.Component; + +/** + * 传输管理器 + * + * @author Jiahang Li + * @version 1.0.0 + * @since 2024/2/21 19:05 + */ +@Component +public class TransferManager { + + /** + * 会话存储器 + */ + private final MultiConcurrentHashMap channelSessions = MultiConcurrentHashMap.create(); + + +} diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/sftp/TransferMessageHandler.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/sftp/TransferMessageHandler.java new file mode 100644 index 00000000..f9b22bc2 --- /dev/null +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/sftp/TransferMessageHandler.java @@ -0,0 +1,48 @@ +package com.orion.ops.module.asset.handler.host.sftp; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.web.socket.BinaryMessage; +import org.springframework.web.socket.CloseStatus; +import org.springframework.web.socket.TextMessage; +import org.springframework.web.socket.WebSocketSession; +import org.springframework.web.socket.handler.AbstractWebSocketHandler; + +/** + * sftp 传输消息处理器 + * + * @author Jiahang Li + * @version 1.0.0 + * @since 2024/2/21 18:22 + */ +@Slf4j +@Component +public class TransferMessageHandler extends AbstractWebSocketHandler { + + @Override + protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception { + System.out.println("text"); + } + + @Override + protected void handleBinaryMessage(WebSocketSession session, BinaryMessage message) throws Exception { + System.out.println("binary"); + } + + @Override + public void afterConnectionEstablished(WebSocketSession session) { + log.info("TransferMessageHandler-afterConnectionEstablished id: {}", session.getId()); + } + + @Override + public void handleTransportError(WebSocketSession session, Throwable exception) { + log.error("TransferMessageHandler-handleTransportError id: {}", session.getId(), exception); + } + + @Override + public void afterConnectionClosed(WebSocketSession session, CloseStatus status) { + String id = session.getId(); + log.info("TransferMessageHandler-afterConnectionClosed id: {}, code: {}, reason: {}", id, status.getCode(), status.getReason()); + } + +} diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/sftp/upload/FileUploader.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/sftp/upload/FileUploader.java new file mode 100644 index 00000000..1c59430f --- /dev/null +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/sftp/upload/FileUploader.java @@ -0,0 +1,9 @@ +package com.orion.ops.module.asset.handler.host.sftp.upload; + +/** + * @author Jiahang Li + * @version 1.0.0 + * @since 2024/2/21 19:04 + */ +public class FileUploader { +} diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/TerminalMessageDispatcher.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/TerminalMessageDispatcher.java index 86c45e45..6ad75398 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/TerminalMessageDispatcher.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/TerminalMessageDispatcher.java @@ -1,12 +1,13 @@ package com.orion.ops.module.asset.handler.host.terminal; -import com.orion.ops.framework.websocket.core.handler.TextWebSocketHandler; import com.orion.ops.module.asset.handler.host.terminal.enums.InputTypeEnum; import com.orion.ops.module.asset.handler.host.terminal.manager.TerminalManager; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import org.springframework.web.socket.CloseStatus; +import org.springframework.web.socket.TextMessage; import org.springframework.web.socket.WebSocketSession; +import org.springframework.web.socket.handler.AbstractWebSocketHandler; import javax.annotation.Resource; @@ -19,13 +20,14 @@ import javax.annotation.Resource; */ @Slf4j @Component -public class TerminalMessageDispatcher extends TextWebSocketHandler { +public class TerminalMessageDispatcher extends AbstractWebSocketHandler { @Resource private TerminalManager terminalManager; @Override - public void onMessage(WebSocketSession session, String payload) { + protected void handleTextMessage(WebSocketSession session, TextMessage message) { + String payload = message.getPayload(); try { // 解析类型 InputTypeEnum type = InputTypeEnum.of(payload); @@ -38,6 +40,11 @@ public class TerminalMessageDispatcher extends TextWebSocketHandler { } } + @Override + public void afterConnectionEstablished(WebSocketSession session) { + log.info("TerminalMessageDispatcher-afterConnectionEstablished id: {}", session.getId()); + } + @Override public void handleTransportError(WebSocketSession session, Throwable exception) { log.error("TerminalMessageDispatcher-handleTransportError id: {}", session.getId(), exception); diff --git a/orion-ops-ui/src/store/modules/terminal/index.ts b/orion-ops-ui/src/store/modules/terminal/index.ts index ff0a2ee9..57bd15b8 100644 --- a/orion-ops-ui/src/store/modules/terminal/index.ts +++ b/orion-ops-ui/src/store/modules/terminal/index.ts @@ -16,7 +16,7 @@ import type { TerminalTheme, TerminalThemeSchema } from '@/api/asset/host-termin import { getTerminalThemes } from '@/api/asset/host-terminal'; import { defineStore } from 'pinia'; import { getPreference, updatePreference } from '@/api/user/preference'; -import { nextSessionId } from '@/utils'; +import { nextId } from '@/utils'; import { Message } from '@arco-design/web-vue'; import { PanelSessionType, TerminalTabs } from '@/views/host/terminal/types/terminal.const'; import TerminalTabManager from '@/views/host/terminal/handler/terminal-tab-manager'; @@ -152,7 +152,7 @@ export default defineStore('terminal', { : 1; // 打开 tab this.panelManager.getPanel(panelIndex).openTab({ - key: nextSessionId(10), + key: nextId(10), seq: nextSeq, title: `(${nextSeq}) ${record.alias || record.name}`, hostId: record.id, diff --git a/orion-ops-ui/src/utils/index.ts b/orion-ops-ui/src/utils/index.ts index cc956918..954bd95b 100644 --- a/orion-ops-ui/src/utils/index.ts +++ b/orion-ops-ui/src/utils/index.ts @@ -206,7 +206,7 @@ export function getUUID() { /** * 获取会话id */ -export const nextSessionId = (len: number): string => { +export const nextId = (len: number): string => { return getUUID().replaceAll('-', '').substring(0, len); }; 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 14d89dd2..f82e324c 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 @@ -81,6 +81,7 @@ import { Message } from '@arco-design/web-vue'; import useVisible from '@/hooks/visible'; import { TransferStatus, TransferType } from '../../types/terminal.const'; + import { nextId } from '@/utils'; const { visible, setVisible } = useVisible(); const { transferManager } = useTerminalStore(); @@ -106,6 +107,7 @@ // 添加到上传列表 const files = fileList.value.map(s => { return { + id: nextId(10), type: TransferType.UPLOAD, hostId: hostId.value, name: s.file.webkitRelativePath || s.file.name, @@ -116,7 +118,7 @@ file: s.file }; }); - transferManager.addUpload(files); + transferManager.addTransfer(files); Message.success('已开始上传, 点击右侧传输列表查看进度'); // 清空 handlerClear(); 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 357697d4..427c1ff2 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 @@ -14,7 +14,8 @@ :data="transferManager.transferList">