Commit Graph

73 Commits

Author SHA1 Message Date
msh-agent
1224ed328b feat(my-profile): 隐藏未开发功能项,新增食谱计算历史入口
- 移除统计卡片中的「关注」(功能未实现)
- 移除「我的健康」中的「健康档案」(未实现)
- 整段隐藏「我的内容」(点赞/收藏/食谱均未实现)
- 「工具与服务」仅保留「邀请有礼」(移除营养师/消息通知/营养指导/用药指导)
- 整段隐藏「设置」(账号/隐私/帮助/关于均未实现);版本号下沉到底部独立展示
- 新增「我的健康」分组下的「食谱计算历史」入口 → /pages/tool/calculator-history
- 同步清理未使用的 data 字段、icon 资源与方法

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-03 03:37:32 +08:00
msh-agent
4b8b391674 feat(checkin): P2 一键借鉴打卡功能落地(test-0415 反馈5-2)
最小修改方案,零 DB 表结构变动:

前端 checkin-publish.vue:
- onLoad 识别 sourcePostId + sourceType=learn → 调 getCommunityDetail 拉原帖
- 预填 selectedImages / selectedMealType / remark(带「[借鉴自 @xxx]」前缀)
- 顶部新增黄色徽章「借鉴自 @xxx」
- handlePublish 提交时透传 sourcePostId 到后端

