From 70d347e06e85325b552ab7c7e6cde39b87928ea8 Mon Sep 17 00:00:00 2001 From: cat_shark <1716967236@qq.com> Date: Sat, 23 May 2026 20:35:53 +0800 Subject: [PATCH] =?UTF-8?q?fix(review):=20=E4=BC=98=E5=8C=96=E5=A4=8D?= =?UTF-8?q?=E4=B9=A0=E6=BB=9A=E5=8A=A8=E6=9D=A1=E5=B1=95=E7=A4=BA=E6=96=B9?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 去除"复习滚动条"模块标题,改用右侧小字颜色图例 - 按 session 维度分组展示,一次学习的报告和残片合并为一个条目 - 移除类型标签(报告/残片),改用左边框颜色区分(绿色=有报告,黄色=仅残片) - 展示内容从 50 字增加到 120 字 - 滚动动画从 80s 放慢到 150s --- src/components/Welcome.vue | 166 +++++++++++++++++++++++++++---------- 1 file changed, 123 insertions(+), 43 deletions(-) diff --git a/src/components/Welcome.vue b/src/components/Welcome.vue index a1854ed..de84f5f 100644 --- a/src/components/Welcome.vue +++ b/src/components/Welcome.vue @@ -6,31 +6,72 @@ import { getReviewFeed, type ReviewFeedItem } from "@/api/review"; const reviewItems = ref([]); const isHovering = ref(false); -const truncatedItems = computed(() => - reviewItems.value.map((item) => ({ - ...item, - display: - item.content.length > 50 - ? item.content.substring(0, 50) + "..." - : item.content, - })) -); +interface SessionGroup { + sessionNum: string; + taskName: string; + taskNum: string; + content: string; + hasReport: boolean; + fragmentCount: number; + navigateType: string; + navigateId: number; +} + +// 按 sessionNum 分组,一个会话展示为一个 chip +const sessionGroups = computed(() => { + const map = new Map(); + for (const item of reviewItems.value) { + const list = map.get(item.sessionNum) || []; + list.push(item); + map.set(item.sessionNum, list); + } + + const groups: SessionGroup[] = []; + for (const [sessionNum, items] of map) { + const first = items[0]; + const report = items.find(i => i.sourceType === "REPORT"); + const fragments = items.filter(i => i.sourceType === "FRAGMENT"); + + const rawContent = report?.content || fragments.map(f => f.content).join(";"); + const content = rawContent.length > 120 + ? rawContent.substring(0, 120) + "..." + : rawContent; + + groups.push({ + sessionNum, + taskName: first.taskName, + taskNum: first.taskNum, + content, + hasReport: !!report, + fragmentCount: fragments.length, + navigateType: report ? "report" : "fragment", + navigateId: report ? report.id : (fragments[0]?.id ?? 0), + }); + } + + groups.sort((a, b) => { + const aItem = reviewItems.value.find(i => i.sessionNum === a.sessionNum); + const bItem = reviewItems.value.find(i => i.sessionNum === b.sessionNum); + return (bItem?.createdTime || "").localeCompare(aItem?.createdTime || ""); + }); + + return groups; +}); // 复制一份实现无缝循环 -const duplicatedItems = computed(() => [...truncatedItems.value, ...truncatedItems.value]); +const duplicatedGroups = computed(() => [...sessionGroups.value, ...sessionGroups.value]); const loadReviewFeed = async () => { try { - const res = await getReviewFeed(30); + const res = await getReviewFeed(100); reviewItems.value = res?.data || []; } catch { // feed 加载失败不影响页面主体功能 } }; -const goToReviewDetail = (item: ReviewFeedItem) => { - const type = item.sourceType === "REPORT" ? "report" : "fragment"; - router.push(`/review/detail/${type}/${item.id}`); +const goToReviewDetail = (group: SessionGroup) => { + router.push(`/review/detail/${group.navigateType}/${group.navigateId}`); }; const startStudy = () => { @@ -48,8 +89,13 @@ onMounted(() => {