From 439a5309785a9a3f6ec8e7b3866f6b9f72a0a45f Mon Sep 17 00:00:00 2001 From: cat_shark <1716967236@qq.com> Date: Sat, 30 May 2026 15:50:48 +0800 Subject: [PATCH 1/6] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E7=A2=8E?= =?UTF-8?q?=E7=89=87=E6=9B=B4=E6=96=B0=E5=92=8C=E4=BC=9A=E8=AF=9D=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E7=9A=84=E5=89=8D=E7=AB=AFAPI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 updateFragments(id, content) 调用 PUT 接口 - 新增 getFragmentsBySession(sessionNum) 获取会话碎片列表 --- src/api/reportFragments.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/api/reportFragments.ts b/src/api/reportFragments.ts index 3c56eb7..66f416d 100644 --- a/src/api/reportFragments.ts +++ b/src/api/reportFragments.ts @@ -3,4 +3,12 @@ import request from "@/utils/request"; export const createFragments = (sessionNum: string, content: string) => { return request.post(`/report-fragments`, {sessionNum, content}) +} + +export const updateFragments = (id: number, content: string) => { + return request.put(`/report-fragments/${id}`, {content}) +} + +export const getFragmentsBySession = (sessionNum: string) => { + return request.get(`/report-fragments/session/${sessionNum}`) } \ No newline at end of file From 0f1a2d8bbaad3b0da7902c9a8a3694fa5b549974 Mon Sep 17 00:00:00 2001 From: cat_shark <1716967236@qq.com> Date: Sat, 30 May 2026 15:50:56 +0800 Subject: [PATCH 2/6] =?UTF-8?q?refactor:=20confirmGenerateFragment=20?= =?UTF-8?q?=E6=94=B9=E4=B8=BA=E8=BF=94=E5=9B=9E=20Promise?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 便于调用方在碎片创建成功后执行后续操作(如刷新列表) --- src/components/composables/fragment.ts | 49 ++++++++++++++------------ 1 file changed, 26 insertions(+), 23 deletions(-) diff --git a/src/components/composables/fragment.ts b/src/components/composables/fragment.ts index 2bbcf8f..f9ceea3 100644 --- a/src/components/composables/fragment.ts +++ b/src/components/composables/fragment.ts @@ -25,34 +25,37 @@ export const useStudyFragment = () => { }); }; - const confirmGenerateFragment = async (sessionNum: string) => { + const confirmGenerateFragment = async (sessionNum: string): Promise => { if (!fragmentContent.value.trim()) { ElMessage.warning('请输入学习内容!'); - return; + return false; } - ElMessageBox.confirm('确定要生成学习残片吗?', '提示', { - confirmButtonText: '确定', - cancelButtonText: '取消', - type: 'info', - }) - .then(async () => { - try { - const res = await createFragments(sessionNum, fragmentContent.value); - - if (res.code === 200) { - ElMessage.success('学习残片生成成功!'); - fragmentsDialogVisible.value = false; - } else { - ElMessage.error(res.message || '生成学习残片失败'); - } - } catch (error: any) { - ElMessage.error(error.message || '请求失败'); - } - }) - .catch(() => { - ElMessage.info('已取消生成'); + try { + await ElMessageBox.confirm('确定要生成学习残片吗?', '提示', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'info', }); + } catch { + ElMessage.info('已取消生成'); + return false; + } + + try { + const res = await createFragments(sessionNum, fragmentContent.value); + if (res.code === 200) { + ElMessage.success('学习残片生成成功!'); + fragmentsDialogVisible.value = false; + return true; + } else { + ElMessage.error(res.message || '生成学习残片失败'); + return false; + } + } catch (error: any) { + ElMessage.error(error.message || '请求失败'); + return false; + } }; return { From a82c25b45c76c66ca2e4d58c38b1b7e9cf3e354d Mon Sep 17 00:00:00 2001 From: cat_shark <1716967236@qq.com> Date: Sat, 30 May 2026 15:51:04 +0800 Subject: [PATCH 3/6] =?UTF-8?q?feat:=20=E7=A2=8E=E7=89=87=E8=AF=A6?= =?UTF-8?q?=E6=83=85=E9=A1=B5=E6=94=AF=E6=8C=81=E5=86=85=E8=81=94=E7=BC=96?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 碎片类型详情页新增编辑按钮 - 编辑模式下显示 textarea 和保存/取消按钮 - 保存时调用更新接口并同步本地数据 --- src/components/ReviewDetail.vue | 88 +++++++++++++++++++++++++++++++-- 1 file changed, 83 insertions(+), 5 deletions(-) diff --git a/src/components/ReviewDetail.vue b/src/components/ReviewDetail.vue index fa422dd..098b4aa 100644 --- a/src/components/ReviewDetail.vue +++ b/src/components/ReviewDetail.vue @@ -3,6 +3,8 @@ import { computed, onMounted, ref } from "vue"; import { useRoute, useRouter } from "vue-router"; import { getReportDetail, getFragmentDetail, getTaskReview, type ReviewFeedItem } from "@/api/review"; import { getSessionDetail } from "@/api/studySessions"; +import { updateFragments } from "@/api/reportFragments"; +import { ElMessage } from "element-plus"; const route = useRoute(); const router = useRouter(); @@ -15,6 +17,11 @@ const content = ref(""); const sourceTypeLabel = ref(""); const taskNum = ref(""); +// 编辑状态 +const isEditing = ref(false); +const editContent = ref(""); +const saving = ref(false); + // 当前会话信息 const sessionInfo = ref<{ taskName: string; @@ -114,6 +121,42 @@ const goToDetail = (type: string, id: number) => { router.push(`/review/detail/${type}/${id}`); }; +const enterEdit = () => { + editContent.value = content.value; + isEditing.value = true; +}; + +const cancelEdit = () => { + isEditing.value = false; + editContent.value = ""; +}; + +const saveEdit = async () => { + if (!editContent.value.trim()) { + ElMessage.warning("内容不能为空"); + return; + } + if (editContent.value === content.value) { + isEditing.value = false; + return; + } + saving.value = true; + try { + const res = await updateFragments(contentId.value, editContent.value); + if (res?.code === 200) { + content.value = editContent.value; + isEditing.value = false; + ElMessage.success("保存成功"); + } else { + ElMessage.error(res?.message || "保存失败"); + } + } catch (e: any) { + ElMessage.error(e.message || "请求失败"); + } finally { + saving.value = false; + } +}; + onMounted(() => { loadDetail(); }); @@ -137,14 +180,38 @@ onMounted(() => { 学习时间:{{ sessionInfo.startTime?.replace("T", " ")?.substring(0, 16) }} + + 编辑 + -
-

- {{ line || " " }} -

+ +
+ +
+ 取消 + 保存 +
-
暂无内容
+ + @@ -342,4 +409,15 @@ onMounted(() => { color: #b8860b; } +.edit-area { + margin-top: 12px; +} + +.edit-actions { + display: flex; + justify-content: flex-end; + gap: 8px; + margin-top: 12px; +} + \ No newline at end of file From 887756f4ffe354e7e7cb26a1dd59f341b0266fc7 Mon Sep 17 00:00:00 2001 From: cat_shark <1716967236@qq.com> Date: Sat, 30 May 2026 15:51:09 +0800 Subject: [PATCH 4/6] =?UTF-8?q?feat:=20=E5=AD=A6=E4=B9=A0=E4=BC=9A?= =?UTF-8?q?=E8=AF=9D=E9=A1=B5=E5=B1=95=E7=A4=BA=E5=BD=93=E5=89=8D=E4=BC=9A?= =?UTF-8?q?=E8=AF=9D=E7=A2=8E=E7=89=87=E5=88=97=E8=A1=A8=E5=B9=B6=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E7=BC=96=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 会话加载时获取碎片列表,创建碎片后自动刷新 - 碎片列表支持内联编辑(textarea + 保存/取消) - 修复多根节点问题,用 div 包裹模板内容以兼容 Transition 组件 --- src/components/StartTask.vue | 133 ++++++++++++++++++++++++++++++++++- 1 file changed, 132 insertions(+), 1 deletion(-) diff --git a/src/components/StartTask.vue b/src/components/StartTask.vue index 51400ed..4d343d7 100644 --- a/src/components/StartTask.vue +++ b/src/components/StartTask.vue @@ -1,5 +1,5 @@ +