feat(admin/vm-network): 网络列表增加is_primary主IP标识+设为主IP+重置MAC地址 -- 缘由: 后端新增network/set_primary和vm/reset_mac接口 -- 预期: VmDetail与UserVmDetail网络列表显示主IP标签,非主IP行有设为主IP按钮,更多菜单增加重置MAC地址

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
shiran
2026-05-15 10:59:45 +08:00
co-authored by Cursor
parent 98678859cb
commit 564e6cc017
4 changed files with 98 additions and 6 deletions
+38 -3
View File
@@ -46,6 +46,7 @@
<el-dropdown-item command="resume">恢复</el-dropdown-item>
<el-dropdown-item command="rescue" :disabled="!!vm?.rescue">救援模式</el-dropdown-item>
<el-dropdown-item command="exitRescue" :disabled="!vm?.rescue">退出救援</el-dropdown-item>
<el-dropdown-item command="resetMac">重置MAC地址</el-dropdown-item>
<el-dropdown-item divided command="rebuild">重装系统</el-dropdown-item>
<el-dropdown-item command="updateVm">编辑虚拟机</el-dropdown-item>
<el-dropdown-item command="refactorVm">重构虚拟机</el-dropdown-item>
@@ -329,9 +330,15 @@
<el-table-column prop="address" label="地址(CIDR)" min-width="150" />
<el-table-column prop="gateway" label="网关" min-width="120" />
<el-table-column prop="mac_address" label="MAC" min-width="150" show-overflow-tooltip />
<el-table-column label="类型" width="80"><template #default="{ row }"><el-tag :type="row.type === 'bridge' ? 'success' : 'warning'" size="small">{{ row.type === 'bridge' ? '网桥' : 'NAT' }}</el-tag></template></el-table-column>
<el-table-column label="操作" width="90" fixed="right">
<el-table-column label="主IP" width="70" align="center">
<template #default="{ row }">
<el-tag v-if="row.is_primary" type="success" size="small" effect="dark"></el-tag>
</template>
</el-table-column>
<el-table-column label="类型" width="80"><template #default="{ row }"><el-tag :type="row.type === 'bridge' ? 'success' : 'warning'" size="small">{{ row.type === 'bridge' ? '网桥' : 'NAT' }}</el-tag></template></el-table-column>
<el-table-column label="操作" width="160" fixed="right">
<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-button>
@@ -1117,7 +1124,8 @@ import {
getUserVmNetworkList, getUserVmNetworkDetail, getUserVmNetworkingList, createUserVmNetworking, assignUserVmNetworking, removeUserVmNetworkingNetwork, deleteUserVmNetworking,
getUserGoodsDetail,
getUserVmMetricsHistory,
getUserVmTrafficPolicy, updateUserVmTrafficPolicy, addUserVmFixedTraffic, addUserVmTemporaryTraffic
getUserVmTrafficPolicy, updateUserVmTrafficPolicy, addUserVmFixedTraffic, addUserVmTemporaryTraffic,
setUserVmNetworkPrimary, resetUserVmMac
} from '@/api/admin/userVm'
import { deleteNetwork as deletePointNetwork } from '@/api/admin/kvmService'
import { extractApiError } from '@/utils/kvmErrorUtil'
@@ -1363,6 +1371,7 @@ const handleMoreCmd = (cmd) => {
if (cmd === 'refactorVm') openRefactorVm()
if (cmd === 'migrate') openMigrateVm()
if (cmd === 'editGoods') openEditGoods()
if (cmd === 'resetMac') handleResetVmMac()
if (cmd === 'delete') {
ElMessageBox.confirm('确定删除该用户虚拟机吗?', '删除确认', { type: 'error' }).then(async () => {
try {
@@ -1731,6 +1740,32 @@ const handleDeleteVmNetwork = (row) => {
}).catch(() => {})
}
const handleSetVmNetworkPrimary = (row) => {
ElMessageBox.confirm(
`将「${row.address || row.name}」设为主IP?设置后将触发 CloudInit 重建并重启虚拟机。`,
'设置主IP', { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' }
).then(async () => {
try {
const res = await setUserVmNetworkPrimary({ user_good_id: userGoodsId.value, network_id: row.id })
if (res?.data?.code === 200) { ElMessage.success('设置主IP成功,虚拟机将重启'); loadDetail() }
else ElMessage.error(extractApiError(res?.data, '设置主IP失败'))
} catch (e) { ElMessage.error(extractApiError(e?.response?.data, '设置主IP失败')) }
}).catch(() => {})
}
const handleResetVmMac = () => {
ElMessageBox.confirm(
'重置MAC地址将重建 CloudInit 并重启虚拟机,确定继续?',
'重置MAC地址', { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' }
).then(async () => {
try {
const res = await resetUserVmMac({ user_goods_id: userGoodsId.value })
if (res?.data?.code === 200) { ElMessage.success('MAC地址重置成功,虚拟机将重启'); loadDetail() }
else ElMessage.error(extractApiError(res?.data, '重置MAC失败'))
} catch (e) { ElMessage.error(extractApiError(e?.response?.data, '重置MAC失败')) }
}).catch(() => {})
}
// ---- 绑定网络 ----
const showBindNetworkSelector = ref(false)