From 0749208a0dcf9cb3e3fd8fd7dcd7965a873bbaa6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E5=8D=9A=E6=96=87?= <1179111926@qq.com> Date: Fri, 1 Aug 2025 18:59:20 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8A=A0=E5=85=A5=E5=9C=B0=E5=9D=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/web/projects/vgpu/api/poll.js | 32 ++++++ .../projects/vgpu/views/poll/admin/index.vue | 98 +++++++++++++------ 2 files changed, 102 insertions(+), 28 deletions(-) diff --git a/packages/web/projects/vgpu/api/poll.js b/packages/web/projects/vgpu/api/poll.js index 155737e..11ba586 100644 --- a/packages/web/projects/vgpu/api/poll.js +++ b/packages/web/projects/vgpu/api/poll.js @@ -12,6 +12,38 @@ class pollApi { }); } + getNodeList(params) { + return request({ + url: apiPrefix + '/v1/available/nodes', + method: 'GET', + params, + }); + } + + create(data) { + return request({ + url: apiPrefix + '/v1/resource/pool/create', + method: 'POST', + data, + }); + } + + update(data) { + return request({ + url: apiPrefix + '/v1/resource/pool/update', + method: 'POST', + data, + }); + } + + delete(data) { + return request({ + url: apiPrefix + '/v1/resource/pool/delete', + method: 'POST', + data, + }); + } + // getNodes(data) { // return request({ // url: apiPrefix + '/v1/nodes', diff --git a/packages/web/projects/vgpu/views/poll/admin/index.vue b/packages/web/projects/vgpu/views/poll/admin/index.vue index 023b088..7c7dc78 100644 --- a/packages/web/projects/vgpu/views/poll/admin/index.vue +++ b/packages/web/projects/vgpu/views/poll/admin/index.vue @@ -1,13 +1,13 @@ - + 资源池名称 @@ -87,7 +89,7 @@ @@ -99,18 +101,56 @@ import pollApi from '~/vgpu/api/poll'; import { ref, onMounted } from 'vue'; import BlockBox from '@/components/BlockBox.vue'; import { Remove } from '@element-plus/icons-vue' +import { ElMessage, ElMessageBox } from 'element-plus' const list = ref([]) const dialogVisible = ref(false) -const editData = ref(null) +const editId = ref(null) const nodeList = ref([]) const nodeSelect = ref([]) const input = ref('') +const btnLoading = ref(false) const bytesToGB = (bytes) => { return Math.round(bytes / (1024 * 1024 * 1024)); } +const handleOk = async () => { + if (!input.value) { + ElMessage({ + message: '请输入资源池名称', + type: 'warning', + }) + return; + } + if (!nodeSelect.value.length) { + ElMessage({ + message: '请选择节点', + type: 'warning', + }) + return; + } + btnLoading.value = true; + const nodes = nodeList.value.filter(e => nodeSelect.value.includes(e.nodeIp)).map(e => ({ nodeIp: e.nodeIp, nodeName: e.nodeName })) + let res; + if (editId.value) { + res = await pollApi.update({ + pool_id: editId.value, + pool_name: input.value, + nodes + }) + } else { + res = await pollApi.create({ + pool_name: input.value, + nodes + }) + } + console.log(res, 'res') + getList(); + btnLoading.value = false; + dialogVisible.value = false; +} + const handleCheckboxChange = (ip) => { const index = nodeSelect.value.indexOf(ip); if (index > -1) { @@ -120,29 +160,31 @@ const handleCheckboxChange = (ip) => { } } -onMounted(async () => { +const handleDelete = async (id) => { + ElMessageBox.confirm(`确定要删除当前资源池吗?`, '提示', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }).then(async () => { + const res = await pollApi.delete({ pool_id: id }) + if (res.code === 1) { + ElMessage.success('删除成功'); + getList(); + } + }) +} + +const getList = async () => { const res = await pollApi.getPollList() list.value = res.data - nodeList.value = [ - { - "nodeName": "k8s1", - "cpuCores": "96", - "gpuNum": "0", - "gpuMemory": "0", - "totalMemory": "134472257536", - "diskSize": "7676310884352", - "nodeIp": "172.16.100.14" - }, - { - "nodeName": "k8s2", - "cpuCores": "80", - "gpuNum": "1", - "gpuMemory": "25769803776", - "totalMemory": "134432251904", - "diskSize": "7675682045952", - "nodeIp": "172.16.100.15" - } - ] +} + + +onMounted(async () => { + getList(); + const res = await pollApi.getNodeList() + nodeList.value = res.data + });