feat(复习): 节点选择交互 + 移除 session 维度

- MindMapViewer 新增 selectable 模式,点击节点 emit node-select 事件
- ReviewRecall.vue 移除会话选择器,改为节点选择交互
- 支持 URL ?focusPath= 参数自动预设复习起点
- 节点选择弹窗确认后回忆导图根节点=选中节点标题
- ReviewDetail 和 Welcome 中调用 findNode API 匹配节点后跳转
- API: recallCompare 使用 focusPath 替代 sessionNum
- API: 新增 findNode 端点
This commit is contained in:
2026-07-05 18:10:42 +08:00
parent 5a5a294f06
commit 84fe452e80
6 changed files with 150 additions and 54 deletions
+21 -1
View File
@@ -12,12 +12,32 @@ import {
} from "@/api/review";
import { getSessionDetail } from "@/api/studySessions";
import { updateFragments } from "@/api/reportFragments";
import { findNode } from "@/api/standardMindMap";
import { ElMessage } from "element-plus";
import MarkdownRenderer from "@/components/MarkdownRenderer.vue";
const route = useRoute();
const router = useRouter();
/** 调用 findNode API 匹配标准导图中的最近节点,跳转到回忆页 */
const goToRecall = async () => {
if (!content.value || !content.value.trim()) {
router.push(`/review/recall/${taskNum.value}`);
return;
}
try {
const res = await findNode(taskNum.value, content.value.substring(0, 500));
const data = res?.data;
if (data?.path) {
router.push(`/review/recall/${taskNum.value}?focusPath=${encodeURIComponent(data.path)}`);
} else {
router.push(`/review/recall/${taskNum.value}`);
}
} catch {
router.push(`/review/recall/${taskNum.value}`);
}
};
const contentType = computed(() => route.params.type as string);
const contentId = computed(() => Number(route.params.id));
@@ -327,7 +347,7 @@ watch(
>
<el-button type="success" :loading="mindMapUploading">上传导图文件</el-button>
</el-upload>
<el-button type="success" size="small" @click="router.push(`/review/recall/${taskNum}`)">
<el-button type="success" size="small" @click="goToRecall">
回忆复习
</el-button>
<el-tag v-if="mindMap?.fileFormat" size="small" effect="plain">