From efbb4e8eea88b476b55d2bcd5b8800e0d4198ea1 Mon Sep 17 00:00:00 2001 From: ssongliu Date: Fri, 11 Sep 2026 17:00:36 +0800 Subject: [PATCH] feat(terminal): share connection menu and add node quick connect --- frontend/src/api/modules/group.ts | 9 +- frontend/src/api/modules/terminal.ts | 24 +- .../terminal/connection-menu/index.vue | 342 ++++++++++++++++++ .../terminal/connection-menu/types.ts | 6 + .../src/components/terminal/dock/index.vue | 122 +------ .../terminal/host-create.vue | 20 +- .../src/store/modules/terminal-session.ts | 45 +-- .../src/views/terminal/terminal/index.vue | 246 +------------ 8 files changed, 423 insertions(+), 391 deletions(-) create mode 100644 frontend/src/components/terminal/connection-menu/index.vue create mode 100644 frontend/src/components/terminal/connection-menu/types.ts rename frontend/src/{views/terminal => components}/terminal/host-create.vue (91%) diff --git a/frontend/src/api/modules/group.ts b/frontend/src/api/modules/group.ts index 9514f7fc58ef..e9f23781ec9a 100644 --- a/frontend/src/api/modules/group.ts +++ b/frontend/src/api/modules/group.ts @@ -14,8 +14,13 @@ export const deleteGroup = (id: number) => { return http.post(`/core/groups/del`, { id: id }); }; -export const getAgentGroupList = (type: string) => { - return http.post>(`/groups/search`, { type: type }); +export const getAgentGroupList = (type: string, nodeName?: string) => { + return http.post>( + `/groups/search`, + { type: type }, + undefined, + nodeName ? { CurrentNode: nodeName } : undefined, + ); }; export const createAgentGroup = (params: Group.GroupCreate) => { return http.post(`/groups`, params); diff --git a/frontend/src/api/modules/terminal.ts b/frontend/src/api/modules/terminal.ts index f9b1311d42c9..8a21a03510aa 100644 --- a/frontend/src/api/modules/terminal.ts +++ b/frontend/src/api/modules/terminal.ts @@ -16,19 +16,24 @@ export const getHostTree = (params: Host.ReqSearch) => { export const updateLocalConn = (param: { withReset: boolean; defaultConn: string }) => { return http.post(`/settings/ssh/default`, param); }; -export const addHost = (params: Host.HostOperate) => { +export const addHost = (params: Host.HostOperate, nodeName?: string) => { let request = deepCopy(params) as Host.HostOperate; encodeBase64Fields(request, ['password', 'privateKey']); if (params.isLocal) { - return http.post(`/settings/ssh`, request); + return http.post(`/settings/ssh`, request, undefined, nodeName ? { CurrentNode: nodeName } : undefined); } return http.postLocalNode(`/hosts`, request); }; -export const testByInfo = (params: Host.HostConnTest) => { +export const testByInfo = (params: Host.HostConnTest | Host.HostOperate, nodeName?: string) => { let request = deepCopy(params) as Host.HostOperate; encodeBase64Fields(request, ['password', 'privateKey']); if (params.isLocal) { - return http.post(`/settings/ssh/check/info`, request); + return http.post( + `/settings/ssh/check/info`, + request, + undefined, + nodeName ? { CurrentNode: nodeName } : undefined, + ); } return http.postLocalNode(`/hosts/test/byinfo`, request); }; @@ -47,15 +52,18 @@ export const deleteHost = (params: { ids: number[] }) => { return http.postLocalNode(`/hosts/del`, params); }; -// agent export const loadLocalConn = () => { return http.get(`/settings/ssh/conn`); }; -export const testLocalConn = () => { - return http.post(`/settings/ssh/check`); +export const testLocalConn = (nodeName?: string) => { + return http.post( + `/settings/ssh/check`, + undefined, + undefined, + nodeName ? { CurrentNode: nodeName } : undefined, + ); }; -// live web terminal sessions of the caller; ssh ones live on the local node, local shells on the operated node export const searchTerminalSessions = (localNode: boolean) => { return localNode ? http.postLocalNode(`/hosts/terminal/sessions/search`) diff --git a/frontend/src/components/terminal/connection-menu/index.vue b/frontend/src/components/terminal/connection-menu/index.vue new file mode 100644 index 000000000000..d6c866035878 --- /dev/null +++ b/frontend/src/components/terminal/connection-menu/index.vue @@ -0,0 +1,342 @@ + + + + + + + diff --git a/frontend/src/components/terminal/connection-menu/types.ts b/frontend/src/components/terminal/connection-menu/types.ts new file mode 100644 index 000000000000..518802b95395 --- /dev/null +++ b/frontend/src/components/terminal/connection-menu/types.ts @@ -0,0 +1,6 @@ +export interface TerminalConnectionOptions { + title: string; + wsID: number; + nodeName?: string; + error?: string; +} diff --git a/frontend/src/components/terminal/dock/index.vue b/frontend/src/components/terminal/dock/index.vue index 6f17be2a392d..cc593b7b468a 100644 --- a/frontend/src/components/terminal/dock/index.vue +++ b/frontend/src/components/terminal/dock/index.vue @@ -1,5 +1,4 @@ -
- -