diff --git a/e2e/welcome.spec.ts b/e2e/welcome.spec.ts index 00de01a..68154b8 100644 --- a/e2e/welcome.spec.ts +++ b/e2e/welcome.spec.ts @@ -31,4 +31,44 @@ test.describe('Welcome page', () => { await page.locator('.quick-card').nth(1).locator('button').click(); await expect(page).toHaveURL(/\/review/); }); + + test('wheel scrolls review ticker manually while hovering', async ({ page }) => { + const items = Array.from({ length: 10 }, (_, i) => ({ + id: i + 1, + sessionNum: `S${i + 1}`, + taskNum: `T${i + 1}`, + taskName: `任务 ${i + 1}`, + sourceType: 'FRAGMENT', + content: `第 ${i + 1} 条学习残片内容,用来撑起首页滚动区域。`, + createdTime: `2026-08-01 10:00:${String(i).padStart(2, '0')}`, + })); + + await page.route('**/api/review/feed**', (route) => + route.fulfill({ + status: 200, + contentType: 'application/json', + body: JSON.stringify({ code: 200, data: items }), + }), + ); + await page.goto('/welcome'); + + const track = page.locator('.review-scroll-track'); + const content = page.locator('.review-scroll-content'); + await expect(track).toBeVisible(); + await track.hover(); + + const readTime = () => + content.evaluate((el) => { + const anim = el.getAnimations()[0]; + return anim && typeof anim.currentTime === 'number' ? anim.currentTime : -1; + }); + + const before = await readTime(); + await page.mouse.wheel(0, 200); + await expect.poll(readTime).toBeGreaterThan(before); + + await page.mouse.move(10, 10); + const after = await readTime(); + await expect.poll(readTime).toBeGreaterThan(after); + }); }); diff --git a/src/components/Welcome.vue b/src/components/Welcome.vue index 0c252d9..65bf771 100644 --- a/src/components/Welcome.vue +++ b/src/components/Welcome.vue @@ -1,63 +1,39 @@ @@ -139,26 +182,27 @@ onMounted(() => {
- 学习报告 学习残片
-
+
- {{ group.taskName }} - {{ group.content }} + {{ chip.taskName }} + {{ chip.content }}
@@ -191,36 +235,53 @@ onMounted(() => { -