diff --git a/frontend/src/views/systemMonitor/diskMonitor/components/DiskMonitorJobDetailDrawer.vue b/frontend/src/views/systemMonitor/diskMonitor/components/DiskMonitorJobDetailDrawer.vue new file mode 100644 index 0000000..b5c1c27 --- /dev/null +++ b/frontend/src/views/systemMonitor/diskMonitor/components/DiskMonitorJobDetailDrawer.vue @@ -0,0 +1,139 @@ + + + + + diff --git a/frontend/src/views/systemMonitor/diskMonitor/components/DiskMonitorJobTable.vue b/frontend/src/views/systemMonitor/diskMonitor/components/DiskMonitorJobTable.vue new file mode 100644 index 0000000..3c10e80 --- /dev/null +++ b/frontend/src/views/systemMonitor/diskMonitor/components/DiskMonitorJobTable.vue @@ -0,0 +1,119 @@ + + + + + diff --git a/frontend/src/views/systemMonitor/diskMonitor/index.vue b/frontend/src/views/systemMonitor/diskMonitor/index.vue index 15ed61b..2f00bcd 100644 --- a/frontend/src/views/systemMonitor/diskMonitor/index.vue +++ b/frontend/src/views/systemMonitor/diskMonitor/index.vue @@ -27,6 +27,9 @@ :title="editingTargetIndex >= 0 ? '编辑监控目标' : '新增监控目标'" @confirm="confirmTarget" /> + + + @@ -35,12 +38,15 @@ import { computed, onMounted, reactive, ref } from 'vue' import { ElMessage } from 'element-plus' import { useRouter } from 'vue-router' import { + getDiskMonitorJobDetail, getDiskMonitorJobList, getDiskMonitorPolicyDetail, runDiskMonitorJob, saveDiskMonitorPolicy } from '@/api/system/diskMonitor' import type { DiskMonitor } from '@/api/system/diskMonitor/interface' +import DiskMonitorJobDetailDrawer from './components/DiskMonitorJobDetailDrawer.vue' +import DiskMonitorJobTable from './components/DiskMonitorJobTable.vue' import DiskMonitorPolicyForm from './components/DiskMonitorPolicyForm.vue' import DiskMonitorSummary from './components/DiskMonitorSummary.vue' import DiskMonitorTargetDialog from './components/DiskMonitorTargetDialog.vue' @@ -66,6 +72,10 @@ const targetDialogVisible = ref(false) const editingTargetIndex = ref(-1) const editingTarget = ref(createEmptyTarget()) const latestJob = ref(null) +const jobList = ref([]) +const jobDetailVisible = ref(false) +const jobDetail = ref(null) +const detailLoading = ref(false) const loading = reactive({ init: false, save: false, @@ -146,24 +156,40 @@ const loadPolicyDetail = async () => { targetList.value = (detail.targets || []).map(item => normalizeTargetItem(item)) } -const loadLatestJob = async () => { +const loadJobList = async () => { loading.jobs = true try { + // 统一拉取最近任务列表,并复用首条记录更新摘要卡片 const response = await getDiskMonitorJobList({ pageNum: 1, - pageSize: 1 + pageSize: 10 }) - latestJob.value = response.data?.records?.[0] || null + const records = response.data?.records || [] + jobList.value = records + latestJob.value = records[0] || null } finally { loading.jobs = false } } +const openJobDetail = async (row: DiskMonitor.JobListItem) => { + jobDetailVisible.value = true + jobDetail.value = null + detailLoading.value = true + try { + // 点击明细时按任务 ID 拉取完整执行结果与通知日志 + const response = await getDiskMonitorJobDetail(row.id) + jobDetail.value = response.data || null + } finally { + detailLoading.value = false + } +} + const loadPageData = async () => { loading.init = true try { - // 页面初始化时并行拉取策略和最近任务,保证摘要卡片和表单状态一致 - await Promise.all([loadPolicyDetail(), loadLatestJob()]) + // 页面刷新入口单一化:统一并行加载策略与最近任务 + await Promise.all([loadPolicyDetail(), loadJobList()]) } finally { loading.init = false } @@ -201,7 +227,7 @@ const handleRun = async () => { jobSource: 'MANUAL' }) ElMessage.success('监控任务已启动') - // 手动触发任务后刷新摘要,展示最新任务状态 + // 手动触发任务后通过页面统一刷新流更新摘要和任务列表 await loadPageData() } finally { loading.run = false