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"> -