后端 ToolCheckinServiceImpl.submit:
- 检测 data.sourcePostId,若 notes 没有「借鉴自」字样则追加 [借鉴自 post#id] 标记
- 不新增 UserSign 列,引用关系记录在 notes,便于后续查询展示

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-03 03:34:28 +08:00
msh-agent
df0273de36 feat(checkin): P2-1 打卡任务/福利/邀请最小化方案(test-0415 反馈1-1)
按 PRD 简化版落地,零后端改动:

checkin.vue:
- 任务「内容分享」→ switchTab 到社区 /pages/tool_main/community
- 积分兑换列表 handleExchange → 一律 switchTab 到商城首页 /pages/index/index

welcome-gift.vue:
- 福利大礼包卡片可点击 → 跳商品详情页 /pages/goods/goods_details/index?id=
  · welfareProductId 从 storage 读,运营在 admin 配置后缓存
  · 缺省退化到商城首页
- 去除「步骤1 长按识别二维码」整段及对应 qrCode 资源
- 「立即添加」按钮改用 button open-type='contact' 唤起小程序客服
- H5/APP 兜底走 chatUrl web_page;无配置弹 toast

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-03 03:30:04 +08:00
msh-agent
fde0d555fa feat(calculator): 食谱计算器历史记录功能(test-0415 反馈2-2)
后端:
- GET /api/front/tool/calculator/history 倒序分页返回当前用户记录摘要
- ToolCalculatorService.getHistory(PageParamRequest) 实现
- 摘要含 id / createdAt / bmi / ckdStage / proteinIntake / energyIntake / isAdopted / hasDialysis

前端:
- api/tool.js 新增 getCalculatorHistory(params)
- pages/tool/calculator-history.vue 历史列表页(下拉刷新 + 触底加载)
- 点击行跳转 calculator-result?id=xxx 复用结果页,自然支持「重新载入参数」
- pages.json 注册路由

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-03 03:24:30 +08:00
msh-agent
229181f1e0 feat(calculator): 营养计算结果返回校验规则集(test-0415 反馈2-1)
- NutritionCalculateResponse 新增 validations: List<ValidationRule>
- ValidationRule = { name, value, targetRange, status, reference }
- 当前覆盖 4 条核心规则:
  · BMI(WS/T 428-2013)
  · eGFR(KDIGO 2012 CKD 评估指南)
  · 蛋白质摄入量(KDOQI 2020,按是否透析切换 0.6-0.8 / 1.0-1.2 g/kg)
  · 能量摄入量(KDOQI 2020,30-35 kcal/kg)
- status: normal / below / above / unknown,前端可在结果页给徽标提示
- 用户/医生可据此核对推荐数值是否落在临床指南区间内

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-03 03:21:29 +08:00
msh-agent
31f909247e fix(ai-nutritionist): 图文问答注入营养师 system prompt(test-0415 反馈3-4)
- 旧版多模态消息仅有用户 parts,模型无领域上下文,常回退到通用客套话
- 新增 SYSTEM_NUTRITIONIST:专业中文营养师人设 + 慢病饮食知识 + 非食物兜底
- 仅在含 image_url 时注入,避免影响纯文字流式(3-2)回归
- image 类型用户提示从「请分析这张图片」改为「识别食物,给营养成分与饮食建议」

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-03 03:18:27 +08:00
msh-agent
8868d6f948 perf(ai-nutritionist): 文字流式 + TTS 分句首播(test-0415 反馈3-2/3-3)
3-2 文字回复响应速度:
- _sendViaGemini 由 stream:false 改为 kieaiGeminiChatStream(SSE)
- 首包到达即停 loading 圈、aiMsg.streaming=true 显示打字光标
- 逐 delta 累加到 aiMsg.content,TTFB 由全量等待降至首字节

3-3 TTS 朗读延迟:
- splitTTSSentences 按 [。!?!?;;\n] 切分,超长 80 字硬切
- 首句独立合成立即播放;播放期间预合成下一句形成流水线
- innerAudioContext.onEnded 链式触发 _playNextTTSChunk
- stopTTS 清队列,避免后台残留预合成

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-03 03:17:00 +08:00
msh-agent
e27e094183 fix(asr): 一句话识别 sourceType=1 时支持显式 voiceFormat(test-0415 反馈3-1 续修)
- 老逻辑:req.setVoiceFormat(getVoiceFormat(request.getUrl()))
  sourceType=1 时 url 为空 → 默认 wav → 把 mp3 数据当 wav 给腾讯云 → "Audio decoding failed"
- 修复:TencentAsrRequest 新增 voiceFormat 字段(前端已透传 'mp3')
  ToolTencentAsrServiceImpl.sentenceRecognition 优先使用 request.getVoiceFormat(),
  缺省回落到 getVoiceFormat(url) 兼容老调用

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-03 03:05:37 +08:00
msh-agent
276366f98e docs(test-0415): 更新 fix-plan 状态:P0 8 项全部完成
- 顶部新增 commit 清单表
- 每项补 root cause / 修复要点 / 验收 checklist
- 当前阻塞项明确归属

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-03 02:44:13 +08:00
msh-agent
2c91cfe544 fix(order): 提交订单与拉起支付分离,支持取消后二次支付(test-0415 反馈6-3)
- onCreate 旧逻辑:orderCreate 后直接 getOrderPay → requestPayment,强制弹支付
- 现行:orderCreate 成功后 redirectTo /pages/order/order_payment,由用户主动「去支付」
- payment() else 分支同步纠正,避免重复点击「提交订单」时还会绕过支付页直接拉起
- order_payment 自带重试/取消处理,二次支付链路顺畅

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-03 02:35:54 +08:00
msh-agent
f36f8ff495 fix(customer-service): 客服 chatUrl 在小程序也存储;空值兜底提示(test-0415 反馈6-2)
- 旧版 SET_CHATURL 套了 #ifdef H5 || APP-PLUS,小程序拿不到 chatUrl
- wxChatService 在 chatUrl 为空时弹 toast 提示「客服暂未配置」,避免跳到空白 web 页
- chatConfig 缓存为 null 时回退默认值,防止模板 v-if 取属性报错

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-03 02:34:34 +08:00
msh-agent
33602ea013 fix(cart): 购物车入口由 switchTab 改为 navigate(test-0415 反馈6-1)
- order_addcart 未注册在 tabBar,旧代码 switchTab 静默失败 → 用户点购物车按钮无反应
- goods_details 商品详情页底部购物车 navigator 改 open-type='navigate'
- user/index switchTab/navigateTo 黑名单逻辑反向纠正

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-03 02:32:17 +08:00
msh-agent
5c0beeceb9 fix(community): getDetail 返回 isFollowed 字段,修复关注状态不持久(test-0415 反馈5-1)
- 此前仅回传 isLiked / isCollected,缺少 isFollowed
- 用户每次进入帖子页都显示「+ 关注」,重复点击导致 follow/unfollow 反复无感知
- 同时补全未登录场景的 isLiked/isCollected/isFollowed 默认 false

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-03 02:30:50 +08:00
msh-agent
82735a52b9 fix(ai-nutritionist): 语音录入跳过 OSS 上传,改用一句话识别 base64 直传(test-0415 反馈3-1)
- 旧链路把 mp3 上传到 /api/front/upload/imageOuter,被图片扩展名校验拒绝
- 改为本地读 base64 直接走 /api/front/tencent/asr/sentence-recognition(sourceType=1)
- 适用 ≤60s 短音频场景,命中 ai-nutritionist 限时录音上限 60s 的设计

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-03 02:27:27 +08:00
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