From 4643c37a5af092133d3536e841b2eac2dce2daf5 Mon Sep 17 00:00:00 2001 From: lijiahangmax Date: Mon, 7 Jul 2025 14:42:54 +0800 Subject: [PATCH] =?UTF-8?q?:hammer:=20=E6=B7=BB=E5=8A=A0=E4=B8=AA=E6=80=A7?= =?UTF-8?q?=E5=8C=96=E9=85=8D=E7=BD=AE.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../terminal/handler/guacd/GuacdTunnel.java | 1 - .../display/terminal-display-setting.vue | 3 + .../display/terminal-rdp-action-bar-block.vue | 12 +- .../display/terminal-vnc-action-bar-block.vue | 112 ++++++++++++ .../setting/extra/host-extra-modal.vue | 23 ++- .../setting/extra/vnc-extra-form.vue | 72 ++++++++ .../general/terminal-general-setting.vue | 3 + .../general/terminal-rdp-graph-block.vue | 8 +- .../general/terminal-rdp-session-block.vue | 2 +- .../general/terminal-ssh-interact-block.vue | 12 +- .../general/terminal-vnc-graph-block.vue | 133 ++++++++++++++ .../src/views/terminal/types/const.ts | 169 +++++++++++++++--- 12 files changed, 507 insertions(+), 43 deletions(-) create mode 100644 orion-visor-ui/src/views/terminal/components/setting/display/terminal-vnc-action-bar-block.vue create mode 100644 orion-visor-ui/src/views/terminal/components/setting/extra/vnc-extra-form.vue create mode 100644 orion-visor-ui/src/views/terminal/components/setting/general/terminal-vnc-graph-block.vue diff --git a/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/guacd/GuacdTunnel.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/guacd/GuacdTunnel.java index 53034461..0821bad4 100644 --- a/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/guacd/GuacdTunnel.java +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/guacd/GuacdTunnel.java @@ -89,7 +89,6 @@ public class GuacdTunnel implements IGuacdTunnel { @Override public void connect() throws GuacdException { try { - // TODO 端口转发 this.socket = new ConfiguredGuacamoleSocket(new InetGuacamoleSocket(serverAddress, serverPort), serverConfig, clientConfig); this.tunnel = new CustomGuacamoleTunnel(uuid, socket); } catch (GuacamoleException e) { diff --git a/orion-visor-ui/src/views/terminal/components/setting/display/terminal-display-setting.vue b/orion-visor-ui/src/views/terminal/components/setting/display/terminal-display-setting.vue index 2e52485d..9257f7c4 100644 --- a/orion-visor-ui/src/views/terminal/components/setting/display/terminal-display-setting.vue +++ b/orion-visor-ui/src/views/terminal/components/setting/display/terminal-display-setting.vue @@ -9,6 +9,8 @@ + + @@ -26,6 +28,7 @@ import TerminalSshActionBarBlock from './terminal-ssh-action-bar-block.vue'; import TerminalSshRightMenuBlock from './terminal-ssh-right-menu-block.vue'; import TerminalRdpActionBarBlock from './terminal-rdp-action-bar-block.vue'; + import TerminalVncActionBarBlock from './terminal-vnc-action-bar-block.vue'; diff --git a/orion-visor-ui/src/views/terminal/components/setting/display/terminal-rdp-action-bar-block.vue b/orion-visor-ui/src/views/terminal/components/setting/display/terminal-rdp-action-bar-block.vue index 66ac84d4..8a8c1d54 100644 --- a/orion-visor-ui/src/views/terminal/components/setting/display/terminal-rdp-action-bar-block.vue +++ b/orion-visor-ui/src/views/terminal/components/setting/display/terminal-rdp-action-bar-block.vue @@ -12,12 +12,6 @@ :model="formModel" layout="vertical"> - - - - + + + + diff --git a/orion-visor-ui/src/views/terminal/components/setting/display/terminal-vnc-action-bar-block.vue b/orion-visor-ui/src/views/terminal/components/setting/display/terminal-vnc-action-bar-block.vue new file mode 100644 index 00000000..5baf89e8 --- /dev/null +++ b/orion-visor-ui/src/views/terminal/components/setting/display/terminal-vnc-action-bar-block.vue @@ -0,0 +1,112 @@ + + + + + + + diff --git a/orion-visor-ui/src/views/terminal/components/setting/extra/host-extra-modal.vue b/orion-visor-ui/src/views/terminal/components/setting/extra/host-extra-modal.vue index 6c1940bd..20beb3e2 100644 --- a/orion-visor-ui/src/views/terminal/components/setting/extra/host-extra-modal.vue +++ b/orion-visor-ui/src/views/terminal/components/setting/extra/host-extra-modal.vue @@ -14,7 +14,9 @@ :cancel-button-props="{ disabled: loading }" :on-before-ok="handlerOk" @close="handleClose"> - + @@ -30,7 +32,7 @@ :key="ExtraSettingItems.SSH" title="SSH 配置"> @@ -38,9 +40,17 @@ :key="ExtraSettingItems.RDP" title="RDP 配置"> + + + + @@ -64,6 +74,7 @@ import LabelExtraForm from './label-extra-form.vue'; import SshExtraForm from './ssh-extra-form.vue'; import RdpExtraForm from './rdp-extra-form.vue'; + import VncExtraForm from './vnc-extra-form.vue'; const { visible, setVisible } = useVisible(); const { loading, setLoading } = useLoading(); @@ -75,6 +86,7 @@ const labelForm = ref(); const sshForm = ref(); const rdpForm = ref(); + const vncForm = ref(); // 打开配置 const open = (record: HostQueryResponse) => { @@ -101,6 +113,9 @@ } else if (activeItem.value === ExtraSettingItems.RDP) { // RDP 配置 value = await rdpForm.value.getValue(); + } else if (activeItem.value === ExtraSettingItems.VNC) { + // VNC 配置 + value = await vncForm.value.getValue(); } if (!value) { return false; diff --git a/orion-visor-ui/src/views/terminal/components/setting/extra/vnc-extra-form.vue b/orion-visor-ui/src/views/terminal/components/setting/extra/vnc-extra-form.vue new file mode 100644 index 00000000..33b45313 --- /dev/null +++ b/orion-visor-ui/src/views/terminal/components/setting/extra/vnc-extra-form.vue @@ -0,0 +1,72 @@ + + + + + + + diff --git a/orion-visor-ui/src/views/terminal/components/setting/general/terminal-general-setting.vue b/orion-visor-ui/src/views/terminal/components/setting/general/terminal-general-setting.vue index 113659c3..0f7d8f38 100644 --- a/orion-visor-ui/src/views/terminal/components/setting/general/terminal-general-setting.vue +++ b/orion-visor-ui/src/views/terminal/components/setting/general/terminal-general-setting.vue @@ -11,6 +11,8 @@ + + @@ -26,6 +28,7 @@ import TerminalSshPluginsBlock from './terminal-ssh-plugins-block.vue'; import TerminalRdpGraphBlock from './terminal-rdp-graph-block.vue'; import TerminalRdpSessionBlock from './terminal-rdp-session-block.vue'; + import TerminalVncGraphBlock from './terminal-vnc-graph-block.vue'; diff --git a/orion-visor-ui/src/views/terminal/components/setting/general/terminal-rdp-graph-block.vue b/orion-visor-ui/src/views/terminal/components/setting/general/terminal-rdp-graph-block.vue index 1d588c2f..d8b4bd64 100644 --- a/orion-visor-ui/src/views/terminal/components/setting/general/terminal-rdp-graph-block.vue +++ b/orion-visor-ui/src/views/terminal/components/setting/general/terminal-rdp-graph-block.vue @@ -14,7 +14,7 @@ @@ -22,14 +22,14 @@ - + @@ -79,7 +79,7 @@ - + diff --git a/orion-visor-ui/src/views/terminal/components/setting/general/terminal-rdp-session-block.vue b/orion-visor-ui/src/views/terminal/components/setting/general/terminal-rdp-session-block.vue index 763e604a..419645f3 100644 --- a/orion-visor-ui/src/views/terminal/components/setting/general/terminal-rdp-session-block.vue +++ b/orion-visor-ui/src/views/terminal/components/setting/general/terminal-rdp-session-block.vue @@ -16,7 +16,7 @@ diff --git a/orion-visor-ui/src/views/terminal/components/setting/general/terminal-vnc-graph-block.vue b/orion-visor-ui/src/views/terminal/components/setting/general/terminal-vnc-graph-block.vue new file mode 100644 index 00000000..4ac5634a --- /dev/null +++ b/orion-visor-ui/src/views/terminal/components/setting/general/terminal-vnc-graph-block.vue @@ -0,0 +1,133 @@ + + + + + + + diff --git a/orion-visor-ui/src/views/terminal/types/const.ts b/orion-visor-ui/src/views/terminal/types/const.ts index ead8720a..9826c18d 100644 --- a/orion-visor-ui/src/views/terminal/types/const.ts +++ b/orion-visor-ui/src/views/terminal/types/const.ts @@ -44,18 +44,31 @@ export const TerminalTabs = { export const TerminalSessionTypes = { SSH: { type: 'SSH', + protocol: 'SSH', channel: 'ssh', - icon: 'icon-desktop' + icon: 'icon-desktop', + connectIcon: 'icon-thunderbolt', }, SFTP: { type: 'SFTP', + protocol: 'SSH', channel: 'sftp', - icon: 'icon-folder' + icon: 'icon-folder', + connectIcon: 'icon-folder', }, RDP: { type: 'RDP', + protocol: 'RDP', channel: 'rdp', - icon: 'icon-computer' + icon: 'icon-desktop', + connectIcon: 'icon-desktop', + }, + VNC: { + type: 'VNC', + protocol: 'VNC', + channel: 'vnc', + icon: 'icon-computer', + connectIcon: 'icon-computer', }, }; @@ -72,6 +85,7 @@ export const ExtraSettingItems = { LABEL: 'LABEL', SSH: 'SSH', RDP: 'RDP', + VNC: 'VNC', }; // 主机额外配置认证方式 @@ -97,7 +111,7 @@ export const TerminalMessages = { sessionClosed: '会话已结束...', waitingReconnect: '输入回车重新连接...', loggedElsewhere: '该账号已在另一台设备登录', - rdpConnectTimeout: '请检查远程计算机网络及其他配置是否正常', + connectTimeout: '请检查远程计算机网络及其他配置是否正常', fileTransferError: '传输失败', fileSaveError: '保存失败', fileUploading: '已开始上传, 点击右侧传输列表查看进度', @@ -214,8 +228,8 @@ export const SshActionBarItems = [ } ]; -// 终端操作栏键 - RDP -export const RdpActionItemKeys = { +// guacd 终端操作栏键 +export const GuacdActionItemKeys = { DISPLAY: 'display', COMBINATION_KEY: 'combinationKey', CLIPBOARD: 'clipboard', @@ -225,45 +239,71 @@ export const RdpActionItemKeys = { CLOSE: 'close', }; -// 终端操作栏 - RDP -export const RdpActionBarItems = [ - { - item: RdpActionItemKeys.DISPLAY, +// guacd 终端操作栏 +export const GuacdActionBarItemMap = { + [GuacdActionItemKeys.DISPLAY]: { + item: GuacdActionItemKeys.DISPLAY, icon: 'icon-desktop', content: '显示设置', }, - { - item: RdpActionItemKeys.COMBINATION_KEY, + [GuacdActionItemKeys.COMBINATION_KEY]: { + item: GuacdActionItemKeys.COMBINATION_KEY, icon: 'icon-command', content: '组合键', }, - { - item: RdpActionItemKeys.CLIPBOARD, + [GuacdActionItemKeys.CLIPBOARD]: { + item: GuacdActionItemKeys.CLIPBOARD, icon: 'icon-paste', content: '剪切板', }, - { - item: RdpActionItemKeys.UPLOAD, + [GuacdActionItemKeys.UPLOAD]: { + item: GuacdActionItemKeys.UPLOAD, icon: 'icon-upload', content: '文件上传', }, - { - item: RdpActionItemKeys.SAVE_RDP, + [GuacdActionItemKeys.SAVE_RDP]: { + item: GuacdActionItemKeys.SAVE_RDP, icon: 'icon-save', content: '保存 rdp 文件', }, - { - item: RdpActionItemKeys.DISCONNECT, + [GuacdActionItemKeys.DISCONNECT]: { + item: GuacdActionItemKeys.DISCONNECT, icon: 'icon-stop', content: '断开连接', }, - { - item: RdpActionItemKeys.CLOSE, + [GuacdActionItemKeys.CLOSE]: { + item: GuacdActionItemKeys.CLOSE, icon: 'icon-close', content: '关闭工具栏', }, +}; + +// 终端操作栏 - RDP +export const RdpActionBarItems = [ + GuacdActionBarItemMap[GuacdActionItemKeys.DISPLAY], + GuacdActionBarItemMap[GuacdActionItemKeys.COMBINATION_KEY], + GuacdActionBarItemMap[GuacdActionItemKeys.CLIPBOARD], + GuacdActionBarItemMap[GuacdActionItemKeys.UPLOAD], + GuacdActionBarItemMap[GuacdActionItemKeys.SAVE_RDP], + GuacdActionBarItemMap[GuacdActionItemKeys.DISCONNECT], + GuacdActionBarItemMap[GuacdActionItemKeys.CLOSE], ]; +// 终端操作栏 - VNC +export const VncActionBarItems = [ + GuacdActionBarItemMap[GuacdActionItemKeys.DISPLAY], + GuacdActionBarItemMap[GuacdActionItemKeys.COMBINATION_KEY], + GuacdActionBarItemMap[GuacdActionItemKeys.CLIPBOARD], + GuacdActionBarItemMap[GuacdActionItemKeys.DISCONNECT], + GuacdActionBarItemMap[GuacdActionItemKeys.CLOSE], +]; + +// 终端操作栏方向 +export const ActionBarPosition = { + TOP: 'top', + RIGHT: 'right', +}; + // 终端快捷键操作类型 export const TerminalShortcutType = { GLOBAL: 1, @@ -403,8 +443,8 @@ export const TerminalShortcutItems: Array = [ }, ]; -// RDP 组合键元素 -export const RdpCombinationKeyItems: Array = [ +// Guacd 组合键元素 +export const GuacdCombinationKeyItems: Array = [ { keys: [65307], name: 'Esc' @@ -444,9 +484,90 @@ export const RdpCombinationKeyItems: Array = [ { keys: [65515, 120], name: 'Windows+X' + }, { + keys: [65507, 99], + name: 'Ctrl+C' }, + { + keys: [65507, 118], + name: 'Ctrl+V' + }, + { + keys: [65507, 120], + name: 'Ctrl+X' + }, + { + keys: [65507, 97], + name: 'Ctrl+A' + }, + { + keys: [65507, 122], + name: 'Ctrl+Z' + }, + { + keys: [65507, 65535], + name: 'Ctrl+Delete' + }, + { + keys: [65507, 65288], + name: 'Ctrl+Backspace' + }, + { + keys: [65507, 65513, 65470], + name: 'Ctrl+Alt+F1' + }, + { + keys: [65507, 65513, 65471], + name: 'Ctrl+Alt+F2' + }, + { + keys: [65507, 65513, 65472], + name: 'Ctrl+Alt+F3' + }, + { + keys: [65507, 65513, 65473], + name: 'Ctrl+Alt+F4' + }, + { + keys: [65507, 65513, 65474], + name: 'Ctrl+Alt+F5' + }, + { + keys: [65507, 65513, 65475], + name: 'Ctrl+Alt+F6' + }, + { + keys: [65507, 65513, 65476], + name: 'Ctrl+Alt+F7' + }, + { + keys: [65507, 65513, 65477], + name: 'Ctrl+Alt+F8' + }, + { + keys: [65507, 65513, 65478], + name: 'Ctrl+Alt+F9' + }, + { + keys: [65507, 65513, 65479], + name: 'Ctrl+Alt+F10' + }, + { + keys: [65507, 65513, 65480], + name: 'Ctrl+Alt+F11' + }, + { + keys: [65507, 65513, 65481], + name: 'Ctrl+Alt+F12' + } ]; +// backspace 字符 +export const BACKSPACE_CHAR = String.fromCharCode(127); + +// ctrl^h 字符 +export const CTRL_H_CHAR = String.fromCharCode(8); + // 传输状态 export const TransferStatus = { WAITING: 'waiting',