From 62e12686e30960599bbc1ef6cc2e97ba51d494e3 Mon Sep 17 00:00:00 2001 From: cat_shark <1716967236@qq.com> Date: Sun, 5 Jul 2026 12:24:26 +0800 Subject: [PATCH] =?UTF-8?q?feat(markdown):=20=E5=8F=AA=E8=AF=BB=E5=86=85?= =?UTF-8?q?=E5=AE=B9=E6=94=AF=E6=8C=81=20Markdown=20=E6=B8=B2=E6=9F=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 MarkdownRenderer.vue 组件,基于 marked 解析 GFM - 学习残片/报告历史列表:纯文本 {{ }} 替换为 MarkdownRenderer - ReviewDetail.vue content-body:p 标签逐行渲染替换为 MarkdownRenderer - 结束会话总结框:增加「编辑/预览」切换,预览模式实时渲染 markdown - 学习预期展示也改为 MarkdownRenderer --- package-lock.json | 17 ++++ package.json | 1 + src/components/MarkdownRenderer.vue | 133 ++++++++++++++++++++++++++++ src/components/ReviewDetail.vue | 5 +- src/components/StartTask.vue | 69 ++++++++++++--- 5 files changed, 211 insertions(+), 14 deletions(-) create mode 100644 src/components/MarkdownRenderer.vue diff --git a/package-lock.json b/package-lock.json index 18efd33..2ba3dce 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,6 +12,7 @@ "axios": "^1.7.7", "css-loader": "^7.1.2", "element-plus": "^2.8.7", + "marked": "^18.0.5", "mind-elixir": "^5.13.0", "normalize": "^0.3.1", "normalize.css": "^8.0.1", @@ -2683,6 +2684,17 @@ "@jridgewell/sourcemap-codec": "^1.5.0" } }, + "node_modules/marked": { + "version": "18.0.5", + "resolved": "https://registry.npmmirror.com/marked/-/marked-18.0.5.tgz", + "integrity": "sha512-S6GcvALHg6K4ohtu4E7x0a1AqhAjp6cV8KhLSyN9qVapnzJkusVBxZRcIU9AeYsbe6P1hKDusSbEOzGyyuce6w==", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 20" + } + }, "node_modules/memoize-one": { "version": "6.0.0", "resolved": "https://registry.npmmirror.com/memoize-one/-/memoize-one-6.0.0.tgz", @@ -6453,6 +6465,11 @@ "@jridgewell/sourcemap-codec": "^1.5.0" } }, + "marked": { + "version": "18.0.5", + "resolved": "https://registry.npmmirror.com/marked/-/marked-18.0.5.tgz", + "integrity": "sha512-S6GcvALHg6K4ohtu4E7x0a1AqhAjp6cV8KhLSyN9qVapnzJkusVBxZRcIU9AeYsbe6P1hKDusSbEOzGyyuce6w==" + }, "memoize-one": { "version": "6.0.0", "resolved": "https://registry.npmmirror.com/memoize-one/-/memoize-one-6.0.0.tgz", diff --git a/package.json b/package.json index 8055a39..f2c2bf6 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,7 @@ "axios": "^1.7.7", "css-loader": "^7.1.2", "element-plus": "^2.8.7", + "marked": "^18.0.5", "mind-elixir": "^5.13.0", "normalize": "^0.3.1", "normalize.css": "^8.0.1", diff --git a/src/components/MarkdownRenderer.vue b/src/components/MarkdownRenderer.vue new file mode 100644 index 0000000..988906b --- /dev/null +++ b/src/components/MarkdownRenderer.vue @@ -0,0 +1,133 @@ + + + + + + + diff --git a/src/components/ReviewDetail.vue b/src/components/ReviewDetail.vue index 3769df1..22b5f8b 100644 --- a/src/components/ReviewDetail.vue +++ b/src/components/ReviewDetail.vue @@ -13,6 +13,7 @@ import { import { getSessionDetail } from "@/api/studySessions"; import { updateFragments } from "@/api/reportFragments"; import { ElMessage } from "element-plus"; +import MarkdownRenderer from "@/components/MarkdownRenderer.vue"; const route = useRoute(); const router = useRouter(); @@ -301,9 +302,7 @@ watch( - - {{ line || " " }} - + 暂无内容 diff --git a/src/components/StartTask.vue b/src/components/StartTask.vue index a752945..cd7790b 100644 --- a/src/components/StartTask.vue +++ b/src/components/StartTask.vue @@ -13,6 +13,7 @@ import { useStudyFragment } from "@/components/composables/fragment"; import { getFragmentsBySession, updateFragments } from "@/api/reportFragments"; import { getExpectation, getReportDraft, getTaskFragments, getTaskReports, upsertExpectation } from "@/api/studySessions"; import router from "@/router"; +import MarkdownRenderer from "@/components/MarkdownRenderer.vue"; const { fragmentsDialogVisible, @@ -24,6 +25,7 @@ const { const summaryDialogVisible = ref(false); const summaryContent = ref(""); +const summaryPreview = ref(false); const summaryLoading = ref(false); const summaryLoadingSeconds = ref(0); let summaryLoadingTimer: ReturnType | null = null; @@ -666,7 +668,7 @@ onUnmounted(() => { {{ item.sessionNum }} - {{ item.content }} + @@ -676,7 +678,7 @@ onUnmounted(() => { {{ item.sessionNum }} - {{ item.content }} + @@ -721,21 +723,39 @@ onUnmounted(() => { - + 本次预期 - {{ expectationSaved }} + AI 正在聚合残片生成草稿,已等待 {{ summaryLoadingSeconds }} 秒… - + + + 编辑 + 预览 + + + + + + 取消 确认结束 @@ -819,6 +839,33 @@ onUnmounted(() => { color: var(--text-secondary); } +.summary-editor { + border: 1px solid #e0e8e0; + border-radius: 6px; + overflow: hidden; +} + +.summary-toolbar { + display: flex; + gap: 0; + border-bottom: 1px solid #e0e8e0; + background: #f9fbf9; + padding: 4px; +} + +.summary-toolbar .el-button { + border-radius: 4px; + border: none; +} + +.summary-preview { + padding: 12px 16px; + min-height: 200px; + max-height: 360px; + overflow-y: auto; + background: #fff; +} + .status-text { font-size: 14px; color: var(--text-secondary);
- {{ line || " " }} -
{{ item.content }}
AI 正在聚合残片生成草稿,已等待 {{ summaryLoadingSeconds }} 秒…