From 4fc9a43fd279a7b6ba860d061ab7e4aee63dfec7 Mon Sep 17 00:00:00 2001 From: 2256907009 <2256907009@qq.com> Date: Sun, 28 Sep 2025 23:29:18 +0800 Subject: [PATCH] feat:add guacamole --- src/config/menus.js | 5 + src/router/index.js | 7 + src/utils/acs/guacamole.js | 34 ++ src/views/acs/guacamole/Guacamole.vue | 739 ++++++++++++++++++++++++++ src/views/acs/nodes/Nodes.vue | 46 +- 5 files changed, 829 insertions(+), 2 deletions(-) create mode 100644 src/utils/acs/guacamole.js create mode 100644 src/views/acs/guacamole/Guacamole.vue diff --git a/src/config/menus.js b/src/config/menus.js index 095bd4c..4f55ce3 100644 --- a/src/config/menus.js +++ b/src/config/menus.js @@ -35,6 +35,11 @@ export const menus = [ }, { path: '/acs/nodes', title: '节点管理' + }, + { + path: '/acs/guacamole', + title: '远程桌面网关管理', + icon: 'Monitor' },{ path: '/audit', title: '站点审计', diff --git a/src/router/index.js b/src/router/index.js index 5ff23a4..47f9c8c 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -130,6 +130,13 @@ const routes = [ meta: { title: '节点管理' } + },{ + path: 'guacamole', + name: 'Guacamole', + component: () => import('../views/acs/guacamole/Guacamole.vue'), + meta: { + title: 'Guacamole管理' + } } ] }, diff --git a/src/utils/acs/guacamole.js b/src/utils/acs/guacamole.js new file mode 100644 index 0000000..13b6184 --- /dev/null +++ b/src/utils/acs/guacamole.js @@ -0,0 +1,34 @@ +import {http2} from "@/utils/request.js"; + +/**获取 guacamole 列表 */ +export const getGuacamoleList = data => { + return http2.get(`/v1/admin/server/get_guacamole_list`); +}; +/**获取服务器 guacamole 信息 */ +export const getGuacamoleInfo = data => { + return http2.get(`/v1/admin/server/get_server_guacamole?server_id=${data}`); +}; +/**新增 guacamole 参数 url:string,username:string,password:string*/ +export const addGuacamoleInfo = data => { + return http2.post(`/v1/admin/server/add_guacamole`, data,{ + headers:{ + 'Content-Type': 'multipart/form-data' + } + }); +}; +/**修改guacamole 参数 id:string,url:string,username:string,password:string*/ +export const updateGuacamoleInfo = data => { + return http2.post(`/v1/admin/server/edit_guacamole`, data,{ + headers:{ + 'Content-Type': 'multipart/form-data' + } + }); +}; +/**删除guacamole 参数 id:string */ +export const deleteGuacamoleInfo = data => { + return http2.post(`/v1/admin/server/delete_guacamole`, data,{ + headers:{ + 'Content-Type': 'multipart/form-data' + } + }); +}; diff --git a/src/views/acs/guacamole/Guacamole.vue b/src/views/acs/guacamole/Guacamole.vue new file mode 100644 index 0000000..1e8a7c8 --- /dev/null +++ b/src/views/acs/guacamole/Guacamole.vue @@ -0,0 +1,739 @@ + + + + + diff --git a/src/views/acs/nodes/Nodes.vue b/src/views/acs/nodes/Nodes.vue index c4bcf18..9e155a0 100644 --- a/src/views/acs/nodes/Nodes.vue +++ b/src/views/acs/nodes/Nodes.vue @@ -201,7 +201,31 @@
认证与展示
- + + + + + + + + + + + + + +
服务器是否开放端口映射
{ Object.keys(serverForm).forEach(key => { if (key === 'hide') { serverForm[key] = 0 + } else if (key === 'allow_port_forward') { + serverForm[key] = 0 } else if (key === 'server_type') { serverForm[key] = serverType.value } else { @@ -534,7 +569,7 @@ const submitForm = async () => { const formData = { ...serverForm } // 转换可能的数字字段 - const numericFields = ['bandwidth', 'disk', 'memory', 'cpu', 'hide']; + const numericFields = ['bandwidth', 'disk', 'memory', 'cpu', 'hide', 'allow_port_forward']; numericFields.forEach(field => { if (formData[field] !== '' && formData[field] !== null && formData[field] !== undefined) { formData[field] = Number(formData[field]) @@ -985,6 +1020,13 @@ onMounted(async () => { color: #409EFF; } +.form-item-description { + font-size: 12px; + color: #909399; + margin-top: 4px; + line-height: 1.2; +} + .form-grid { display: grid; grid-template-columns: repeat(2, 1fr);