fix: 虚拟机网络管理改为解绑逻辑,不再删除底层网络
Build and Deploy Vue3 / build (push) Successful in 1m33s
Build and Deploy Vue3 / deploy (push) Successful in 44s

将 user-vm/UserVmDetail 和 virtualization/VmDetail 中的网络删除操作改为通过 updateVm 接口解绑,与绑定网络逻辑对称,避免误删底层物理网络。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
shiran
2026-06-30 10:26:01 +08:00
co-authored by Cursor
parent cae5551107
commit 0155715278
3 changed files with 48 additions and 19 deletions
+18 -12
View File
@@ -344,7 +344,7 @@
<template #default="{ row }">
<el-button v-if="!row.is_primary" link type="warning" size="small" @click="handleSetVmNetworkPrimary(row)">设为主IP</el-button>
<el-button link type="danger" size="small" :loading="deletingNetworkId === row.id" @click="handleDeleteVmNetwork(row)">
<el-icon :size="14"><Delete /></el-icon>删除
<el-icon :size="14"><Delete /></el-icon>解绑
</el-button>
</template>
</el-table-column>
@@ -1807,21 +1807,27 @@ const resolveNetworkServiceHost = async (row) => {
}
const handleDeleteVmNetwork = (row) => {
ElMessageBox.confirm(
`将删除底层网络「${row.name}」(ID:${row.id}),该操作会影响所有绑定该网络的虚拟机,是否继续`,
'删除网络',
{ confirmButtonText: '确定删除', cancelButtonText: '取消', type: 'warning' }
`确定从该虚拟机解绑网络「${row.name}」(ID:${row.id})`,
'解绑网络',
{ confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' }
).then(async () => {
deletingNetworkId.value = row.id
try {
const { serviceId, hostId } = await resolveNetworkServiceHost(row)
if (!serviceId) { ElMessage.error('无法获取该网络所属服务ID,删除失败'); return }
const params = { service_id: serviceId, network_id: row.id }
if (hostId) params.host_id = hostId
const res = await deletePointNetwork(params)
if (res?.data?.code === 200) { ElMessage.success('删除成功'); loadDetail() }
else ElMessage.error(extractApiError(res?.data, '删除失败'))
const payload = { user_goods_id: userGoodsId.value }
const remainingNetworks = vmNetworks.value.filter(n => n.id !== row.id)
const bridgeIds = remainingNetworks.filter(n => n.type === 'bridge').map(n => n.id)
const natNet = remainingNetworks.find(n => n.type === 'nat')
payload.network_ids = bridgeIds
if (natNet) payload.internet_network_id = natNet.id
if (vm.value?.rx_bandwidth) payload.rx_bandwidth = vm.value.rx_bandwidth
if (vm.value?.tx_bandwidth) payload.tx_bandwidth = vm.value.tx_bandwidth
if (vm.value?.ssh_port) payload.ssh_port = vm.value.ssh_port
if (inPortGroup.value?.id) payload.port_group_id = inPortGroup.value.id
const res = await updateUserVm(payload)
if (res?.data?.code === 200) { ElMessage.success('解绑网络成功'); loadDetail() }
else ElMessage.error(extractApiError(res?.data, '解绑网络失败'))
} catch (e) {
ElMessage.error(extractApiError(e?.response?.data, '删除失败'))
ElMessage.error(extractApiError(e?.response?.data, '解绑网络失败'))
} finally {
deletingNetworkId.value = 0
}