|
|
0197224c75
|
chore:H5所有气泡都统一
|
2026-09-24 11:59:50 +08:00 |
|
|
|
70f8fb867d
|
feat(chat-ui): 增加聊天 UI 配置的本地持久化和预加载功能,优化首帧渲染体验
|
2026-09-24 11:10:21 +08:00 |
|
|
|
86b87eeb9d
|
feat(ai-chat): 聊天 UI 配置 V3 — 名称/头像/时间配置项消费
- CHAT_UI_DEFAULTS 同步后端 4 新键 (show_name/show_avatar/avatar/time_format/time_humanize)
- 标题与 AI 头像按开关显隐, 自定义头像 (素材库 pic_path / URL) 优先于内置
- formatTime 支持 auto(智能分段)/full(完整) 与 humanizeTime 相对时间优先 (刚刚/N分钟前/N小时前/昨天/前天/M月D日/Y年M月D日)
- i18n 中英各+5 键
|
2026-09-24 10:30:28 +08:00 |
|
|
|
297b545e55
|
fix(media-upload): alioss 直传 endpoint 缺 oss- 前缀修复
- sts.region 是简写 (cn-hangzhou), 真实 OSS endpoint 须完整形式 (oss-cn-hangzhou)
- 优先使用后端 sts.oss_url (OssProviderRegistry::buildDirectEndpoint 已拼好), 兜底 oss-${region} 拼接
|
2026-09-24 10:29:55 +08:00 |
|
|
|
3e2ae9b7ca
|
chore
|
2026-09-24 08:51:52 +08:00 |
|
|
|
2016b87b6e
|
chore:回答问题视口随文字增长一直是贴着最新一句往上走。
|
2026-09-23 17:12:11 +08:00 |
|
|
|
a42ad4ebb3
|
chore:新增AI智能问题是否合并回答/单独回答
|
2026-09-23 16:25:39 +08:00 |
|
|
|
158750b933
|
chore:删除AI回答后下面出现修改图标的英文
|
2026-09-23 15:26:36 +08:00 |
|
|
|
3abe65de2a
|
chore:H5的气泡修改
|
2026-09-23 15:22:19 +08:00 |
|
|
|
c0e432cc22
|
chore:微信小程序真机可以自定义复制
|
2026-09-23 15:04:27 +08:00 |
|
|
|
f8115f47fd
|
chore:AI修改新对话按钮图标,搜索记录按钮向上移动,删除AI回答后的AI名称
|
2026-09-23 14:13:54 +08:00 |
|
|
|
0ee97f902d
|
chore:跳转文章列表链接可以分类
|
2026-09-23 11:15:47 +08:00 |
|
|
|
3b996485e8
|
Merge branch 'dev/1.0' of http://git.aigc-quickapp.com/Uniapp/lucky_shop into dev/1.0
# Conflicts:
# components-diy/diy-image-nav.vue
|
2026-09-22 15:44:27 +08:00 |
|
|
|
d18df73849
|
fix(diy-image-nav): 修复小程序端水平滚动条始终显示/滑动时显示不生效
|
2026-09-22 15:22:15 +08:00 |
|
|
|
66b56387e6
|
chore:滑动图片后台上传图片自适应
|
2026-09-22 15:15:24 +08:00 |
|
|
|
bac5583ecb
|
强制合并
|
2026-09-22 10:52:56 +08:00 |
|
|
|
3079cf4ba5
|
chore:点赞图标正常
|
2026-09-22 10:39:01 +08:00 |
|
|
|
aefb0c1550
|
Merge branch 'temp221' of http://git.aigc-quickapp.com/Uniapp/lucky_shop into temp221
|
2026-09-21 08:53:52 +08:00 |
|
|
|
235adb5ebd
|
chore:优化工具调用的可见性控制,确保与思考过程开关一致;统一欢迎语字段名,移除冗余信息;兼容旧数据格式,提升数据处理的健壮性
|
2026-09-20 18:25:59 +08:00 |
|
|
|
744981ed93
|
chore:添加 chat_ui_config 支持,优化前端 UI 行为开关;实现附件类型动态控制,确保与后端配置同步
|
2026-09-20 18:01:43 +08:00 |
|
|
|
942d85de19
|
chore:要实现后台开启双语模式,微信小程序真机切换英文模式,此时显示的是英文,后台关闭双语模式,微信小程序刷新重新进入要是中文模式
|
2026-09-20 17:58:16 +08:00 |
|
|
|
ae5921aa90
|
fix(lang): 恢复 common 和 components 节点校验
|
2026-09-20 16:15:48 +08:00 |
|
|
|
c104f6c443
|
chore: 忽略 .trae 相关文件
|
2026-09-20 16:15:19 +08:00 |
|
|
|
747a15f16e
|
chore: 忽略 .workbuddy 目录
|
2026-09-20 16:14:42 +08:00 |
|
|
|
ee20c214de
|
chore:优化服务配置缓存逻辑,减少不必要的 API 调用;修复欢迎语加载逻辑,避免重复推送欢迎气泡;调整快捷问题样式以兼容低版本环境
|
2026-09-20 15:45:12 +08:00 |
|
|
|
b93752d58c
|
更新lang
|
2026-09-20 15:27:45 +08:00 |
|
|
|
619e1dc9ef
|
Merge branch 'dev/1.0' of http://git.aigc-quickapp.com/Uniapp/lucky_shop into dev/1.0
# Conflicts:
# components-diy/diy-category-item.vue
# components-diy/diy-category.vue
|
2026-09-20 15:25:15 +08:00 |
|
|
|
8fd68033ed
|
chore:添加欢迎语配套快捷问题功能,支持用户快速发送常见问题;优化数据格式处理与样式
|
2026-09-20 15:07:43 +08:00 |
|
|
|
500328ef55
|
chore :真机可以支持测试
|
2026-09-20 14:27:51 +08:00 |
|
|
|
62b4b44f88
|
chore :真机可以支持测试
|
2026-09-20 14:06:28 +08:00 |
|
|
|
6fa0603783
|
fix(diy-search): 支持卡片底板内边距/外边距/圆角/四边样式后台字段
|
2026-09-20 10:39:49 +08:00 |
|
|
|
9d599d5f47
|
chore:后台更改卡片底板内边距,四边样式颜色,前端和后台同步
|
2026-09-20 10:33:28 +08:00 |
|
|
|
2b1f8a4fe2
|
chore:修复清除会话的 URL 格式,确保使用 camelCase,避免 404 错误;优化 agent 切换时的会话 ID 管理
|
2026-09-19 16:25:16 +08:00 |
|
|
|
34c712db32
|
chore: 同步搜索框与滑动图片相关5个文件到 dev/1.0
|
2026-09-19 16:03:13 +08:00 |
|
|
|
7a81045290
|
Merge branch 'temp221' of https://git.aigc-quickapp.com/Uniapp/lucky_shop into temp221
|
2026-09-19 15:26:53 +08:00 |
|
|
|
67ce0f8b39
|
chore:更新 AI 服务会话管理逻辑,优化用户状态切换时的 key 迁移与会话隔离,确保 H5 端 elicitResponse 请求正常处理
|
2026-09-19 15:26:38 +08:00 |
|
|
|
01df6c9116
|
chore:后台调节滑动图片组件的左右边距,前端运行出来和后台一致
|
2026-09-19 15:01:22 +08:00 |
|
|
|
480a109114
|
chore:商品分类模板1更改,只有「加载完成 且 该二级分类下商品列表非空」才渲染,否则标题 + 网格整块都不显示。
|
2026-09-18 17:44:03 +08:00 |
|
|
|
509fe203f7
|
chore:商品分类模板5 更改完成
|
2026-09-18 17:28:51 +08:00 |
|
|
|
0f9cc1087f
|
chore:商品分类模板5
|
2026-09-18 16:44:14 +08:00 |
|
|
|
0f24f47048
|
chore:滑动图片的上下左间距可以后台自定义调节
|
2026-09-18 15:26:05 +08:00 |
|
|
|
a3d2ee562e
|
chore:新增商品分类模板5
|
2026-09-18 13:53:47 +08:00 |
|
|
|
1b1704f7c6
|
chore:滑动图片是水平滑动滚动条根据后台显示,AI智能点赞svg
|
2026-09-18 09:58:15 +08:00 |
|
|
|
8b2670bf31
|
chore:客服信息组件转英文模式显示全部英文
|
2026-09-17 18:19:30 +08:00 |
|
|
|
e66c91acfc
|
chore:【搜索框】的样式设置中的“背景颜色”可以控制搜索框的"背景颜色"和搜索框的“上下左右边距”的颜色
|
2026-09-17 15:09:42 +08:00 |
|
|
|
29699a66fd
|
chore:AI智能输入框样式改变
|
2026-09-17 14:21:28 +08:00 |
|
|
|
3b4051c775
|
chore:上传图片可以支持3张,正常显示
|
2026-09-17 09:48:49 +08:00 |
|
|
|
fffb5dae18
|
chore:用户的消息,图片在上文字在下
|
2026-09-17 09:11:59 +08:00 |
|
|
|
8cfc144ba9
|
fix(frontend): 端用户附件走 inline base64 路径, 避开 MediaGuard SSRF 闸门
PR-FRONTEND-MEDIA-INLINE-BASE64 (2026-09-16)
PR-WB-MP-INBOUND-MEDIA 配套
症状: 用户在前端上传图片成功后 (OSS URL 已返回), AI Agent 仍回复
"我这边并没有收到或看到任何图片附件".
根因链路:
1. backend Upload.php::buildPublicUrl 用 request()->domain() 拼 URL
(LAN 部署返回 http://192.168.x.x:8050/upload/..., 公网部署返回公网域名)
2. 前端把 upload 响应直接透给 AI chat attachments[] 字段
3. backend MediaGuard::urlAllowed 把 192.168.x.x 当内网 IP
(FILTER_FLAG_NO_PRIV_RANGE) 拒绝 → attachments 整批丢
4. 静默失败: MediaGuard 在 '白名单过滤后空集' 时返回 ok=true + media=[]
→ Kefu.php 不 return error, 业务继续走
5. WB 收到 0 个 media block → Agent 看不到附件
修复:
- media-upload.js 新增 fileToBase64(filePath, opts) helper
- H5: fetch(blobUrl) → blob → FileReader.readAsDataURL → strip data: 前缀
- MP-WEIXIN/APP-PLUS: uni.getFileSystemManager().readFileSync(base64)
- SIZE_LIMIT_INLINE_BASE64 = 5MB, 与后端 INLINE_MEDIA_LIMIT 对齐
- 超限 / 失败返回 null, 调用方退回 URL 路径
- ai-chat-message.vue sendMessage 改为 await Promise.all 模式:
- 对每个 pending item 调 fileToBase64(tempPath) 拿 base64
- 把 data + encoding='base64' 注入 attachment
- enrichedPendingAttachments 同时用于 readyAttachments + userMessage.attachments
- 复用同一份 base64, 不重复读 file
后端接收 data 字段后整条链路已对齐:
- MessageMedia::normalizeInput 直接透传 data 字段
- MediaGuard::check data 非空时无条件放行, 不参与 URL 校验
- WbAgentOsClient::buildMediaBlocks (A 路) 路径 1 优先 data + image/audio
- WbAcpClient::buildMediaBlocks (B 路) data 非空也走 inline base64
- inline_media_sanity.php 39 个断言全部覆盖 (test 3.1, 3.2, 4.1, 4.2, 7.6)
测试:
- E2E test_inline_base64.py 10/10 通过
- mock 上传返回 LAN URL 模拟 MediaGuard 拦截场景
- 抓 /api/kefu/chat POST body, 验证 attachments[].data 是有效 PNG base64
- magic bytes 89504E47 验证通过
- 既有 test_ai_chat_upload.py 20/20 通过 (无回归)
边界:
- >5MB 图片 fileToBase64 返回 null, 退回 URL 路径 (buildMediaBlocks 走
路径 2 fetchInline / 路径 3 resource_link); LAN 部署下仍可能被 MediaGuard
拦截, 但 5MB 以下的图片(主流微信/支付宝截图等)不受影响
- H5/MINIProgram/APP 三端都加了 #ifdef 编译条件
|
2026-09-16 17:55:49 +08:00 |
|
|
|
065fba7cf8
|
fix(media-upload): H5 pathToFile 修复 multipart filename 缺扩展名
PR-FRONTEND-MEDIA-UPLOAD-FIX-HOTFIX (2026-09-16)
诊断: 直接打后端 (curl) 验证后端 ext_rule 完全 OK,
所有 jpg/png/heic 标准 mime 都返回 code:0, 只有 filename=空
(无扩展名) 才会被拒. 所以问题在前端.
定位: common/js/media-upload.js pathToFile() H5 分支:
原代码 filePath.split('/').pop() 对 blob:http://xxx/uuid
取出 'uuid' (无扩展名)
→ new File([blob], 'uuid', ...) 没有 .jpg/.png 后缀
→ multipart Content-Disposition: filename='uuid'
→ 后端 fileExt 规则检查 'uuid' 不在白名单 → 拒绝
修复: 提取 extractExt() 到模块顶层 (之前内联在 uploadViaSts 里),
pathToFile 调用 extractExt(filePath, blob.type) 三段兜底:
1) filePath 最后一段正则
2) filePath.name 兜底
3) blob.type mimeHint 反查 EXT_MIME_MAP → png/jpg/heic 等
修复后 multipart filename = 'test-img1.png' (有扩展名),
后端 ext_rule 通过, 上传成功.
E2E 验证 (verify_filename2.py):
- 修复前: filename='test-img2' → 后端拒绝
- 修复后: filename='test-img2.png' → 后端接受
教训: PR-FRONTEND-MEDIA-UPLOAD-FIX 加 extractExt 时只修了 STS 路径,
PHP 路径漏修; H5 blob URL + multipart 是双盲点 (前端不知道后端需要
filename 扩展名, 后端拿到 filename 才检查). 任何 file.toBlob() 或
URL.createObjectURL 出来的 file 都要在 File 构造时补扩展名.
|
2026-09-16 17:32:03 +08:00 |
|