From 01139f2874bad8019b968abdc50efd720a911352 Mon Sep 17 00:00:00 2001
From: zxr <271055687@qq.com>
Date: Thu, 16 Apr 2026 18:59:33 +0800
Subject: [PATCH] fix
---
src/api/ops/room-device.ts | 30 ++++-
src/api/ops/security.ts | 22 ++++
src/api/ops/storage.ts | 29 +++++
.../dc/device-collect/components/Detail.vue | 16 ++-
.../device-collect/components/FormDialog.vue | 105 +++++++++++++++-
.../components/QuickConfigDialog.vue | 41 +++++--
.../pages/dc/device-collect/config/columns.ts | 6 +
.../ops/pages/dc/device-collect/index.vue | 5 +
.../pages/dc/security/components/Detail.vue | 16 ++-
.../dc/security/components/FormDialog.vue | 113 +++++++++++++++++-
.../security/components/QuickConfigDialog.vue | 33 +++++
.../ops/pages/dc/security/config/columns.ts | 6 +
src/views/ops/pages/dc/security/index.vue | 5 +
.../dc/storage/components/StorageDetail.vue | 16 ++-
.../storage/components/StorageFormDialog.vue | 80 ++++++++++++-
.../ops/pages/dc/storage/config/columns.ts | 6 +
src/views/ops/pages/dc/storage/index.vue | 5 +
.../dc/url-harvest/components/Detail.vue | 5 +-
src/views/ops/pages/dc/url-harvest/index.vue | 5 +-
19 files changed, 522 insertions(+), 22 deletions(-)
diff --git a/src/api/ops/room-device.ts b/src/api/ops/room-device.ts
index 31fe140..cad8a1c 100644
--- a/src/api/ops/room-device.ts
+++ b/src/api/ops/room-device.ts
@@ -12,6 +12,13 @@ export interface RoomDeviceItem {
room_id: string
device_category: string
agent_config: string
+ collect_method: 'api' | 'snmp'
+ snmp_target: string
+ snmp_port: number
+ snmp_community: string
+ snmp_timeout_ms: number
+ snmp_retries: number
+ snmp_oids: string
enabled: boolean
collect_on: boolean
collect_interval: number
@@ -45,6 +52,13 @@ export interface RoomDeviceCreateData {
room_id: string
device_category: string
agent_config?: string
+ collect_method?: 'api' | 'snmp'
+ snmp_target?: string
+ snmp_port?: number
+ snmp_community?: string
+ snmp_timeout_ms?: number
+ snmp_retries?: number
+ snmp_oids?: string
enabled?: boolean
collect_on?: boolean
collect_interval?: number
@@ -58,6 +72,13 @@ export interface RoomDeviceUpdateData {
room_id?: string
device_category?: string
agent_config?: string
+ collect_method?: 'api' | 'snmp'
+ snmp_target?: string
+ snmp_port?: number
+ snmp_community?: string
+ snmp_timeout_ms?: number
+ snmp_retries?: number
+ snmp_oids?: string
enabled?: boolean
collect_on?: boolean
collect_interval?: number
@@ -66,9 +87,16 @@ export interface RoomDeviceUpdateData {
/** 机房设备采集配置数据 */
export interface RoomDeviceCollectData {
+ collect_method?: 'api' | 'snmp'
+ agent_config?: string
+ snmp_target?: string
+ snmp_port?: number
+ snmp_community?: string
+ snmp_timeout_ms?: number
+ snmp_retries?: number
+ snmp_oids?: string
collect_on?: boolean
collect_interval?: number
- agent_config?: string
}
/** 指标数据项 */
diff --git a/src/api/ops/security.ts b/src/api/ops/security.ts
index af5aa18..01f9395 100644
--- a/src/api/ops/security.ts
+++ b/src/api/ops/security.ts
@@ -19,6 +19,13 @@ export interface SecurityServiceItem {
tags: string
status_url: string
agent_config: string
+ collect_method: 'api' | 'snmp'
+ snmp_target: string
+ snmp_port: number
+ snmp_community: string
+ snmp_timeout_ms: number
+ snmp_retries: number
+ snmp_oids: string
collect_on: boolean
collect_args: string
collect_interval: number
@@ -65,6 +72,13 @@ export interface SecurityServiceFormData {
tags?: string
status_url?: string
agent_config?: string
+ collect_method?: 'api' | 'snmp'
+ snmp_target?: string
+ snmp_port?: number
+ snmp_community?: string
+ snmp_timeout_ms?: number
+ snmp_retries?: number
+ snmp_oids?: string
collect_on?: boolean
collect_args?: string
collect_interval?: number
@@ -120,6 +134,14 @@ export const fetchSecurityMetricsLatest = (serviceIdentity: string) => {
/** 采集配置补丁参数 */
export interface SecurityServicePatchData {
+ collect_method?: 'api' | 'snmp'
+ agent_config?: string
+ snmp_target?: string
+ snmp_port?: number
+ snmp_community?: string
+ snmp_timeout_ms?: number
+ snmp_retries?: number
+ snmp_oids?: string
collect_on?: boolean
collect_interval?: number
}
diff --git a/src/api/ops/storage.ts b/src/api/ops/storage.ts
index dc5106f..ee39bd5 100644
--- a/src/api/ops/storage.ts
+++ b/src/api/ops/storage.ts
@@ -19,6 +19,13 @@ export interface StorageItem {
tags: string
status_url: string
agent_config: string
+ collect_method: 'api' | 'snmp'
+ snmp_target: string
+ snmp_port: number
+ snmp_community: string
+ snmp_timeout_ms: number
+ snmp_retries: number
+ snmp_oids: string
collect_on: boolean
collect_args: string
collect_interval: number
@@ -65,6 +72,13 @@ export interface StorageCreateData {
tags?: string
status_url?: string
agent_config?: string
+ collect_method?: 'api' | 'snmp'
+ snmp_target?: string
+ snmp_port?: number
+ snmp_community?: string
+ snmp_timeout_ms?: number
+ snmp_retries?: number
+ snmp_oids?: string
collect_on?: boolean
collect_args?: string
collect_interval?: number
@@ -86,6 +100,13 @@ export interface StorageUpdateData {
tags?: string
status_url?: string
agent_config?: string
+ collect_method?: 'api' | 'snmp'
+ snmp_target?: string
+ snmp_port?: number
+ snmp_community?: string
+ snmp_timeout_ms?: number
+ snmp_retries?: number
+ snmp_oids?: string
collect_on?: boolean
collect_args?: string
collect_interval?: number
@@ -151,6 +172,14 @@ export const fetchStorageMetricsLatest = (serviceIdentity: string) => {
/** 采集配置补丁 */
export interface StoragePatchData {
+ collect_method?: 'api' | 'snmp'
+ agent_config?: string
+ snmp_target?: string
+ snmp_port?: number
+ snmp_community?: string
+ snmp_timeout_ms?: number
+ snmp_retries?: number
+ snmp_oids?: string
collect_on?: boolean
collect_interval?: number
}
diff --git a/src/views/ops/pages/dc/device-collect/components/Detail.vue b/src/views/ops/pages/dc/device-collect/components/Detail.vue
index b6bed99..ae5b460 100644
--- a/src/views/ops/pages/dc/device-collect/components/Detail.vue
+++ b/src/views/ops/pages/dc/device-collect/components/Detail.vue
@@ -10,10 +10,22 @@
{{ record.room_id }}
{{ record.description || '-' }}
-
- {{ record.agent_config }}
+
+
+ {{ record.collect_method === 'snmp' ? 'SNMP' : 'API' }}
+
+
+
+ {{ record.agent_config }}
+ {{ record.snmp_target || '-' }}
-
+
+ {{ (record.snmp_community || '-') + ' @ ' + (record.snmp_port || 161) }}
+
+
+ {{ (record.snmp_timeout_ms || 3000) + 'ms / ' + (record.snmp_retries ?? 1) }}
+
diff --git a/src/views/ops/pages/dc/device-collect/components/FormDialog.vue b/src/views/ops/pages/dc/device-collect/components/FormDialog.vue
index cd46da4..a0c98e3 100644
--- a/src/views/ops/pages/dc/device-collect/components/FormDialog.vue
+++ b/src/views/ops/pages/dc/device-collect/components/FormDialog.vue
@@ -38,10 +38,58 @@
-
-
+ 采集协议与连接
+
+
+ API
+ SNMP
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -110,6 +158,13 @@ const formData = reactive({
room_id: '',
device_category: '',
agent_config: '',
+ collect_method: 'api' as 'api' | 'snmp',
+ snmp_target: '',
+ snmp_port: 161,
+ snmp_community: '',
+ snmp_timeout_ms: 3000,
+ snmp_retries: 1,
+ snmp_oids: '',
enabled: true,
collect_on: true,
collect_interval: 60,
@@ -149,6 +204,13 @@ watch(
room_id: props.record.room_id || '',
device_category: props.record.device_category || '',
agent_config: props.record.agent_config || '',
+ collect_method: props.record.collect_method || 'api',
+ snmp_target: props.record.snmp_target || '',
+ snmp_port: props.record.snmp_port || 161,
+ snmp_community: props.record.snmp_community || '',
+ snmp_timeout_ms: props.record.snmp_timeout_ms || 3000,
+ snmp_retries: props.record.snmp_retries ?? 1,
+ snmp_oids: props.record.snmp_oids || '',
enabled: props.record.enabled ?? true,
collect_on: props.record.collect_on ?? true,
collect_interval: props.record.collect_interval || 60,
@@ -161,6 +223,13 @@ watch(
room_id: '',
device_category: '',
agent_config: '',
+ collect_method: 'api',
+ snmp_target: '',
+ snmp_port: 161,
+ snmp_community: '',
+ snmp_timeout_ms: 3000,
+ snmp_retries: 1,
+ snmp_oids: '',
enabled: true,
collect_on: true,
collect_interval: 60,
@@ -174,6 +243,24 @@ watch(
const handleOk = async () => {
try {
await formRef.value?.validate()
+ if (formData.collect_method === 'api' && !formData.agent_config?.trim()) {
+ Message.warning('API 模式下请填写采集地址')
+ return
+ }
+ if (formData.collect_method === 'snmp') {
+ if (!formData.snmp_target?.trim() || !formData.snmp_community?.trim()) {
+ Message.warning('SNMP 模式下请填写目标地址和 community')
+ return
+ }
+ if (formData.snmp_oids?.trim()) {
+ try {
+ JSON.parse(formData.snmp_oids)
+ } catch {
+ Message.warning('SNMP OID 配置必须是合法 JSON')
+ return
+ }
+ }
+ }
confirmLoading.value = true
@@ -184,6 +271,13 @@ const handleOk = async () => {
room_id: formData.room_id,
device_category: formData.device_category,
agent_config: formData.agent_config,
+ collect_method: formData.collect_method,
+ snmp_target: formData.snmp_target,
+ snmp_port: formData.snmp_port,
+ snmp_community: formData.snmp_community,
+ snmp_timeout_ms: formData.snmp_timeout_ms,
+ snmp_retries: formData.snmp_retries,
+ snmp_oids: formData.snmp_oids,
enabled: formData.enabled,
collect_on: formData.collect_on,
collect_interval: formData.collect_interval,
@@ -198,6 +292,13 @@ const handleOk = async () => {
room_id: formData.room_id,
device_category: formData.device_category,
agent_config: formData.agent_config,
+ collect_method: formData.collect_method,
+ snmp_target: formData.snmp_target,
+ snmp_port: formData.snmp_port,
+ snmp_community: formData.snmp_community,
+ snmp_timeout_ms: formData.snmp_timeout_ms,
+ snmp_retries: formData.snmp_retries,
+ snmp_oids: formData.snmp_oids,
enabled: formData.enabled,
collect_on: formData.collect_on,
collect_interval: formData.collect_interval,
diff --git a/src/views/ops/pages/dc/device-collect/components/QuickConfigDialog.vue b/src/views/ops/pages/dc/device-collect/components/QuickConfigDialog.vue
index c321cf6..9f8cfab 100644
--- a/src/views/ops/pages/dc/device-collect/components/QuickConfigDialog.vue
+++ b/src/views/ops/pages/dc/device-collect/components/QuickConfigDialog.vue
@@ -1,6 +1,30 @@
+
+
+ API
+ SNMP
+
+
+
+
+
+
+
+ 采集地址应返回 JSON 格式的指标数据,支持 {"metrics":[...]} 或数组形式
+
+
+
+
+
+
+
+
+
+
+
+
@@ -12,12 +36,6 @@
-
-
-
- 采集地址应返回 JSON 格式的指标数据,支持 {"metrics":[...]} 或数组形式
-
-
@@ -38,18 +56,24 @@ const emit = defineEmits(['update:visible', 'success'])
const loading = ref(false)
const form = ref({
+ collect_method: 'api' as 'api' | 'snmp',
collect_on: true,
collect_interval: 60,
agent_config: '',
+ snmp_target: '',
+ snmp_community: '',
})
watch(
() => props.visible,
(val) => {
if (val && props.record) {
+ form.value.collect_method = props.record.collect_method || 'api'
form.value.collect_on = props.record.collect_on ?? true
form.value.collect_interval = props.record.collect_interval || 60
form.value.agent_config = props.record.agent_config || ''
+ form.value.snmp_target = props.record.snmp_target || ''
+ form.value.snmp_community = props.record.snmp_community || ''
}
}
)
@@ -58,9 +82,12 @@ const handleSubmit = async () => {
loading.value = true
try {
const data: RoomDeviceCollectData = {
+ collect_method: form.value.collect_method,
collect_on: form.value.collect_on,
collect_interval: form.value.collect_interval,
- agent_config: form.value.agent_config,
+ agent_config: form.value.collect_method === 'api' ? form.value.agent_config : undefined,
+ snmp_target: form.value.collect_method === 'snmp' ? form.value.snmp_target : undefined,
+ snmp_community: form.value.collect_method === 'snmp' ? form.value.snmp_community : undefined,
}
await patchRoomDeviceCollect(props.record.id, data)
diff --git a/src/views/ops/pages/dc/device-collect/config/columns.ts b/src/views/ops/pages/dc/device-collect/config/columns.ts
index 2492c12..0ceb038 100644
--- a/src/views/ops/pages/dc/device-collect/config/columns.ts
+++ b/src/views/ops/pages/dc/device-collect/config/columns.ts
@@ -38,6 +38,12 @@ export const columns = [
width: 100,
slotName: 'enabled',
},
+ {
+ dataIndex: 'collect_method',
+ title: '采集方式',
+ width: 100,
+ slotName: 'collect_method',
+ },
{
dataIndex: 'collect_on',
title: '数据采集',
diff --git a/src/views/ops/pages/dc/device-collect/index.vue b/src/views/ops/pages/dc/device-collect/index.vue
index db316e6..806f993 100644
--- a/src/views/ops/pages/dc/device-collect/index.vue
+++ b/src/views/ops/pages/dc/device-collect/index.vue
@@ -40,6 +40,11 @@
{{ record.collect_on ? '已启用' : '未启用' }}
+
+
+ {{ record.collect_method === 'snmp' ? 'SNMP' : 'API' }}
+
+
diff --git a/src/views/ops/pages/dc/security/components/Detail.vue b/src/views/ops/pages/dc/security/components/Detail.vue
index f6a411a..c793c74 100644
--- a/src/views/ops/pages/dc/security/components/Detail.vue
+++ b/src/views/ops/pages/dc/security/components/Detail.vue
@@ -17,16 +17,28 @@
采集配置
+
+
+ {{ record.collect_method === 'snmp' ? 'SNMP' : 'API' }}
+
+
+ {{ record.collect_interval }}秒
- {{ record.agent_config }}
+ {{ record.agent_config }}
+ {{ record.snmp_target || '-' }}
-
+
+ {{ (record.snmp_community || '-') + ' @ ' + (record.snmp_port || 161) }}
+
+
+ {{ (record.snmp_timeout_ms || 3000) + 'ms / ' + (record.snmp_retries ?? 1) }}
+
{{ record.collect_on ? '已启用' : '未启用' }}
- {{ record.collect_interval }}秒
{{ record.collect_args || '-' }}
{{ record.collect_last_result || '-' }}
diff --git a/src/views/ops/pages/dc/security/components/FormDialog.vue b/src/views/ops/pages/dc/security/components/FormDialog.vue
index 4209d19..cf33335 100644
--- a/src/views/ops/pages/dc/security/components/FormDialog.vue
+++ b/src/views/ops/pages/dc/security/components/FormDialog.vue
@@ -55,10 +55,62 @@
-
-
+ 采集协议与连接
+
+
+ API
+ SNMP
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -135,6 +187,13 @@ const formData = reactive({
interval: 60,
description: '',
agent_config: '',
+ collect_method: 'api' as 'api' | 'snmp',
+ snmp_target: '',
+ snmp_port: 161,
+ snmp_community: '',
+ snmp_timeout_ms: 3000,
+ snmp_retries: 1,
+ snmp_oids: '',
enabled: true,
collect_on: true,
collect_interval: 60,
@@ -192,6 +251,13 @@ watch(
interval: props.record.interval || 60,
description: props.record.description || '',
agent_config: props.record.agent_config || '',
+ collect_method: props.record.collect_method || 'api',
+ snmp_target: props.record.snmp_target || '',
+ snmp_port: props.record.snmp_port || 161,
+ snmp_community: props.record.snmp_community || '',
+ snmp_timeout_ms: props.record.snmp_timeout_ms || 3000,
+ snmp_retries: props.record.snmp_retries ?? 1,
+ snmp_oids: props.record.snmp_oids || '',
enabled: props.record.enabled ?? true,
collect_on: props.record.collect_on ?? true,
collect_interval: props.record.collect_interval || 60,
@@ -209,6 +275,13 @@ watch(
interval: 60,
description: '',
agent_config: '',
+ collect_method: 'api',
+ snmp_target: '',
+ snmp_port: 161,
+ snmp_community: '',
+ snmp_timeout_ms: 3000,
+ snmp_retries: 1,
+ snmp_oids: '',
enabled: true,
collect_on: true,
collect_interval: 60,
@@ -224,6 +297,28 @@ watch(
const handleOk = async () => {
try {
await formRef.value?.validate()
+ if (formData.collect_method === 'api' && !formData.agent_config?.trim()) {
+ Message.warning('API 模式下请填写采集地址')
+ return
+ }
+ if (formData.collect_method === 'snmp') {
+ if (!formData.snmp_target?.trim()) {
+ Message.warning('SNMP 模式下请填写目标地址')
+ return
+ }
+ if (!formData.snmp_community?.trim()) {
+ Message.warning('SNMP 模式下请填写 community')
+ return
+ }
+ if (formData.snmp_oids?.trim()) {
+ try {
+ JSON.parse(formData.snmp_oids)
+ } catch {
+ Message.warning('SNMP OID配置必须是合法 JSON')
+ return
+ }
+ }
+ }
confirmLoading.value = true
@@ -236,6 +331,13 @@ const handleOk = async () => {
interval: formData.interval,
description: formData.description,
agent_config: formData.agent_config,
+ collect_method: formData.collect_method,
+ snmp_target: formData.snmp_target,
+ snmp_port: formData.snmp_port,
+ snmp_community: formData.snmp_community,
+ snmp_timeout_ms: formData.snmp_timeout_ms,
+ snmp_retries: formData.snmp_retries,
+ snmp_oids: formData.snmp_oids,
enabled: formData.enabled,
collect_on: formData.collect_on,
collect_interval: formData.collect_interval,
@@ -276,3 +378,10 @@ onMounted(() => {
loadServerOptions()
})
+
+
diff --git a/src/views/ops/pages/dc/security/components/QuickConfigDialog.vue b/src/views/ops/pages/dc/security/components/QuickConfigDialog.vue
index cc261a0..150183e 100644
--- a/src/views/ops/pages/dc/security/components/QuickConfigDialog.vue
+++ b/src/views/ops/pages/dc/security/components/QuickConfigDialog.vue
@@ -9,6 +9,27 @@
width="500px"
>
+
+
+ API
+ SNMP
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -43,6 +64,10 @@ const formRef = ref()
const confirmLoading = ref(false)
const formData = reactive({
+ collect_method: 'api' as 'api' | 'snmp',
+ agent_config: '',
+ snmp_target: '',
+ snmp_community: '',
collect_on: true,
collect_interval: 60,
})
@@ -51,6 +76,10 @@ watch(
() => props.visible,
(val) => {
if (val && props.record) {
+ formData.collect_method = props.record.collect_method || 'api'
+ formData.agent_config = props.record.agent_config || ''
+ formData.snmp_target = props.record.snmp_target || ''
+ formData.snmp_community = props.record.snmp_community || ''
formData.collect_on = props.record.collect_on ?? true
formData.collect_interval = props.record.collect_interval || 60
}
@@ -62,6 +91,10 @@ const handleOk = async () => {
confirmLoading.value = true
const patchData: SecurityServicePatchData = {
+ collect_method: formData.collect_method,
+ agent_config: formData.collect_method === 'api' ? formData.agent_config : undefined,
+ snmp_target: formData.collect_method === 'snmp' ? formData.snmp_target : undefined,
+ snmp_community: formData.collect_method === 'snmp' ? formData.snmp_community : undefined,
collect_on: formData.collect_on,
collect_interval: formData.collect_interval,
}
diff --git a/src/views/ops/pages/dc/security/config/columns.ts b/src/views/ops/pages/dc/security/config/columns.ts
index 6462429..18dcdfc 100644
--- a/src/views/ops/pages/dc/security/config/columns.ts
+++ b/src/views/ops/pages/dc/security/config/columns.ts
@@ -40,6 +40,12 @@ export const columns = [
width: 100,
slotName: 'enabled',
},
+ {
+ dataIndex: 'collect_method',
+ title: '采集方式',
+ width: 100,
+ slotName: 'collectMethod',
+ },
{
dataIndex: 'collect_on',
title: '采集状态',
diff --git a/src/views/ops/pages/dc/security/index.vue b/src/views/ops/pages/dc/security/index.vue
index 890b646..8170748 100644
--- a/src/views/ops/pages/dc/security/index.vue
+++ b/src/views/ops/pages/dc/security/index.vue
@@ -40,6 +40,11 @@
{{ record.collect_on ? '已启用' : '未启用' }}
+
+
+ {{ record.collect_method === 'snmp' ? 'SNMP' : 'API' }}
+
+
diff --git a/src/views/ops/pages/dc/storage/components/StorageDetail.vue b/src/views/ops/pages/dc/storage/components/StorageDetail.vue
index f9ae239..4453d3d 100644
--- a/src/views/ops/pages/dc/storage/components/StorageDetail.vue
+++ b/src/views/ops/pages/dc/storage/components/StorageDetail.vue
@@ -22,7 +22,21 @@
- {{ detailData?.agent_config || '-' }}
+
+
+ {{ detailData?.collect_method === 'snmp' ? 'SNMP' : 'API' }}
+
+
+
+ {{ detailData?.snmp_target || '-' }}
+ {{ detailData?.agent_config || '-' }}
+
+
+ {{ (detailData?.snmp_community || '-') + ' @ ' + (detailData?.snmp_port || 161) }}
+
+
+ {{ (detailData?.snmp_timeout_ms || 3000) + 'ms / ' + (detailData?.snmp_retries ?? 1) }}
+
{{ detailData?.collect_on ? '已启用' : '未启用' }}
diff --git a/src/views/ops/pages/dc/storage/components/StorageFormDialog.vue b/src/views/ops/pages/dc/storage/components/StorageFormDialog.vue
index 4a34060..27a30d5 100644
--- a/src/views/ops/pages/dc/storage/components/StorageFormDialog.vue
+++ b/src/views/ops/pages/dc/storage/components/StorageFormDialog.vue
@@ -68,7 +68,39 @@
-
+
+ API
+ SNMP
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -124,6 +156,13 @@ const formData = reactive({
extra: '',
tags: '',
agent_config: '',
+ collect_method: 'api' as 'api' | 'snmp',
+ snmp_target: '',
+ snmp_port: 161,
+ snmp_community: '',
+ snmp_timeout_ms: 3000,
+ snmp_retries: 1,
+ snmp_oids: '',
collect_on: true,
collect_args: '',
collect_interval: 60,
@@ -150,6 +189,13 @@ watch(
extra: props.record.extra || '',
tags: props.record.tags || '',
agent_config: props.record.agent_config || '',
+ collect_method: props.record.collect_method || 'api',
+ snmp_target: props.record.snmp_target || '',
+ snmp_port: props.record.snmp_port || 161,
+ snmp_community: props.record.snmp_community || '',
+ snmp_timeout_ms: props.record.snmp_timeout_ms || 3000,
+ snmp_retries: props.record.snmp_retries ?? 1,
+ snmp_oids: props.record.snmp_oids || '',
collect_on: props.record.collect_on ?? true,
collect_args: props.record.collect_args || '',
collect_interval: props.record.collect_interval || 60,
@@ -166,6 +212,13 @@ watch(
extra: '',
tags: '',
agent_config: '',
+ collect_method: 'api',
+ snmp_target: '',
+ snmp_port: 161,
+ snmp_community: '',
+ snmp_timeout_ms: 3000,
+ snmp_retries: 1,
+ snmp_oids: '',
collect_on: true,
collect_args: '',
collect_interval: 60,
@@ -178,6 +231,24 @@ watch(
const handleOk = async () => {
try {
await formRef.value?.validate()
+ if (formData.collect_method === 'api' && !formData.agent_config?.trim()) {
+ Message.warning('API 模式下请填写 Agent 配置 URL')
+ return
+ }
+ if (formData.collect_method === 'snmp') {
+ if (!formData.snmp_target?.trim() || !formData.snmp_community?.trim()) {
+ Message.warning('SNMP 模式下请填写目标地址和 community')
+ return
+ }
+ if (formData.snmp_oids?.trim()) {
+ try {
+ JSON.parse(formData.snmp_oids)
+ } catch {
+ Message.warning('SNMP OID 配置必须是合法 JSON')
+ return
+ }
+ }
+ }
confirmLoading.value = true
@@ -192,6 +263,13 @@ const handleOk = async () => {
extra: formData.extra,
tags: formData.tags,
agent_config: formData.agent_config,
+ collect_method: formData.collect_method,
+ snmp_target: formData.snmp_target,
+ snmp_port: formData.snmp_port,
+ snmp_community: formData.snmp_community,
+ snmp_timeout_ms: formData.snmp_timeout_ms,
+ snmp_retries: formData.snmp_retries,
+ snmp_oids: formData.snmp_oids,
collect_on: formData.collect_on,
collect_args: formData.collect_args,
collect_interval: formData.collect_interval,
diff --git a/src/views/ops/pages/dc/storage/config/columns.ts b/src/views/ops/pages/dc/storage/config/columns.ts
index b39d431..139a420 100644
--- a/src/views/ops/pages/dc/storage/config/columns.ts
+++ b/src/views/ops/pages/dc/storage/config/columns.ts
@@ -31,6 +31,12 @@ export const columns = [
width: 100,
slotName: 'enabled',
},
+ {
+ dataIndex: 'collect_method',
+ title: '采集方式',
+ width: 100,
+ slotName: 'collect_method',
+ },
{
dataIndex: 'collect_on',
title: '数据采集',
diff --git a/src/views/ops/pages/dc/storage/index.vue b/src/views/ops/pages/dc/storage/index.vue
index 45502c7..8f8454b 100644
--- a/src/views/ops/pages/dc/storage/index.vue
+++ b/src/views/ops/pages/dc/storage/index.vue
@@ -40,6 +40,11 @@
{{ record.collect_on ? '已启用' : '未启用' }}
+
+
+ {{ record.collect_method === 'snmp' ? 'SNMP' : 'API' }}
+
+
diff --git a/src/views/ops/pages/dc/url-harvest/components/Detail.vue b/src/views/ops/pages/dc/url-harvest/components/Detail.vue
index 73ca677..8738448 100644
--- a/src/views/ops/pages/dc/url-harvest/components/Detail.vue
+++ b/src/views/ops/pages/dc/url-harvest/components/Detail.vue
@@ -97,9 +97,10 @@ const getStatusText = (status?: string) => {
return textMap[status || ''] || '-'
}
-const formatTime = (time?: string) => {
- if (!time) return '-'
+const formatTime = (time?: string | null) => {
+ if (!time || time.startsWith('0001-01-01')) return '-'
const date = new Date(time)
+ if (Number.isNaN(date.getTime()) || date.getFullYear() <= 1) return '-'
const year = date.getFullYear()
const month = String(date.getMonth() + 1).padStart(2, '0')
const day = String(date.getDate()).padStart(2, '0')
diff --git a/src/views/ops/pages/dc/url-harvest/index.vue b/src/views/ops/pages/dc/url-harvest/index.vue
index 4221c8c..b744673 100644
--- a/src/views/ops/pages/dc/url-harvest/index.vue
+++ b/src/views/ops/pages/dc/url-harvest/index.vue
@@ -156,9 +156,10 @@ const getStatusText = (status?: string) => {
return textMap[status || ''] || '-'
}
-const formatTime = (time?: string) => {
- if (!time) return '-'
+const formatTime = (time?: string | null) => {
+ if (!time || time.startsWith('0001-01-01')) return '-'
const date = new Date(time)
+ if (Number.isNaN(date.getTime()) || date.getFullYear() <= 1) return '-'
const year = date.getFullYear()
const month = String(date.getMonth() + 1).padStart(2, '0')
const day = String(date.getDate()).padStart(2, '0')