═══════════════════════════════════════════════ [2026-03-02 16:44:23] ▶ 阶段 0 — 基线确认(运行回归测试,记录当前失败情况) ═══════════════════════════════════════════════ Running 10 tests using 1 worker ✘ 1 [mobile-chrome] › tests/e2e/bug-regression.spec.ts:114:5 › TC-B01a 打卡前积分无提前跳变 (31.6s) ✘ 2 [mobile-chrome] › tests/e2e/bug-regression.spec.ts:114:5 › TC-B01a 打卡前积分无提前跳变 (retry #1) (31.7s) ✘ 3 [mobile-chrome] › tests/e2e/bug-regression.spec.ts:139:5 › TC-B01b 打卡后积分按规则累加 (11.7s) ✘ 4 [mobile-chrome] › tests/e2e/bug-regression.spec.ts:139:5 › TC-B01b 打卡后积分按规则累加 (retry #1) (11.7s) ✘ 5 [mobile-chrome] › tests/e2e/bug-regression.spec.ts:171:5 › TC-B02 计算结果页 Tab 切换选中状态清晰 (30.6s) ✘ 6 [mobile-chrome] › tests/e2e/bug-regression.spec.ts:171:5 › TC-B02 计算结果页 Tab 切换选中状态清晰 (retry #1) (30.5s) ✘ 7 [mobile-chrome] › tests/e2e/bug-regression.spec.ts:238:5 › TC-B03 食物列表每条目展示图片与营养信息 (16.4s) ✘ 8 [mobile-chrome] › tests/e2e/bug-regression.spec.ts:238:5 › TC-B03 食物列表每条目展示图片与营养信息 (retry #1) (16.0s) ✓ 9 [mobile-chrome] › tests/e2e/bug-regression.spec.ts:277:5 › TC-B04 食物详情页正常加载内容 (18.6s) ✘ 10 [mobile-chrome] › tests/e2e/bug-regression.spec.ts:311:5 › TC-B05 AI针对不同问题返回差异化回复 (30.7s) ✘ 11 [mobile-chrome] › tests/e2e/bug-regression.spec.ts:311:5 › TC-B05 AI针对不同问题返回差异化回复 (retry #1) (30.6s) ✘ 12 [mobile-chrome] › tests/e2e/bug-regression.spec.ts:352:5 › TC-B06 健康知识与营养知识名称统一性 (31.5s) ✘ 13 [mobile-chrome] › tests/e2e/bug-regression.spec.ts:352:5 › TC-B06 健康知识与营养知识名称统一性 (retry #1) (31.7s) [PageError] 文章不存在 ✘ 14 [mobile-chrome] › tests/e2e/bug-regression.spec.ts:386:5 › TC-B07 饮食指南和科普文章详情页有正常内容 (18.4s) [PageError] 文章不存在 ✘ 15 [mobile-chrome] › tests/e2e/bug-regression.spec.ts:386:5 › TC-B07 饮食指南和科普文章详情页有正常内容 (retry #1) (18.2s) ✓ 16 [mobile-chrome] › tests/e2e/bug-regression.spec.ts:433:5 › TC-B08 帖子详情页展示营养统计数据 (8.3s) ✘ 17 [mobile-chrome] › tests/e2e/bug-regression.spec.ts:468:5 › TC-B09 社区 Tab 标签和帖子类型均使用中文 (4.7s) ✘ 18 [mobile-chrome] › tests/e2e/bug-regression.spec.ts:468:5 › TC-B09 社区 Tab 标签和帖子类型均使用中文 (retry #1) (4.9s) 1) [mobile-chrome] › tests/e2e/bug-regression.spec.ts:114:5 › TC-B01a 打卡前积分无提前跳变 ───────────────── Test timeout of 30000ms exceeded. Error: page.waitForTimeout: Target page, context or browser has been closed 133 | expect(pointsDuring, '打卡点击后 800ms 内积分不应提前增加 30').toBeLessThanOrEqual(initialPoints + 1); 134 | > 135 | await page.waitForTimeout(2000); | ^ 136 | await screenshot(page, 'tc-b01a-checkin-clicked'); 137 | }); 138 | at /Users/apple/scott2026/msh-system/tests/e2e/bug-regression.spec.ts:135:14 attachment #1: screenshot (image/png) ────────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B01a-打卡前积分无提前跳变-mobile-chrome/test-failed-1.png ──────────────────────────────────────────────────────────────────────────────────────────────── attachment #2: video (video/webm) ────────────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B01a-打卡前积分无提前跳变-mobile-chrome/video.webm ──────────────────────────────────────────────────────────────────────────────────────────────── Error Context: tests/e2e/test-results/bug-regression-TC-B01a-打卡前积分无提前跳变-mobile-chrome/error-context.md attachment #4: trace (application/zip) ───────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B01a-打卡前积分无提前跳变-mobile-chrome/trace.zip Usage: npx playwright show-trace tests/e2e/test-results/bug-regression-TC-B01a-打卡前积分无提前跳变-mobile-chrome/trace.zip ──────────────────────────────────────────────────────────────────────────────────────────────── Retry #1 ─────────────────────────────────────────────────────────────────────────────────────── Test timeout of 30000ms exceeded. Error: page.waitForTimeout: Target page, context or browser has been closed 133 | expect(pointsDuring, '打卡点击后 800ms 内积分不应提前增加 30').toBeLessThanOrEqual(initialPoints + 1); 134 | > 135 | await page.waitForTimeout(2000); | ^ 136 | await screenshot(page, 'tc-b01a-checkin-clicked'); 137 | }); 138 | at /Users/apple/scott2026/msh-system/tests/e2e/bug-regression.spec.ts:135:14 attachment #1: screenshot (image/png) ────────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B01a-打卡前积分无提前跳变-mobile-chrome-retry1/test-failed-1.png ──────────────────────────────────────────────────────────────────────────────────────────────── attachment #2: video (video/webm) ────────────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B01a-打卡前积分无提前跳变-mobile-chrome-retry1/video.webm ──────────────────────────────────────────────────────────────────────────────────────────────── Error Context: tests/e2e/test-results/bug-regression-TC-B01a-打卡前积分无提前跳变-mobile-chrome-retry1/error-context.md attachment #4: trace (application/zip) ───────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B01a-打卡前积分无提前跳变-mobile-chrome-retry1/trace.zip Usage: npx playwright show-trace tests/e2e/test-results/bug-regression-TC-B01a-打卡前积分无提前跳变-mobile-chrome-retry1/trace.zip ──────────────────────────────────────────────────────────────────────────────────────────────── 2) [mobile-chrome] › tests/e2e/bug-regression.spec.ts:139:5 › TC-B01b 打卡后积分按规则累加 ───────────────── Error: 打卡成功后积分应至少增加 30 expect(received).toBeGreaterThanOrEqual(expected) Expected: >= 30 Received: 0 158 | const afterText = await afterEl.textContent(); 159 | const afterPoints = parsePointsFromText(afterText || ''); > 160 | expect(afterPoints, '打卡成功后积分应至少增加 30').toBeGreaterThanOrEqual(initialPoints + 30); | ^ 161 | } else { 162 | test.skip(); 163 | } at /Users/apple/scott2026/msh-system/tests/e2e/bug-regression.spec.ts:160:44 attachment #1: screenshot (image/png) ────────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B01b-打卡后积分按规则累加-mobile-chrome/test-failed-1.png ──────────────────────────────────────────────────────────────────────────────────────────────── attachment #2: video (video/webm) ────────────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B01b-打卡后积分按规则累加-mobile-chrome/video.webm ──────────────────────────────────────────────────────────────────────────────────────────────── Error Context: tests/e2e/test-results/bug-regression-TC-B01b-打卡后积分按规则累加-mobile-chrome/error-context.md attachment #4: trace (application/zip) ───────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B01b-打卡后积分按规则累加-mobile-chrome/trace.zip Usage: npx playwright show-trace tests/e2e/test-results/bug-regression-TC-B01b-打卡后积分按规则累加-mobile-chrome/trace.zip ──────────────────────────────────────────────────────────────────────────────────────────────── Retry #1 ─────────────────────────────────────────────────────────────────────────────────────── Error: 打卡成功后积分应至少增加 30 expect(received).toBeGreaterThanOrEqual(expected) Expected: >= 30 Received: 0 158 | const afterText = await afterEl.textContent(); 159 | const afterPoints = parsePointsFromText(afterText || ''); > 160 | expect(afterPoints, '打卡成功后积分应至少增加 30').toBeGreaterThanOrEqual(initialPoints + 30); | ^ 161 | } else { 162 | test.skip(); 163 | } at /Users/apple/scott2026/msh-system/tests/e2e/bug-regression.spec.ts:160:44 attachment #1: screenshot (image/png) ────────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B01b-打卡后积分按规则累加-mobile-chrome-retry1/test-failed-1.png ──────────────────────────────────────────────────────────────────────────────────────────────── attachment #2: video (video/webm) ────────────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B01b-打卡后积分按规则累加-mobile-chrome-retry1/video.webm ──────────────────────────────────────────────────────────────────────────────────────────────── Error Context: tests/e2e/test-results/bug-regression-TC-B01b-打卡后积分按规则累加-mobile-chrome-retry1/error-context.md attachment #4: trace (application/zip) ───────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B01b-打卡后积分按规则累加-mobile-chrome-retry1/trace.zip Usage: npx playwright show-trace tests/e2e/test-results/bug-regression-TC-B01b-打卡后积分按规则累加-mobile-chrome-retry1/trace.zip ──────────────────────────────────────────────────────────────────────────────────────────────── 3) [mobile-chrome] › tests/e2e/bug-regression.spec.ts:171:5 › TC-B02 计算结果页 Tab 切换选中状态清晰 ────────── Test timeout of 30000ms exceeded. Error: locator.click: Test timeout of 30000ms exceeded. Call log:  - waiting for locator('.submit-btn, .calc-btn, button').filter({ hasText: /计算|确定|提交/ }).first() 196 | 197 | const calcBtn = page.locator('.submit-btn, .calc-btn, button').filter({ hasText: /计算|确定|提交/ }).first(); > 198 | await calcBtn.click(); | ^ 199 | await page.waitForTimeout(3500); 200 | 201 | const resultPage = page.locator('.result-page').first(); at /Users/apple/scott2026/msh-system/tests/e2e/bug-regression.spec.ts:198:17 attachment #1: screenshot (image/png) ────────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B02-计算结果页-Tab-切换选中状态清晰-mobile-chrome/test-failed-1.png ──────────────────────────────────────────────────────────────────────────────────────────────── attachment #2: video (video/webm) ────────────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B02-计算结果页-Tab-切换选中状态清晰-mobile-chrome/video.webm ──────────────────────────────────────────────────────────────────────────────────────────────── Error Context: tests/e2e/test-results/bug-regression-TC-B02-计算结果页-Tab-切换选中状态清晰-mobile-chrome/error-context.md attachment #4: trace (application/zip) ───────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B02-计算结果页-Tab-切换选中状态清晰-mobile-chrome/trace.zip Usage: npx playwright show-trace tests/e2e/test-results/bug-regression-TC-B02-计算结果页-Tab-切换选中状态清晰-mobile-chrome/trace.zip ──────────────────────────────────────────────────────────────────────────────────────────────── Retry #1 ─────────────────────────────────────────────────────────────────────────────────────── Test timeout of 30000ms exceeded. Error: locator.click: Test timeout of 30000ms exceeded. Call log:  - waiting for locator('.submit-btn, .calc-btn, button').filter({ hasText: /计算|确定|提交/ }).first() 196 | 197 | const calcBtn = page.locator('.submit-btn, .calc-btn, button').filter({ hasText: /计算|确定|提交/ }).first(); > 198 | await calcBtn.click(); | ^ 199 | await page.waitForTimeout(3500); 200 | 201 | const resultPage = page.locator('.result-page').first(); at /Users/apple/scott2026/msh-system/tests/e2e/bug-regression.spec.ts:198:17 attachment #1: screenshot (image/png) ────────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B02-计算结果页-Tab-切换选中状态清晰-mobile-chrome-retry1/test-failed-1.png ──────────────────────────────────────────────────────────────────────────────────────────────── attachment #2: video (video/webm) ────────────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B02-计算结果页-Tab-切换选中状态清晰-mobile-chrome-retry1/video.webm ──────────────────────────────────────────────────────────────────────────────────────────────── Error Context: tests/e2e/test-results/bug-regression-TC-B02-计算结果页-Tab-切换选中状态清晰-mobile-chrome-retry1/error-context.md attachment #4: trace (application/zip) ───────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B02-计算结果页-Tab-切换选中状态清晰-mobile-chrome-retry1/trace.zip Usage: npx playwright show-trace tests/e2e/test-results/bug-regression-TC-B02-计算结果页-Tab-切换选中状态清晰-mobile-chrome-retry1/trace.zip ──────────────────────────────────────────────────────────────────────────────────────────────── 4) [mobile-chrome] › tests/e2e/bug-regression.spec.ts:238:5 › TC-B03 食物列表每条目展示图片与营养信息 ──────────── Error: 食物条目 1 应有配图 src expect(received).toBeTruthy() Received: null 259 | if (await img.count() > 0) { 260 | const src = await img.getAttribute('src'); > 261 | expect(src, `食物条目 ${i + 1} 应有配图 src`).toBeTruthy(); | ^ 262 | expect((src || '').trim().length).toBeGreaterThan(0); 263 | } 264 | at /Users/apple/scott2026/msh-system/tests/e2e/bug-regression.spec.ts:261:45 attachment #1: screenshot (image/png) ────────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B03-食物列表每条目展示图片与营养信息-mobile-chrome/test-failed-1.png ──────────────────────────────────────────────────────────────────────────────────────────────── attachment #2: video (video/webm) ────────────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B03-食物列表每条目展示图片与营养信息-mobile-chrome/video.webm ──────────────────────────────────────────────────────────────────────────────────────────────── Error Context: tests/e2e/test-results/bug-regression-TC-B03-食物列表每条目展示图片与营养信息-mobile-chrome/error-context.md attachment #4: trace (application/zip) ───────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B03-食物列表每条目展示图片与营养信息-mobile-chrome/trace.zip Usage: npx playwright show-trace tests/e2e/test-results/bug-regression-TC-B03-食物列表每条目展示图片与营养信息-mobile-chrome/trace.zip ──────────────────────────────────────────────────────────────────────────────────────────────── Retry #1 ─────────────────────────────────────────────────────────────────────────────────────── Error: 食物条目 1 应有配图 src expect(received).toBeTruthy() Received: null 259 | if (await img.count() > 0) { 260 | const src = await img.getAttribute('src'); > 261 | expect(src, `食物条目 ${i + 1} 应有配图 src`).toBeTruthy(); | ^ 262 | expect((src || '').trim().length).toBeGreaterThan(0); 263 | } 264 | at /Users/apple/scott2026/msh-system/tests/e2e/bug-regression.spec.ts:261:45 attachment #1: screenshot (image/png) ────────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B03-食物列表每条目展示图片与营养信息-mobile-chrome-retry1/test-failed-1.png ──────────────────────────────────────────────────────────────────────────────────────────────── attachment #2: video (video/webm) ────────────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B03-食物列表每条目展示图片与营养信息-mobile-chrome-retry1/video.webm ──────────────────────────────────────────────────────────────────────────────────────────────── Error Context: tests/e2e/test-results/bug-regression-TC-B03-食物列表每条目展示图片与营养信息-mobile-chrome-retry1/error-context.md attachment #4: trace (application/zip) ───────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B03-食物列表每条目展示图片与营养信息-mobile-chrome-retry1/trace.zip Usage: npx playwright show-trace tests/e2e/test-results/bug-regression-TC-B03-食物列表每条目展示图片与营养信息-mobile-chrome-retry1/trace.zip ──────────────────────────────────────────────────────────────────────────────────────────────── 5) [mobile-chrome] › tests/e2e/bug-regression.spec.ts:311:5 › TC-B05 AI针对不同问题返回差异化回复 ───────────── Test timeout of 30000ms exceeded. Error: locator.click: Test timeout of 30000ms exceeded. Call log:  - waiting for locator('.send-btn, .submit-btn').filter({ hasText: /发送/ }).first() 324 | await textInput.fill('什么食物富含蛋白质?'); 325 | const sendBtn = page.locator('.send-btn, .submit-btn').filter({ hasText: /发送/ }).first(); > 326 | await sendBtn.click(); | ^ 327 | await page.waitForTimeout(6000); 328 | 329 | const aiMessages1 = page.locator('.message-item.ai-message .message-text'); at /Users/apple/scott2026/msh-system/tests/e2e/bug-regression.spec.ts:326:17 attachment #1: screenshot (image/png) ────────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B05-AI针对不同问题返回差异化回复-mobile-chrome/test-failed-1.png ──────────────────────────────────────────────────────────────────────────────────────────────── attachment #2: video (video/webm) ────────────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B05-AI针对不同问题返回差异化回复-mobile-chrome/video.webm ──────────────────────────────────────────────────────────────────────────────────────────────── Error Context: tests/e2e/test-results/bug-regression-TC-B05-AI针对不同问题返回差异化回复-mobile-chrome/error-context.md attachment #4: trace (application/zip) ───────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B05-AI针对不同问题返回差异化回复-mobile-chrome/trace.zip Usage: npx playwright show-trace tests/e2e/test-results/bug-regression-TC-B05-AI针对不同问题返回差异化回复-mobile-chrome/trace.zip ──────────────────────────────────────────────────────────────────────────────────────────────── Retry #1 ─────────────────────────────────────────────────────────────────────────────────────── Test timeout of 30000ms exceeded. Error: locator.click: Test timeout of 30000ms exceeded. Call log:  - waiting for locator('.send-btn, .submit-btn').filter({ hasText: /发送/ }).first() 324 | await textInput.fill('什么食物富含蛋白质?'); 325 | const sendBtn = page.locator('.send-btn, .submit-btn').filter({ hasText: /发送/ }).first(); > 326 | await sendBtn.click(); | ^ 327 | await page.waitForTimeout(6000); 328 | 329 | const aiMessages1 = page.locator('.message-item.ai-message .message-text'); at /Users/apple/scott2026/msh-system/tests/e2e/bug-regression.spec.ts:326:17 attachment #1: screenshot (image/png) ────────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B05-AI针对不同问题返回差异化回复-mobile-chrome-retry1/test-failed-1.png ──────────────────────────────────────────────────────────────────────────────────────────────── attachment #2: video (video/webm) ────────────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B05-AI针对不同问题返回差异化回复-mobile-chrome-retry1/video.webm ──────────────────────────────────────────────────────────────────────────────────────────────── Error Context: tests/e2e/test-results/bug-regression-TC-B05-AI针对不同问题返回差异化回复-mobile-chrome-retry1/error-context.md attachment #4: trace (application/zip) ───────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B05-AI针对不同问题返回差异化回复-mobile-chrome-retry1/trace.zip Usage: npx playwright show-trace tests/e2e/test-results/bug-regression-TC-B05-AI针对不同问题返回差异化回复-mobile-chrome-retry1/trace.zip ──────────────────────────────────────────────────────────────────────────────────────────────── 6) [mobile-chrome] › tests/e2e/bug-regression.spec.ts:352:5 › TC-B06 健康知识与营养知识名称统一性 ────────────── Test timeout of 30000ms exceeded. Error: expect(received).toBe(expected) // Object.is equality Expected: true Received: false 373 | 374 | expect(mainIsHealth || mainIsNutrition).toBe(true); > 375 | expect(detailIsHealth || detailIsNutrition).toBe(true); | ^ 376 | expect(mainName === detailName || (mainIsHealth && detailIsHealth) || (mainIsNutrition && detailIsNutrition), 377 | '主页区块名称与营养知识页标题应统一(均为健康知识或均为营养知识)').toBe(true); 378 | at /Users/apple/scott2026/msh-system/tests/e2e/bug-regression.spec.ts:375:47 attachment #1: screenshot (image/png) ────────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B06-健康知识与营养知识名称统一性-mobile-chrome/test-failed-1.png ──────────────────────────────────────────────────────────────────────────────────────────────── attachment #2: video (video/webm) ────────────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B06-健康知识与营养知识名称统一性-mobile-chrome/video.webm ──────────────────────────────────────────────────────────────────────────────────────────────── Error Context: tests/e2e/test-results/bug-regression-TC-B06-健康知识与营养知识名称统一性-mobile-chrome/error-context.md attachment #4: trace (application/zip) ───────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B06-健康知识与营养知识名称统一性-mobile-chrome/trace.zip Usage: npx playwright show-trace tests/e2e/test-results/bug-regression-TC-B06-健康知识与营养知识名称统一性-mobile-chrome/trace.zip ──────────────────────────────────────────────────────────────────────────────────────────────── Retry #1 ─────────────────────────────────────────────────────────────────────────────────────── Test timeout of 30000ms exceeded. Error: expect(received).toBe(expected) // Object.is equality Expected: true Received: false 373 | 374 | expect(mainIsHealth || mainIsNutrition).toBe(true); > 375 | expect(detailIsHealth || detailIsNutrition).toBe(true); | ^ 376 | expect(mainName === detailName || (mainIsHealth && detailIsHealth) || (mainIsNutrition && detailIsNutrition), 377 | '主页区块名称与营养知识页标题应统一(均为健康知识或均为营养知识)').toBe(true); 378 | at /Users/apple/scott2026/msh-system/tests/e2e/bug-regression.spec.ts:375:47 attachment #1: screenshot (image/png) ────────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B06-健康知识与营养知识名称统一性-mobile-chrome-retry1/test-failed-1.png ──────────────────────────────────────────────────────────────────────────────────────────────── attachment #2: video (video/webm) ────────────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B06-健康知识与营养知识名称统一性-mobile-chrome-retry1/video.webm ──────────────────────────────────────────────────────────────────────────────────────────────── Error Context: tests/e2e/test-results/bug-regression-TC-B06-健康知识与营养知识名称统一性-mobile-chrome-retry1/error-context.md attachment #4: trace (application/zip) ───────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B06-健康知识与营养知识名称统一性-mobile-chrome-retry1/trace.zip Usage: npx playwright show-trace tests/e2e/test-results/bug-regression-TC-B06-健康知识与营养知识名称统一性-mobile-chrome-retry1/trace.zip ──────────────────────────────────────────────────────────────────────────────────────────────── 7) [mobile-chrome] › tests/e2e/bug-regression.spec.ts:386:5 › TC-B07 饮食指南和科普文章详情页有正常内容 ─────────── Error: expect(locator).toBeVisible() failed Locator: locator('.conter, .article-content, .content-scroll').first() Expected: visible Received: hidden Timeout: 8000ms Call log:  - Expect "toBeVisible" with timeout 8000ms  - waiting for locator('.conter, .article-content, .content-scroll').first()  12 × locator resolved to   - unexpected value "hidden" 401 | await page.waitForTimeout(3000); 402 | const contentArea = page.locator('.conter, .article-content, .content-scroll').first(); > 403 | await expect(contentArea).toBeVisible({ timeout: 8_000 }); | ^ 404 | const contentText = await contentArea.textContent(); 405 | expect((contentText || '').trim().length, '饮食指南详情应有正文').toBeGreaterThan(50); 406 | await expect(page.locator('.empty-placeholder').filter({ hasText: '暂无' })).toHaveCount(0); at /Users/apple/scott2026/msh-system/tests/e2e/bug-regression.spec.ts:403:31 attachment #1: screenshot (image/png) ────────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B07-饮食指南和科普文章详情页有正常内容-mobile-chrome/test-failed-1.png ──────────────────────────────────────────────────────────────────────────────────────────────── attachment #2: video (video/webm) ────────────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B07-饮食指南和科普文章详情页有正常内容-mobile-chrome/video.webm ──────────────────────────────────────────────────────────────────────────────────────────────── Error Context: tests/e2e/test-results/bug-regression-TC-B07-饮食指南和科普文章详情页有正常内容-mobile-chrome/error-context.md attachment #4: trace (application/zip) ───────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B07-饮食指南和科普文章详情页有正常内容-mobile-chrome/trace.zip Usage: npx playwright show-trace tests/e2e/test-results/bug-regression-TC-B07-饮食指南和科普文章详情页有正常内容-mobile-chrome/trace.zip ──────────────────────────────────────────────────────────────────────────────────────────────── Retry #1 ─────────────────────────────────────────────────────────────────────────────────────── Error: expect(locator).toBeVisible() failed Locator: locator('.conter, .article-content, .content-scroll').first() Expected: visible Received: hidden Timeout: 8000ms Call log:  - Expect "toBeVisible" with timeout 8000ms  - waiting for locator('.conter, .article-content, .content-scroll').first()  12 × locator resolved to   - unexpected value "hidden" 401 | await page.waitForTimeout(3000); 402 | const contentArea = page.locator('.conter, .article-content, .content-scroll').first(); > 403 | await expect(contentArea).toBeVisible({ timeout: 8_000 }); | ^ 404 | const contentText = await contentArea.textContent(); 405 | expect((contentText || '').trim().length, '饮食指南详情应有正文').toBeGreaterThan(50); 406 | await expect(page.locator('.empty-placeholder').filter({ hasText: '暂无' })).toHaveCount(0); at /Users/apple/scott2026/msh-system/tests/e2e/bug-regression.spec.ts:403:31 attachment #1: screenshot (image/png) ────────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B07-饮食指南和科普文章详情页有正常内容-mobile-chrome-retry1/test-failed-1.png ──────────────────────────────────────────────────────────────────────────────────────────────── attachment #2: video (video/webm) ────────────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B07-饮食指南和科普文章详情页有正常内容-mobile-chrome-retry1/video.webm ──────────────────────────────────────────────────────────────────────────────────────────────── Error Context: tests/e2e/test-results/bug-regression-TC-B07-饮食指南和科普文章详情页有正常内容-mobile-chrome-retry1/error-context.md attachment #4: trace (application/zip) ───────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B07-饮食指南和科普文章详情页有正常内容-mobile-chrome-retry1/trace.zip Usage: npx playwright show-trace tests/e2e/test-results/bug-regression-TC-B07-饮食指南和科普文章详情页有正常内容-mobile-chrome-retry1/trace.zip ──────────────────────────────────────────────────────────────────────────────────────────────── 8) [mobile-chrome] › tests/e2e/bug-regression.spec.ts:468:5 › TC-B09 社区 Tab 标签和帖子类型均使用中文 ───────── Error: 帖子类型 "dinner" 应含中文表述 expect(received).toBe(expected) // Object.is equality Expected: true Received: false 491 | if (label.length > 0) { 492 | const hasChinese = /[\u4e00-\u9fa5]/.test(label); > 493 | expect(hasChinese, `帖子类型 "${label}" 应含中文表述`).toBe(true); | ^ 494 | } 495 | } 496 | at /Users/apple/scott2026/msh-system/tests/e2e/bug-regression.spec.ts:493:52 attachment #1: screenshot (image/png) ────────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B09-社区-Tab-标签和帖子类型均使用中文-mobile-chrome/test-failed-1.png ──────────────────────────────────────────────────────────────────────────────────────────────── attachment #2: video (video/webm) ────────────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B09-社区-Tab-标签和帖子类型均使用中文-mobile-chrome/video.webm ──────────────────────────────────────────────────────────────────────────────────────────────── Error Context: tests/e2e/test-results/bug-regression-TC-B09-社区-Tab-标签和帖子类型均使用中文-mobile-chrome/error-context.md attachment #4: trace (application/zip) ───────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B09-社区-Tab-标签和帖子类型均使用中文-mobile-chrome/trace.zip Usage: npx playwright show-trace tests/e2e/test-results/bug-regression-TC-B09-社区-Tab-标签和帖子类型均使用中文-mobile-chrome/trace.zip ──────────────────────────────────────────────────────────────────────────────────────────────── Retry #1 ─────────────────────────────────────────────────────────────────────────────────────── Error: 帖子类型 "dinner" 应含中文表述 expect(received).toBe(expected) // Object.is equality Expected: true Received: false 491 | if (label.length > 0) { 492 | const hasChinese = /[\u4e00-\u9fa5]/.test(label); > 493 | expect(hasChinese, `帖子类型 "${label}" 应含中文表述`).toBe(true); | ^ 494 | } 495 | } 496 | at /Users/apple/scott2026/msh-system/tests/e2e/bug-regression.spec.ts:493:52 attachment #1: screenshot (image/png) ────────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B09-社区-Tab-标签和帖子类型均使用中文-mobile-chrome-retry1/test-failed-1.png ──────────────────────────────────────────────────────────────────────────────────────────────── attachment #2: video (video/webm) ────────────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B09-社区-Tab-标签和帖子类型均使用中文-mobile-chrome-retry1/video.webm ──────────────────────────────────────────────────────────────────────────────────────────────── Error Context: tests/e2e/test-results/bug-regression-TC-B09-社区-Tab-标签和帖子类型均使用中文-mobile-chrome-retry1/error-context.md attachment #4: trace (application/zip) ───────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B09-社区-Tab-标签和帖子类型均使用中文-mobile-chrome-retry1/trace.zip Usage: npx playwright show-trace tests/e2e/test-results/bug-regression-TC-B09-社区-Tab-标签和帖子类型均使用中文-mobile-chrome-retry1/trace.zip ──────────────────────────────────────────────────────────────────────────────────────────────── 8 failed [mobile-chrome] › tests/e2e/bug-regression.spec.ts:114:5 › TC-B01a 打卡前积分无提前跳变 ────────────────── [mobile-chrome] › tests/e2e/bug-regression.spec.ts:139:5 › TC-B01b 打卡后积分按规则累加 ────────────────── [mobile-chrome] › tests/e2e/bug-regression.spec.ts:171:5 › TC-B02 计算结果页 Tab 切换选中状态清晰 ─────────── [mobile-chrome] › tests/e2e/bug-regression.spec.ts:238:5 › TC-B03 食物列表每条目展示图片与营养信息 ───────────── [mobile-chrome] › tests/e2e/bug-regression.spec.ts:311:5 › TC-B05 AI针对不同问题返回差异化回复 ────────────── [mobile-chrome] › tests/e2e/bug-regression.spec.ts:352:5 › TC-B06 健康知识与营养知识名称统一性 ─────────────── [mobile-chrome] › tests/e2e/bug-regression.spec.ts:386:5 › TC-B07 饮食指南和科普文章详情页有正常内容 ──────────── [mobile-chrome] › tests/e2e/bug-regression.spec.ts:468:5 › TC-B09 社区 Tab 标签和帖子类型均使用中文 ────────── 2 passed (7.5m) [2026-03-02 16:51:57] 基线记录完成 ═══════════════════════════════════════════════ [2026-03-02 16:51:57] ▶ 阶段 1 — 快速修复(BUG-002, BUG-006, BUG-009) ═══════════════════════════════════════════════ [2026-03-02 16:51:57] [BUG-002] 启动 Cursor Agent 修复... 已按 BUG-002 要求只改了 CSS,未动任何 JS。修改总结如下: ### 1. 未激活 Tab(`.tab-item`) - **字色**:`.tab-text` 与 `.tab-icon` 均为 `#9ca3af` - **下划线**:无实线,用 `border-bottom: 6rpx solid transparent` 占位,避免切换时高度抖动 - 其它:`height: 100%`、`min-height: 75rpx`,让底部边框落在 tab 栏最下方;`border-radius: 0`,改为下划线式 tab ### 2. 激活 Tab(`.tab-item.active`) - **字重**:`.tab-text` 设为 `font-weight: 700` - **下划线**:`border-bottom: 6rpx solid #f97316`(与要求 3px 等效,用 6rpx 保持与页面其它 rpx 一致) - **字色**:`.tab-text`、`.tab-icon` 均为 `color: #f97316` - **背景**:`background: transparent`,去掉原来的橙色块,只保留下划线样式 效果:当前选中的「健康概览」或「营养配餐」会以**加粗 + 橙色字 + 橙色底线下划线**显示,未选中的 Tab 为**灰色字、无下划线**,视觉区分更明显。 [2026-03-02 16:53:32] [BUG-002] Agent 执行完成 → /Users/apple/scott2026/msh-system/scripts/logs/agent-BUG-002-165157.log [2026-03-02 16:53:32] [BUG-006] 启动 Cursor Agent 修复... BUG-006 已按「统一为健康知识」处理,修改如下。 **1. 确认的现有文案** - **tool_main/index.vue** - 下方区块标题(第125行):`健康知识` - 四大入口里对应卡片标题(第65行):`营养知识` - **营养知识页导航栏** - 在 **pages.json** 里配置:`nutrition-knowledge` 的 `navigationBarTitleText` 为 `营养知识` - **nutrition-knowledge.vue** 内没有设置导航栏标题的文案。 **2. 已做修改(仅文案,未改逻辑与样式)** - **msh_single_uniapp/pages/tool_main/index.vue** - 四大入口卡片标题:`营养知识` → `健康知识`(第67行 `function-title`)。 - **msh_single_uniapp/pages.json** - `nutrition-knowledge` 页的 `navigationBarTitleText`:`营养知识` → `健康知识`。 现在主页入口卡片、主页「健康知识」区块和营养知识页导航栏都统一为「健康知识」。`nutrition-knowledge.vue` 未改,因为导航栏标题是在 `pages.json` 里配置的。 [2026-03-02 16:54:26] [BUG-006] Agent 执行完成 → /Users/apple/scott2026/msh-system/scripts/logs/agent-BUG-006-165332.log [2026-03-02 16:54:26] [BUG-009] 启动 Cursor Agent 修复... BUG-009 已按你的要求改完,修改总结如下: ## 1. Template 检查结果 - **Tab 文案**:四个 Tab 的展示文字早就是中文(推荐、最新、关注、热门),未改。 - **Tab 内部值**:`currentTab` 仍为 `recommend` / `latest` / `follow` / `hot`,用于 `switchTab()` 和接口参数 `tab`,按「不改动接口调用等逻辑」保留。 - **帖子类型标签**:两处原先直接显示 `{{ item.mealType }}`,若接口返回英文(如 `breakfast`)会显示英文,已改为通过映射显示中文。 ## 2. 具体修改 1. **类型标签展示改为用“中文 label”** - 有图:`{{ getMealTypeLabel(item.mealType) }}` - 无图:`{{ getMealTypeLabel(item.mealType) }}` 2. **新增 `getMealTypeLabel(mealType)` 方法** - 英文 → 中文映射:`breakfast`→早餐、`lunch`→午餐、`dinner`→晚餐、`snack`→加餐、`share`→分享、`checkin`→打卡。 - 若 `mealType` 已是中文或未知,则原样返回;空则返回「分享」。 这样 Tab 展示仍是中文,帖子类型在界面上也统一为中文;`currentTab`、接口入参和请求逻辑均未改动。 [2026-03-02 16:55:44] [BUG-009] Agent 执行完成 → /Users/apple/scott2026/msh-system/scripts/logs/agent-BUG-009-165426.log [2026-03-02 16:55:44] [阶段1] 阶段1修复完成,进行局部验证... [2026-03-02 16:55:44] [TEST] 验证: TC-B02|TC-B06|TC-B09 Running 3 tests using 1 worker ✘ 1 [mobile-chrome] › tests/e2e/bug-regression.spec.ts:171:5 › TC-B02 计算结果页 Tab 切换选中状态清晰 (30.5s) ✘ 2 [mobile-chrome] › tests/e2e/bug-regression.spec.ts:171:5 › TC-B02 计算结果页 Tab 切换选中状态清晰 (retry #1) (30.5s) ✘ 3 [mobile-chrome] › tests/e2e/bug-regression.spec.ts:352:5 › TC-B06 健康知识与营养知识名称统一性 (31.6s) ✘ 4 [mobile-chrome] › tests/e2e/bug-regression.spec.ts:352:5 › TC-B06 健康知识与营养知识名称统一性 (retry #1) (31.7s) ✓ 5 [mobile-chrome] › tests/e2e/bug-regression.spec.ts:468:5 › TC-B09 社区 Tab 标签和帖子类型均使用中文 (4.8s) 1) [mobile-chrome] › tests/e2e/bug-regression.spec.ts:171:5 › TC-B02 计算结果页 Tab 切换选中状态清晰 ────────── Test timeout of 30000ms exceeded. Error: locator.click: Test timeout of 30000ms exceeded. Call log:  - waiting for locator('.submit-btn, .calc-btn, button').filter({ hasText: /计算|确定|提交/ }).first() 196 | 197 | const calcBtn = page.locator('.submit-btn, .calc-btn, button').filter({ hasText: /计算|确定|提交/ }).first(); > 198 | await calcBtn.click(); | ^ 199 | await page.waitForTimeout(3500); 200 | 201 | const resultPage = page.locator('.result-page').first(); at /Users/apple/scott2026/msh-system/tests/e2e/bug-regression.spec.ts:198:17 attachment #1: screenshot (image/png) ────────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B02-计算结果页-Tab-切换选中状态清晰-mobile-chrome/test-failed-1.png ──────────────────────────────────────────────────────────────────────────────────────────────── attachment #2: video (video/webm) ────────────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B02-计算结果页-Tab-切换选中状态清晰-mobile-chrome/video.webm ──────────────────────────────────────────────────────────────────────────────────────────────── Error Context: tests/e2e/test-results/bug-regression-TC-B02-计算结果页-Tab-切换选中状态清晰-mobile-chrome/error-context.md attachment #4: trace (application/zip) ───────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B02-计算结果页-Tab-切换选中状态清晰-mobile-chrome/trace.zip Usage: npx playwright show-trace tests/e2e/test-results/bug-regression-TC-B02-计算结果页-Tab-切换选中状态清晰-mobile-chrome/trace.zip ──────────────────────────────────────────────────────────────────────────────────────────────── Retry #1 ─────────────────────────────────────────────────────────────────────────────────────── Test timeout of 30000ms exceeded. Error: locator.click: Test timeout of 30000ms exceeded. Call log:  - waiting for locator('.submit-btn, .calc-btn, button').filter({ hasText: /计算|确定|提交/ }).first() 196 | 197 | const calcBtn = page.locator('.submit-btn, .calc-btn, button').filter({ hasText: /计算|确定|提交/ }).first(); > 198 | await calcBtn.click(); | ^ 199 | await page.waitForTimeout(3500); 200 | 201 | const resultPage = page.locator('.result-page').first(); at /Users/apple/scott2026/msh-system/tests/e2e/bug-regression.spec.ts:198:17 attachment #1: screenshot (image/png) ────────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B02-计算结果页-Tab-切换选中状态清晰-mobile-chrome-retry1/test-failed-1.png ──────────────────────────────────────────────────────────────────────────────────────────────── attachment #2: video (video/webm) ────────────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B02-计算结果页-Tab-切换选中状态清晰-mobile-chrome-retry1/video.webm ──────────────────────────────────────────────────────────────────────────────────────────────── Error Context: tests/e2e/test-results/bug-regression-TC-B02-计算结果页-Tab-切换选中状态清晰-mobile-chrome-retry1/error-context.md attachment #4: trace (application/zip) ───────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B02-计算结果页-Tab-切换选中状态清晰-mobile-chrome-retry1/trace.zip Usage: npx playwright show-trace tests/e2e/test-results/bug-regression-TC-B02-计算结果页-Tab-切换选中状态清晰-mobile-chrome-retry1/trace.zip ──────────────────────────────────────────────────────────────────────────────────────────────── 2) [mobile-chrome] › tests/e2e/bug-regression.spec.ts:352:5 › TC-B06 健康知识与营养知识名称统一性 ────────────── Test timeout of 30000ms exceeded. Error: expect(received).toBe(expected) // Object.is equality Expected: true Received: false 373 | 374 | expect(mainIsHealth || mainIsNutrition).toBe(true); > 375 | expect(detailIsHealth || detailIsNutrition).toBe(true); | ^ 376 | expect(mainName === detailName || (mainIsHealth && detailIsHealth) || (mainIsNutrition && detailIsNutrition), 377 | '主页区块名称与营养知识页标题应统一(均为健康知识或均为营养知识)').toBe(true); 378 | at /Users/apple/scott2026/msh-system/tests/e2e/bug-regression.spec.ts:375:47 attachment #1: screenshot (image/png) ────────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B06-健康知识与营养知识名称统一性-mobile-chrome/test-failed-1.png ──────────────────────────────────────────────────────────────────────────────────────────────── attachment #2: video (video/webm) ────────────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B06-健康知识与营养知识名称统一性-mobile-chrome/video.webm ──────────────────────────────────────────────────────────────────────────────────────────────── Error Context: tests/e2e/test-results/bug-regression-TC-B06-健康知识与营养知识名称统一性-mobile-chrome/error-context.md attachment #4: trace (application/zip) ───────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B06-健康知识与营养知识名称统一性-mobile-chrome/trace.zip Usage: npx playwright show-trace tests/e2e/test-results/bug-regression-TC-B06-健康知识与营养知识名称统一性-mobile-chrome/trace.zip ──────────────────────────────────────────────────────────────────────────────────────────────── Retry #1 ─────────────────────────────────────────────────────────────────────────────────────── Test timeout of 30000ms exceeded. Error: expect(received).toBe(expected) // Object.is equality Expected: true Received: false 373 | 374 | expect(mainIsHealth || mainIsNutrition).toBe(true); > 375 | expect(detailIsHealth || detailIsNutrition).toBe(true); | ^ 376 | expect(mainName === detailName || (mainIsHealth && detailIsHealth) || (mainIsNutrition && detailIsNutrition), 377 | '主页区块名称与营养知识页标题应统一(均为健康知识或均为营养知识)').toBe(true); 378 | at /Users/apple/scott2026/msh-system/tests/e2e/bug-regression.spec.ts:375:47 attachment #1: screenshot (image/png) ────────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B06-健康知识与营养知识名称统一性-mobile-chrome-retry1/test-failed-1.png ──────────────────────────────────────────────────────────────────────────────────────────────── attachment #2: video (video/webm) ────────────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B06-健康知识与营养知识名称统一性-mobile-chrome-retry1/video.webm ──────────────────────────────────────────────────────────────────────────────────────────────── Error Context: tests/e2e/test-results/bug-regression-TC-B06-健康知识与营养知识名称统一性-mobile-chrome-retry1/error-context.md attachment #4: trace (application/zip) ───────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B06-健康知识与营养知识名称统一性-mobile-chrome-retry1/trace.zip Usage: npx playwright show-trace tests/e2e/test-results/bug-regression-TC-B06-健康知识与营养知识名称统一性-mobile-chrome-retry1/trace.zip ──────────────────────────────────────────────────────────────────────────────────────────────── 2 failed [mobile-chrome] › tests/e2e/bug-regression.spec.ts:171:5 › TC-B02 计算结果页 Tab 切换选中状态清晰 ─────────── [mobile-chrome] › tests/e2e/bug-regression.spec.ts:352:5 › TC-B06 健康知识与营养知识名称统一性 ─────────────── 1 passed (2.5m) ═══════════════════════════════════════════════ [2026-03-02 16:58:18] ▶ 阶段 2 — 中等修复(BUG-001, BUG-007) ═══════════════════════════════════════════════ [2026-03-02 16:58:18] [BUG-001] 启动 Cursor Agent 修复... 已按 BUG-001 的两个子问题改好,修改总结如下。 --- ### 子问题 A — 打卡前积分不再提前跳变 - **原逻辑**:点击「立即打卡」后先执行 `uni.navigateTo`,再执行 `this.currentPoints += 30`,在接口返回前就改动了积分。 - **现逻辑**: - 在 `handleCheckin` 中**不再**在接口成功前修改 `currentPoints`。 - 仅当签到接口调用成功,并且用 `getUserPoints()` 拿到服务端最新积分后,才给 `currentPoints` 赋值(见下)。 --- ### 子问题 B — 打卡成功后用服务端积分更新 - **原逻辑**:没有调用任何打卡/签到接口,只在前端写死 `currentPoints += 30`,后端没有参与积分变更。 - **现逻辑**: 1. **调用签到接口**:使用现有接口 `GET /api/front/user/sign/integral`(`@/api/user.js` 中的 `setSignIntegral()`),与需求中的「/api/front/user/checkin 或类似接口」一致,用于触发后端签到与积分累加。 2. **成功后刷新积分**:签到成功后请求 `getUserPoints()`(对应后端 `GET .../tool/points/info`),用返回的积分更新页面。 3. **积分来源**: `currentPoints` 只从接口赋值: `pointsRes.data.totalPoints ?? pointsRes.data.points ?? pointsRes.data.availablePoints ?? 0` 不再使用硬编码的 +30。 4. **错误与跳转**:若签到或拉取积分失败,会 `uni.showToast` 提示并 `return`,不跳转;只有成功后才 `uni.navigateTo('/pages/tool/checkin-publish')`。 --- ### 其它修改 - **loadCheckinData**:积分取值改为优先使用服务端字段,与上面一致: `currentPoints = pointsRes.data.totalPoints ?? pointsRes.data.points ?? 0` 这样列表和打卡页的积分都来自服务端。 需求里提到的「GET /api/front/user/info」在当前项目里没有对应接口;用户积分接口是 `GET /api/front/tool/points/info`(`getUserPoints()`),因此用该接口的返回值刷新并赋值给 `currentPoints`。若后续后端提供 `/api/front/user/info` 并返回积分,只需在成功后再调该接口,用其返回的积分更新 `currentPoints` 即可。 [2026-03-02 17:00:40] [BUG-001] Agent 执行完成 → /Users/apple/scott2026/msh-system/scripts/logs/agent-BUG-001-165818.log [2026-03-02 17:00:40] [BUG-007] 启动 Cursor Agent 修复... BUG-007 已按你的要求修好,修改总结如下: ### 1. **`loadKnowledgeList` 与 API** - **请求参数**:`type` 已按 tab 传 `guide` / `article`(与后端 `type` 一致),并显式用 `typeParam` 传参。 - **响应处理**:用 `Array.isArray(result.data.list)` 判断,只把合法数组赋给列表,否则用 `[]`,避免赋成 `undefined`。 - **列表赋值**:用 `currentTab === 'articles'` 分支给 `articleList` 赋值,与「科普文章」tab 一致。 ### 2. **错误处理** - 在 `catch` 里增加 `uni.showToast`,文案为 `error.message` / `error.msg` 或「加载列表失败」。 - 在 `catch` 中**不**对 `guideList` / `articleList` 赋值,保持为初始的 `[]`,避免变成 `undefined`。 ### 3. **onLoad 与无 id 时的列表** - 无 `id` 时不再在 onLoad 里调用 `loadKnowledgeList()`(当前 tab 为 nutrients,调用也会直接 return)。 - 列表只在「切换 tab」时加载:`switchTab('guide')` / `switchTab('articles')` 内会调用 `loadKnowledgeList()`,从而加载对应 guide/article 列表。 ### 4. **详情跳转 `goToDetail`** - 先取 `id = item.knowledgeId ?? item.id`,再判断 `id === undefined || id === null || id === ''`。 - 无有效 id 时:`uni.showToast({ title: '暂无详情', icon: 'none' })` 并 return,不跳转。 - 有 id 时才 `navigateTo` 到 `/pages/news/news_details/index?id=${id}`。 ### 5. **列表展示与后端字段** - 后端返回 `summary`、`viewCount`、`publishedAt` 等,模板用的是 `desc`、`time`、`views`、`icon`。 - 在赋值前对列表做了一层映射:`desc` ← summary、`time` ← 格式化 `publishedAt`/`createdAt`、`views` ← viewCount、`icon` 默认 `'📄'`,并增加了 `formatKnowledgeTime` 做日期格式化。 按当前逻辑:切换「饮食指南」或「科普文章」会请求 `type=guide` / `type=article` 并正确赋给 `guideList`/`articleList`;请求失败会 toast 且列表保持为 `[]`;只有存在 `knowledgeId` 或 `id` 时才跳转详情,否则提示「暂无详情」。 [2026-03-02 17:04:35] [BUG-007] Agent 执行完成 → /Users/apple/scott2026/msh-system/scripts/logs/agent-BUG-007-170040.log [2026-03-02 17:04:35] [阶段2] 阶段2修复完成,进行局部验证... [2026-03-02 17:04:35] [TEST] 验证: TC-B01|TC-B07 Running 3 tests using 1 worker ✘ 1 [mobile-chrome] › tests/e2e/bug-regression.spec.ts:114:5 › TC-B01a 打卡前积分无提前跳变 (31.4s) ✓ 2 [mobile-chrome] › tests/e2e/bug-regression.spec.ts:114:5 › TC-B01a 打卡前积分无提前跳变 (retry #1) (7.5s) ✘ 3 [mobile-chrome] › tests/e2e/bug-regression.spec.ts:139:5 › TC-B01b 打卡后积分按规则累加 (11.7s) ✘ 4 [mobile-chrome] › tests/e2e/bug-regression.spec.ts:139:5 › TC-B01b 打卡后积分按规则累加 (retry #1) (11.7s) ✓ 5 [mobile-chrome] › tests/e2e/bug-regression.spec.ts:386:5 › TC-B07 饮食指南和科普文章详情页有正常内容 (8.5s) 1) [mobile-chrome] › tests/e2e/bug-regression.spec.ts:139:5 › TC-B01b 打卡后积分按规则累加 ───────────────── Error: 打卡成功后积分应至少增加 30 expect(received).toBeGreaterThanOrEqual(expected) Expected: >= 40 Received: 10 158 | const afterText = await afterEl.textContent(); 159 | const afterPoints = parsePointsFromText(afterText || ''); > 160 | expect(afterPoints, '打卡成功后积分应至少增加 30').toBeGreaterThanOrEqual(initialPoints + 30); | ^ 161 | } else { 162 | test.skip(); 163 | } at /Users/apple/scott2026/msh-system/tests/e2e/bug-regression.spec.ts:160:44 attachment #1: screenshot (image/png) ────────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B01b-打卡后积分按规则累加-mobile-chrome/test-failed-1.png ──────────────────────────────────────────────────────────────────────────────────────────────── attachment #2: video (video/webm) ────────────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B01b-打卡后积分按规则累加-mobile-chrome/video.webm ──────────────────────────────────────────────────────────────────────────────────────────────── Error Context: tests/e2e/test-results/bug-regression-TC-B01b-打卡后积分按规则累加-mobile-chrome/error-context.md attachment #4: trace (application/zip) ───────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B01b-打卡后积分按规则累加-mobile-chrome/trace.zip Usage: npx playwright show-trace tests/e2e/test-results/bug-regression-TC-B01b-打卡后积分按规则累加-mobile-chrome/trace.zip ──────────────────────────────────────────────────────────────────────────────────────────────── Retry #1 ─────────────────────────────────────────────────────────────────────────────────────── Error: 打卡成功后积分应至少增加 30 expect(received).toBeGreaterThanOrEqual(expected) Expected: >= 40 Received: 10 158 | const afterText = await afterEl.textContent(); 159 | const afterPoints = parsePointsFromText(afterText || ''); > 160 | expect(afterPoints, '打卡成功后积分应至少增加 30').toBeGreaterThanOrEqual(initialPoints + 30); | ^ 161 | } else { 162 | test.skip(); 163 | } at /Users/apple/scott2026/msh-system/tests/e2e/bug-regression.spec.ts:160:44 attachment #1: screenshot (image/png) ────────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B01b-打卡后积分按规则累加-mobile-chrome-retry1/test-failed-1.png ──────────────────────────────────────────────────────────────────────────────────────────────── attachment #2: video (video/webm) ────────────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B01b-打卡后积分按规则累加-mobile-chrome-retry1/video.webm ──────────────────────────────────────────────────────────────────────────────────────────────── Error Context: tests/e2e/test-results/bug-regression-TC-B01b-打卡后积分按规则累加-mobile-chrome-retry1/error-context.md attachment #4: trace (application/zip) ───────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B01b-打卡后积分按规则累加-mobile-chrome-retry1/trace.zip Usage: npx playwright show-trace tests/e2e/test-results/bug-regression-TC-B01b-打卡后积分按规则累加-mobile-chrome-retry1/trace.zip ──────────────────────────────────────────────────────────────────────────────────────────────── 2) [mobile-chrome] › tests/e2e/bug-regression.spec.ts:114:5 › TC-B01a 打卡前积分无提前跳变 ───────────────── Test timeout of 30000ms exceeded. Error: page.waitForTimeout: Target page, context or browser has been closed 133 | expect(pointsDuring, '打卡点击后 800ms 内积分不应提前增加 30').toBeLessThanOrEqual(initialPoints + 1); 134 | > 135 | await page.waitForTimeout(2000); | ^ 136 | await screenshot(page, 'tc-b01a-checkin-clicked'); 137 | }); 138 | at /Users/apple/scott2026/msh-system/tests/e2e/bug-regression.spec.ts:135:14 attachment #1: screenshot (image/png) ────────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B01a-打卡前积分无提前跳变-mobile-chrome/test-failed-1.png ──────────────────────────────────────────────────────────────────────────────────────────────── attachment #2: video (video/webm) ────────────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B01a-打卡前积分无提前跳变-mobile-chrome/video.webm ──────────────────────────────────────────────────────────────────────────────────────────────── Error Context: tests/e2e/test-results/bug-regression-TC-B01a-打卡前积分无提前跳变-mobile-chrome/error-context.md attachment #4: trace (application/zip) ───────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B01a-打卡前积分无提前跳变-mobile-chrome/trace.zip Usage: npx playwright show-trace tests/e2e/test-results/bug-regression-TC-B01a-打卡前积分无提前跳变-mobile-chrome/trace.zip ──────────────────────────────────────────────────────────────────────────────────────────────── 1 failed [mobile-chrome] › tests/e2e/bug-regression.spec.ts:139:5 › TC-B01b 打卡后积分按规则累加 ────────────────── 1 flaky [mobile-chrome] › tests/e2e/bug-regression.spec.ts:114:5 › TC-B01a 打卡前积分无提前跳变 ────────────────── 1 passed (1.5m) ═══════════════════════════════════════════════ [2026-03-02 17:06:07] ▶ 阶段 3 — 数据展示修复(BUG-003, BUG-008) ═══════════════════════════════════════════════ [2026-03-02 17:06:07] [BUG-003] 启动 Cursor Agent 修复... BUG-003 已按你的要求修好,修改总结如下。 --- ## 1. 问题原因 - **后端列表接口**(`getFoodList` / `searchFood`)返回的是:`id, name, image, energy, protein, suitabilityLevel`,没有 `nutrition` 数组,也没有 `category`、`potassium`、`phosphorus`。 - 模板里用的是 `item.image`、`item.nutrition`。当接口替换掉本地 mock 后,`item.nutrition` 为 `undefined`,营养简介不渲染;图片若为空也没有占位。 ## 2. 修改内容 ### 前端 `msh_single_uniapp/pages/tool/food-encyclopedia.vue` **模板:** - **`.food-image` 的 `:src`**:改为 `getFoodImage(item)`,内部使用 `item.imageUrl || item.image || item.img`,都没有时用占位图。 - **`.nutrition-item` 的 `v-for`**:改为 `v-for="(nut, idx) in (item.nutrition || [])"`,并给 `nut.colorClass` 加了默认 `'green'`,避免无数据或缺字段时报错。 - **分类与安全标签**:`item.category` 为空时不渲染分类徽章(`v-if="item.category"`);安全标签增加 `item.safetyClass || 'safe'`、`item.safety || '—'` 兜底。 - **列表 `:key`**:改为 `item.id != null ? item.id : index`,便于接口数据稳定渲染。 **逻辑:** - **`defaultPlaceholder`**:在 `data()` 里增加灰色 SVG 的 data URL,作为无图时的占位图(与 `.food-image-wrapper` 的灰色风格一致)。 - **`getFoodImage(item)`**:返回 `item.imageUrl || item.image || item.img`,若都为空则返回 `defaultPlaceholder`。 - **`normalizeFoodItem(item)`**:把接口数据统一成列表项结构: - 图片:沿用 `image` / `imageUrl` / `img`(展示由 `getFoodImage` 处理)。 - 安全:若已有 `safety`/`safetyClass` 则保留,否则按 `suitabilityLevel` 映射(suitable→放心吃/safe,moderate→限量吃/limited,restricted/forbidden→谨慎吃/careful)。 - 营养:若已有 `item.nutrition` 数组则直接用;否则用接口字段组装:能量、蛋白质、钾、磷(有值才加),格式为 `{ label, value, colorClass }`。 - **列表赋值**:`loadFoodList` 和搜索分支里,对 `result.data.list` 做 `(result.data.list || []).map(item => this.normalizeFoodItem(item))` 再赋给 `foodList`,保证每条都有 `nutrition` 和可用的图片、安全、分类展示。 ### 后端 `msh_crmeb_22/.../ToolFoodServiceImpl.java` - 列表/搜索的 map 中增加:`category`、`potassium`、`phosphorus`,这样前端 `normalizeFoodItem` 能拼出更完整的营养简介,分类徽章也能显示。 效果: - 配图:有图用接口的 `image`(或 `imageUrl`/`img`),无图用灰色占位图。 - 营养简介:接口有 `nutrition` 用接口的,没有则用能量/蛋白质/钾/磷自动组一条,`.nutrition-item` 始终有稳定数据源可遍历。 [2026-03-02 17:09:07] [BUG-003] Agent 执行完成 → /Users/apple/scott2026/msh-system/scripts/logs/agent-BUG-003-170607.log [2026-03-02 17:09:07] [BUG-008] 启动 Cursor Agent 修复... BUG-008 已按你的要求修好,修改总结如下。 ### 1. 阅读结果简述 - **postData.nutritionStats**:在 `data()` 里初始化为 `[]`,在 `formatPostData` 里只从 `data.nutritionDataJson` 解析并赋值;若后端没给或字段名不同,就会一直是空数组。 - **加载逻辑**:`loadPostData` 调 `getCommunityDetail(id)`,用返回的 `data` 调用 `formatPostData(data)`。后端确实会返回 `nutritionDataJson`,但可能为空或字段名不一致(如 snake_case)。 ### 2. 已做修改 **(1)统一从详情数据里构建营养统计** - 新增 **`buildNutritionStatsFromDetailData(data)`**,按优先级从接口数据里生成 `nutritionStats`: - 若存在 **`nutritionStats` / `nutrition_stats`** 数组,直接规范成 `[{label, value}, ...]` 使用。 - 否则解析 **`nutritionDataJson` / `nutrition_data_json`**,按原有逻辑生成热量、蛋白质、钾、磷四项。 - 否则从 **`dietaryData` / `mealData` / `dietary_data` / `meal_data`** 等对象里取 calories/energy、protein、potassium、phosphorus(及常见别名),生成同样四项。 **(2)后端没有营养数据时用打卡数据补充** - 新增 **`buildNutritionStatsFromCheckinDetail(detail)`**:根据打卡详情里的 `actualEnergy`、`actualProtein` 等生成 `[{label, value}, ...]`,钾/磷无则显示 `-`。 - 新增 **`fillNutritionStatsFromCheckin(checkInRecordId)`**:请求 `getCheckinDetail(checkInRecordId)`,用上面方法得到 `nutritionStats` 并赋给 `postData.nutritionStats`。 - 在 **`loadPostData`** 里,在 `formatPostData(data)` 之后:若当前 **`postData.nutritionStats.length === 0`** 且 **`data.checkInRecordId`** 存在,则调用 **`fillNutritionStatsFromCheckin(data.checkInRecordId)`**,用打卡数据补全营养统计(不阻塞评论、推荐等加载)。 **(3)展示条件只依赖数组长度** - 营养统计卡片的 **v-if** 已改为只依赖是否有数据: - 原:`v-if="postData.nutritionStats && postData.nutritionStats.length > 0"` - 现:`v-if="postData.nutritionStats.length > 0"` (`postData.nutritionStats` 初始化为 `[]`,不会为 undefined。) **(4)接口引用** - 在 `@/api/tool.js` 的 import 中增加了 **`getCheckinDetail`**,用于在无详情营养数据时拉取打卡详情并计算营养统计。 效果总结: - 后端有 `nutritionDataJson` 或其它营养相关字段(含不同命名)时,会正确解析并显示。 - 后端没有营养数据但有关联打卡记录时,会用打卡详情中的热量、蛋白质等补全并显示。 - 卡片是否展示只由 **`postData.nutritionStats.length > 0`** 决定,不再依赖“后端某字段是否存在”。 [2026-03-02 17:12:51] [BUG-008] Agent 执行完成 → /Users/apple/scott2026/msh-system/scripts/logs/agent-BUG-008-170907.log [2026-03-02 17:12:51] [阶段3] 阶段3修复完成,进行局部验证... [2026-03-02 17:12:51] [TEST] 验证: TC-B03|TC-B08 Running 2 tests using 1 worker ✘ 1 [mobile-chrome] › tests/e2e/bug-regression.spec.ts:238:5 › TC-B03 食物列表每条目展示图片与营养信息 (21.5s) ✘ 2 [mobile-chrome] › tests/e2e/bug-regression.spec.ts:238:5 › TC-B03 食物列表每条目展示图片与营养信息 (retry #1) (29.5s) ✓ 3 [mobile-chrome] › tests/e2e/bug-regression.spec.ts:433:5 › TC-B08 帖子详情页展示营养统计数据 (8.2s) 1) [mobile-chrome] › tests/e2e/bug-regression.spec.ts:238:5 › TC-B03 食物列表每条目展示图片与营养信息 ──────────── Error: 食物条目 1 应有配图 src expect(received).toBeTruthy() Received: null 259 | if (await img.count() > 0) { 260 | const src = await img.getAttribute('src'); > 261 | expect(src, `食物条目 ${i + 1} 应有配图 src`).toBeTruthy(); | ^ 262 | expect((src || '').trim().length).toBeGreaterThan(0); 263 | } 264 | at /Users/apple/scott2026/msh-system/tests/e2e/bug-regression.spec.ts:261:45 attachment #1: screenshot (image/png) ────────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B03-食物列表每条目展示图片与营养信息-mobile-chrome/test-failed-1.png ──────────────────────────────────────────────────────────────────────────────────────────────── attachment #2: video (video/webm) ────────────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B03-食物列表每条目展示图片与营养信息-mobile-chrome/video.webm ──────────────────────────────────────────────────────────────────────────────────────────────── Error Context: tests/e2e/test-results/bug-regression-TC-B03-食物列表每条目展示图片与营养信息-mobile-chrome/error-context.md attachment #4: trace (application/zip) ───────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B03-食物列表每条目展示图片与营养信息-mobile-chrome/trace.zip Usage: npx playwright show-trace tests/e2e/test-results/bug-regression-TC-B03-食物列表每条目展示图片与营养信息-mobile-chrome/trace.zip ──────────────────────────────────────────────────────────────────────────────────────────────── Retry #1 ─────────────────────────────────────────────────────────────────────────────────────── Error: 食物条目 1 应有配图 src expect(received).toBeTruthy() Received: null 259 | if (await img.count() > 0) { 260 | const src = await img.getAttribute('src'); > 261 | expect(src, `食物条目 ${i + 1} 应有配图 src`).toBeTruthy(); | ^ 262 | expect((src || '').trim().length).toBeGreaterThan(0); 263 | } 264 | at /Users/apple/scott2026/msh-system/tests/e2e/bug-regression.spec.ts:261:45 attachment #1: screenshot (image/png) ────────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B03-食物列表每条目展示图片与营养信息-mobile-chrome-retry1/test-failed-1.png ──────────────────────────────────────────────────────────────────────────────────────────────── attachment #2: video (video/webm) ────────────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B03-食物列表每条目展示图片与营养信息-mobile-chrome-retry1/video.webm ──────────────────────────────────────────────────────────────────────────────────────────────── Error Context: tests/e2e/test-results/bug-regression-TC-B03-食物列表每条目展示图片与营养信息-mobile-chrome-retry1/error-context.md attachment #4: trace (application/zip) ───────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B03-食物列表每条目展示图片与营养信息-mobile-chrome-retry1/trace.zip Usage: npx playwright show-trace tests/e2e/test-results/bug-regression-TC-B03-食物列表每条目展示图片与营养信息-mobile-chrome-retry1/trace.zip ──────────────────────────────────────────────────────────────────────────────────────────────── 1 failed [mobile-chrome] › tests/e2e/bug-regression.spec.ts:238:5 › TC-B03 食物列表每条目展示图片与营养信息 ───────────── 1 passed (1.2m) ═══════════════════════════════════════════════ [2026-03-02 17:14:09] ▶ 阶段 4 — 复杂修复(BUG-004, BUG-005) ═══════════════════════════════════════════════ [2026-03-02 17:14:09] [BUG-004] 启动 Cursor Agent 修复... BUG-004 已按你的要求修好,修改总结如下。 --- ## 1. 根因(API 参数错误) - **后端**:`ToolController.getFoodDetail(@PathVariable Long id)` 只接受 **Long 类型 id**。 - **前端**:食物百科列表跳转详情时用了 **`item.name`**(如「羊肉(熟)」「儿童营养饼干」),导致后端报 `NumberFormatException`,接口失败,页面只提示「数据加载失败」。 日志中可见:`Failed to convert value of type 'java.lang.String' to required type 'java.lang.Long'`. --- ## 2. 修改内容 ### 2.1 `msh_single_uniapp/pages/tool/food-encyclopedia.vue` - **跳转参数**:改为传 **`item.id`**(后端列表返回的 `id`),不再传 `item.name`。 - 若某条没有 `id`,则回退为 `item.name`,并对 name 做 `encodeURIComponent`,避免中文等字符在 URL 里出错。 ```javascript // 后端详情接口需要 Long 类型 id,传 id 而非 name const id = item.id != null ? item.id : item.name url: `/pages/tool/food-detail?id=${encodeURIComponent(id)}` ``` 这样从列表点进详情会带正确的 id,接口可正常返回数据。 --- ### 2.2 `msh_single_uniapp/pages/tool/food-detail.vue` 1. **请求参数打印** - `onLoad`:`console.log('[food-detail] onLoad params:', { id: options.id, name: options.name })` - `loadFoodData`:`console.log('[food-detail] getFoodDetail request param:', { id, type: typeof id })` 便于确认传参是否正确。 2. **`loadError` 与调试** - 增加 `loadError: ''`。 - 在 `loadFoodData` 的 **catch** 里把 `loadError` 设为具体错误信息(`error.message || error.msg || error`),便于调试。 3. **失败时用默认数据 + 缓存提示** - 抽取 **`applyDefaultFoodData(clearError)`**:用 `defaultFoodData` 填充 `foodData`,并对 `keyNutrients`、`nutritionTable` 做数组拷贝,保证不为空数组、能正常渲染 `.food-name-overlay` / `.nutrient-card` / `.nutrition-row`。 - 在 catch 里:先设置 `loadError`,再调用 `applyDefaultFoodData(false)`(不再清空 `loadError`),并保留原有 `showToast('数据加载失败')`。 - 无入参时仍走默认数据,此时调用 `applyDefaultFoodData()` 会清空 `loadError`。 4. **「当前数据来自缓存」提示** - 当 `loadError` 有值时,在页面顶部展示提示条:「当前数据来自缓存,可能不是最新」,并增加 `.cache-notice` 样式。 5. **默认数据下的展示** - `defaultFoodData` 已包含完整的 `name`、`category`、`safetyTag`、`image`、`keyNutrients`、`nutritionTable`(均为非空数组),应用 `applyDefaultFoodData` 后,`.food-name-overlay`、`.nutrient-card`、`.nutrition-row` 在默认数据下也能正常渲染。 6. **样式** - 为 `.nutrition-dot` 增加 `&.high`,避免后端返回 `level: 'high'` 时缺样式。 --- ## 3. 行为小结 | 场景 | 行为 | |----------------|------| | 列表点击条目 | 传 `item.id`,详情接口用 id 请求,正常展示该食物。 | | 接口失败/异常 | 设置 `loadError`、用 `defaultFoodData` 填页面、Toast「数据加载失败」、顶部显示「当前数据来自缓存,可能不是最新」,名称/营养成分等仍可正常显示。 | | 无 id/name 入参 | 直接使用默认数据,不显示缓存提示。 | 按当前逻辑,从食物百科点进详情应能正常看到名称和营养成分;若接口仍失败,会显示默认示例数据并提示「当前数据来自缓存,可能不是最新」,同时控制台和 `loadError` 可用来排查具体错误。 [2026-03-02 17:18:12] [BUG-004] Agent 执行完成 → /Users/apple/scott2026/msh-system/scripts/logs/agent-BUG-004-171409.log [2026-03-02 17:18:12] [BUG-005] 启动 Cursor Agent 修复... BUG-005 相关修改已按你的要求做完,结论与改动如下。 --- ## 1. 问题原因 - **前端**:创建对话后从 `response.data.chat` 取 `conversation_id`、`id`,但后端返回的是 `CozeBaseResponse.success(resp)`,`data` 就是 Coze 的 CreateChatResp,没有嵌套的 `chat`,且多为 camelCase(如 `conversationID`)。因此取不到会话/聊天 ID,轮询失败,请求在 catch 里走本地兜底 `getAIResponse(content)`,看起来就像“固定一段话”。 - **后端**:Coze 实现里没有发现硬编码占位词,用户内容来自 `additionalMessages[0].content`。已做的修改是“无用户消息时不发请求”的防护。 --- ## 2. 前端修改(`msh_single_uniapp/pages/tool/ai-nutritionist.vue`) - **创建对话响应解析** - 兼容 `response.data.chat` 与 `response.data`。 - 兼容 `conversation_id` / `conversationID` / `conversationId` 和 `id`。 - 只有拿到 `conversationId` 和 `chatId` 后才调用 `pollChatStatus`,否则抛出明确错误。 - **轮询状态** - 使用 `const chatObj = res.data.chat || res.data` 再取 `status`,避免因结构不同取不到状态。 - **消息列表** - 支持 `res.data.messages` 或 `res.data` 为数组两种结构,用 `rawMessages` 统一处理,保证 AI 回复用 `role: 'ai', content: msg.content` 正确 push 到 `messageList`。 未改 UI,只修了数据流;`sendMessage` / `sendToAI` 里用的始终是 `inputText.trim()` → `content`,请求体已正确带用户输入。 --- ## 3. 后端修改(`ToolCozeServiceImpl.java`) - **无用户消息时不调用 Coze** - `chat()` 与 `chatStream()` 中:若 `buildMessages(request)` 为空,则不再调用 Coze,直接返回错误(如“请提供对话内容”),避免“空请求”导致平台返回欢迎语等固定回复。 未改动 `ToolKieAIServiceImpl.java`:该文件是 Gemini 对话实现,营养师页走的是 Coze(`/api/front/coze/chat`);且其中没有硬编码占位词,prompt 来自 `KieAIGeminiChatRequest.getMessages()`,因此按要求未修改。 --- ## 4. 修改汇总 | 文件 | 修改内容 | |------|----------| | `ai-nutritionist.vue` | 修正 create-chat 响应解析(data / data.chat、camel/snake);轮询与消息列表兼容不同返回结构;保证 AI 回复写入 `messageList`。 | | `ToolCozeServiceImpl.java` | 在 `chat` / `chatStream` 中增加“无用户消息则不请求 Coze”的校验。 | | `ToolKieAIServiceImpl.java` | 未修改(非本接口且无硬编码)。 | 按当前逻辑,用户输入会正确传到 Coze,且能正确解析创建对话与轮询结果,AI 的真实回复会显示在列表中,而不再被固定兜底文案覆盖。 [2026-03-02 17:22:19] [BUG-005] Agent 执行完成 → /Users/apple/scott2026/msh-system/scripts/logs/agent-BUG-005-171812.log [2026-03-02 17:22:19] [阶段4] 阶段4修复完成,进行局部验证... [2026-03-02 17:22:19] [TEST] 验证: TC-B04|TC-B05 Running 2 tests using 1 worker ✓ 1 [mobile-chrome] › tests/e2e/bug-regression.spec.ts:277:5 › TC-B04 食物详情页正常加载内容 (20.0s) ✘ 2 [mobile-chrome] › tests/e2e/bug-regression.spec.ts:311:5 › TC-B05 AI针对不同问题返回差异化回复 (30.7s) ✘ 3 [mobile-chrome] › tests/e2e/bug-regression.spec.ts:311:5 › TC-B05 AI针对不同问题返回差异化回复 (retry #1) (30.6s) 1) [mobile-chrome] › tests/e2e/bug-regression.spec.ts:311:5 › TC-B05 AI针对不同问题返回差异化回复 ───────────── Test timeout of 30000ms exceeded. Error: locator.click: Test timeout of 30000ms exceeded. Call log:  - waiting for locator('.send-btn, .submit-btn').filter({ hasText: /发送/ }).first() 324 | await textInput.fill('什么食物富含蛋白质?'); 325 | const sendBtn = page.locator('.send-btn, .submit-btn').filter({ hasText: /发送/ }).first(); > 326 | await sendBtn.click(); | ^ 327 | await page.waitForTimeout(6000); 328 | 329 | const aiMessages1 = page.locator('.message-item.ai-message .message-text'); at /Users/apple/scott2026/msh-system/tests/e2e/bug-regression.spec.ts:326:17 attachment #1: screenshot (image/png) ────────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B05-AI针对不同问题返回差异化回复-mobile-chrome/test-failed-1.png ──────────────────────────────────────────────────────────────────────────────────────────────── attachment #2: video (video/webm) ────────────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B05-AI针对不同问题返回差异化回复-mobile-chrome/video.webm ──────────────────────────────────────────────────────────────────────────────────────────────── Error Context: tests/e2e/test-results/bug-regression-TC-B05-AI针对不同问题返回差异化回复-mobile-chrome/error-context.md attachment #4: trace (application/zip) ───────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B05-AI针对不同问题返回差异化回复-mobile-chrome/trace.zip Usage: npx playwright show-trace tests/e2e/test-results/bug-regression-TC-B05-AI针对不同问题返回差异化回复-mobile-chrome/trace.zip ──────────────────────────────────────────────────────────────────────────────────────────────── Retry #1 ─────────────────────────────────────────────────────────────────────────────────────── Test timeout of 30000ms exceeded. Error: locator.click: Test timeout of 30000ms exceeded. Call log:  - waiting for locator('.send-btn, .submit-btn').filter({ hasText: /发送/ }).first() 324 | await textInput.fill('什么食物富含蛋白质?'); 325 | const sendBtn = page.locator('.send-btn, .submit-btn').filter({ hasText: /发送/ }).first(); > 326 | await sendBtn.click(); | ^ 327 | await page.waitForTimeout(6000); 328 | 329 | const aiMessages1 = page.locator('.message-item.ai-message .message-text'); at /Users/apple/scott2026/msh-system/tests/e2e/bug-regression.spec.ts:326:17 attachment #1: screenshot (image/png) ────────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B05-AI针对不同问题返回差异化回复-mobile-chrome-retry1/test-failed-1.png ──────────────────────────────────────────────────────────────────────────────────────────────── attachment #2: video (video/webm) ────────────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B05-AI针对不同问题返回差异化回复-mobile-chrome-retry1/video.webm ──────────────────────────────────────────────────────────────────────────────────────────────── Error Context: tests/e2e/test-results/bug-regression-TC-B05-AI针对不同问题返回差异化回复-mobile-chrome-retry1/error-context.md attachment #4: trace (application/zip) ───────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B05-AI针对不同问题返回差异化回复-mobile-chrome-retry1/trace.zip Usage: npx playwright show-trace tests/e2e/test-results/bug-regression-TC-B05-AI针对不同问题返回差异化回复-mobile-chrome-retry1/trace.zip ──────────────────────────────────────────────────────────────────────────────────────────────── 1 failed [mobile-chrome] › tests/e2e/bug-regression.spec.ts:311:5 › TC-B05 AI针对不同问题返回差异化回复 ────────────── 1 passed (1.6m) ═══════════════════════════════════════════════ [2026-03-02 17:23:57] ▶ 阶段 5 — 全量回归测试 + 报告生成 ═══════════════════════════════════════════════ [2026-03-02 17:23:57] [TEST] 全量回归测试... Running 10 tests using 1 worker ✓ 1 [mobile-chrome] › tests/e2e/bug-regression.spec.ts:114:5 › TC-B01a 打卡前积分无提前跳变 (7.4s) ✘ 2 [mobile-chrome] › tests/e2e/bug-regression.spec.ts:139:5 › TC-B01b 打卡后积分按规则累加 (11.6s) ✘ 3 [mobile-chrome] › tests/e2e/bug-regression.spec.ts:139:5 › TC-B01b 打卡后积分按规则累加 (retry #1) (11.6s) ✘ 4 [mobile-chrome] › tests/e2e/bug-regression.spec.ts:171:5 › TC-B02 计算结果页 Tab 切换选中状态清晰 (30.6s) ✘ 5 [mobile-chrome] › tests/e2e/bug-regression.spec.ts:171:5 › TC-B02 计算结果页 Tab 切换选中状态清晰 (retry #1) (30.5s) ✘ 6 [mobile-chrome] › tests/e2e/bug-regression.spec.ts:238:5 › TC-B03 食物列表每条目展示图片与营养信息 (18.2s) ✘ 7 [mobile-chrome] › tests/e2e/bug-regression.spec.ts:238:5 › TC-B03 食物列表每条目展示图片与营养信息 (retry #1) (16.4s) ✓ 8 [mobile-chrome] › tests/e2e/bug-regression.spec.ts:277:5 › TC-B04 食物详情页正常加载内容 (19.3s) ✘ 9 [mobile-chrome] › tests/e2e/bug-regression.spec.ts:311:5 › TC-B05 AI针对不同问题返回差异化回复 (30.6s) ✘ 10 [mobile-chrome] › tests/e2e/bug-regression.spec.ts:311:5 › TC-B05 AI针对不同问题返回差异化回复 (retry #1) (30.9s) ✘ 11 [mobile-chrome] › tests/e2e/bug-regression.spec.ts:352:5 › TC-B06 健康知识与营养知识名称统一性 (31.8s) ✘ 12 [mobile-chrome] › tests/e2e/bug-regression.spec.ts:352:5 › TC-B06 健康知识与营养知识名称统一性 (retry #1) (31.6s) ✓ 13 [mobile-chrome] › tests/e2e/bug-regression.spec.ts:386:5 › TC-B07 饮食指南和科普文章详情页有正常内容 (8.5s) ✓ 14 [mobile-chrome] › tests/e2e/bug-regression.spec.ts:433:5 › TC-B08 帖子详情页展示营养统计数据 (8.1s) ✓ 15 [mobile-chrome] › tests/e2e/bug-regression.spec.ts:468:5 › TC-B09 社区 Tab 标签和帖子类型均使用中文 (4.8s) 1) [mobile-chrome] › tests/e2e/bug-regression.spec.ts:139:5 › TC-B01b 打卡后积分按规则累加 ───────────────── Error: 打卡成功后积分应至少增加 30 expect(received).toBeGreaterThanOrEqual(expected) Expected: >= 40 Received: 10 158 | const afterText = await afterEl.textContent(); 159 | const afterPoints = parsePointsFromText(afterText || ''); > 160 | expect(afterPoints, '打卡成功后积分应至少增加 30').toBeGreaterThanOrEqual(initialPoints + 30); | ^ 161 | } else { 162 | test.skip(); 163 | } at /Users/apple/scott2026/msh-system/tests/e2e/bug-regression.spec.ts:160:44 attachment #1: screenshot (image/png) ────────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B01b-打卡后积分按规则累加-mobile-chrome/test-failed-1.png ──────────────────────────────────────────────────────────────────────────────────────────────── attachment #2: video (video/webm) ────────────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B01b-打卡后积分按规则累加-mobile-chrome/video.webm ──────────────────────────────────────────────────────────────────────────────────────────────── Error Context: tests/e2e/test-results/bug-regression-TC-B01b-打卡后积分按规则累加-mobile-chrome/error-context.md attachment #4: trace (application/zip) ───────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B01b-打卡后积分按规则累加-mobile-chrome/trace.zip Usage: npx playwright show-trace tests/e2e/test-results/bug-regression-TC-B01b-打卡后积分按规则累加-mobile-chrome/trace.zip ──────────────────────────────────────────────────────────────────────────────────────────────── Retry #1 ─────────────────────────────────────────────────────────────────────────────────────── Error: 打卡成功后积分应至少增加 30 expect(received).toBeGreaterThanOrEqual(expected) Expected: >= 40 Received: 10 158 | const afterText = await afterEl.textContent(); 159 | const afterPoints = parsePointsFromText(afterText || ''); > 160 | expect(afterPoints, '打卡成功后积分应至少增加 30').toBeGreaterThanOrEqual(initialPoints + 30); | ^ 161 | } else { 162 | test.skip(); 163 | } at /Users/apple/scott2026/msh-system/tests/e2e/bug-regression.spec.ts:160:44 attachment #1: screenshot (image/png) ────────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B01b-打卡后积分按规则累加-mobile-chrome-retry1/test-failed-1.png ──────────────────────────────────────────────────────────────────────────────────────────────── attachment #2: video (video/webm) ────────────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B01b-打卡后积分按规则累加-mobile-chrome-retry1/video.webm ──────────────────────────────────────────────────────────────────────────────────────────────── Error Context: tests/e2e/test-results/bug-regression-TC-B01b-打卡后积分按规则累加-mobile-chrome-retry1/error-context.md attachment #4: trace (application/zip) ───────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B01b-打卡后积分按规则累加-mobile-chrome-retry1/trace.zip Usage: npx playwright show-trace tests/e2e/test-results/bug-regression-TC-B01b-打卡后积分按规则累加-mobile-chrome-retry1/trace.zip ──────────────────────────────────────────────────────────────────────────────────────────────── 2) [mobile-chrome] › tests/e2e/bug-regression.spec.ts:171:5 › TC-B02 计算结果页 Tab 切换选中状态清晰 ────────── Test timeout of 30000ms exceeded. Error: locator.click: Test timeout of 30000ms exceeded. Call log:  - waiting for locator('.submit-btn, .calc-btn, button').filter({ hasText: /计算|确定|提交/ }).first() 196 | 197 | const calcBtn = page.locator('.submit-btn, .calc-btn, button').filter({ hasText: /计算|确定|提交/ }).first(); > 198 | await calcBtn.click(); | ^ 199 | await page.waitForTimeout(3500); 200 | 201 | const resultPage = page.locator('.result-page').first(); at /Users/apple/scott2026/msh-system/tests/e2e/bug-regression.spec.ts:198:17 attachment #1: screenshot (image/png) ────────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B02-计算结果页-Tab-切换选中状态清晰-mobile-chrome/test-failed-1.png ──────────────────────────────────────────────────────────────────────────────────────────────── attachment #2: video (video/webm) ────────────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B02-计算结果页-Tab-切换选中状态清晰-mobile-chrome/video.webm ──────────────────────────────────────────────────────────────────────────────────────────────── Error Context: tests/e2e/test-results/bug-regression-TC-B02-计算结果页-Tab-切换选中状态清晰-mobile-chrome/error-context.md attachment #4: trace (application/zip) ───────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B02-计算结果页-Tab-切换选中状态清晰-mobile-chrome/trace.zip Usage: npx playwright show-trace tests/e2e/test-results/bug-regression-TC-B02-计算结果页-Tab-切换选中状态清晰-mobile-chrome/trace.zip ──────────────────────────────────────────────────────────────────────────────────────────────── Retry #1 ─────────────────────────────────────────────────────────────────────────────────────── Test timeout of 30000ms exceeded. Error: locator.click: Test timeout of 30000ms exceeded. Call log:  - waiting for locator('.submit-btn, .calc-btn, button').filter({ hasText: /计算|确定|提交/ }).first() 196 | 197 | const calcBtn = page.locator('.submit-btn, .calc-btn, button').filter({ hasText: /计算|确定|提交/ }).first(); > 198 | await calcBtn.click(); | ^ 199 | await page.waitForTimeout(3500); 200 | 201 | const resultPage = page.locator('.result-page').first(); at /Users/apple/scott2026/msh-system/tests/e2e/bug-regression.spec.ts:198:17 attachment #1: screenshot (image/png) ────────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B02-计算结果页-Tab-切换选中状态清晰-mobile-chrome-retry1/test-failed-1.png ──────────────────────────────────────────────────────────────────────────────────────────────── attachment #2: video (video/webm) ────────────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B02-计算结果页-Tab-切换选中状态清晰-mobile-chrome-retry1/video.webm ──────────────────────────────────────────────────────────────────────────────────────────────── Error Context: tests/e2e/test-results/bug-regression-TC-B02-计算结果页-Tab-切换选中状态清晰-mobile-chrome-retry1/error-context.md attachment #4: trace (application/zip) ───────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B02-计算结果页-Tab-切换选中状态清晰-mobile-chrome-retry1/trace.zip Usage: npx playwright show-trace tests/e2e/test-results/bug-regression-TC-B02-计算结果页-Tab-切换选中状态清晰-mobile-chrome-retry1/trace.zip ──────────────────────────────────────────────────────────────────────────────────────────────── 3) [mobile-chrome] › tests/e2e/bug-regression.spec.ts:238:5 › TC-B03 食物列表每条目展示图片与营养信息 ──────────── Error: 食物条目 1 应有配图 src expect(received).toBeTruthy() Received: null 259 | if (await img.count() > 0) { 260 | const src = await img.getAttribute('src'); > 261 | expect(src, `食物条目 ${i + 1} 应有配图 src`).toBeTruthy(); | ^ 262 | expect((src || '').trim().length).toBeGreaterThan(0); 263 | } 264 | at /Users/apple/scott2026/msh-system/tests/e2e/bug-regression.spec.ts:261:45 attachment #1: screenshot (image/png) ────────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B03-食物列表每条目展示图片与营养信息-mobile-chrome/test-failed-1.png ──────────────────────────────────────────────────────────────────────────────────────────────── attachment #2: video (video/webm) ────────────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B03-食物列表每条目展示图片与营养信息-mobile-chrome/video.webm ──────────────────────────────────────────────────────────────────────────────────────────────── Error Context: tests/e2e/test-results/bug-regression-TC-B03-食物列表每条目展示图片与营养信息-mobile-chrome/error-context.md attachment #4: trace (application/zip) ───────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B03-食物列表每条目展示图片与营养信息-mobile-chrome/trace.zip Usage: npx playwright show-trace tests/e2e/test-results/bug-regression-TC-B03-食物列表每条目展示图片与营养信息-mobile-chrome/trace.zip ──────────────────────────────────────────────────────────────────────────────────────────────── Retry #1 ─────────────────────────────────────────────────────────────────────────────────────── Error: 食物条目 1 应有配图 src expect(received).toBeTruthy() Received: null 259 | if (await img.count() > 0) { 260 | const src = await img.getAttribute('src'); > 261 | expect(src, `食物条目 ${i + 1} 应有配图 src`).toBeTruthy(); | ^ 262 | expect((src || '').trim().length).toBeGreaterThan(0); 263 | } 264 | at /Users/apple/scott2026/msh-system/tests/e2e/bug-regression.spec.ts:261:45 attachment #1: screenshot (image/png) ────────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B03-食物列表每条目展示图片与营养信息-mobile-chrome-retry1/test-failed-1.png ──────────────────────────────────────────────────────────────────────────────────────────────── attachment #2: video (video/webm) ────────────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B03-食物列表每条目展示图片与营养信息-mobile-chrome-retry1/video.webm ──────────────────────────────────────────────────────────────────────────────────────────────── Error Context: tests/e2e/test-results/bug-regression-TC-B03-食物列表每条目展示图片与营养信息-mobile-chrome-retry1/error-context.md attachment #4: trace (application/zip) ───────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B03-食物列表每条目展示图片与营养信息-mobile-chrome-retry1/trace.zip Usage: npx playwright show-trace tests/e2e/test-results/bug-regression-TC-B03-食物列表每条目展示图片与营养信息-mobile-chrome-retry1/trace.zip ──────────────────────────────────────────────────────────────────────────────────────────────── 4) [mobile-chrome] › tests/e2e/bug-regression.spec.ts:311:5 › TC-B05 AI针对不同问题返回差异化回复 ───────────── Test timeout of 30000ms exceeded. Error: locator.click: Test timeout of 30000ms exceeded. Call log:  - waiting for locator('.send-btn, .submit-btn').filter({ hasText: /发送/ }).first() 324 | await textInput.fill('什么食物富含蛋白质?'); 325 | const sendBtn = page.locator('.send-btn, .submit-btn').filter({ hasText: /发送/ }).first(); > 326 | await sendBtn.click(); | ^ 327 | await page.waitForTimeout(6000); 328 | 329 | const aiMessages1 = page.locator('.message-item.ai-message .message-text'); at /Users/apple/scott2026/msh-system/tests/e2e/bug-regression.spec.ts:326:17 attachment #1: screenshot (image/png) ────────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B05-AI针对不同问题返回差异化回复-mobile-chrome/test-failed-1.png ──────────────────────────────────────────────────────────────────────────────────────────────── attachment #2: video (video/webm) ────────────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B05-AI针对不同问题返回差异化回复-mobile-chrome/video.webm ──────────────────────────────────────────────────────────────────────────────────────────────── Error Context: tests/e2e/test-results/bug-regression-TC-B05-AI针对不同问题返回差异化回复-mobile-chrome/error-context.md attachment #4: trace (application/zip) ───────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B05-AI针对不同问题返回差异化回复-mobile-chrome/trace.zip Usage: npx playwright show-trace tests/e2e/test-results/bug-regression-TC-B05-AI针对不同问题返回差异化回复-mobile-chrome/trace.zip ──────────────────────────────────────────────────────────────────────────────────────────────── Retry #1 ─────────────────────────────────────────────────────────────────────────────────────── Test timeout of 30000ms exceeded. Error: locator.click: Test timeout of 30000ms exceeded. Call log:  - waiting for locator('.send-btn, .submit-btn').filter({ hasText: /发送/ }).first() 324 | await textInput.fill('什么食物富含蛋白质?'); 325 | const sendBtn = page.locator('.send-btn, .submit-btn').filter({ hasText: /发送/ }).first(); > 326 | await sendBtn.click(); | ^ 327 | await page.waitForTimeout(6000); 328 | 329 | const aiMessages1 = page.locator('.message-item.ai-message .message-text'); at /Users/apple/scott2026/msh-system/tests/e2e/bug-regression.spec.ts:326:17 attachment #1: screenshot (image/png) ────────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B05-AI针对不同问题返回差异化回复-mobile-chrome-retry1/test-failed-1.png ──────────────────────────────────────────────────────────────────────────────────────────────── attachment #2: video (video/webm) ────────────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B05-AI针对不同问题返回差异化回复-mobile-chrome-retry1/video.webm ──────────────────────────────────────────────────────────────────────────────────────────────── Error Context: tests/e2e/test-results/bug-regression-TC-B05-AI针对不同问题返回差异化回复-mobile-chrome-retry1/error-context.md attachment #4: trace (application/zip) ───────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B05-AI针对不同问题返回差异化回复-mobile-chrome-retry1/trace.zip Usage: npx playwright show-trace tests/e2e/test-results/bug-regression-TC-B05-AI针对不同问题返回差异化回复-mobile-chrome-retry1/trace.zip ──────────────────────────────────────────────────────────────────────────────────────────────── 5) [mobile-chrome] › tests/e2e/bug-regression.spec.ts:352:5 › TC-B06 健康知识与营养知识名称统一性 ────────────── Test timeout of 30000ms exceeded. Error: expect(received).toBe(expected) // Object.is equality Expected: true Received: false 373 | 374 | expect(mainIsHealth || mainIsNutrition).toBe(true); > 375 | expect(detailIsHealth || detailIsNutrition).toBe(true); | ^ 376 | expect(mainName === detailName || (mainIsHealth && detailIsHealth) || (mainIsNutrition && detailIsNutrition), 377 | '主页区块名称与营养知识页标题应统一(均为健康知识或均为营养知识)').toBe(true); 378 | at /Users/apple/scott2026/msh-system/tests/e2e/bug-regression.spec.ts:375:47 attachment #1: screenshot (image/png) ────────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B06-健康知识与营养知识名称统一性-mobile-chrome/test-failed-1.png ──────────────────────────────────────────────────────────────────────────────────────────────── attachment #2: video (video/webm) ────────────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B06-健康知识与营养知识名称统一性-mobile-chrome/video.webm ──────────────────────────────────────────────────────────────────────────────────────────────── Error Context: tests/e2e/test-results/bug-regression-TC-B06-健康知识与营养知识名称统一性-mobile-chrome/error-context.md attachment #4: trace (application/zip) ───────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B06-健康知识与营养知识名称统一性-mobile-chrome/trace.zip Usage: npx playwright show-trace tests/e2e/test-results/bug-regression-TC-B06-健康知识与营养知识名称统一性-mobile-chrome/trace.zip ──────────────────────────────────────────────────────────────────────────────────────────────── Retry #1 ─────────────────────────────────────────────────────────────────────────────────────── Test timeout of 30000ms exceeded. Error: expect(received).toBe(expected) // Object.is equality Expected: true Received: false 373 | 374 | expect(mainIsHealth || mainIsNutrition).toBe(true); > 375 | expect(detailIsHealth || detailIsNutrition).toBe(true); | ^ 376 | expect(mainName === detailName || (mainIsHealth && detailIsHealth) || (mainIsNutrition && detailIsNutrition), 377 | '主页区块名称与营养知识页标题应统一(均为健康知识或均为营养知识)').toBe(true); 378 | at /Users/apple/scott2026/msh-system/tests/e2e/bug-regression.spec.ts:375:47 attachment #1: screenshot (image/png) ────────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B06-健康知识与营养知识名称统一性-mobile-chrome-retry1/test-failed-1.png ──────────────────────────────────────────────────────────────────────────────────────────────── attachment #2: video (video/webm) ────────────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B06-健康知识与营养知识名称统一性-mobile-chrome-retry1/video.webm ──────────────────────────────────────────────────────────────────────────────────────────────── Error Context: tests/e2e/test-results/bug-regression-TC-B06-健康知识与营养知识名称统一性-mobile-chrome-retry1/error-context.md attachment #4: trace (application/zip) ───────────────────────────────────────────────────────── tests/e2e/test-results/bug-regression-TC-B06-健康知识与营养知识名称统一性-mobile-chrome-retry1/trace.zip Usage: npx playwright show-trace tests/e2e/test-results/bug-regression-TC-B06-健康知识与营养知识名称统一性-mobile-chrome-retry1/trace.zip ──────────────────────────────────────────────────────────────────────────────────────────────── 5 failed [mobile-chrome] › tests/e2e/bug-regression.spec.ts:139:5 › TC-B01b 打卡后积分按规则累加 ────────────────── [mobile-chrome] › tests/e2e/bug-regression.spec.ts:171:5 › TC-B02 计算结果页 Tab 切换选中状态清晰 ─────────── [mobile-chrome] › tests/e2e/bug-regression.spec.ts:238:5 › TC-B03 食物列表每条目展示图片与营养信息 ───────────── [mobile-chrome] › tests/e2e/bug-regression.spec.ts:311:5 › TC-B05 AI针对不同问题返回差异化回复 ────────────── [mobile-chrome] › tests/e2e/bug-regression.spec.ts:352:5 › TC-B06 健康知识与营养知识名称统一性 ─────────────── 5 passed (5.7m) [2026-03-02 17:29:45] [TEST] 全量回归完成,报告: tests/e2e/reports/index.html [2026-03-02 17:29:45] ──────────────────────────────────────────────── [2026-03-02 17:29:45] 全部阶段完成!总耗时:45 分钟(2722 秒) [2026-03-02 17:29:45] 回归报告:/Users/apple/scott2026/msh-system/tests/e2e/reports/index.html [2026-03-02 17:29:45] 详细日志:/Users/apple/scott2026/msh-system/scripts/logs/fix-bugs-20260302_1644.log [2026-03-02 17:29:45] ────────────────────────────────────────────────