fix(admin): 安全组选择器新增成功未关弹框 + 概览vCPU/带宽合并布局

缘由:
1) UserVmSecurityGroupSelector 中新增安全组成功后,若后端返回码非严格 200
   则 showCreate 不会置 false、列表不会刷新、无成功反馈。
2) /user-goods/vm-detail 概览第一行 vCPU、内存、下行带宽、上行带宽 各占一格,
   需求要求 vCPU+内存 合并为一格、上行+下行带宽 合并为一格并加编辑按钮。

修改:
- UserVmSecurityGroupSelector.vue submitCreate:响应码判断放宽为 200/201/2xx;
  catch 块提取 e.response.data.message 作更精确的错误信息。
- UserVmDetail.vue config-row 第一行:vCPU/内存 合并为「vCPU / 内存」单格;
  带宽合并为「带宽 ↓ / ↑」单格并内嵌修改按钮(handleMoreCmd('updateTraffic'));
  原第二行重复的用户名/远程端口 cell 移至第一行,外网IP/内网IP 独占第二行。

预期:
- 安全组选择器中新增安全组后弹框关闭、列表刷新、显示成功消息。
- 概览第一行信息密度提升,带宽格可一键触发修改带宽弹框。

测试:admin_dashboard_pc 本地 HMR 通过,无编译/lint 报错。
安全组新增接口联调需在有后端环境下验证实际 response code。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
shiran
2026-05-13 16:27:52 +08:00
parent e38ea4cc32
commit ea571563e0
2 changed files with 22 additions and 10 deletions
@@ -124,13 +124,19 @@ const submitCreate = async () => {
lock: createForm.lock, lock: createForm.lock,
drop_all: createForm.drop_all drop_all: createForm.drop_all
}) })
if (res?.data?.code === 200) { const code = res?.data?.code
if (code === 200 || code === 201 || (code >= 200 && code < 300)) {
ElMessage.success('创建成功') ElMessage.success('创建成功')
showCreate.value = false showCreate.value = false
Object.assign(createForm, { name: '', direction: 'in', lock: false, drop_all: false }) Object.assign(createForm, { name: '', direction: 'in', lock: false, drop_all: false })
loadList() await loadList()
} else ElMessage.error(res?.data?.message || '创建失败') } else {
} catch { ElMessage.error('创建失败') } finally { createLoading.value = false } ElMessage.error(res?.data?.message || res?.data?.error || '创建失败')
}
} catch (e) {
const msg = e?.response?.data?.message || e?.response?.data?.error || e?.message || '创建失败'
ElMessage.error(msg)
} finally { createLoading.value = false }
} }
const handleClose = () => { visible.value = false } const handleClose = () => { visible.value = false }
+11 -5
View File
@@ -63,14 +63,20 @@
<!-- VM 配置信息 --> <!-- VM 配置信息 -->
<div class="vm-config-grid" v-if="vm"> <div class="vm-config-grid" v-if="vm">
<div class="config-row"> <div class="config-row">
<div class="config-cell"><span class="config-label">vCPU</span><span class="config-value">{{ vm.vcpu || '-' }} </span></div> <div class="config-cell"><span class="config-label">vCPU / 内存</span><span class="config-value">{{ vm.vcpu || '-' }} / {{ formatMemory(vm.memory) }}</span></div>
<div class="config-cell"><span class="config-label">内存</span><span class="config-value">{{ formatMemory(vm.memory) }}</span></div> <div class="config-cell">
<div class="config-cell"><span class="config-label">下行带宽</span><span class="config-value">{{ vm.rx_bandwidth || 0 }} Mbps</span></div> <span class="config-label">带宽 / </span>
<div class="config-cell"><span class="config-label">上行带宽</span><span class="config-value">{{ vm.tx_bandwidth || 0 }} Mbps</span></div> <span class="config-value">
{{ vm.rx_bandwidth || 0 }} / {{ vm.tx_bandwidth || 0 }} Mbps
<el-button link type="primary" size="small" class="cfg-edit-btn" @click="handleMoreCmd('updateTraffic')">
<el-icon :size="14"><Edit /></el-icon>修改
</el-button>
</span>
</div> </div>
<div class="config-row">
<div class="config-cell"><span class="config-label">用户名</span><span class="config-value" style="font-weight:500">{{ isWindows ? 'Administrator' : 'root' }}</span></div> <div class="config-cell"><span class="config-label">用户名</span><span class="config-value" style="font-weight:500">{{ isWindows ? 'Administrator' : 'root' }}</span></div>
<div class="config-cell"><span class="config-label">远程端口</span><span class="config-value">{{ isWindows ? (vm.ssh_port && vm.ssh_port !== 22 ? vm.ssh_port : 3389) : (vm.ssh_port || 22) }}</span></div> <div class="config-cell"><span class="config-label">远程端口</span><span class="config-value">{{ isWindows ? (vm.ssh_port && vm.ssh_port !== 22 ? vm.ssh_port : 3389) : (vm.ssh_port || 22) }}</span></div>
</div>
<div class="config-row">
<div class="config-cell"> <div class="config-cell">
<span class="config-label">外网IP</span> <span class="config-label">外网IP</span>
<span class="config-value ip-value" v-if="vmPublicIpList.length"> <span class="config-value ip-value" v-if="vmPublicIpList.length">