Files
msh-system/scripts/logs/fix-bugs-20260302_1644.log
scottpan 4be53dcd1b feat: 集成 KieAI 服务,移除 models-integration 子项目
- 添加 Gemini 2.5 Flash 对话接口(流式+非流式)
- 添加 NanoBanana 图像生成/编辑接口
- 添加 Sora2 视频生成接口(文生视频、图生视频、去水印)
- 移除 models-integration 子项目(功能已迁移至主后端)
- 新增测试文档和 Playwright E2E 配置
- 更新前端页面和 API 接口
- 更新后端配置和日志处理
2026-03-03 15:33:50 +08:00

1807 lines
147 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
═══════════════════════════════════════════════
[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 <uni-view class="conter" data-v-831dd3a8="">…</uni-view>
 - 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 <uni-view class="conter" data-v-831dd3a8="">…</uni-view>
 - 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”**
- 有图:`<view class="meal-tag">{{ getMealTypeLabel(item.mealType) }}</view>`
- 无图:`<view class="type-tag">{{ getMealTypeLabel(item.mealType) }}</view>`
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→放心吃/safemoderate→限量吃/limitedrestricted/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] ────────────────────────────────────────────────