|
|
b57a457734
|
chore:商品分类模板5 点进商品分类,进入商品列表,红色框的”产品说明书“和”商品详情“俩个功能交换顺序之后,默认显示”商品详情“
|
2026-09-28 11:33:20 +08:00 |
|
|
|
535ae732bc
|
chore:商品分类模板5 点进商品分类,进入商品列表隐藏搜索框下面功能
|
2026-09-28 11:25:02 +08:00 |
|
|
|
993b5c5cb0
|
chore:进入商品列表,默认视图要图片中的竖版视图
|
2026-09-28 10:54:06 +08:00 |
|
|
|
f40c4b2a69
|
Merge branch 'temp221' of http://git.aigc-quickapp.com/Uniapp/lucky_shop into temp221
|
2026-09-24 17:05:26 +08:00 |
|
|
|
2dae3adf66
|
chore:网页容器H5显示正常
|
2026-09-24 17:00:14 +08:00 |
|
|
|
e079afc0a2
|
feat(media-upload): 增加自愈机制,自动切换 STS 直传以应对后端策略变化
|
2026-09-24 16:27:33 +08:00 |
|
|
|
85b3e4db47
|
chore:AI回答的文字只有网址是蓝色,其他回答是黑色的
|
2026-09-24 13:59:24 +08:00 |
|
|
|
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 |
|
|
|
66b56387e6
|
chore:滑动图片后台上传图片自适应
|
2026-09-22 15:15:24 +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 |
|
|
|
ee20c214de
|
chore:优化服务配置缓存逻辑,减少不必要的 API 调用;修复欢迎语加载逻辑,避免重复推送欢迎气泡;调整快捷问题样式以兼容低版本环境
|
2026-09-20 15:45:12 +08:00 |
|
|
|
8fd68033ed
|
chore:添加欢迎语配套快捷问题功能,支持用户快速发送常见问题;优化数据格式处理与样式
|
2026-09-20 15:07:43 +08:00 |
|
|
|
62b4b44f88
|
chore :真机可以支持测试
|
2026-09-20 14:06:28 +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 |
|
|
|
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 |
|
|
|
f2cb69cb06
|
fix(ai-chat): rename _pendingIdSeq → pendingIdSeq (Vue 2 strips underscore-prefix data)
PR-FRONTEND-MEDIA-UPLOAD-FIX-HOTFIX (2026-09-16)
Bug: Vue 2 在组件实例化时过滤掉 _ 和 $ 开头的数据属性.
`_pendingIdSeq: 0` 在 data() 里定义但 this._pendingIdSeq === undefined.
onImagePicked 中 `++this._pendingIdSeq` → NaN, 所有 pendingImage 的
localId 都是 NaN, Vue 'Duplicate keys detected: NaN' 警告.
E2E 实测发现 (test_ai_chat_upload.py 20/20 通过):
- pendingImages 应有 3 项 ✓
- 每张图 localId 独立递增 (1, 2, 3) ✓
- 3 张图独立上传成功 ✓
- DOM 渲染 3 个 .pending-item + 3 个 uni-image 缩略图 ✓
- canSendPendingImage computed = true → .top-send-btn 出现 ✓
- removePendingImage(localId) → 剩 2 张 ✓
- 失败场景: uploadError 有值 + pending-retry-delete 出现 ✓
修复: data 里改 pendingIdSeq: 0, 代码里改 ++this.pendingIdSeq
教训: Vue 2 data() 里禁止用 _ 或 $ 前缀的属性名.
|
2026-09-16 17:14:11 +08:00 |
|
|
|
fe2d3dcfe2
|
fix(ai-chat): 全面修复前端图片附件 4 个 P0 + 3 个 P1 + 3 个 P2 bug
PR-FRONTEND-MEDIA-UPLOAD-FIX (2026-09-16)
配合后端 PR-WB-MP-UPLOAD-EXT (HEIC/AVIF/BMP/TIFF 双层修复), 前端用户上传链路全面打通:
**4 个 P0 (阻塞用户上传)**:
- pendingImage 单数 → pendingImages 数组: 选 9 张图只发 1 张 → 全部一起发
- 每个图独立 localId 独立上传独立失败
- 失败给删除按钮 (用户不再卡死)
- MP-WEIXIN 不压缩 HEIC → H5+MP-WEIXIN 双端都压缩
- 微信 chooseImage 默认 compressed 不支持 HEIC, 必须本地 uni.compressImage
- getFileSize 失败兜底 0 → 失败抛错, 探测完全失败时兜底走 STS
- 0 > 2MB = false 让 auto 模式永远走 PHP 中转, 大文件 OOM
- 现: totallyUnknown → 兜底 STS
- guessMime 缺 HEIC 等 → 与后端 guessMimeFromPath 对齐 26 个 mime
**3 个 P1 (业务级)**:
- selectFile 微信小程序死按钮 → 加 #ifdef MP-WEIXIN 分支 (uni.chooseMessageFile/wx.chooseMessageFile)
- 兼容检测两个 API 哪个可用
- 上传失败后 pendingImage 永远卡住 → 失败时给 删除 按钮 (pending-retry-delete)
- URL.createObjectURL 永不释放 → upload 完成后 (成功/失败都) revokeObjectURL
**3 个 P2 (优化)**:
- filePath.split('.').pop() 在 blob URL 翻车 → 用 lastSegment + 正则提取 + 兜底 'bin'
- STS MP-WEIXIN size 永远 0 → 用已知 detectedSize + pathToFile 再探测
- H5 压缩阈值 10MB → 3MB
**新增**:
- tests/media-upload-fix.test.js (12 个单测全过): guessMime 现代格式 / extractExt blob URL / decideSts 兜底 STS 决策
|
2026-09-16 16:52:49 +08:00 |
|
|
|
78973c99a3
|
chore:
|
2026-09-16 16:38:34 +08:00 |
|
|
|
171190c1cd
|
chore:合并
|
2026-09-16 11:52:28 +08:00 |
|
|
|
7952f5a722
|
feat(ai-chat): frontend 媒体上传/播放全栈接通 (PR-FRONTEND-MEDIA-UPLOAD 2026-09-16)
P0 — 新建 common/js/media-upload.js (12KB)
- uploadImage(filePath) / uploadMedia(filePath, kind) 落地
- 此前 ai-chat-tools-panel.vue 引用但文件从未入库, 选图立即抛 "Cannot find module"
- 12 cloud provider 分流: 4-field STS (alioss/qiniu/txcos/baidubos/qingstor/jdoss/ucloud/wyoss) vs single-URL signed PUT (huaweiobs/volcengine/awsoss/minio)
- 端点必须 addon namespace: /<addon>/api/upload/{image|file|ossSts}, 普通 /api/kefu/upload/* 不命中 InitRoute
- 补 docs 设计稿漏写的 `import store from '@/store/index.js'` (H5 上传需带 token)
P1 — ai-chat-message.vue 用户附件全支持
- P1.1 filter 不再丢 file/audio/video 消息
- P1.2 用户气泡加 type==='file' 分支: 文件图标 + 名称 + 大小 + 上传状态
- P1.3 sendMessage type 不再强制把 audio/video 折成 file
P2 — AI 侧 audio 播放引擎接通
- P2.1 previewAttachment audio 分支 → 跳 file-preview
- P2.2 音频气泡接 uni.createInnerAudioContext: data 加 innerAudioCtx/_innerAudioSrc, 改写 playAudio/pauseAudio, beforeDestroy 必 destroy, slider 区分 change (显示) / changeend (实际 seek)
- P2.3 file-preview.vue 加 image-viewer + audio-viewer 两个分支;inferFileType 识别 jpg/png/mp3/wav 等扩展
P3 — sendMessageWithContent 透传 attachments 参数
- 默认 attachments = [], 传给 sendStreamMessage/sendNormalMessage
- tools panel 选完文件 push 到 attachments → 链到 send
lang — zh-cn + en-us file-preview 加 4 项
- audioUrlNotExist / audioDefaultTitle / audioPlaying / audioPaused
docs — docs/ai-agent-integration.md (跨 PR 累积同步, 2149 行)
- 版本基线提到 PR-WB-MP-INLINE-MEDIA (2026-09-16) 及之后
- 加 §3.1.5 attachments.data 字段协议 (PR-WB-MP-INLINE-MEDIA)
- 12 cloud provider 替换原"阿里云"单点 (PR-OSS-REGISTRY)
- media-upload.js 章节补 fileToBase64 (PR-FRONTEND-MEDIA-UPLOAD)
- 上传策略表 backend/oss_sts/auto 全替换为"云存储"措辞
对齐后端:
- PR-WB-MP-INLINE-MEDIA (a707b90): media data 字段
- PR-OSS-REGISTRY (12 provider): OssProviderRegistry
- PR-FRONTEND-MEDIA-UPLOAD (本 commit): 前端落地
兼容性:
- 后端未升级到 PR-WB-MP-INLINE-MEDIA 之前, attachments 不带 data 字段, 走 URL 路径 (退化到老行为, 不破)
- 后端 oss_sts 单点 alioss 时, securityToken 不带 -SIGNED 后缀, 走 4-field STS 分支 (与 PR-OSS-REGISTRY 之前兼容)
回归:
- node --check media-upload.js OK
- lang zh ESM import OK, 输出 8 个 key 全对
- ai-chat-message.vue 11 处 PR-FRONTEND-MEDIA-UPLOAD 标记, file-preview.vue 9 处
- 旧 chat 路径不带 attachments 走默认 [], 不破坏现有响应结构
安全约束: 不涉及 nginx 层防盗链 / 限速
|
2026-09-16 11:42:18 +08:00 |
|
|
|
3f29116345
|
Merge branch 'dev/1.0' of http://git.aigc-quickapp.com/Uniapp/lucky_shop into temp221
|
2026-09-16 11:15:23 +08:00 |
|