From f667fe420aa1344b08bba3e67029233e9a069960 Mon Sep 17 00:00:00 2001 From: shiran Date: Wed, 3 Jun 2026 17:59:53 +0800 Subject: [PATCH] =?UTF-8?q?feat(host-detail):=20=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E8=99=9A=E6=8B=9F=E6=9C=BA=E7=9B=91=E6=8E=A7=20tab?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 支持多选虚拟机和监控指标(CPU/内存/磁盘IO/网络),基于 metrics_history 接口渲染 ECharts 图表;时间范围可选。 Co-authored-by: Cursor --- src/views/virtualization/HostDetail.vue | 9 +- src/views/virtualization/VmMonitor.vue | 407 ++++++++++++++++++++++++ 2 files changed, 414 insertions(+), 2 deletions(-) create mode 100644 src/views/virtualization/VmMonitor.vue diff --git a/src/views/virtualization/HostDetail.vue b/src/views/virtualization/HostDetail.vue index 7273a14..857d576 100644 --- a/src/views/virtualization/HostDetail.vue +++ b/src/views/virtualization/HostDetail.vue @@ -350,6 +350,9 @@ + + +
@@ -745,6 +748,7 @@ import VolumeManage from '@/views/virtualization/VolumeManage.vue' import VmManage from '@/views/virtualization/VmManage.vue' import SnapshotManage from '@/views/virtualization/SnapshotManage.vue' import BackupManage from '@/views/virtualization/BackupManage.vue' +import VmMonitor from '@/views/virtualization/VmMonitor.vue' import { useTagsViewStore } from '@/store/tagsViewStore' import UserListSelector from '@/components/admin/UserListSelector.vue' import VmSelectorPopup from '@/components/admin/VmSelectorPopup.vue' @@ -759,7 +763,7 @@ const serviceName = computed(() => route.query.service_name || '') const hostId = computed(() => parseInt(route.query.id) || 0) const activeTab = ref('info') -const hostTabLoaded = reactive({ image: false, network: false, volume: false, vm: false, snapshot: false, backup: false, networking: false }) +const hostTabLoaded = reactive({ image: false, network: false, volume: false, vm: false, snapshot: false, backup: false, vmMonitor: false, networking: false }) const imageManageRef = ref(null) const networkManageRef = ref(null) @@ -767,7 +771,8 @@ const volumeManageRef = ref(null) const vmManageRef = ref(null) const snapshotManageRef = ref(null) const backupManageRef = ref(null) -const tabRefMap = { image: imageManageRef, network: networkManageRef, volume: volumeManageRef, vm: vmManageRef, snapshot: snapshotManageRef, backup: backupManageRef } +const vmMonitorRef = ref(null) +const tabRefMap = { image: imageManageRef, network: networkManageRef, volume: volumeManageRef, vm: vmManageRef, snapshot: snapshotManageRef, backup: backupManageRef, vmMonitor: vmMonitorRef } watch(activeTab, (tab) => { if (!['info', 'monitor', 'networking'].includes(tab)) { diff --git a/src/views/virtualization/VmMonitor.vue b/src/views/virtualization/VmMonitor.vue new file mode 100644 index 0000000..fb3f0d6 --- /dev/null +++ b/src/views/virtualization/VmMonitor.vue @@ -0,0 +1,407 @@ + + + + +