Commit Graph

59 Commits

Author SHA1 Message Date
msh-agent
6187a92029 feat(food-encyclopedia): 按分类配置兜底占位图(test-0415 反馈4-2)
- 按 categoryType / category 文案映射到 8 个分类(grain/vegetable/fruit/meat/seafood/dairy/bean/nut)
- 占位图使用对应 emoji + 浅色背景,零新增图片资源
- 远程图加载失败/为空时自动回退到分类占位

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-03 02:19:05 +08:00
msh-agent
c089e8c2be fix(food-encyclopedia): 解决列表页首屏闪烁(test-0415 反馈4-3)
- foodList 初始化由 figma mock 数据改为空数组,加 foodLoaded 标记 API 完成态
- 首屏未拿到数据时显示骨架占位,避免短暂展示无效 figma 图片造成闪烁
- 同步收纳已存在的 scroll-view 高度修复(BUG-003)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-03 02:11:01 +08:00
msh-agent
e9c2404b2b fix(food-encyclopedia): 前台食物图片输出归一化,修复uniapp部分图片不显示
- ToolFoodServiceImpl 新增 normalizeImageForOutput:定位 "crmebimage/" 片段,剥掉前面所有 host 前缀,再用 prefixImage 拼上单层 cdnUrl
- 应用于 search / getDetail / getSimilar 三处 image 输出
- 处理三类历史脏数据:相对路径、双层 host 前缀、AI OSS URL(原样透传)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-03 01:19:07 +08:00
msh-agent
a3b609e70a fix(food-encyclopedia): 后台食物百科列表/编辑页接入并修复图片URL双前缀
- 新增 FoodEncyclopediaController 及 ToolFoodAdminService,提供 /api/admin/tool/food/* CRUD
- ToolFoodAdminServiceImpl 在保存前 clearPrefix 并正则修复历史脏数据中的多层 host 前缀
- 前端 list.vue/edit.vue 修复二次解包导致 listData.list 渲染崩溃
- edit.vue 加载详情时兜底归一化 image 字段,处理 https://host//https://host//crmebimage/... 形式
- content.js 注册 foodManager / foodEdit 路由

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-03 01:08:34 +08:00
msh-agent
d7c870ced7 fix(admin): add distribution views and correct dist ignore rule
Wire router imports to promoter list and retail config pages. Remove the
overbroad dist* gitignore entry that matched src/views/distribution/.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-02 22:49:58 +08:00
msh-agent
b00b9b08b3 chore(crmeb): remove tracked admin and front log files
Stop versioning rotated debug/error logs under crmeb_admin_log and front_log.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-02 22:49:52 +08:00
msh-agent
ceac1c0340 feat(admin): add msh_single_admin project and harden ignore rules
Introduce the new Vue admin project into version control while tightening gitignore patterns to keep env files, logs, build artifacts, and test outputs out of commits.

Made-with: Cursor
2026-04-15 19:32:40 +08:00
msh-agent
a840045fc1 chore: organize root .gitignore
Group rules by purpose; add Playwright report dir, crmeb_log, Cursor CLI, and common backup patterns.

Made-with: Cursor
2026-04-15 18:01:52 +08:00
msh-agent
77632510cf fix: 修复Tool模块相关问题 - 优化签到、社区、食物和AI服务功能 2026-04-12 09:31:00 +08:00
msh-agent
b164d8ba11 feat(ai-chat): 新增豆包API + AI模型配置项支持动态切换
- 后端新增豆包(火山引擎Ark)API集成:DoubaoController、ToolDoubaoServiceImpl,
  使用OkHttp3 SSE流式对话,兼容OpenAI Chat Completions格式
- 新增DoubaoConfig配置类,读取doubao.api.*配置
- 在eb_system_config表新增ai_chat_model配置项,支持doubao/coze/gemini三种模型切换
- 新增GET /api/front/doubao/ai-model-config接口供前端读取当前模型配置
- 前端ai-nutritionist.vue的sendToAI按系统配置分发到_sendViaDoubao/_sendViaCoze/_sendViaGemini
- 前端models-api.js新增doubaoChatStream/doubaoChat/getAiModelConfig函数
- 附带豆包API测试脚本和数据库初始化SQL

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-11 18:03:21 +08:00
msh-agent
58ea76498f fix(streaming): 修正流式输出的端点URL和防缓冲header
前端:
- kieaiGeminiChatStream URL 从 /gemini/chat 改为 /gemini/chat/stream
  (后者声明了 produces=text/event-stream,nginx 不会缓冲)
- 请求 header 增加 Accept: text/event-stream

后端:
- KieAIController.geminiChatStream 补充防缓冲 header:
  X-Accel-Buffering: no + Cache-Control: no-cache
  (与 CozeController.chatStream 对齐,防止 nginx 缓冲 SSE)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-11 15:51:32 +08:00
msh-agent
19b6dc1d2b fix(food-encyclopedia): 修复点击食物卡片 item 为 undefined 的根因
根因:小程序编译时 @click="goToFoodDetail(item)" 通过 dataset 传递
复杂对象,scroll-view 内 DOM 回收或列表异步刷新后 dataset 序列化
丢失,导致 item 变为 undefined。

修复:
1. 模板改为 @click="handleFoodItemClick(index)" 传递基本类型
2. 新增 handleFoodItemClick 方法,从 filteredFoodList 实时取 item
3. foodRowKey 始终拼接 index 避免重复 id 导致 Vue DOM 复用错乱

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-11 15:46:06 +08:00
msh-agent
5b08211fa2 style(ai-nutritionist): emoji按钮替换为iconfont图标
将消息操作按钮从emoji替换为项目iconfont图标:
- 复制:icon-fuzhi
- 重新生成:icon-shuaxin
- 语音朗读:icon-laba(播放中高亮)
- 删除:icon-shanchu

按钮样式优化:圆角方形背景、统一灰色调、hover反馈

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-11 15:42:28 +08:00
msh-agent
dce899f655 fix: 测试反馈0403修改 — 百科Bug修复/份数→克数/AI对话增强/流式输出
1. [P0] food-encyclopedia: 修复 goToFoodDetail TypeError 报错
   - 增加 item 空值防御性校验
   - 加固 filteredFoodList 过滤无效项

2. [P1] calculator-result: 食物份数建议改为克数
   - 模板展示从"X份"改为"X克"
   - applyResult 数据适配:优先读 gram 字段,兜底 portion * gramPerServing 换算

3. [P2] ai-nutritionist: 新增消息操作按钮(复制/重新生成/删除)
   - AI消息气泡下方新增 msg-actions 按钮组
   - 复制到剪贴板、删除单条消息、重新生成最后一条AI回复

4. [P2] ai-nutritionist + models-api: 启用流式输出改善响应速度
   - 新增 kieaiGeminiChatStream 函数(SSE + enableChunked)
   - sendToAI 优先走流式,失败自动降级为非流式

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-11 15:20:10 +08:00
msh-agent
2facd355ab feat(ai-nutritionist): Coze TTS and streaming robustness
- Add Coze TTS endpoint and service; expose binary MP3 from controller.
- Bypass ResponseFilter for /audio/speech so MP3 bodies are not UTF-8 wrapped.
- UniApp: cozeTextToSpeech, TTS UI and play flow; SSE HTTP errors and diagnostics.
- Document TTS in docs/features.md; extend test-0325-1 with curl verification.

Made-with: Cursor
2026-03-31 07:07:21 +08:00
panchengyong
35052d655f chore: 更新测试文档 test-0325-1 与 IDEA 配置
- docs/Testing:标题行微调
- .idea:compiler.xml、jarRepositories.xml

Made-with: Cursor
2026-03-30 12:50:38 +08:00
panchengyong
3023115bb0 fix: 移除损坏的 Claude gitlink 并同步业务与文档更新
- 从索引移除误记录的 .claude/worktrees gitlink(旧绝对路径会导致 git 命令失败)
- 新增根目录 .gitignore 忽略 .claude/worktrees 与 .DS_Store
- 后端:Coze/知识库、ResultAdvice、应用配置
- 前端 uniapp:AI 营养、食物百科等页面与 API
- 更新 README、测试文档与 shop-msh.sql

Made-with: Cursor
2026-03-30 12:46:24 +08:00
panchengyong
3329a2b296 fix(ai-nutritionist): unwrap double-layer Coze API responses
CRMEB wraps CozeBaseResponse again, so chat/retrieve/message payloads live at response.data.data. Added unwrapCozeResponse() and applied it to sendToAI, pollChatStatus, and getChatMessages. Updated test log.

Made-with: Cursor
2026-03-25 17:21:12 +08:00
Developer
6ec9487597 feat: 营养素AI生成落库 + AI营养师消息级loading占位(设计文档对齐)
后端:
- ToolKnowledgeService/Impl 新增 generateNutrientContent()
  调用 Coze AI 批量生成6种营养素(蛋白质/钾/磷/钠/钙/水分)
  科普内容并写入 v2_knowledge,已存在的自动跳过
- ToolController 新增 POST /tool/knowledge/generate-nutrients
  端点(管理端一次性调用后自动补充封面图)
- 新增 SQL 备用脚本 migration_2026-03-25_nutrient_knowledge.sql
  含6种营养素完整JSON,直接执行可跳过AI生成

前端(ai-nutritionist.vue,对齐功能开发详细设计文档任务3-2):
- 新增 sleep(ms) 工具方法
- sendToAI 发起前先推入 {loading:true} 占位气泡
- pollChatStatus 轮询间隔由 1000ms 调整为 1500ms
- getChatMessages 回调填充占位气泡(不再 push 新消息)
- 所有错误/超时/失败路径统一更新 aiMsg.loading=false

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-25 15:32:53 +08:00
Developer
24f75d198c fix: 营养素详情页修复 API 空响应未走本地兜底的问题
- loadNutrientData() 判断由 if(res.data) 改为
  if(res.data && Object.keys(res.data).length > 0 && res.data.name)
- 当后端 v2_knowledge 表无该营养素记录时(返回{})
  自动降级到本地 nutrientMap 展示内置数据
- 不影响正常有数据时的 API 优先逻辑

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-25 15:14:14 +08:00
Developer
355895dba2 fix: 修复手动测试发现的3项问题
1. food-encyclopedia: 修复 v-for key id:index TypeError
   - :key 改为 :key="index",避免 WeChat 小程序 key 表达式异常
   - filteredFoodList 加本地搜索过滤 + null item 过滤
   - normalizeFoodItem 新增英文→中文分类名映射(grain→谷薯类等)
   - loadFoodList/handleSearch 过滤 null 条目

2. ToolKnowledgeServiceImpl: 修复 TooManyResultsException
   - getNutrientDetail 查询新增 LIMIT 1 + ORDER BY knowledge_id DESC
   - 防止 DB 中同名营养素存在多条导致 selectOne 异常

3. ai-nutritionist: 统一走 Coze API,移除 KieAI Gemini 路径
   - sendToAI 文本/多模态均改为 api.cozeChat + pollChatStatus
   - 支持 type='text'/'multimodal'/图片 三种消息类型构建

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-25 14:54:31 +08:00
Developer
ba08abd374 fix: 修复6项测试问题并补全配套资源
- 修复油脂类食物推荐量系数 (5.7→2.5) [ToolCalculatorServiceImpl]
- AI营养师接入真实Coze API,替换Mock回复 [ToolAiNutritionistServiceImpl]
- 食物百科详情新增钙/铁/维C/嘌呤/重量基准字段返回 [ToolFoodServiceImpl]
- V2Food模型新增purine、servingSize字段 [V2Food.java]
- 食物百科详情页动态重量标注+新增4项营养展示+替换Figma URL [food-detail.vue]
- 修复营养素列表dataset传参Bug(WeChat camelCase) [nutrition-knowledge.vue]
- 营养素详情页接入后端API+兜底本地数据+替换Figma URL [nutrient-detail.vue]
- 新增数据库迁移脚本及参考初始化数据 [docs/sql/]
- 新增前端占位图标5个 [static/images/]
- 新增开发任务完成报告 [docs/]

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-25 14:18:00 +08:00
Claude
a5de6fb46d docs: 新增功能开发详细设计文档(以前端页面为维度)
基于测试问题分析报告,按6个前端页面拆分开发任务,含代码示例、自测清单和工时估算

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-25 11:23:21 +08:00
Claude
45ac22d725 docs: 更新测试分析报告,补充具体修复方案
- 问题二:AI营养师改为统一调用Coze API + SSE流式响应
- 问题三:参考ishen365补全食物成分表,利用已有DishImageService批量生图落库
- 问题四:营养素内容改为通过Coze AI生成后写入v2_knowledge表

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-24 07:06:37 +08:00
Claude
584ff3b666 docs: 新增测试问题分析报告(食谱计算器/AI营养师/食物百科/健康知识)
针对测试反馈的四个问题进行代码级分析,包含根因定位、涉及文件和修复建议。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-22 10:18:18 +08:00
msh-agent
c1857ce852 fix: 修复关注按钮相关问题
- 食谱详情页: 修复 applyDefaultData 中未定义变量 id 的问题
- 帖子详情页: 优化 toggleFollow 方法,提前校验 author.id,兼容多种后端字段
- 为帖子详情页已关注状态添加灰色样式
2026-03-09 18:56:53 +08:00
panchengyong
b516089c4f change deploy.conf 2026-03-09 16:59:02 +08:00
panchengyong
eaa9c8fe75 change deploy.conf 2026-03-09 16:57:46 +08:00
panchengyong
6529793a93 fix bug 2026-03-09 15:45:36 +08:00
panchengyong
c69ce2891f feat: 帖子详情页 - 当前登录用户不显示关注按钮
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-09 15:39:09 +08:00
panchengyong
4ace4452a0 fix: 修复 fillNutrition 中 ClassCastException 及 parseWorkflowResponse 解析失败
- 新增 extractOutputMap() 支持两种策略:
  Strategy 1:output 以 '"' 开头时,先用 JSON.parseObject(str, String.class)
  解码 \" \n 等转义序列,再提取内部 {...}
  Strategy 2:直接 indexOf('{') / lastIndexOf('}') 提取 JSON 对象
- 新增 extractJsonObject() 辅助方法统一提取 {...} 片段
- 修复 line 684 unsafe cast:改为 instanceof Map 检查,避免 ClassCastException

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-09 15:27:36 +08:00
panchengyong
5d4f79fe03 fix: workflow() 返回 resp.getData() 而非整个 RunWorkflowResp 对象
parseWorkflowResponse 只能处理 Map/String 类型,
之前传入了 RunWorkflowResp 对象导致直接返回 null。
改为传入 resp.getData()(JSON 字符串)使解析逻辑正常工作。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 14:46:47 +08:00
panchengyong
7b51a1bcf7 fix: 修复 parseWorkflowResponse 处理包含额外文本的 JSON 输出
Coze 工作流返回的 output 字段包含:
1. 双编码的 JSON 字符串
2. JSON 对象后面跟着额外的注释/说明文本

修复方案:
- 从字符串中提取 JSON 对象部分(从 { 开始到 } 结束)
- 仅解析 JSON 部分,忽略后面的注释文本

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 14:37:49 +08:00
panchengyong
9f64233cae fix: 修复 parseWorkflowResponse 解析 Coze 工作流双编码 JSON 数据
Coze 工作流返回的 output 字段是双编码的 JSON 字符串:
{"output": ""{\\\"calories\\\":...}\""}

修复方案:
1. 第一次解析:JSON.parseObject() 去掉外层引号,得到字符串
2. 第二次解析:JSON.parseObject() 解析该字符串,得到最终的营养数据对象

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 14:24:55 +08:00
panchengyong
379a5c1bd6 fix: 修复 Coze 工作流调用 SocketTimeoutException
CozeAPI.Builder 默认超时仅 5 秒,导致营养分析等耗时工作流请求超时。
将 YAML 中已配置的 connect-timeout(30s) 和 read-timeout(60s) 正确传入 CozeAPI 客户端。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 14:02:47 +08:00
3ba0601242 feat: 社区帖子详情页自动 AI 填充营养数据
- 在 getDetail() 中添加营养数据为空时的自动填充逻辑
- fillNutritionByAi() 方法调用 Coze 工作流 7613879935811354687
- 统一参数: input(帖子内容) + img(图片URL)
- fillNutrition() 同样添加 img 参数支持
2026-03-08 15:13:32 +08:00
314a29ea70 feat: 打卡详情页一键分享到社区功能
- 新增后端接口 POST /api/front/tool/checkin/{checkinId}/share-to-community
- 实现 shareCheckinToCommunity 方法,复制打卡数据到社区帖子表
- 前端修改 handleCopyCheckin 方法,直接调用后端接口创建帖子
- 支持将打卡图片、描述、营养分析数据复制到社区
- 添加重复分享检查,防止重复创建帖子
- 创建成功后显示提示并可跳转到社区详情页
2026-03-08 00:40:01 +08:00
f692c75f7b feat: 更新前端多个页面和后端服务
- 前端: 更新AI营养师、计算器、打卡、食物详情等页面
- 前端: 更新食物百科、知识详情、营养知识页面
- 前端: 更新社区首页
- 后端: 更新ToolKieAIServiceImpl服务
- API: 更新models-api.js和user.js
2026-03-07 22:26:37 +08:00
1632801880 ui: 将「AI 补充营养」按钮文字改为「分析营养成分」 2026-03-07 16:40:52 +08:00
8f94035703 feat: 使用Coze工作流自动补齐帖子营养数据
- 后端: fillNutrition()改用Coze工作流7613879935811354687分析营养成分
- 后端: 新增parseWorkflowResponse/nestedToFlat解析工作流响应
- 前端: 页面加载时自动检测并补齐不完整的营养统计
- 修复: ToolKnowledgeServiceImpl编译错误(Integer转Long)

工作流输出格式: output.{calories,protein,potassium,phosphorus}.{value,unit}
2026-03-07 12:36:56 +08:00
d62f934d7f feat: 支持 nutrition_data_json 嵌套格式存储(带 value/unit)
- 新增 flatToNestedForDb() 方法:将扁平格式转换为带 value/unit 的嵌套格式
- 新增 nestedToFlat() 方法:将嵌套格式转换回扁平格式
- 修改 fillNutrition():AI 生成的扁平结果转为嵌套格式后存入数据库
- 保持接口返回格式不变(仍为扁平格式)

支持字段映射:
- energyKcal → calories (kcal)
- proteinG → protein (g)
- potassiumMg → potassium (mg)
- phosphorusMg → phosphorus (mg)
- fatG → fat (g)
- carbohydratesG → carbohydrates (g)
- sodiumG → sodium (g)

由 Cursor CLI 实现
2026-03-05 19:36:36 +08:00
3dc1a24706 fix: 修复帖子详情营养数据为占位符 '-' 时无法从打卡记录补充的问题
根本原因:
- buildNutritionStatsFromDetailData 返回 [{value: '-'}, ...] 而非 []
- loadPostData 用 length===0 判断,但 4 个 '-' 时 length=4,不会走打卡补数据

修复内容:
- 增加 hasValidNutritionStats() 判断,检测是否有至少一项非占位符
- rawStats 映射后若全为 '-' 则返回 []
- formatPostData 中若 nutritionStats 全为占位符则强制设为 []
- 只有无有效营养数据时才调用 fillNutritionStatsFromCheckin 和 fillNutritionFromServer

由 Cursor CLI 检测并修复
2026-03-05 12:16:45 +08:00
cd7b3f6b40 fix: 修复帖子详情营养统计显示全为 "-" 的问题
问题原因:
1. fillNutritionStatsFromCheckin 即使全为 "-" 也会更新视图
2. buildNutritionStatsFromCheckinDetail 钾、磷被写死为 "-"
3. 字段解析不兼容(下划线命名、嵌套对象)

修复内容:
- 仅当至少一项有效值时才更新 nutritionStats
- 兼容多种字段命名(驼峰/下划线/别名)
- 支持从嵌套对象解析(nutrition/dietaryData/mealData/aiResult)
- 补全钾、磷字段解析
- 计算属性保护:全为 "-" 时视为空数组

由 Cursor CLI 检测并修复
2026-03-05 12:08:59 +08:00
cb05cf1044 fix: 修复帖子详情营养数据为空时无法从打卡记录补充的问题
问题原因:
- nutritionDataJson 为 "{}" 时生成 4 项都是 "-" 的数组
- 因为 length===4 而非 0,未触发从打卡详情补数据逻辑

修复内容:
- 空对象 {} 返回 [],触发后续补数据逻辑
- 全为 "-" 的无效数据也返回 []
- 兼容 check_in_record_id 下划线命名
- 当 checkInRecordId 存在且营养数据为空时,自动从打卡详情补充

由 Cursor CLI 检测并修复
2026-03-05 11:28:38 +08:00
9dcb58f056 fix: 修复社区帖子详情页营养统计数据为空的问题
- 修复数据解包逻辑,正确处理 CommonResult 响应
- 新增对 data.nutrition 对象的支持
- 扩展字段映射,支持下划线命名(energy_kcal, protein_g 等)
- 使用 Vue. 保证营养数据响应式更新
- 改进营养 AI 回填的稳定性

由 Cursor CLI 检测并修复
2026-03-05 11:19:03 +08:00
a02529acba fix: Cursor CLI 优化微信小程序兼容性和健壮性
- 添加 scrollViewHeight 明确 scroll-view 高度,修复部分机型滚动失效
- 跳转营养素详情时使用 encodeURIComponent 编码中文参数
- 修复代码风格(补充分号)

由 Cursor CLI (agent) 自动检测并修复
2026-03-05 11:02:09 +08:00
50d5b7ebf9 fix: 修复 Vue 模板 data-* 属性绑定语法错误
- 将 data-nutrient-index/data-item-id/data-item-kid 的 {{ }} 插值语法
  改为 v-bind (:) 简写语法
- 适配 Vue 2 模板编译规范

Error: Interpolation inside attributes has been removed.
Use v-bind or the colon shorthand instead.
2026-03-05 10:54:10 +08:00
15ad15b501 fix: 修复微信小程序 v-for 事件绑定兼容性问题
- 修复 v-for 循环中 @click 直接传递 item 导致的错误
- 使用 data- 属性传递数据,通过 event.currentTarget.dataset 获取
- 适配微信小程序模板编译限制

Error: v-for 暂不支持循环数据 (env: macOS,mp,1.06.2307250)
2026-03-05 10:47:45 +08:00
22d49935ae fix: 修复食谱收藏接口 ClassCastException 错误
- 修复 toggleRecipeFavorite 方法中 recipeId 类型转换问题
- 支持 Number 和 String 两种类型传入
- 添加参数校验,返回友好的错误提示

Error: java.lang.String cannot be cast to java.lang.Number
2026-03-05 10:43:46 +08:00
d8d2025543 feat: T10 回归测试 Bug 修复与功能完善
修复 BUG-001 至 BUG-009 及 T10-1 至 T10-6 相关问题:
- 打卡积分显示与累加逻辑优化
- 食谱计算器 Tab 选中样式修复
- 食物百科列表图片与简介展示修复
- 食物详情页数据加载修复
- AI营养师差异化回复优化
- 健康知识/营养知识名称统一
- 饮食指南/科普文章详情页内容展示修复
- 帖子营养统计数据展示修复
- 社区帖子类型中文命名统一
- 帖子详情标签中文显示修复
- 食谱营养AI填充功能完善
- 食谱收藏/点赞功能修复

新增:
- ToolNutritionFillService 营养填充服务
- T10 回归测试用例 (Playwright)
- 知识文章数据 SQL 脚本

涉及模块:
- crmeb-common: VO/Request/Response 优化
- crmeb-service: 业务逻辑完善
- crmeb-front: API 接口扩展
- msh_single_uniapp: 前端页面修复
- tests/e2e: 回归测试用例
2026-03-05 09:35:00 +08:00