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(() => {