From 003c5522385b8d2713d0a2546a66af3a487f8bdc Mon Sep 17 00:00:00 2001 From: zxr <271055687@qq.com> Date: Sun, 12 Apr 2026 16:40:33 +0800 Subject: [PATCH] fix --- src/api/ops/alertRecord.ts | 4 + .../server/components/QuickConfigDialog.vue | 2 +- .../dc/server/components/ServerFormDialog.vue | 93 +- src/views/ops/pages/dc/server/index.vue | 23 +- src/views/ops/pages/monitor/os/index.vue | 2000 ++++++++++------- 5 files changed, 1269 insertions(+), 853 deletions(-) diff --git a/src/api/ops/alertRecord.ts b/src/api/ops/alertRecord.ts index b06c0bd..7769d40 100644 --- a/src/api/ops/alertRecord.ts +++ b/src/api/ops/alertRecord.ts @@ -13,6 +13,10 @@ export const fetchAlertRecords = (data: { keyword?: string, sort?: string, order?: string, + binding_id?: number, + resource_category?: string, + server_identity?: string, + ip?: string, }) => { return request.get("/Alert/v1/record/list", { params: data }); }; diff --git a/src/views/ops/pages/dc/server/components/QuickConfigDialog.vue b/src/views/ops/pages/dc/server/components/QuickConfigDialog.vue index 2bcebe7..0c5eeba 100644 --- a/src/views/ops/pages/dc/server/components/QuickConfigDialog.vue +++ b/src/views/ops/pages/dc/server/components/QuickConfigDialog.vue @@ -25,7 +25,7 @@ diff --git a/src/views/ops/pages/dc/server/components/ServerFormDialog.vue b/src/views/ops/pages/dc/server/components/ServerFormDialog.vue index 0ab0477..4b92734 100644 --- a/src/views/ops/pages/dc/server/components/ServerFormDialog.vue +++ b/src/views/ops/pages/dc/server/components/ServerFormDialog.vue @@ -16,16 +16,20 @@ - - + + - - + + @@ -92,7 +96,7 @@ - + @@ -182,9 +186,79 @@ const formData = reactive({ ip_scan_port: 12429, }) +/** 判断是否为合法 IPv4 字符串 */ +function isIPv4String(host: string): boolean { + const h = host.trim() + if (!h) return false + const parts = h.split('.') + if (parts.length !== 4) return false + return parts.every((p) => { + if (!/^\d{1,3}$/.test(p)) return false + const n = Number(p) + return n >= 0 && n <= 255 + }) +} + +/** + * 若主机地址为 IP,返回规范化后的 IP(IPv4 或 IPv6);否则返回 null + */ +function extractIpFromHost(host: string): string | null { + const t = host.trim() + if (!t) return null + if (isIPv4String(t)) return t + if (!t.includes(':')) return null + try { + const withBrackets = t.startsWith('[') && t.endsWith(']') ? t : `[${t}]` + const u = new URL(`http://${withBrackets}/`) + if (u.hostname.includes(':')) return u.hostname + } catch { + return null + } + return null +} + +/** 校验 IP 地址字段(IPv4 或 IPv6) */ +function isValidIpAddress(s: string): boolean { + const t = s.trim() + if (!t) return false + if (isIPv4String(t)) return true + try { + const withBrackets = t.startsWith('[') && t.endsWith(']') ? t : `[${t}]` + const u = new URL(`http://${withBrackets}/`) + return u.hostname.includes(':') + } catch { + return false + } +} + +/** 主机为 IP 时同步到 IP 地址字段 */ +function syncIpFromHost() { + const ip = extractIpFromHost(formData.host) + if (ip) { + formData.ip_address = ip + } +} + const rules = { name: [{ required: true, message: '请输入服务器名称' }], host: [{ required: true, message: '请输入主机地址' }], + ip_address: [ + { required: true, message: '请输入IP地址' }, + { + validator: (value: string | undefined, cb: (error?: string) => void) => { + const v = (value || '').trim() + if (!v) { + cb() + return + } + if (!isValidIpAddress(v)) { + cb('请输入合法的 IPv4 或 IPv6 地址') + return + } + cb() + }, + }, + ], } function validateAgentConfigURL(raw?: string): string | null { @@ -228,6 +302,7 @@ watch( is_ip_scan_server: props.record.is_ip_scan_server ?? false, ip_scan_port: props.record.ip_scan_port || 12429, }) + syncIpFromHost() } else { Object.assign(formData, { server_identity: '', @@ -255,6 +330,14 @@ watch( } ) +watch( + () => formData.host, + () => { + if (!props.visible) return + syncIpFromHost() + }, +) + const handleOk = async () => { try { await formRef.value?.validate() diff --git a/src/views/ops/pages/dc/server/index.vue b/src/views/ops/pages/dc/server/index.vue index c0e2726..ba7941b 100644 --- a/src/views/ops/pages/dc/server/index.vue +++ b/src/views/ops/pages/dc/server/index.vue @@ -460,19 +460,7 @@ const handleDelete = async (record: any) => { }) } -/** dc-host `/dc-host/v1/control/command` 拉取本机采集指标(execute_task + service_collect) */ -const buildDcHostServiceCollectBody = () => ({ - command: 'execute_task' as const, - params: { - task_id: 0, - task_name: 'service_collect', - type: 'host' as const, - config: '{}', - timeout: 120, - }, - timestamp: new Date().toISOString(), -}) - +/** dc-host `GET agent_config`(一般为 `/dc-host/stats`)返回裸 Metrics JSON */ // 获取所有服务器的监控指标 const getAllMetrics = async () => { try { @@ -485,9 +473,8 @@ const getAllMetrics = async () => { let metricsUrl = record.agent_config // 验证 URL 是否合法 - let agentUrl: URL try { - agentUrl = new URL(metricsUrl) + new URL(metricsUrl) } catch (urlError) { console.warn(`服务器 ${record.name} 的 agent_config 不是合法的 URL:`, metricsUrl) // 设置默认值 0 @@ -496,12 +483,8 @@ const getAllMetrics = async () => { record.disk_info = { value: 0, total: '', used: '' } return } - // dc-host 控制面拉取指标接口为 POST - const isDcHostCommand = agentUrl.pathname.includes('/dc-host/v1/control/command') // 使用独立的 axios 实例请求外部 agent,绕过全局拦截器 - const response = isDcHostCommand - ? await agentAxios.post(metricsUrl, buildDcHostServiceCollectBody()) - : await agentAxios.get(metricsUrl) + const response = await agentAxios.get(metricsUrl) console.log('获取指标数据:', response.data) if (response.data) { // 更新记录的监控数据 diff --git a/src/views/ops/pages/monitor/os/index.vue b/src/views/ops/pages/monitor/os/index.vue index cfbd6f2..3a72f42 100644 --- a/src/views/ops/pages/monitor/os/index.vue +++ b/src/views/ops/pages/monitor/os/index.vue @@ -1,827 +1,1173 @@ - - - - - 当前服务器 - - - - {{ item.name }} - {{ item.ip }} - - - - - - {{ activeServer.os }} · {{ activeServer.location }} - - - - - - - - - - - - - - 内存 - {{ stats.memory.util }}% - - 总值 {{ stats.memory.total }} · 已用 {{ stats.memory.used }} - - - - - - - - - - - - - 磁盘(系统盘 /) - {{ stats.systemDisk.util }}% - - 总值 {{ stats.systemDisk.total }} · 已用 {{ stats.systemDisk.used }} - - - - - - - - - - - - - CPU - {{ stats.cpu.util }}% - - 总值 {{ stats.cpu.total }} · 已用 {{ stats.cpu.used }} - - - - - - - - - - - - - 硬盘(数据盘汇总) - {{ stats.dataDisk.util }}% - - 总值 {{ stats.dataDisk.total }} · 已用 {{ stats.dataDisk.used }} - - - - - - - - - - - - - - - - 接收 - - - - 发送 - - - - - {{ trafficHint }} - - - - - - - - - - 当前主机 · 最近 5 条 - - - - - - {{ - item.alert_name || '-' - }} - - {{ item.severity.name }} - - - - - {{ alertStatusText(item.status) }} - - {{ - formatAlertTime(item.starts_at) - }} - - - {{ item.summary }} - - - - - - - - - - - - - - - - + + + + + 当前服务器 + + + + {{ item.name }} + {{ item.ip }} + + + + + + {{ activeServer.os }} · {{ activeServer.location }} + + + + + + + + + + + + + + {{ panel.title }} + {{ panel.remaining }} + + + + + + + + + + + + {{ panel.title }} + + + + + + + + + 总值 {{ panel.totalLabel }} · 已用 {{ panel.usedLabel }} · 剩余 + {{ panel.freeLabel }} + + + + + + + + + + + + + + + + + + + + + + + + + + 接收 + + + + 发送 + + + + + {{ trafficHint }} + + + + + + + + + + 当前主机 · 共 {{ recentAlerts.length }} 条(最多 5 条) + + + + + + {{ + item.alert_name || '-' + }} + + {{ item.severity.name }} + + + + + {{ alertStatusText(item.status) }} + + {{ + formatAlertTime(item.starts_at) + }} + + + {{ item.summary }} + + + + + + + + + + + + + + + + + +
{{ trafficHint }}