Commit Graph
100 Commits
Author SHA1 Message Date
admin d356416518 Merge branch 'feat/camcard' of https://git.aigc-quickapp.com/Uniapp/lucky_shop into feat/camcard 2026-10-27 15:31:19 +08:00
admin cb36136f40 feat: 添加名片 ID 解析方法以支持小程序码场景 2026-10-27 15:31:15 +08:00
admin 523473250c test(card): 名片级自定义二维码契约测试 + 修正陈旧断言
- 新增 tests/diy-card-qr-image-source.test.js(24 项):
  mini 基件 qrSrc 按「名片级 card.qr_image > 组件级 c.qrImage > 系统码
  card.qr_url」三层优先级取值(源码契约 + 真实求值双证);
  组件级 qrImage 仍完整保留(未被名片级顶掉); 反例防恒真
- diy-card-qr-style.test.js 补 2.20 盒模型/色带/逐向间距字段契约,
  并修正一处陈旧断言: cornerHeadStyle 的 paddingRight 已叠加
  2.20 逐向微调右位移(customRight), 旧正则未同步
2026-10-27 14:52:30 +08:00
admin 0a5794d260 feat: 添加自定义二维码图片及其优先级配置支持 2026-10-27 11:57:11 +08:00
admin 7c4d6cbb72 chore:添加独立成块逐向间距配置支持 2026-10-26 17:44:09 +08:00
admin d291f5a6c1 feat(diy-card): 增加可配置的外边距和头部样式属性 2026-10-26 08:35:34 +08:00
admin 526b513345 feat(card-diy): band/卡片容器/head 样式属性可配置(2.19.11)
mini.vue: bandShow/bandBg/bandHeight + wrapMarginTop/Bottom + headBg/headPadV/headPadH
show/self: miniConfig 透传 8 字段
qr-style 测试: bandStyle 断言适配新实现(自定义背景+高度)

前端 7 套 123 项全绿
2026-10-24 17:42:23 +08:00
admin 1de3146c3a feat(card-diy): 2.19.10 C 端消费 detail 对齐 + 区块独立样式字段
- mini.vue: 8 detail 字段消费(三列行/复制范围外观/QR 多行/URL 行/hero 徽章)
  + rowsBlockStyle/qrBlockCustomStyle computed(与操作区 actsBlockStyle 同款模式)
  + rowsFinalStyle/qrBlockFinalStyle 合并独立块样式
- show.vue/self.vue: miniConfig 透传 14 字段(8 detail + 6 独立样式)
- 测试 ×3: 2.19.10 契约锁(配置层/透传/面板/预览消费/反例: layoutCards 已移除)

前端 7 套 123 项全绿
2026-10-24 17:03:57 +08:00
admin e98d3ba0e5 fix(diy-card): 团队名片墙列表项同修数组绑定 — itemFinalStyle 合并(对象/对象数组同雷)
diy-card-list.vue 列表项 :style="[itemStyle, {animationDelay}]" 数组绑定
按 2026-10-24 操作区同根因预防性消除(uni-app 静默丢弃数组绑定), 合并为
itemFinalStyle(index) 单对象绑定; 扫描全部 5 个卡片组件, 数组绑定清零
2026-10-24 14:05:44 +08:00
admin 8617bb0395 fix(diy-card): 操作区独立样式改单绑定 — uni-app 静默丢弃数组绑定(2.18 缺陷)
2026-10-22 线上问题(qrBlockStyle)同根因漏网: 4 个操作区分支
:style="[actsBlockStyle, cornerClearStyle]" 数组绑定被 uni-app 运行时
静默丢弃(style 属性整体为 null) → 操作区独立成块(actsBlockBg/Radius/Pad)
与 corner 让位在 C 端全部失效, 后端配置了也不生效。

- mini.vue: 新增 actsBlockFinalStyle 合并 computed(块样式字符串 +
  cornerClearStyle.marginTop), 4 分支(上/下 x grid/chips)改单绑定
