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 @@
+
+
+
+
+
+ VNC 工具栏设置
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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-ssh-interact-block.vue b/orion-visor-ui/src/views/terminal/components/setting/general/terminal-ssh-interact-block.vue
index 9d2bdfbe..27e2dfe3 100644
--- a/orion-visor-ui/src/views/terminal/components/setting/general/terminal-ssh-interact-block.vue
+++ b/orion-visor-ui/src/views/terminal/components/setting/general/terminal-ssh-interact-block.vue
@@ -67,7 +67,7 @@
@@ -76,14 +76,14 @@
+
+
+
+
+
+
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 @@
+
+
+
+
+
+ VNC 图形化设置
+
+
+
+
修改后会立刻保存, 重新打开终端后生效. 配置调整后可能会占用更多的带宽, 若发生卡顿/无法加载请调整配置
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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',