From 5a5a294f06c8cf5499fcd6767d085517ba726f46 Mon Sep 17 00:00:00 2001 From: cat_shark <1716967236@qq.com> Date: Sun, 5 Jul 2026 15:18:02 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E5=AF=BC=E5=9B=BE):=20=E9=98=B2=E6=8A=96/?= =?UTF-8?q?=E5=A2=9E=E9=87=8F=E7=94=9F=E6=88=90/=E7=A7=BB=E9=99=A4?= =?UTF-8?q?=E5=86=97=E4=BD=99=E5=AF=B9=E6=AF=94=E9=9D=A2=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 重新生成按钮增加 :loading 防重复点击 - 生成进度提示(AI 正在生成中,已等待 X 秒) - 用户编辑后弹窗选择「全量重新生成」或「增量更新」 - 移除独立的对比结果面板,着色结果直接展示在标准导图中 --- src/api/standardMindMap.ts | 8 ++-- src/components/ReviewRecall.vue | 85 +++++++++++++++++++++++---------- 2 files changed, 64 insertions(+), 29 deletions(-) diff --git a/src/api/standardMindMap.ts b/src/api/standardMindMap.ts index 02b538f..7fd2add 100644 --- a/src/api/standardMindMap.ts +++ b/src/api/standardMindMap.ts @@ -10,7 +10,7 @@ export interface StandardMindMap { content: string; outline: string; summary: string; - generator: "BUILTIN" | "AI" | "USER"; + generator: "BUILTIN" | "AI" | "USER" | "USER_MERGE"; generatorVersion?: string; sourceReportCount: number; sourceFragmentCount: number; @@ -38,9 +38,9 @@ export const getStandardMindMap = (taskNum: string) => { return request.get(`/review/standard-mind-map/${taskNum}`); }; -/** 强制重新生成标准思维导图 */ -export const regenerateStandardMindMap = (taskNum: string) => { - return request.post(`/review/standard-mind-map/${taskNum}/regenerate`); +/** 强制重新生成标准思维导图(全量或增量) */ +export const regenerateStandardMindMap = (taskNum: string, mode: "full" | "incremental" = "full") => { + return request.post(`/review/standard-mind-map/${taskNum}/regenerate?mode=${mode}`); }; /** 用户编辑标准思维导图(大纲文本) */ diff --git a/src/components/ReviewRecall.vue b/src/components/ReviewRecall.vue index 6d6fb92..015bc46 100644 --- a/src/components/ReviewRecall.vue +++ b/src/components/ReviewRecall.vue @@ -23,6 +23,10 @@ const standard = ref(null); const comparing = ref(false); const comparingSeconds = ref(0); let comparingTimer: ReturnType | null = null; + +const regenerating = ref(false); +const regeneratingSeconds = ref(0); +let regeneratingTimer: ReturnType | null = null; const lastResult = ref(null); const hasCompared = ref(false); @@ -120,22 +124,60 @@ const loadData = async () => { } }; -// 重新生成 +// 重新生成(防抖 + 用户编辑时弹窗选模式) const handleRegenerate = async () => { + // 防抖:正在生成中跳过 + if (regenerating.value) return; + + let mode: "full" | "incremental" = "full"; + + // 如果用户编辑过,弹窗选择生成模式 + if (standard.value?.generator === "USER" || standard.value?.generator === "USER_MERGE") { + try { + await ElMessageBox.confirm( + "检测到您已编辑过标准思维导图,请选择重新生成方式:", + "重新生成", + { + confirmButtonText: "全量重新生成", + cancelButtonText: "增量更新(保留编辑)", + type: "warning", + distinguishCancelAndClose: true, + } + ); + // confirm → 全量(保持 mode = "full") + } catch (e: any) { + if (e === "cancel" || e?.toString()?.includes("cancel")) { + mode = "incremental"; + } else { + return; // 点 X 关闭 → 不做操作 + } + } + } else { + // 未编辑过的简单确认 + try { + await ElMessageBox.confirm("重新生成将从学习数据中重新生成标准思维导图,确定?", "提示", { + confirmButtonText: "确定", + cancelButtonText: "取消", + type: "info", + }); + } catch { + return; + } + } + + // 开始生成 + regenerating.value = true; + regeneratingSeconds.value = 0; + regeneratingTimer = setInterval(() => { regeneratingSeconds.value++; }, 1000); try { - await ElMessageBox.confirm("重新生成将丢弃用户编辑的内容,确定?", "提示", { - confirmButtonText: "确定", - cancelButtonText: "取消", - type: "warning", - }); - loading.value = true; - const res = await regenerateStandardMindMap(taskNum.value); + const res = await regenerateStandardMindMap(taskNum.value, mode); standard.value = res?.data || null; - ElMessage.success("标准思维导图已重新生成"); - } catch { - // 用户取消或接口错误 + ElMessage.success(mode === "incremental" ? "标准思维导图已增量更新" : "标准思维导图已重新生成"); + } catch (e: any) { + ElMessage.error(e.message || "重新生成失败"); } finally { - loading.value = false; + regenerating.value = false; + if (regeneratingTimer) { clearInterval(regeneratingTimer); regeneratingTimer = null; } } }; @@ -395,19 +437,7 @@ onMounted(() => { - -
-

📊 对比结果

-

绿色=回忆命中,红色=遗漏。点击带标签的节点可回看原文。

- -
- - +

📖 标准思维导图

@@ -419,6 +449,7 @@ onMounted(() => { v-if="standardExpanded" size="small" type="warning" + :loading="regenerating" @click="handleRegenerate" > 重新生成 @@ -432,6 +463,10 @@ onMounted(() => { 编辑
+

+ + +