diff --git a/frontend/src/views/MapCanvas.vue b/frontend/src/views/MapCanvas.vue index cb58ff4c..9e4aa5ca 100644 --- a/frontend/src/views/MapCanvas.vue +++ b/frontend/src/views/MapCanvas.vue @@ -708,6 +708,7 @@ async function deleteNode(dimKey: string, oi: number) { // ── 保存 ── let saveTimer: ReturnType | null = null +let autoSaveTimer: ReturnType | null = null let isSaving = false function debouncedSaveCanvas() { @@ -716,7 +717,7 @@ function debouncedSaveCanvas() { saveTimer = setTimeout(() => { saveCanvas() }, 500) } -async function saveCanvas() { +async function saveCanvas(silent?: boolean) { if (!selectedMap.value) return if (isSaving) return isSaving = true @@ -730,7 +731,7 @@ async function saveCanvas() { canvas_data: { connections: connections.value }, version_num: currentMap.value?.version_num, }) - ElMessage.success("已保存") + if (!silent) ElMessage.success("已保存") } catch (e: any) { if (e?.response?.status === 409) { ElMessage.warning("地图已被修改,刷新后重试") @@ -927,12 +928,17 @@ onMounted(async () => { for (const kpi of allKpis.value) { if (kpi.kpi_code) kpiNameMap[kpi.kpi_code] = kpi.kpi_name || kpi.kpi_code } + // 自动保存:每30秒自动保存草稿 + autoSaveTimer = setInterval(() => { + if (currentMap?.status === 'draft') saveCanvas(true) + }, 30000) window.addEventListener('resize', triggerRecalc) }) onUnmounted(() => { window.removeEventListener('resize', triggerRecalc) if (saveTimer) clearTimeout(saveTimer) + if (autoSaveTimer) clearInterval(autoSaveTimer) })