diff --git a/src/views/analysis-of-students/dialogue.vue b/src/views/analysis-of-students/dialogue.vue index 7013815..a524d61 100644 --- a/src/views/analysis-of-students/dialogue.vue +++ b/src/views/analysis-of-students/dialogue.vue @@ -17,9 +17,9 @@ -
- - +
+ +
@@ -47,6 +47,7 @@ import { getAssetsFile } from "@/utils/index.js"; import * as AI from "@/api/AI.js"; import "md-editor-v3/lib/style.css"; import * as XLSX from "xlsx"; +import { marked } from "marked"; import useUserStore from "@/store/modules/user"; const { proxy } = getCurrentInstance(); const userStore = useUserStore(); @@ -146,9 +147,31 @@ const scrollToBottom = () => { scrollEl.scrollTop = scrollEl.scrollHeight; } }; -const copyTextSuccess = () => { - proxy.$modal.msgSuccess("复制成功"); -}; +function exportTeachingPlan(item) { + if (!item?.content?.trim()) { + proxy.$message.warning("暂无可导出的教案内容"); + return; + } + const documentHtml = `

AI 实训教案

${marked.parse(item.content, { gfm: true, breaks: true })}`; + const blob = new Blob(["\ufeff", documentHtml], { type: "application/msword;charset=utf-8" }); + const url = URL.createObjectURL(blob); + const link = document.createElement("a"); + link.href = url; + link.download = `AI实训教案-${new Date().toISOString().slice(0, 10)}.doc`; + link.click(); + URL.revokeObjectURL(url); + proxy.$modal.msgSuccess("教案已导出"); +} // 中断对话 const gInterrupt = () => { if (abortController) { @@ -373,7 +396,7 @@ onUnmounted(() => { gap: 1rem; position: relative; padding-right: 10px; - .copy { + .answer-export { position: absolute; top: 5px; right: 23px; @@ -385,7 +408,7 @@ onUnmounted(() => { } } &:hover { - .copy { + .answer-export { display: block; cursor: pointer; } @@ -408,7 +431,7 @@ onUnmounted(() => { .qustionCon { position: relative; padding-left: 10px; - .copy { + .answer-export { position: absolute; top: 5px; left: 8px; @@ -420,7 +443,7 @@ onUnmounted(() => { } } &:hover { - .copy { + .answer-export { display: block; cursor: pointer; } diff --git a/tests/ai-lesson-plan-export.static.test.cjs b/tests/ai-lesson-plan-export.static.test.cjs new file mode 100644 index 0000000..0152d31 --- /dev/null +++ b/tests/ai-lesson-plan-export.static.test.cjs @@ -0,0 +1,18 @@ +const assert = require("node:assert/strict"); +const fs = require("node:fs"); +const path = require("node:path"); + +const page = fs.readFileSync( + path.resolve(__dirname, "../src/views/analysis-of-students/dialogue.vue"), + "utf8", +); + +assert.match(page, /content="导出教案"/); +assert.match(page, /icon-class="导出"/); +assert.doesNotMatch(page, /v-copyText="item\.content"/); +assert.match(page, /function exportTeachingPlan\(item\)/); +assert.match(page, /marked\.parse\(item\.content/); +assert.match(page, /table-layout:\s*fixed/); +assert.match(page, /th, td\s*\{[^}]*word-break:\s*break-word/); + +console.log("AI lesson plan export static checks passed");