From edf0af795349d58f824b9ecc5b8cffb2d0875c93 Mon Sep 17 00:00:00 2001 From: yexb <553699424@qq.com> Date: Wed, 22 Apr 2026 22:53:39 +0800 Subject: [PATCH] feat: add disk monitor target editors --- .../components/DiskMonitorTargetDialog.vue | 141 ++++++++++++++++++ .../components/DiskMonitorTargetTable.vue | 127 ++++++++++++++++ .../components/NotificationHttpEditor.vue | 133 +++++++++++++++++ .../components/NotificationPathEditor.vue | 116 ++++++++++++++ .../views/systemMonitor/diskMonitor/index.vue | 63 +++++++- 5 files changed, 579 insertions(+), 1 deletion(-) create mode 100644 frontend/src/views/systemMonitor/diskMonitor/components/DiskMonitorTargetDialog.vue create mode 100644 frontend/src/views/systemMonitor/diskMonitor/components/DiskMonitorTargetTable.vue create mode 100644 frontend/src/views/systemMonitor/diskMonitor/components/NotificationHttpEditor.vue create mode 100644 frontend/src/views/systemMonitor/diskMonitor/components/NotificationPathEditor.vue diff --git a/frontend/src/views/systemMonitor/diskMonitor/components/DiskMonitorTargetDialog.vue b/frontend/src/views/systemMonitor/diskMonitor/components/DiskMonitorTargetDialog.vue new file mode 100644 index 0000000..877fecf --- /dev/null +++ b/frontend/src/views/systemMonitor/diskMonitor/components/DiskMonitorTargetDialog.vue @@ -0,0 +1,141 @@ + + + + + diff --git a/frontend/src/views/systemMonitor/diskMonitor/components/DiskMonitorTargetTable.vue b/frontend/src/views/systemMonitor/diskMonitor/components/DiskMonitorTargetTable.vue new file mode 100644 index 0000000..c5658ba --- /dev/null +++ b/frontend/src/views/systemMonitor/diskMonitor/components/DiskMonitorTargetTable.vue @@ -0,0 +1,127 @@ + + + + + diff --git a/frontend/src/views/systemMonitor/diskMonitor/components/NotificationHttpEditor.vue b/frontend/src/views/systemMonitor/diskMonitor/components/NotificationHttpEditor.vue new file mode 100644 index 0000000..07f6eff --- /dev/null +++ b/frontend/src/views/systemMonitor/diskMonitor/components/NotificationHttpEditor.vue @@ -0,0 +1,133 @@ + + + + + diff --git a/frontend/src/views/systemMonitor/diskMonitor/components/NotificationPathEditor.vue b/frontend/src/views/systemMonitor/diskMonitor/components/NotificationPathEditor.vue new file mode 100644 index 0000000..269f7e0 --- /dev/null +++ b/frontend/src/views/systemMonitor/diskMonitor/components/NotificationPathEditor.vue @@ -0,0 +1,116 @@ + + + + + diff --git a/frontend/src/views/systemMonitor/diskMonitor/index.vue b/frontend/src/views/systemMonitor/diskMonitor/index.vue index f6cc6a1..8bccb31 100644 --- a/frontend/src/views/systemMonitor/diskMonitor/index.vue +++ b/frontend/src/views/systemMonitor/diskMonitor/index.vue @@ -18,6 +18,15 @@ @save="handleSave" @run="handleRun" /> + + + + @@ -34,7 +43,9 @@ import { import type { DiskMonitor } from '@/api/system/diskMonitor/interface' import DiskMonitorPolicyForm from './components/DiskMonitorPolicyForm.vue' import DiskMonitorSummary from './components/DiskMonitorSummary.vue' -import { createDefaultPolicy, validatePolicy } from './utils/form' +import DiskMonitorTargetDialog from './components/DiskMonitorTargetDialog.vue' +import DiskMonitorTargetTable from './components/DiskMonitorTargetTable.vue' +import { createDefaultPolicy, createEmptyTarget, validatePolicy, validateTarget } from './utils/form' defineOptions({ name: 'DiskMonitorPage' @@ -44,6 +55,9 @@ const router = useRouter() const policyForm = ref(createDefaultPolicy()) const targetList = ref([]) +const targetDialogVisible = ref(false) +const editingTargetIndex = ref(-1) +const editingTarget = ref(createEmptyTarget()) const latestJob = ref(null) const loading = reactive({ init: false, @@ -57,6 +71,53 @@ const handleBack = async () => { await router.push('/systemMonitor') } +const cloneTarget = (target: DiskMonitor.TargetItem): DiskMonitor.TargetItem => ({ + ...target, + notifyPathList: target.notifyPathList.map(item => ({ ...item })), + notifyHttpList: target.notifyHttpList.map(item => ({ ...item })) +}) + +const openAddTarget = () => { + editingTargetIndex.value = -1 + editingTarget.value = createEmptyTarget() + targetDialogVisible.value = true +} + +const openEditTarget = (row: DiskMonitor.TargetItem, index: number) => { + editingTargetIndex.value = index + // 编辑时克隆当前行,避免未确认前直接污染列表数据 + editingTarget.value = cloneTarget(row) + targetDialogVisible.value = true +} + +const confirmTarget = () => { + // 提交前统一规范盘符并做去重、阈值关系校验 + const normalizedDriveLetter = editingTarget.value.driveLetter.trim().toUpperCase() + const payload: DiskMonitor.TargetItem = { + ...editingTarget.value, + driveLetter: normalizedDriveLetter + } + const exists = targetList.value + .filter((_, index) => index !== editingTargetIndex.value) + .map(item => item.driveLetter.trim().toUpperCase()) + const errorMessage = validateTarget(payload, exists) + if (errorMessage) { + ElMessage.warning(errorMessage) + return + } + + if (editingTargetIndex.value >= 0) { + targetList.value.splice(editingTargetIndex.value, 1, payload) + } else { + targetList.value.push(payload) + } + targetDialogVisible.value = false +} + +const removeTarget = (index: number) => { + targetList.value.splice(index, 1) +} + const loadPolicyDetail = async () => { const response = await getDiskMonitorPolicyDetail() const detail = response.data