feat: 对接用户组网管理
Build and Deploy Vue3 / build (push) Successful in 1m43s
Build and Deploy Vue3 / deploy (push) Successful in 1m7s

This commit is contained in:
2026-03-24 18:57:52 +08:00
parent 3357566b02
commit 40a5e486a6
29 changed files with 1895 additions and 9381 deletions
+39 -14
View File
@@ -36,9 +36,19 @@
<span class="status-value">{{ detail.ip || '-' }}</span>
</div>
<div class="status-item">
<span class="status-label">资源</span>
<span class="status-value">{{ detail.max_cpu || 0 }} | {{ formatMemKB(detail.max_memory) }} | {{ formatDiskGB(detail.max_disk) }}</span>
<span class="status-label">CPU</span>
<span class="status-value">{{ detail.max_cpu || 0 }}</span>
</div>
<div class="status-item">
<span class="status-label">内存</span>
<span class="status-value">{{ formatMemKB(detail.max_memory) }}</span>
</div>
<div class="status-item">
<span class="status-label">磁盘</span>
<span class="status-value">{{ formatDiskGB(detail.max_disk) }}</span>
</div>
</div>
<div class="status-bar" v-if="detail">
<div class="status-item">
<span class="status-label">带宽</span>
<span class="status-value">{{ detail.rx_bandwidth || 0 }} / {{ detail.tx_bandwidth || 0 }} Mbps</span>
@@ -174,22 +184,22 @@
</el-tab-pane>
<el-tab-pane label="镜像管理" name="image">
<ImageManage v-if="hostTabLoaded['image']" />
<ImageManage v-if="hostTabLoaded['image']" ref="imageManageRef" />
</el-tab-pane>
<el-tab-pane label="网络管理" name="network">
<NetworkManage v-if="hostTabLoaded['network']" />
<NetworkManage v-if="hostTabLoaded['network']" ref="networkManageRef" />
</el-tab-pane>
<el-tab-pane label="数据卷管理" name="volume">
<VolumeManage v-if="hostTabLoaded['volume']" />
<VolumeManage v-if="hostTabLoaded['volume']" ref="volumeManageRef" />
</el-tab-pane>
<el-tab-pane label="虚拟机管理" name="vm">
<VmManage v-if="hostTabLoaded['vm']" />
<VmManage v-if="hostTabLoaded['vm']" ref="vmManageRef" />
</el-tab-pane>
<el-tab-pane label="快照管理" name="snapshot">
<SnapshotManage v-if="hostTabLoaded['snapshot']" />
<SnapshotManage v-if="hostTabLoaded['snapshot']" ref="snapshotManageRef" />
</el-tab-pane>
<el-tab-pane label="备份管理" name="backup">
<BackupManage v-if="hostTabLoaded['backup']" />
<BackupManage v-if="hostTabLoaded['backup']" ref="backupManageRef" />
</el-tab-pane>
</el-tabs>
</div>
@@ -283,21 +293,36 @@ 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 })
const imageManageRef = ref(null)
const networkManageRef = ref(null)
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 }
watch(activeTab, (tab) => {
if (!['info', 'monitor'].includes(tab) && !hostTabLoaded[tab]) hostTabLoaded[tab] = true
if (!['info', 'monitor'].includes(tab)) {
if (!hostTabLoaded[tab]) {
hostTabLoaded[tab] = true
} else {
nextTick(() => { tabRefMap[tab]?.value?.loadList?.() })
}
}
if (tab === 'monitor' && detail.value) { loadMetrics(); startPolling() }
else stopPolling()
})
provide('embedded', true)
provide('serviceId', serviceId)
provide('serviceName', serviceName)
provide('hostId', hostId)
const loading = ref(false)
const submitLoading = ref(false)
const metricsLoading = ref(false)
const detail = ref(null)
provide('embedded', true)
provide('serviceId', serviceId)
provide('serviceName', serviceName)
provide('hostId', hostId)
provide('hostDetail', detail)
const showToken = ref(false)
const showPassword = ref(false)
const showPrivateKey = ref(false)