From c16a461e5c1b89c1b10d9c7bdc4654cafc8a6c8a Mon Sep 17 00:00:00 2001 From: lijiahangmax Date: Fri, 12 Jan 2024 23:28:32 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E6=9C=AA=E9=80=89?= =?UTF-8?q?=E6=8B=A9=E9=A1=B5=E9=9D=A2=E7=9A=84=E7=A9=BA=E6=89=BF=E8=BD=BD?= =?UTF-8?q?=E9=A1=B5.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/store/modules/terminal/index.ts | 35 ++++-- orion-ops-ui/src/utils/index.ts | 11 +- .../components/layout/empty-recommend.vue | 108 ++++++++++++++---- .../components/layout/terminal-content.vue | 8 +- .../layout/terminal-left-sidebar.vue | 10 +- .../new-connection/host-list-view.vue | 27 +---- .../new-connection/new-connection-view.vue | 4 +- .../terminal-action-bar-block.vue | 4 +- .../view-setting/terminal-display-block.vue | 4 +- .../view-setting/terminal-interact-block.vue | 4 +- .../view-setting/terminal-plugins-block.vue | 4 +- .../view-setting/terminal-session-block.vue | 4 +- .../view-setting/terminal-theme-block.vue | 10 +- .../terminal/handler/terminal-tab-manager.ts | 4 +- .../host/terminal/types/terminal.const.ts | 24 ++-- .../host/terminal/types/terminal.type.ts | 11 ++ 16 files changed, 176 insertions(+), 96 deletions(-) diff --git a/orion-ops-ui/src/store/modules/terminal/index.ts b/orion-ops-ui/src/store/modules/terminal/index.ts index 5ce86b94..cfcc7174 100644 --- a/orion-ops-ui/src/store/modules/terminal/index.ts +++ b/orion-ops-ui/src/store/modules/terminal/index.ts @@ -9,16 +9,19 @@ import type { } from './types'; import type { AuthorizedHostQueryResponse } from '@/api/asset/asset-authorized-data'; import { getCurrentAuthorizedHost } from '@/api/asset/asset-authorized-data'; +import type { HostQueryResponse } from '@/api/asset/host'; import type { TerminalTheme } from '@/api/asset/host-terminal'; import { getTerminalThemes } from '@/api/asset/host-terminal'; import { defineStore } from 'pinia'; import { getPreference, updatePreference } from '@/api/user/preference'; +import { nextSessionId } from '@/utils'; import { Message } from '@arco-design/web-vue'; +import { TerminalTabType } from '@/views/host/terminal/types/terminal.const'; import TerminalTabManager from '@/views/host/terminal/handler/terminal-tab-manager'; import TerminalSessionManager from '@/views/host/terminal/handler/terminal-session-manager'; -// 偏好项 -export const PreferenceItem = { +// 终端偏好项 +export const TerminalPreferenceItem = { // 新建连接类型 NEW_CONNECTION_TYPE: 'newConnectionType', // 终端主题 @@ -62,7 +65,7 @@ export default defineStore('terminal', { const { data: themes } = await getTerminalThemes(); data.theme = themes[0]; // 更新默认主题偏好 - await this.updateTerminalPreference(PreferenceItem.THEME, data.theme); + await this.updateTerminalPreference(TerminalPreferenceItem.THEME, data.theme); } // 选择赋值 const keys = Object.keys(this.preference); @@ -105,10 +108,28 @@ export default defineStore('terminal', { }); }, - // 添加到最近连接列表 - addToLatestConnect(hostId: number) { - this.hosts.latestHosts = [...new Set([hostId, ...this.hosts.latestHosts])]; - } + // 打开终端 + openTerminal(record: HostQueryResponse) { + // 添加到最近连接 + this.hosts.latestHosts = [...new Set([record.id, ...this.hosts.latestHosts])]; + // 获取 seq + const tabSeqArr = this.tabManager.items + .map(s => s.seq) + .filter(Boolean) + .map(Number); + const nextSeq = tabSeqArr.length + ? Math.max(...tabSeqArr) + 1 + : 1; + // 打开 tab + this.tabManager.openTab({ + type: TerminalTabType.TERMINAL, + key: nextSessionId(10), + seq: nextSeq, + title: `(${nextSeq}) ${record.alias || record.name}`, + hostId: record.id, + address: record.address + }); + }, }, diff --git a/orion-ops-ui/src/utils/index.ts b/orion-ops-ui/src/utils/index.ts index 04271688..cc956918 100644 --- a/orion-ops-ui/src/utils/index.ts +++ b/orion-ops-ui/src/utils/index.ts @@ -163,7 +163,7 @@ export const resetObject = (obj: any, ignore: string[] = []) => { export const objectTruthKeyCount = (obj: any, ignore: string[] = []) => { return Object.keys(obj) .filter(s => !ignore.includes(s)) - .reduce(function(acc, curr) { + .reduce(function (acc, curr) { const currVal = obj[curr]; return acc + ~~(currVal !== undefined && currVal !== null && currVal?.length !== 0 && currVal !== ''); }, 0); @@ -196,13 +196,20 @@ export function detectZoom() { * 获取唯一的 UUID */ export function getUUID() { - return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { const r = Math.random() * 16 | 0; const v = c === 'x' ? r : (r & 0x3 | 0x8); return v.toString(16); }); } +/** + * 获取会话id + */ +export const nextSessionId = (len: number): string => { + return getUUID().replaceAll('-', '').substring(0, len); +}; + /** * 清除 xss */ diff --git a/orion-ops-ui/src/views/host/terminal/components/layout/empty-recommend.vue b/orion-ops-ui/src/views/host/terminal/components/layout/empty-recommend.vue index 07128c6c..cd84fcfa 100644 --- a/orion-ops-ui/src/views/host/terminal/components/layout/empty-recommend.vue +++ b/orion-ops-ui/src/views/host/terminal/components/layout/empty-recommend.vue @@ -4,25 +4,16 @@
-
+
- +
- 新建连接 -
-
- -
- -
- -
- -
- 历史1 + {{ handler.title }}
@@ -37,20 +28,83 @@ diff --git a/orion-ops-ui/src/views/host/terminal/components/layout/terminal-content.vue b/orion-ops-ui/src/views/host/terminal/components/layout/terminal-content.vue index 1e353f5d..9c6d0558 100644 --- a/orion-ops-ui/src/views/host/terminal/components/layout/terminal-content.vue +++ b/orion-ops-ui/src/views/host/terminal/components/layout/terminal-content.vue @@ -7,7 +7,7 @@ :key="tab.key" :title="tab.title"> -