- 契约锁死: style-v2/ab-visual 数组绑定反例 + 单绑定断言
- H5 实测(8080 diy2699, 配置 #F7F8FA/12/12): 修复前 computed
  transparent/0/0 → 修复后 rgb(247,248,250)/12px/12px 与配置一致

验证: 名片 7 套件全绿 + 三回归 79/41/56
2026-10-24 14:03:28 +08:00
admin 4b99bcdd7e fix(diy-card): 修复 merge 拼接残留的多余闭合括号 — detailBtnStyle/emptyBtnStyle 掉出 computed
684 行多余 '},' 使 computed 对象提前闭合, detailBtnStyle/emptyBtnStyle 成为
根级孤儿键(Vue 静默忽略) → 发名片大按钮无主题色背景、空态按钮无样式,
控制台警告 Property or method "detailBtnStyle" is not defined。

发现途径: H5 实测(8080 diy 2699 页) console 捕获, 修复后警告清零。
验证: 名片 7 套件全绿
2026-10-24 12:02:24 +08:00
admin bd691d2d30 feat(diy-card): Show 组件弃自绘版式恢复 diy-card-mini 基件(方案A 用户定稿)
决策依据: 后端 design.html 面板预览按 mini 基件渲染消费全部 53 字段,
方案A 下 C 端与编辑器预览逐字段一致(用户要求取与后端预览最接近的方案)。

- diy-card-show.vue: 恢复 2.19.3 末版 mini 基件实现(236 行, miniConfig
  全字段透传 含字号7/设计资产3/二维码6/宫格图层全套), 弃自绘版式(+888 行)
- 测试口径切换: qr-style 10 个/ab-visual 2 个/detail-jump 1 个「show: 自绘…」
  实现细节断言 → 改写为 miniConfig 全字段透传锁(防 merge 冲突解决再丢透传)
- 背景: 今晨两次 merge 保留自绘线丢弃透传致 27 字段 C 端失效(字段审核报告)

验证: 名片 7 套件全绿 + 全量仅剩 card-admin/card-api 存量失败(非本次) + 三回归 79/41/56
2026-10-24 11:53:34 +08:00
admin ba7988765a fix(diy-card): 修复 merge 冲突解决丢失的二维码 qrSrc 消费 + 断言口径对齐
- mini.vue: bottom 档展示挂点被 merge 拼回旧直连 card.qr_url → 恢复 qrSrc
  (自定义二维码图优先); 分享抽屉 ss-qr 保留名片原码(分享扫码语义, 非回归)
- style-v2: doesNotMatch 收紧为 qr-img 展示挂点, 新增 ss-qr 原码语义锁
- qr-style: qrStyle/qrSize 断言放宽为 chips/slide 绑定形态(v-model 与
  @click/field: 两种形态均算生效, 与现面板实现对齐)

背景: 今晨 10:56/11:28 两次 merge 在 diy-card-show.vue/mini.vue 冲突解决时
保留自绘版式线, 丢弃 2.19.1 miniConfig 透传(见字段审核报告, 待产品决策)
2026-10-24 11:42:02 +08:00
admin f4998d1582 test(diy-card): 面板颜色占位与预览同链契约(2.19.7) 2026-10-24 10:21:03 +08:00
admin 7d1349f336 test(diy-card): 线稿图标 mask+currentColor 契约(2.19.6) — 5 类禁固定色 background-image 2026-10-24 10:15:10 +08:00
admin 549a98204a test(diy-card): QR 选图委托契约(js-qr-media + 零内联 openAlbum) 2026-10-24 09:56:58 +08:00
admin 5845474be3 feat(diy-card): 自定义操作扩至 8 类(2.19.3) — sms/map/link 白名单 + doAct 分支 + map 地址回落 2026-10-24 09:49:49 +08:00
admin 1b6114ef58 feat(diy-card): 默认操作删除+恢复(2.19.2) — normalizeActDeleted + acts 双重过滤 + 透传 2026-10-24 09:42:32 +08:00
admin 6977b914d3 test(diy-card): 锁死资源引用版本参数契约(6 条 ?v={$version} + 零无版本引用) 2026-10-24 09:18:40 +08:00
admin 0acd9e0e7b test(diy-card): 锁死快捷操作面板存量组件防炸契约(v-if 守卫/零裸读/防御式写回) 2026-10-24 09:00:58 +08:00
admin a26b9d6601 feat(diy-card): 快捷操作 2.17~2.19.1 — 5 动作/图标自定义/图层式管理/素材图标库/次序调整
- common.js: ACT_GRID_ICONS 结构化{glyph|css} + save 紫档 + WAP_LINE_ICONS(SVG 线稿
  data URI, 自写 b64ascii) + CARD_ICON_LIB 素材库 30 枚(与后端三源同步) +
  normalizeActVis/ActLabels/CustomActs/ActOrder + libIconBg 实时上色
- mini.vue: 宫格图标优先级 img > 素材库 > SVG 线稿 > 首字; acts computed 重构
  (actVis 显隐过滤 + actLabels 改名 + actOrder 次序 + order 外扩展类型尾接 +
  customActs 尾接 + 四 cfg 字段合并); 操作区双位置 + 独立成块样式 + qrSrc 自定义图
- show/self.vue: doAct 补 save 分支(goSaveContact 资料白名单下发) + miniConfig
  透传 actVis/actLabels/actOrder/customActs/qrImage 等 2.17~2.19 字段
- 测试: diy-card 7 套件 111 项全绿(style-v2 22 项含 svg 快照/素材库三源同步/
  template 配平/嵌套结构反例)
2026-10-24 08:48:28 +08:00
admin 0b3a49f0d1 feat(card): save-contact 原生页新增 action=mail 分支——web-view 内 mailto 死链的复制兜底
- onLoad action=mail 时: uni.setClipboardData 复制邮箱(showToast:false) +
  自定义 toast「邮箱已复制,去邮件 App 粘贴发送」+ 1.4s 后 navigateBack
  返回 wap 名片页
- 复制失败时把邮箱原文带进 toast, 便于用户手动抄写
- 与后端 _mini_bridge.html 双环境分发配套(backend ebf355a)
2026-10-23 15:28:47 +08:00
admin 0c0a6a1cb8 feat(card-diy): 四组件字号定制化消费 + 契约测试(12 项)
- entry: 主/副标题与按钮字号内联消费(titleSize/subSize/btnSize, px→rpx ×2),
  文字箭头拆 btnArrowStyle(比按钮大一档=28rpx)
- list: 拆 gridNameStyle/scrollNameStyle/metaStyle/scrollMetaStyle, 横滑与
  人数徽标按 -1px 派生保持历史渲染; infoStyle 保持纯色(箭头/空态共用)
- mini(Show/Self 基件): name/cardTitle/sub/label/value/act/btn 七项字号内联,
  拆 cardTitleStyle/rowLabelStyle/detailTextStyle; labelStyle 保持纯色给图标/qr tip
- self: miniConfig 透传 7 个字号字段
- 新增 tests/diy-card-font-size.test.js: 三层口径契约(diy_view 默认值 ↔
  design.html 面板/重置 ↔ vue 消费) + 派生关系 + 颜色 value 兜底 + 反例自测

验证: 契约 12/12 绿; diy-card 全套测试 0 失败; E2E 截图目检通过
2026-10-23 14:21:36 +08:00
admin d64e989c25 feat(diy-card): 添加链接选择功能,优化名片发送按钮文本 2026-10-22 14:14:42 +08:00
admin d605f4c9ea feat(goods-detail): 商品详情页主图/视频按后台「媒体显示顺序」切换
后台商品「高级设置」新增 media_order(1=主图在前 2=视频在前), 前端按其决定
商品详情页媒体区默认展示哪一个, 以及底部「图片/视频」切换按钮的排列顺序.

改动:
- goods-detail-view 组件:
  - 新增 applyMediaOrder() 按 media_order 决定默认展示主图还是视频
  - 新增 mediaOrderKey 计算属性 + watcher: 只在「媒体显示顺序/视频地址」
    变化时重新应用, 避免用户手动切到「视频」后被详情数据深层变更打回
  - 新增 mediaTabs 计算属性: 切换按钮顺序跟随配置
  - 切换按钮改用 switchMediaTab(), 切回主图时暂停视频
- common/js/goods_detail_base.js: 父级那行 switchMedia 赋值原本是死代码
  (父级无此 data 字段, 无模板读取), 改成与新规则一致, 避免两处规则打架
2026-10-21 16:35:47 +08:00
admin f1bd606e0b fix(diy-card): 审计修复——corner 档头部水平让位动态化 + self 首载骨架屏
- 修复 P1: corner 档自定义 qrSize>120 时静态 padding-right:180rpx
  让位不足, 浮层压住头部姓名区 → 新增 cornerHeadStyle 按浮层实际
  宽度(尺寸+衬底+右偏移20+呼吸20)动态反算, 与 cornerClearStyle
  垂直让位同口径; 废弃静态 CSS 值(负断言锁定)
- 修复: self.vue 已登录首次加载三分支都不渲染(loading 且无 card)
  → 白屏闪烁; 改 v-else-if="loading || card" 挂上 mini 骨架屏
- 契约测试: 新增 cornerHeadStyle 断言 + resolveQrSize 三处口径 +
  静态让位废弃负断言; 3 项变异验证全抓住; 四文件 67 项全绿
2026-10-21 14:09:56 +08:00
admin 805bbb9598 feat(diy-card): 4.0 头像开关 + 二维码四档外观/自定义尺寸/微调位移/提示开关
- common.js: QR_STYLES 四档枚举 + normalizeQrStyle(未知回落 card) +
  resolveQrSize(自定义 px×2>档位自动 rpx) + qrTransform(位移经
  translate, WXSS 不支持 calc)
- mini.vue 基件: 头像可隐藏(默认显示, 兼容历史配置); qrBlockStyle
  统一四档外观(plain 原图/card 白卡/theme 主题色/gradient 渐变,
  多彩只装饰外围衬底, 码黑白保可扫); cornerClearStyle 按实际尺寸
  反算让位(自定义大尺寸/关 tip 自动跟随); 扫码提示可关
- show/self: 6 新字段透传; ab-visual 测试 corner 断言改锚动态让位
- 新增 qr-style 契约测试 20 项(纯函数真值 + 基件 + 透传 + 两个
  design.html 面板控件绑定与预览消费 + 反例), 9 项变异验证全抓住
- 前端四测试文件共 66 项全绿; E2E 143 项; 三回归 79/41/56 全绿
2026-10-21 12:28:18 +08:00
admin 8bdd9f1291 fix(diy-card): 修复两处 WXSS 不兼容 calc() + MP 兼容契约测试
微信小程序 WXSS 不支持 calc(), 两处布局在小程序上会失效:

- mini.vue corner 档: max-width: calc(100% - 170rpx) →
  .mini-head { padding-right: 180rpx }(固定值, 浮层宽 120+偏移 20+呼吸 20)
- list.vue 网格: itemStyle width calc(50% - gap/2) →
  布局盒 50% 宽 + 左右各 half-gap padding, 视觉移入内层 .item-card
  (border/圆角/padding 随之下移, 布局盒透明只算 gutter)
- 新增 tests/diy-card-mp-compat.test.js 20 项: 全组件禁 calc()/var(--)
  (先剥注释再断言) + template 标签配平(栈式匹配, 兼容插槽嵌套 template)
  + 反例自测

注: 渐变角度 linear-gradient(deg,...) 有生产先例(detail/enterprise/
forward 均在生产小程序运行), 不在禁项; 真机渲染需 HBuilderX 构建验证。
验证: 46/46(三个名片测试文件) + npm test 仅剩两个存量失败
2026-10-21 11:58:35 +08:00
admin a841af8f5b feat(diy-card): A+B 视觉升级(资料行图标/可点 + 二维码四档任意位)
配合后端 f031476, 组件内直接复刻参考图视觉, 功能仍归详情页(路径A):

- common.js: rowIconFor(field→iconfont glyph, 无字形退化空串) +
  rowActOf(href 派生 tel/mail/copy, 空 href 不可点) +
  normalizeQrPosition/QR_SIZES(四档归一化+尺寸表)
- mini.vue: 资料行图标列(与文字标签列同宽, 值列左缘对齐) +
  行点击 emit row-act; 二维码四档渲染:
  rows 行下(默认) / head 头部右侧(三段 flex 零遮挡) /
  corner 右上浮层(白底衬底+Logo 避让+资料行让位 108rpx) /
  bottom 主按钮上方; 二维码尺寸随档位(180/120/120/180)
- show/self: miniConfig 透传 showRowIcons/rowTap/qrPosition,
  模板挂 @row-act="doAct" 复用既有动作分发
- 新增 tests/diy-card-ab-visual.test.js 13 项(真函数+源码断言,
  7 项变异验证全抓住)

node --test tests/diy-card-ab-visual.test.js → 13/13
2026-10-21 11:44:37 +08:00
admin 35137ae814 test(diy-card): 路径A链路契约测试(组件卡跳完整名片页)
参考图(名片卡+二维码+发名片)的完整功能在详情页, 组件靠「查看完整名片」
全宽主按钮把用户送过去。固化为 13 项断言(先剥注释再断言, 7 项变异验证):

- show/self: miniConfig 透传 showDetailBtn/detailBtnText
- show/self: 模板挂 @detail="goDetail"; goDetail 跳
  /pages_tool/card/detail 带 card_id + 空 id 守卫
- mini 基件: showDetailBtn flagOn 默认开 + mini-detail emit('detail')
- detail.vue: 错误信封带 wap_url → fallbackToPublicPage
  (H5 直跳/非 H5 走 share 中转 web-view, 游客不死路)
- 反例: 虚构字段/错误落点必须查不到

node --test tests/diy-card-detail-jump.test.js → 13/13
2026-10-21 11:24:50 +08:00
admin 48a17a59f7 feat(diy-card): 名片 DIY 组件 2.0 视觉与功能升级(原生渲染, 禁 webview)
- diy-card-common.js(新): 设计 token 层 —— 颜色/字阶/间距/圆角/阴影/动效/
  触达尺寸 + px2rpx/flagOn/initialOf/avatarBg/themeGradient/visibleRows 助手
- diy-card-mini.vue(新): 共享名片卡基件 —— 封面+遮罩/渐变饰条/Logo/主题色
  头像(首字兜底)/资料行折叠(showRows 总开关+maxRows 上限+展开收起)/快捷操作
  芯片(首个主动作实心, 72rpx 触达)/二维码/详情按钮/骨架屏 shimmer/badge 插槽
- diy-card-entry.vue: 三预设(gradient/solid/minimal)×两布局(left/center)×
  图标装饰(内置字形/图片)×按钮四变体(solid/ghost/link/none)
- diy-card-list.vue: 三布局(grid 双列/list/scroll 横滑)+骨架屏+逐项 fade-up
  入场+标题行(计数/更多)+企业徽章+空态
- diy-card-show.vue / diy-card-self.vue: 改为基件包装; self 管登录态
  (hasToken watch 刷新)+兜底(fallbackMode)+空态 CTA+「我的名片」角标
- 修复死配置: 面板「显示资料行」showRows 此前被 C 端丢弃, 现由基件消费
  (历史配置无此字段时默认显示, 兼容 1.0)
- 规范: 禁 CSS 变量, 动态样式走 $util.objToStyle, rpx 尺寸
2026-10-21 09:56:51 +08:00
admin cc96e2ca13 Merge branch 'dev/1.0' into feat/camcard 2026-10-21 09:24:29 +08:00
admin d0fe005c4a diy: 名片 DIY 组件原生渲染(禁 webview) + diy-group 分发
- 新增 diy-card-entry/list/show/self.vue(easycom 自动加载):
  头像/资料行/快捷操作原生渲染, tel 走 makePhoneCall,
  wx/mail/web 走复制, 点击卡片跳 pages_tool/card/detail
- diy-card-self 登录态自适应: hasToken watch 自动刷新,
  未登录兜底(企业卡/指定卡/登录引导)由后端 /card/api/diy/mycard 决定
- diy-group.vue: DiyCard* 四个 componentName 分发分支
2026-10-21 09:13:56 +08:00
admin 699787528c feat(card): PAGE_CARD_ENTERPRISE 页面链接映射——企业名片(后端 2.11.94 link 注册配套)
路径约定 /pages_tool/card/enterprise(页面由前端开发, 数据走
/card/api/enterprise/* 企业名片 API)。diy 链接管理的企业名片
节点已在后端 lucky_link 注册(name=CARD_ENTERPRISE)。
2026-10-19 18:09:57 +08:00
admin 7909cf2b22 test:导出脚本增加零漏拷/零多拷硬保证
质疑"某个目录有没有被打进 zip"时, 原先只能人工逐目录核对。现在把这个检查做进
脚本, 每次导出都跑:

copyDir 记录每个被复制文件在 zip 中应有的条目名, verifyZipFile 把它与实际 zip
条目做**逐个双向比对** —— 少一个报"漏拷"并列出文件名, 多一个报"多拷"。这样
漏拷会当场失败, 而不是等在别的电脑上解压缩时才发现。

自检输出新增一行, 例如:
  自检: 零漏拷 ✅(1381/1381) / CRC 逐条 ✅ / 偏移一致 ✅ / ...

同时把 copyDir 的条目名拼接由"从 nameOfParent 反推"改为显式传 relBase, 去掉
原先那段绕的 split/map 逻辑。

新增 3 条测试(漏拷拒绝 / 多拷拒绝 / 清单吻合时放行且 README.txt 豁免), 本
测试文件 19/19 通过, npm test 全量 17 个测试文件通过。
2026-10-17 16:13:09 +08:00
admin 336b4d21da test:鸿蒙工程包导出增加产出自检与单元测试
手写 ZIP 编码器的典型 bug 都是静默的 —— 包能生成、看着正常, 但某些机器上
解不开或解出畸形路径。开发期已真实踩过两次(中央目录偏移漏算文件数据长度、
localOffset 记成数据区起点), 两次都只有靠 unzip -t 才发现, 因此加两层保障。

一、脚本内产出自检 (每次导出都跑)
新增 verifyZipFile(), 把写好的 zip 重新解析一遍, 任一项不符直接抛错、不输出
「完成」。刻意用独立解析实现, 不复用写入端逻辑, 避免自证其说:
- EOCD / 中央目录: 签名、条目数、偏移与长度边界一致
- localOffset: 每条必须真的指向本地文件头, 且文件名与中央目录一致
- CRC: 逐条解压后重算 CRC32 比对
- 条目名: 必须正斜杠、必须置 UTF-8 标志位、必须可逆解码为合法 UTF-8
- 内容断言: 必需文件齐全; node_modules/build/.preview 等排除项不得混入

二、单元测试 tests/pack-harmony-project.test.js (16 条)
正向用例写夹具目录打包再独立解析还原, 校验内容/目录/中文名/零字节/空目录/
可压缩与不可压缩内容; 反向用例故意篡改 zip 断言自检能抓到 —— 反向用例一旦
失效自检就形同虚设, 故必须保持通过。

过程中自检抓到自身一条误判: 排除校验原先用子串匹配, 把合法源码
entry/src/ohosTest/ets/test/Ability.test.ets 当成 .test 构建产物。已改为按
路径分段精确匹配, 并加了一条反向用例锁定。

同时修掉两个隐患: stats 是模块级累加器(同进程重复调用会翻倍), main() 原先
无条件执行(require 脚本就会跑一遍打包), 现加 require.main 守卫并导出内部
实现供测试使用。

已验证: 本测试文件 16/16 通过, npm test 全量 17 个测试文件通过, 实打包
2.99MiB 包自检通过且 unzip -t 交叉验证无错误。
2026-10-17 14:42:28 +08:00
admin 77b1a3372c feat:一键导出鸿蒙工程包,支持换机编译
把 stub-app-projects/mp-harmony 中编译所需的文件导成 zip, 供没有本仓库/没有
HBuilderX 的电脑解压后直接用 DevEco 编译上传。

用法:
  npm run pack:harmony                        # 默认: 含证书, 不含 node_modules
  npm run pack:harmony -- --no-certs          # 不含签名证书
  npm run pack:harmony -- --with-node-modules # 含 hvigor/node_modules(320MB), 离线机
  npm run pack:harmony -- --out <dir>        # 自定义输出目录

输出 unpackage/dist/harmony-export/mp-harmony-project-*.zip, 内含一层 mp-harmony/。

实现要点:
- 全程只读源目录: 先复制到暂存目录再压缩, 不修改 stub 下任何文件
- 采用「全量复制 - 排除清单」而非白名单, 避免漏掉新增必需文件
- 包含 ascf/ascf_src (uniapp 编译产物快照), 目标机因此无需本仓库和 HBuilderX
- 包含 cert-profile 签名证书, 否则 hvigor 无法签名, 产不出可上传的 .app
- 排除 node_modules(320M)/oh_modules/build/.preview(22M)/.idea/.hvigor/local.properties

ZIP 由纯 Node 实现 (zlib + 手写 ZIP 头), 未用系统命令, 因为本机两种方案都产出
不合规 zip 且失败是静默的:
- PowerShell Compress-Archive / ZipFile::CreateFromDirectory 写反斜杠条目名, 非
  ZIP 规范, macOS/Linux 解压出畸形路径
- 本机 tar 是 GNU tar 1.35, 不支持创建 zip 且 exit 0, try/catch 拦不住

已验证: 解压后骨架齐全(AppScope/build-profile/entry/ascf_src/证书/README),
排除项均不存在, unzip -t 无错误, 中文文件名改 ASCII 规避工具编码差异。
2026-10-17 14:19:54 +08:00
admin 373db1fb73 docs:修正鸿蒙产物构成描述(1 HAP + 5 HSP)
原描述「共 6 个 HAP」不准确。module.json5 中 type: "entry" 编成 HAP,
type: "shared" 编成 HSP(共享包, 动态下发), 本工程实际是 1 个 HAP + 5 个 HSP。

同步修正:
- 两步流程描述改为「逐个 module 编译出包, 再打成 APP」, 产物路径扩展名
  改为 {hap|hsp}
- 包列表新增扩展名列, 标明哪些是 .hap、哪些是 .hsp
- 单模块调试说明改为「只产出分包、不打 APP」

另补充实测体积: 主包 entry-default.hap 约 2.37 MiB(超官方单包 2MB 限制),
总包约 6.39 MiB(在 10MB 以内)。
2026-10-17 13:55:54 +08:00
admin 550ec72bb7 fix:麦克风权限 Permissions 类型用法修正
上一提交写成 Permissions.MICROPHONE 导致 CompileArkTS 失败:
  'Permissions' only refers to a type, but is being used as a value here

Permissions 在 @ohos.permissions 中是 export type 字符串联合类型, 不是枚举,
只能用在类型位置。改为类型标注 + 权限名字面量:

  const PERMISSION_MICROPHONE: Permissions = 'ohos.permission.MICROPHONE';

注意 abilityAccessCtrl 里的 SwitchType.MICROPHONE(=1) 是开关类型枚举,
与权限名无关, 容易误用。

readme 4.3.3 补充该类型坑说明。
2026-10-17 11:53:44 +08:00
admin 9086f1665c feat:鸿蒙元服务接入麦克风运行时权限申请
MICROPHONE 是 user_grant 权限, 上一提交补了 module.json5 的 reason 只解决
了编译校验, 运行时仍需弹窗申请, 否则录音功能不可用。

在 EntryAbility.onCreate 中调用 abilityAccessCtrl.requestPermissionsFromUser。

关键点:
- AscfUIAbility 父类已定义 onCreate, 重写时必须调 super.onCreate(want,
  launchParam), 否则跳过 ascf runtime 初始化导致元服务白屏
- 选 onCreate 而非按需触发: 权限状态在 JS 侧 (uni.getRecorderManager) 读不到,
  项目无现成 JS<->ArkTS 通道; 且 requestPermissionsFromUser 对已授权应用
  直接 resolve 不弹窗, 实际只有首次启动打扰用户一次
- 降级: 未授权不影响浏览/下单/卡片, 仅语音不可用, 前端 voice-panel 会
  showToast 提示

readme 4.3.3 补充该实现与踩坑说明, 4.3.4 移除已解决项。
2026-10-17 11:46:57 +08:00
admin a9f3c7acc2 docs:清理文档中的本机绝对路径
绝对路径与本机目录绑定,换机器即失效,改为相对表述。

- docs/theme-multi-platform.md:删掉 cd 到绝对路径的命令行,
  改为注释说明「在项目根目录(含 package.json)下执行」
- docs/i18n-audit-report.md:审计范围改为「项目根目录」
- docs/ai-agent-integration.md:适用前端改为「本仓库」;
  WB Cloud SDK 协议约束矩阵原指向外部 refs 仓的绝对路径,
  改为相对文件名并标注「WB Cloud SDK 参考仓内」
2026-10-17 11:35:44 +08:00
admin 53b5b725a5 docs:鸿蒙元服务发布独立为 4.3 章节
原先作为 4.1.2 嵌在「小程序发布」下,实际产出的是 atomicService 元服务包,
与小程序流程差异较大,拆为独立的 4.3 章节,排在 4.2 快应用之后。

新增 4.3.2 DevEco Studio 编译与产物:说明 assembleApp 是两步串联
(先编译 HAP,再打包成 APP),列出 HAP / APP 产物路径与 pack.info 中
6 个 HAP 的构成,并注明元服务上架 AppGallery Connect 上传的是 .app。

新增 4.3.3 常见错误:hvigor 00303218 Configuration Error 的成因与修法
(user_grant 权限必须同时声明 reason 和 usedScene),附 user_grant /
system_grant 权限速查表。

新增 4.3.4 待完善:运行时权限申请未接入、release 签名仍指向 debug 证书。
2026-10-17 11:35:38 +08:00
admin add384916c fix:鸿蒙元服务麦克风权限补充 reason 字段
ohos.permission.MICROPHONE 是 user_grant 权限,必须同时声明
reason 和 usedScene,缺失导致 hvigor 报 00303218 配置错误、
entry:default@PreBuild 失败。

补充 reason 引用,并新增 permission_microphone_reason 字符串资源。
其余 INTERNET / GET_NETWORK_INFO / VIBRATE 均为 system_grant,无需改动。
2026-10-17 11:23:36 +08:00
admin 6309a5bb4b feat: 优化名片详情加载逻辑,处理未登录和卡片不存在的情况,新增公开页跳转功能 2026-10-14 13:50:28 +08:00
admin e56b91970c feat: 申请页状态条(Q7 闭环前端)— 已有名片/审核中隐藏表单, 被拒可重新提交
配合商家后台 2.4.0 申请闭环:
- onShow 回查 /card/api/apply/status: 已有名片或申请审核中 → 状态条替代表单
- 被拒 → 显示未通过原因 + 「重新申请」入口, 表单恢复可编辑
- 状态未回来前不渲染表单, 避免闪一下再消失

本地配置 .local.config.js 不入库(按约定排除)。
2026-10-14 09:03:36 +08:00
admin b3f6ff7517 feat: 名片夹运营闭环——申请状态条/需修改标/申请角标(配合商家后台 2.4.0)
- list.vue 顶部申请状态条: my_apply 待审(审核中)/被拒(可重新申请), 点按进申请页
- 被打回名片: 「需修改」红标, 点击弹层显示商家修改建议(review_note)
- 申请审批建卡: 头像「申」角标(from_apply)
- 数据源: /card/api/card/lists 增 my_apply + need_fix 派生字段
2026-10-13 19:26:04 +08:00
admin c9a58a5ddf fix: 认领双凭证——领取码/card_id 同值双传, 后端按领取码优先解析 2026-10-13 15:22:59 +08:00
admin 53810114ed feat: 员工端申请名片入口与申请页(配合商家后台审批闭环)
- list.vue 空态新增「申请」入口(仅无名片时显示)
- 新增 apply.vue: 姓名+手机号提交 /card/api/apply/submit
- pages.json 注册 card/apply 路由
2026-10-13 14:58:59 +08:00
admin 1f44f11248 feat: 更新名片云 API 文档,补充商家端架构说明及接口细节 2026-10-13 10:37:47 +08:00
admin 6e3818dff6 feat: 添加新建名片按钮,更新空状态提示信息 2026-10-13 10:29:07 +08:00
admin f22892968f feat: 更新名片云 API 文档,移除 Telegram 和 Messenger 独立字段,统一为社交媒体账号 2026-10-13 10:22:15 +08:00
admin 8c5ed50f7a fix: 修复 ns-empty 组件的 isIndex 属性绑定 2026-10-13 08:38:12 +08:00
admin 8f82d97c95 Merge remote-tracking branch 'remotes/origin/dev/1.0' into feat/camcard 2026-10-12 18:07:01 +08:00
admin b92f474ac8 feat(card): 员工端「我的人脉」页 + 与潜在客户导航互链
- 新增 contacts.vue: 搜索/来源筛选/列表卡(来源徽标)/编辑/转潜在客户/删除
- 新增 contact-edit.vue: 新增编辑复用, 姓名红星必填, 其余(选填)
- leads.vue 顶部互链「我的人脉 ›」(导航合并第一步)
- pages.json 注册两页; PAGE_KEY_MAP 补 PAGE_CARD_CONTACTS
- card-platform.test.js 追加 4 测试(25/25)
2026-10-12 17:35:16 +08:00
admin 0859765efb feat(card): 为必填字段添加红星标识,优化表单提示信息 2026-10-12 16:08:44 +08:00
admin 8cf70b617d feat(card): 更新名片夹相关文本和导航,优化用户体验 2026-10-12 15:56:40 +08:00
admin 053cb00826 feat(card): 个人中心新增「我的名片夹」固定入口 + 平台导航 page_key 测试
- member/index.vue: 非装修分支兜底入口, 跳转 /pages_tool/card/list
- card-platform.test.js: PAGE_KEY_MAP 含 PAGE_CARD_LIST/PAGE_CARD_LEADS 断言对齐
2026-10-12 15:27:06 +08:00
admin 9e6dc8665f feat(card): add leads and share pages with platform-specific handling
- Implemented leads.vue for managing lead statuses and displaying lead information.
- Added share.vue for sharing card links with platform-specific web-view handling for WeChat Mini Programs, HarmonyOS, and H5.
- Introduced tests for cross-platform compatibility, ensuring proper handling of conditional compilation and API usage across WeChat, H5, and HarmonyOS.
- Ensured that sharing functionality correctly encodes and decodes URLs for different platforms.
2026-10-12 14:32:20 +08:00
admin a957679957 feat:新增名片夹列表和详情页面,支持搜索和认领功能 2026-10-12 11:31:25 +08:00
admin 5efae5c38b feat(ai-chat): 增加自动定位权限提示及处理逻辑,优化用户体验 2026-09-28 13:57:46 +08:00
admin 4168c24fd6 feat(ai-chat): 增强位置消息处理,支持透传位置、时间、页面上下文,优化用户体验 2026-09-28 13:48:56 +08:00
admin 762401777b feat(ai-chat): 增强多媒体消息处理,支持多条语音和视频同时发送,优化消息气泡显示逻辑 2026-09-28 11:30:40 +08:00
admin 24c4e40df9 Merge remote-tracking branch 'remotes/origin/temp221' into temp221 2026-09-28 11:12:05 +08:00
admin c58734fcda feat(ai-chat): 增强语音消息处理,支持多条语音同时发送及中央播放面板 2026-09-28 11:10:26 +08:00
admin bbc9fdd6ea feat(ai-chat): 动态切换输入框 placeholder 文案,支持语音和媒体附件提示 2026-09-28 10:18:10 +08:00
admin 4cd21ade51 fix(ai-chat): 修复 v-if/v-else 配对问题,优化输入框和语音图标布局对称性 2026-09-28 10:16:09 +08:00
admin 0799e47233 feat(ai-chat): 在流式回答中添加"思考中..."指示,优化操作栏显示逻辑 2026-09-28 10:05:52 +08:00
admin 306f2f7ff7 feat(voice-input): 改进音频消息处理,支持音频时长和指令文本,优化后端交互 2026-09-28 09:33:57 +08:00
admin fff10a2e19 feat(media-upload): 增加全量音视频格式支持,确保与后端一致 2026-09-24 18:03:08 +08:00
admin 9d990e6aac feat: implement voice input feature with press-and-hold gesture
- Added new language strings for voice input functionality in English and Chinese.
- Updated manifest to include microphone permission for voice recording.
- Enhanced ai-chat-message component to support voice input with visual feedback for recording and cancellation gestures.
- Integrated voice recorder functionality in ai-chat-voice-panel, allowing users to record audio with a maximum duration of 60 seconds.
- Implemented audio handling logic to upload recorded audio files and display them in the chat interface.
- Added error handling for voice recording failures and user notifications.
- Updated styles for improved UI/UX during voice recording interactions.
2026-09-24 17:47:37 +08:00
admin 74468e2c9d feat(ai-chat): 暂时隐藏模型选择器,统一使用 Auto 模式 2026-09-24 17:31:15 +08:00
admin e079afc0a2 feat(media-upload): 增加自愈机制,自动切换 STS 直传以应对后端策略变化 2026-09-24 16:27:33 +08:00
admin 70f8fb867d feat(chat-ui): 增加聊天 UI 配置的本地持久化和预加载功能,优化首帧渲染体验 2026-09-24 11:10:21 +08:00
admin 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
admin 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
admin bac5583ecb 强制合并 2026-09-22 10:52:56 +08:00
admin 235adb5ebd chore:优化工具调用的可见性控制,确保与思考过程开关一致;统一欢迎语字段名,移除冗余信息;兼容旧数据格式,提升数据处理的健壮性 2026-09-20 18:25:59 +08:00
admin 744981ed93 chore:添加 chat_ui_config 支持,优化前端 UI 行为开关;实现附件类型动态控制,确保与后端配置同步 2026-09-20 18:01:43 +08:00
admin ee20c214de chore:优化服务配置缓存逻辑,减少不必要的 API 调用;修复欢迎语加载逻辑,避免重复推送欢迎气泡;调整快捷问题样式以兼容低版本环境 2026-09-20 15:45:12 +08:00
admin 8fd68033ed chore:添加欢迎语配套快捷问题功能,支持用户快速发送常见问题;优化数据格式处理与样式 2026-09-20 15:07:43 +08:00
admin 2b1f8a4fe2 chore:修复清除会话的 URL 格式,确保使用 camelCase,避免 404 错误;优化 agent 切换时的会话 ID 管理 2026-09-19 16:25:16 +08:00
admin 7a81045290 Merge branch 'temp221' of https://git.aigc-quickapp.com/Uniapp/lucky_shop into temp221 2026-09-19 15:26:53 +08:00
admin 67ce0f8b39 chore:更新 AI 服务会话管理逻辑,优化用户状态切换时的 key 迁移与会话隔离,确保 H5 端 elicitResponse 请求正常处理 2026-09-19 15:26:38 +08:00
admin 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
admin 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
admin 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
admin 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
admin 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
admin 56d6d17b6a refactor(diy-form.vue): 优化横幅裁剪逻辑,调整背景位置处理以适应uni-app H5编译器 2026-09-04 18:16:13 +08:00
admin 53e885164d refactor(diy-form.vue): 优化横幅图片处理,支持裁剪比例和手动裁栏框配置 2026-09-04 17:38:09 +08:00
admin 0fbff1004c refactor(ns-newform.vue): 增加小程序环境修复,优化CSS变量定义和使用 2026-09-04 14:41:04 +08:00
admin acab1971ab refactor(ns-newform.vue): 优化字段样式,支持字段级控件尺寸和样式动态设置 2026-09-04 13:48:00 +08:00
admin 11cc4f6319 refactor(ns-newform.vue): 优化字段样式,支持组件独立的间距和内边距设置 2026-09-04 09:13:25 +08:00
admin fc5c7e682c refactor(ns-newform.vue): 优化必填星号样式,动态计算颜色和间距 2026-09-03 17:59:22 +08:00
admin b2211edeab refactor(formdata.vue): update default styles and config merging logic
- Adjusted the merging order of form configuration to prioritize frontend defaults when backend configurations are absent.
- Clarified comments regarding the purpose of new visual styles and their application.
- Modified the hideInnerBanner logic to ensure consistent behavior with the updated form styles.
2026-09-03 17:50:11 +08:00
admin 2787e73126 chore:优化表单风格逻辑,支持显式和隐式判定,确保兼容性 2026-09-02 11:14:52 +08:00
admin e7ad9a3cb5 Merge branch 'dev/1.0' of https://git.aigc-quickapp.com/Uniapp/lucky_shop into dev/1.0 2026-09-01 16:29:29 +08:00
admin fc2b77135b chore:更新本地配置注释以提高可读性 2026-09-01 16:29:18 +08:00
admin b5b27039ee feat(form): add captcha and form behavior support
实现表单行为相关功能,新增验证码输入模块,支持表单登录校验、提交次数限制、表单开放状态判断,补充多语言文案,优化空状态展示逻辑
2026-08-20 15:55:41 +08:00
admin 8901e302e4 style: 修复配置文件缩进格式不一致问题
统一调整配置文件内所有对象的缩进样式,移除多余的空格,修正代码格式对齐问题,提升代码可读性。
2026-08-17 14:43:54 +08:00