feat(admin+user): 虚拟机断网/恢复网络+每小时流量图表+宿主机额度统计 -- 缘由: 后端新增disconnect/connect_network,traffic_hourly,quota_stats接口,VM新增network_disabled字段 -- 预期: VmDetail/UserVmDetail/用户详情支持断网恢复操作并显示断网状态,VmDetail新增流量统计tab,HostDetail新增额度统计tab
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -19,6 +19,7 @@
|
||||
<div class="name-row">
|
||||
<h2 class="vm-name">{{ vm?.name || userGoods.good?.name || `用户虚拟机 #${userGoodsId}` }}</h2>
|
||||
<el-tag v-if="vm?.status" :type="vmStatusType(vm.status)" size="small" style="margin-left:8px">{{ vmStatusLabel(vm.status) }}</el-tag>
|
||||
<el-tag v-if="vm?.network_disabled" size="small" type="danger" effect="dark" style="margin-left:4px">已断网</el-tag>
|
||||
<el-tag v-if="vm?.rescue" size="small" type="danger" effect="dark" style="margin-left:4px">救援模式</el-tag>
|
||||
<el-tag v-if="userGoods.tag" size="small" type="info" style="margin-left:4px">{{ userGoods.tag }}</el-tag>
|
||||
</div>
|
||||
@@ -47,6 +48,8 @@
|
||||
<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 command="disconnectNetwork" :disabled="vm?.network_disabled">断网</el-dropdown-item>
|
||||
<el-dropdown-item command="connectNetwork" :disabled="!vm?.network_disabled">恢复网络</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>
|
||||
@@ -1125,7 +1128,8 @@ import {
|
||||
getUserGoodsDetail,
|
||||
getUserVmMetricsHistory,
|
||||
getUserVmTrafficPolicy, updateUserVmTrafficPolicy, addUserVmFixedTraffic, addUserVmTemporaryTraffic,
|
||||
setUserVmNetworkPrimary, resetUserVmMac
|
||||
setUserVmNetworkPrimary, resetUserVmMac,
|
||||
disconnectUserVmNetwork, connectUserVmNetwork
|
||||
} from '@/api/admin/userVm'
|
||||
import { deleteNetwork as deletePointNetwork } from '@/api/admin/kvmService'
|
||||
import { extractApiError } from '@/utils/kvmErrorUtil'
|
||||
@@ -1372,6 +1376,8 @@ const handleMoreCmd = (cmd) => {
|
||||
if (cmd === 'migrate') openMigrateVm()
|
||||
if (cmd === 'editGoods') openEditGoods()
|
||||
if (cmd === 'resetMac') handleResetVmMac()
|
||||
if (cmd === 'disconnectNetwork') handleDisconnectVmNetwork()
|
||||
if (cmd === 'connectNetwork') handleConnectVmNetwork()
|
||||
if (cmd === 'delete') {
|
||||
ElMessageBox.confirm('确定删除该用户虚拟机吗?', '删除确认', { type: 'error' }).then(async () => {
|
||||
try {
|
||||
@@ -1746,7 +1752,7 @@ const handleSetVmNetworkPrimary = (row) => {
|
||||
'设置主IP', { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' }
|
||||
).then(async () => {
|
||||
try {
|
||||
const res = await setUserVmNetworkPrimary({ user_good_id: userGoodsId.value, network_id: row.id })
|
||||
const res = await setUserVmNetworkPrimary({ user_goods_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失败')) }
|
||||
@@ -1766,6 +1772,32 @@ const handleResetVmMac = () => {
|
||||
}).catch(() => {})
|
||||
}
|
||||
|
||||
const handleDisconnectVmNetwork = () => {
|
||||
ElMessageBox.confirm(
|
||||
'断开虚拟机外部网络连接?断网后虚拟机将无法访问外部网络。',
|
||||
'断网', { confirmButtonText: '确定断网', cancelButtonText: '取消', type: 'warning' }
|
||||
).then(async () => {
|
||||
try {
|
||||
const res = await disconnectUserVmNetwork({ user_goods_id: userGoodsId.value })
|
||||
if (res?.data?.code === 200) { ElMessage.success('已断网'); loadDetail() }
|
||||
else ElMessage.error(extractApiError(res?.data, '断网失败'))
|
||||
} catch (e) { ElMessage.error(extractApiError(e?.response?.data, '断网失败')) }
|
||||
}).catch(() => {})
|
||||
}
|
||||
|
||||
const handleConnectVmNetwork = () => {
|
||||
ElMessageBox.confirm(
|
||||
'恢复虚拟机外部网络连接?',
|
||||
'恢复网络', { confirmButtonText: '确定', cancelButtonText: '取消', type: 'info' }
|
||||
).then(async () => {
|
||||
try {
|
||||
const res = await connectUserVmNetwork({ user_goods_id: userGoodsId.value })
|
||||
if (res?.data?.code === 200) { ElMessage.success('网络已恢复'); loadDetail() }
|
||||
else ElMessage.error(extractApiError(res?.data, '恢复网络失败'))
|
||||
} catch (e) { ElMessage.error(extractApiError(e?.response?.data, '恢复网络失败')) }
|
||||
}).catch(() => {})
|
||||
}
|
||||
|
||||
// ---- 绑定网络 ----
|
||||
const showBindNetworkSelector = ref(false)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user