From cacc7de364c416a3ad87b07596e58b07403adda9 Mon Sep 17 00:00:00 2001 From: lijiahangmax Date: Fri, 12 Jan 2024 00:08:56 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E7=BB=88=E7=AB=AF?= =?UTF-8?q?=E4=BA=A4=E4=BA=92=E9=85=8D=E7=BD=AE=E9=A1=B9.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../terminal/session/TerminalSession.java | 3 + .../model/TerminalPreferenceModel.java | 90 +++++++++++-- .../strategy/TerminalPreferenceStrategy.java | 41 +++++- .../src/store/modules/terminal/index.ts | 9 +- .../view-setting/block-setting-item.vue | 68 ++++++++++ .../terminal-action-bar-block.vue | 6 +- .../view-setting/terminal-general-setting.vue | 3 + .../view-setting/terminal-interact-block.vue | 124 +++++++++++------- .../view-setting/terminal-plugins-block.vue | 61 +++++++++ .../view-setting/terminal-session-block.vue | 39 +++++- .../components/xterm/terminal-view.vue | 1 - .../host/terminal/handler/terminal-session.ts | 6 +- .../host/terminal/types/terminal.const.ts | 11 +- .../host/terminal/types/terminal.type.ts | 2 + 14 files changed, 387 insertions(+), 77 deletions(-) create mode 100644 orion-ops-ui/src/views/host/terminal/components/view-setting/block-setting-item.vue create mode 100644 orion-ops-ui/src/views/host/terminal/components/view-setting/terminal-plugins-block.vue diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/session/TerminalSession.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/session/TerminalSession.java index ba64e634..6e11a488 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/session/TerminalSession.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/session/TerminalSession.java @@ -2,6 +2,7 @@ package com.orion.ops.module.asset.handler.host.terminal.session; import com.orion.lang.utils.io.Streams; import com.orion.net.host.SessionStore; +import com.orion.net.host.ssh.TerminalType; import com.orion.net.host.ssh.shell.ShellExecutor; import com.orion.ops.framework.common.constant.Const; import com.orion.ops.framework.websocket.core.utils.WebSockets; @@ -66,6 +67,8 @@ public class TerminalSession implements ITerminalSession { // 打开 shell this.executor = sessionStore.getShellExecutor(); executor.size(cols, rows); + // FIXME + executor.terminalType(TerminalType.XTERM.getType()); executor.streamHandler(this::streamHandler); executor.callback(this::eofCallback); executor.connect(); diff --git a/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/handler/preference/model/TerminalPreferenceModel.java b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/handler/preference/model/TerminalPreferenceModel.java index 1cca5517..fce00f22 100644 --- a/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/handler/preference/model/TerminalPreferenceModel.java +++ b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/handler/preference/model/TerminalPreferenceModel.java @@ -1,7 +1,7 @@ package com.orion.ops.module.infra.handler.preference.model; -import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +import com.orion.lang.able.IJsonObject; import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; import lombok.Builder; @@ -33,14 +33,20 @@ public class TerminalPreferenceModel implements PreferenceModel { @Schema(description = "操作栏设置") private JSONObject actionBarSetting; - @Schema(description = "背景设置") - private JSONObject backgroundSetting; + @Schema(description = "交互设置") + private JSONObject interactSetting; + + @Schema(description = "插件设置") + private JSONObject pluginsSetting; + + @Schema(description = "会话设置") + private JSONObject sessionSetting; @Data @Builder @NoArgsConstructor @AllArgsConstructor - public static class DisplaySettingModel { + public static class DisplaySettingModel implements IJsonObject { @Schema(description = "字体样式") private String fontFamily; @@ -63,14 +69,74 @@ public class TerminalPreferenceModel implements PreferenceModel { @Schema(description = "光标闪烁") private Boolean cursorBlink; - /** - * 转为 json - * - * @return json - */ - public JSONObject toJson() { - return JSON.parseObject(JSON.toJSONString(this)); - } + } + + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + public static class InteractSettingModel implements IJsonObject { + + @Schema(description = "快速滚动") + private Boolean fastScrollModifier; + + @Schema(description = "点击移动光标") + private Boolean altClickMovesCursor; + + @Schema(description = "右键选中词条") + private Boolean rightClickSelectsWord; + + @Schema(description = "选中词条自动复制") + private Boolean selectionChangeCopy; + + @Schema(description = "复制去除空格") + private Boolean copyAutoTrim; + + @Schema(description = "粘贴去除空格") + private Boolean pasteAutoTrim; + + @Schema(description = "右键粘贴") + private Boolean rightClickPaste; + + @Schema(description = "启用右键菜单") + private Boolean enableRightClickMenu; + + @Schema(description = "启用响铃") + private Boolean enableBell; + + @Schema(description = "单词分隔符") + private String wordSeparator; + + } + + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + public static class PluginsSettingModel implements IJsonObject { + + @Schema(description = "超链接插件") + private Boolean enableWeblinkPlugin; + + @Schema(description = "WebGL 渲染插件") + private Boolean enableWebglPlugin; + + @Schema(description = "图片渲染插件") + private Boolean enableImagePlugin; + + } + + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + public static class SessionSettingModel implements IJsonObject { + + @Schema(description = "伪终端类型") + private String terminalEmulationType; + + @Schema(description = "保存在缓冲区的行数") + private Integer scrollBackLine; } diff --git a/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/handler/preference/strategy/TerminalPreferenceStrategy.java b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/handler/preference/strategy/TerminalPreferenceStrategy.java index 3fb3f0bf..2ad68b3a 100644 --- a/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/handler/preference/strategy/TerminalPreferenceStrategy.java +++ b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/handler/preference/strategy/TerminalPreferenceStrategy.java @@ -1,6 +1,7 @@ package com.orion.ops.module.infra.handler.preference.strategy; import com.alibaba.fastjson.JSONObject; +import com.orion.net.host.ssh.TerminalType; import com.orion.ops.module.infra.handler.preference.model.TerminalPreferenceModel; import org.springframework.stereotype.Component; @@ -16,8 +17,9 @@ public class TerminalPreferenceStrategy implements IPreferenceStrategy~!@#$%^&*|+=[]{}~?│") + .build() + .toJsonString(); + // 默认插件设置 + String defaultPluginsSetting = TerminalPreferenceModel.PluginsSettingModel.builder() + .enableWeblinkPlugin(true) + .enableWebglPlugin(true) + .enableImagePlugin(false) + .build() + .toJsonString(); + // 默认会话设置 + String defaultSessionSetting = TerminalPreferenceModel.SessionSettingModel.builder() + .terminalEmulationType(TerminalType.XTERM.getType()) + .scrollBackLine(1000) + .build() + .toJsonString(); + // 默认配置 return TerminalPreferenceModel.builder() .newConnectionType("group") .theme(new JSONObject()) - .displaySetting(defaultDisplaySetting) + .displaySetting(JSONObject.parseObject(defaultDisplaySetting)) .actionBarSetting(new JSONObject()) - .backgroundSetting(new JSONObject()) + .interactSetting(JSONObject.parseObject(defaultInteractSetting)) + .pluginsSetting(JSONObject.parseObject(defaultPluginsSetting)) + .sessionSetting(JSONObject.parseObject(defaultSessionSetting)) .build(); } diff --git a/orion-ops-ui/src/store/modules/terminal/index.ts b/orion-ops-ui/src/store/modules/terminal/index.ts index 53475787..74aa23a0 100644 --- a/orion-ops-ui/src/store/modules/terminal/index.ts +++ b/orion-ops-ui/src/store/modules/terminal/index.ts @@ -44,7 +44,14 @@ export default defineStore('terminal', { // 更新默认主题偏好 await this.updateTerminalPreference(PreferenceItem.THEME, data.theme); } - this.preference = data; + // 选择赋值 + const keys = Object.keys(this.preference); + keys.forEach(key => { + const item = data[key as keyof TerminalPreference]; + if (item) { + this.preference[key as keyof TerminalPreference] = item as any; + } + }); } catch (e) { Message.error('配置加载失败'); } diff --git a/orion-ops-ui/src/views/host/terminal/components/view-setting/block-setting-item.vue b/orion-ops-ui/src/views/host/terminal/components/view-setting/block-setting-item.vue new file mode 100644 index 00000000..d2eeca53 --- /dev/null +++ b/orion-ops-ui/src/views/host/terminal/components/view-setting/block-setting-item.vue @@ -0,0 +1,68 @@ + + + + + + + diff --git a/orion-ops-ui/src/views/host/terminal/components/view-setting/terminal-action-bar-block.vue b/orion-ops-ui/src/views/host/terminal/components/view-setting/terminal-action-bar-block.vue index a50e8c4c..c7e1cdfd 100644 --- a/orion-ops-ui/src/views/host/terminal/components/view-setting/terminal-action-bar-block.vue +++ b/orion-ops-ui/src/views/host/terminal/components/view-setting/terminal-action-bar-block.vue @@ -21,14 +21,14 @@ position="bottom" /> - + - - + + diff --git a/orion-ops-ui/src/views/host/terminal/components/view-setting/terminal-general-setting.vue b/orion-ops-ui/src/views/host/terminal/components/view-setting/terminal-general-setting.vue index 77065573..6ceae047 100644 --- a/orion-ops-ui/src/views/host/terminal/components/view-setting/terminal-general-setting.vue +++ b/orion-ops-ui/src/views/host/terminal/components/view-setting/terminal-general-setting.vue @@ -5,6 +5,8 @@

终端设置

+ + @@ -19,6 +21,7 @@ diff --git a/orion-ops-ui/src/views/host/terminal/components/view-setting/terminal-interact-block.vue b/orion-ops-ui/src/views/host/terminal/components/view-setting/terminal-interact-block.vue index 7eec1dd6..a790a52d 100644 --- a/orion-ops-ui/src/views/host/terminal/components/view-setting/terminal-interact-block.vue +++ b/orion-ops-ui/src/views/host/terminal/components/view-setting/terminal-interact-block.vue @@ -9,21 +9,70 @@ 修改后会立刻保存, 刷新页面后生效 -
- - -
-
- label -
-
- 描述一下 -
-
- -
-
-
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
@@ -37,46 +86,31 @@ diff --git a/orion-ops-ui/src/views/host/terminal/components/view-setting/terminal-plugins-block.vue b/orion-ops-ui/src/views/host/terminal/components/view-setting/terminal-plugins-block.vue new file mode 100644 index 00000000..17328415 --- /dev/null +++ b/orion-ops-ui/src/views/host/terminal/components/view-setting/terminal-plugins-block.vue @@ -0,0 +1,61 @@ + + + + + + + diff --git a/orion-ops-ui/src/views/host/terminal/components/view-setting/terminal-session-block.vue b/orion-ops-ui/src/views/host/terminal/components/view-setting/terminal-session-block.vue index 7ed4419a..4ad81eed 100644 --- a/orion-ops-ui/src/views/host/terminal/components/view-setting/terminal-session-block.vue +++ b/orion-ops-ui/src/views/host/terminal/components/view-setting/terminal-session-block.vue @@ -7,9 +7,26 @@ -
- - +
+ + + + + + + + + +
@@ -21,13 +38,25 @@ diff --git a/orion-ops-ui/src/views/host/terminal/components/xterm/terminal-view.vue b/orion-ops-ui/src/views/host/terminal/components/xterm/terminal-view.vue index d0c9f9c1..65bfd29f 100644 --- a/orion-ops-ui/src/views/host/terminal/components/xterm/terminal-view.vue +++ b/orion-ops-ui/src/views/host/terminal/components/xterm/terminal-view.vue @@ -227,7 +227,6 @@ height: 100%; display: inline-flex; align-items: center; - user-select: none; .address-copy { display: none; diff --git a/orion-ops-ui/src/views/host/terminal/handler/terminal-session.ts b/orion-ops-ui/src/views/host/terminal/handler/terminal-session.ts index 43ffded3..bbbb1375 100644 --- a/orion-ops-ui/src/views/host/terminal/handler/terminal-session.ts +++ b/orion-ops-ui/src/views/host/terminal/handler/terminal-session.ts @@ -8,6 +8,7 @@ import { WebglAddon } from 'xterm-addon-webgl'; import { WebLinksAddon } from 'xterm-addon-web-links'; import { SearchAddon } from 'xterm-addon-search'; import { ImageAddon } from 'xterm-addon-image'; +import { CanvasAddon } from 'xterm-addon-canvas'; // 终端会话实现 export default class TerminalSession implements ITerminalSession { @@ -48,12 +49,13 @@ export default class TerminalSession implements ITerminalSession { this.inst = new Terminal({ ...(preference.displaySetting as any), theme: preference.theme.schema, - fastScrollModifier: 'ctrl', + fastScrollModifier: 'alt', fontFamily: preference.displaySetting.fontFamily + fontFamilySuffix, }); // 注册插件 this.addons.fit = new FitAddon(); - this.addons.webgl = new WebglAddon(); + // this.addons.webgl = new WebglAddon(); + this.addons.canvas = new CanvasAddon(); this.addons.link = new WebLinksAddon(); this.addons.search = new SearchAddon(); this.addons.image = new ImageAddon(); diff --git a/orion-ops-ui/src/views/host/terminal/types/terminal.const.ts b/orion-ops-ui/src/views/host/terminal/types/terminal.const.ts index 86ad813f..0b6237fb 100644 --- a/orion-ops-ui/src/views/host/terminal/types/terminal.const.ts +++ b/orion-ops-ui/src/views/host/terminal/types/terminal.const.ts @@ -156,10 +156,13 @@ export const extraSshAuthTypeKey = 'hostExtraSshAuthType'; // 终端状态 export const connectStatusKey = 'terminalConnectStatus'; +// 终端类型 +export const terminalEmulationTypeKey = 'terminalEmulationType'; + // 加载的字典值 export const dictKeys = [ - fontFamilyKey, - fontSizeKey, fontWeightKey, - cursorStyleKey, newConnectionTypeKey, - extraSshAuthTypeKey, connectStatusKey + fontFamilyKey, fontSizeKey, + fontWeightKey, cursorStyleKey, + newConnectionTypeKey, extraSshAuthTypeKey, + connectStatusKey, terminalEmulationTypeKey ]; diff --git a/orion-ops-ui/src/views/host/terminal/types/terminal.type.ts b/orion-ops-ui/src/views/host/terminal/types/terminal.type.ts index 3835b1bc..289f0110 100644 --- a/orion-ops-ui/src/views/host/terminal/types/terminal.type.ts +++ b/orion-ops-ui/src/views/host/terminal/types/terminal.type.ts @@ -1,5 +1,6 @@ import type { Terminal } from 'xterm'; import type { FitAddon } from 'xterm-addon-fit'; +import type { CanvasAddon } from 'xterm-addon-canvas'; import type { WebglAddon } from 'xterm-addon-webgl'; import type { WebLinksAddon } from 'xterm-addon-web-links'; import type { SearchAddon } from 'xterm-addon-search'; @@ -117,6 +118,7 @@ export interface ITerminalOutputProcessor { export interface TerminalAddons { fit: FitAddon; webgl: WebglAddon; + canvas: CanvasAddon; link: WebLinksAddon; search: SearchAddon; image: ImageAddon;