微信云开发小程序:不做在线支付。顾客浏览上架的美甲款式,在详情页长按保存店主上传的微信二维码,再用微信「扫一扫 → 相册」扫码添加店主咨询下单。
- 首页:顶部展示
back.HEIC转换后的背景图与艺术字店名「墨痕Nails」。 - 首页商品:读取
miniprogram/nails_picture/products.js中配置的商品,展示编号、价格、库存。 - 详情页:多张轮播图、名称、价格、库存、售罄提示,以及店主上传的微信二维码图片;二维码图片支持长按保存。
- 中英文切换:首页「EN / 中文」按钮切换,选择会保存在本机。
- 转发分享:首页、款式详情页可「发送给朋友」和「分享到朋友圈」,通知页可转发店铺首页(见下文「转发与分享到朋友圈」)。
- 「通知」板块:展示配送等消息通知;后台管理页保留在代码中但入口已从页面移除,目前首页商品来自本地
nails_picture/products.js。
首页顶部背景、商品图片和商品列表都来自同一个封装目录(已放入项目):
- 商品配置文件:miniprogram/nails_picture/products.js ← 日常改这里
- 图片目录:
miniprogram/nails_picture/
新增商品的流程:
- 先把 iPhone 的 HEIC 照片转成真正的 JPEG(见下文「商品图片格式」一节,非常重要,否则安卓手机看不到图)。
- 在微信开发者工具里登录「我的」后台,打开 素材上传,选择图片或演示视频;上传完成后复制“文件 ID”(形如
cloud://…)。开发者工具里可直接从电脑本地选文件。 - 打开
products.js,复制其中一段商品配置,把云存储文件 ID 填到images(演示视频填到videos),并修改编号、名称、价格。 - 每个商品编号(
code)必须唯一,按001 → 002 → 003递增。
图片、演示视频请不要再放进
miniprogram/nails_picture/。超过 200K 的媒体走云存储/URL 后,代码包里就不会再出现“静态资源体积过大”的提示;tabBar 图标这类必要小图才保留在代码包。
当前示例(图片已迁移到云存储,不再放进代码包):
- 顶部背景图:云存储文件 ID(对应原
back.HEIC转换图) - 商品 001:云存储文件 ID,编号
001,价格€5 - 商品 002–034:图片使用
cloud://…/nails-shop/002.jpg~034.jpg,字段与 001 一致
本地原图已移到 NailShop/original_assets/ 备份,不再随 miniprogram/ 打包。
商品资料支持中英文两套名称:在 products.js 里填写 nameEn / descriptionEn 后,切换英文时就会显示英文;不填则继续显示中文。
NailShop
├── cloudfunctions
│ └── admin # 云函数:商品、库存、上架状态、二维码设置
├── miniprogram
│ ├── app.js # 云开发初始化
│ ├── app.json # 页面与底部 Tab
│ ├── config.js # 云函数名 / storage key
│ ├── nails_picture # ★ 商品配置(products.js);大图/视频走云存储,不放入此目录
│ ├── utils # 云函数调用与数据格式化
│ └── pages
│ ├── index # 首页
│ ├── detail # 美甲详情 + 二维码联系板块
│ ├── mine # 通知
│ ├── admin_goods # 商品管理
│ ├── admin_setting # 二维码设置
│ └── admin_media # 素材上传(商品图/演示视频传到云存储)
以下步骤只影响「我的 → 后台」与详情页二维码;首页商品目前以本地 nails_picture/products.js 为准。
用微信开发者工具导入 /Users/damen/NailShop(project.config.json 已配置 miniprogramRoot 与 cloudfunctionRoot)。
在开发者工具顶部点击「云开发」,开通后得到一个环境 ID。
miniprogram/app.js中wx.cloud.init的env留空表示使用默认环境;如果账号下有多个环境,请把环境 ID 填进去。
打开 cloudfunctions/admin/index.js,把:
const ADMIN_PASSWORD = process.env.ADMIN_PASSWORD || '123456';中的 '123456' 改成你自己的密码,然后保存。
也可以不改代码,在云开发控制台给
admin云函数配置环境变量ADMIN_PASSWORD,环境变量会优先生效。
在开发者工具中右键 cloudfunctions/admin → 上传并部署:云端安装依赖。
在模拟器中打开小程序「我的」→ 输入管理员密码登录。登录成功后会自动创建两个集合:
products:美甲商品settings:微信二维码设置
- 进入「后台设置」上传你的微信二维码图片。
- 顾客进入详情页长按二维码图片保存,再用微信扫码添加你。
- 登录后台后进入「素材上传」,选择本地图片或视频(开发者工具里可以直接从电脑选文件),或点击「一键上传项目当前的两张示例图」。
- 上传成功后复制“文件 ID”,把
cloud://…地址填入products.js的images/videos。 - 将本地大文件移出
miniprogram/nails_picture/后再上传小程序代码,代码包不再包含超过 200K 的图片/视频。
iPhone 默认用「高效」格式拍照,拍出来的文件是 HEIC。把文件名从 IMG_0001.HEIC 改成
001.jpg 不会转码,文件内部仍然是 HEIC —— 服务器、Finder、访达预览里都可能显示成 jpg。
微信小程序的 <image> 官方只支持 JPG、PNG、SVG、WEBP、GIF,不含 HEIC:
iOS 走系统解码器能认 HEIC,安卓微信认不了,于是表现为「苹果手机正常、安卓手机一片空白」。
这跟用 cloud:// 还是 https 链接无关,只跟图片文件本身有关。
现在小程序会自动处理:miniprogram/utils/cloudMedia.js 会给云存储图片地址 拼上 CDN 的在线转码参数
?imageMogr2/format/jpg/thumbnail/1080x%3E/quality/85
由云存储 CDN 直接把 HEIC 转成真正的 JPEG(thumbnail/1080x> 里的 > 表示只缩不放,
%3E 是它的 URL 编码),并把宽压到 1080:单张 1.5 MB → 约 180 KB,结果由 CDN 缓存约 30 天,
不额外占云存储空间、也不用重新上传图片。已经转好的 JPEG 再拼这些参数是无副作用的空操作。
视频(.mov)不会拼这个参数。
说明:参数里的
>只缩不放是为了让微信二维码这类小图保持原尺寸,不被放大后变糊。
想自己转成真 JPEG 也行(首次访问能少一次实时转码),判断和转换方法:
file xxx.jpg | grep -v "JPEG image" # 有输出就说明是假 JPEG
python3 tools/prepare_images.py <源目录> <输出目录> # HEIC → 转正 → sRGB → 压到 1440 → 去 EXIF/GPS脚本依赖 macOS 自带的 sips(解码 HEIC)和 Pillow(pip3 install pillow)。
2026-09 已经用上面这套方案修好了这些图片在安卓上的显示,共 38 个文件:
- 商品图
001.jpg~034.jpg - 配件图
mobang.jpg(纱条)、guodongjiao.jpg(果冻胶) - 首页背景图
back.jpg(原图 3.5 MB 的 HEIC) - 微信二维码
WeChat.jpg
original_assets/upload_jpg/ 里放了一份全部转好的 JPEG 备用(需要时可以传到云存储覆盖,
不改参数也能显示);原始 HEIC 备份在 original_assets/heic_backup/。
两个目录都在 .gitignore 里,确认没问题后可以自行删除。
nails-shop/nails.mov 是 iPhone 拍的 HEVC(hvc1)QuickTime,95 MB。安卓微信大概率播不了这个格式,
体积也太大(顾客点「使用演示」会很慢)。建议用 QuickTime 或「照片」导出成 H.264 的 MP4
(720p、10 MB 以内),再上传到云存储覆盖同名文件,demo.js 里的路径不用改。
图片默认存在微信云存储中,默认权限是「所有用户可读,仅创建者可读写」,通常无需调整。
如果真机上顾客看不到商品图或二维码,请到云开发控制台 → 存储 → 权限设置,确认当前环境为「所有用户可读」或等效的自定义安全规则。
反过来,如果后台「素材上传」或任何上传操作用户端报错
Have no access right to the storage(错误码 STORAGE_EXCEED_AUTHORITY),
说明当前安全规则不允许小程序端写入(例如设成了「所有用户可读」):改成「所有用户可读,仅创建者可读写」,
或者直接在云开发控制台的存储页面里上传文件(控制台以管理员身份操作,不受该规则限制)。
微信小程序内不能直接识别图片里的二维码。因此详情页使用带长按菜单的二维码图片,顾客长按图片 → 保存到手机相册 → 打开微信「扫一扫」→ 右上角相册图标 → 选择该二维码图片即可添加店主。
- 本项目默认不做支付,不展示微信号文本,只展示二维码图片。
- 商品下架只是把
isOnSale设为false,不会删除后台记录。 - 商品库存填写 0 后,首页与详情页会自动显示「售罄」。
微信规则:小程序页面默认不可被转发、不可分享到朋友圈,页面里必须定义处理函数才会打开对应入口
(Page.onShareAppMessage 决定「发送给朋友」,在此基础上 Page.onShareTimeline 决定「分享到朋友圈」)。
之前只有详情页写了 onShareAppMessage,顾客最常停留的首页没有任何转发处理函数,所以从首页点右上角
「···」里的「转发」是用不了的,朋友圈入口也一直没有。
现在已补齐,统一封装在 miniprogram/utils/share.js:
| 页面 | 发送给朋友 | 分享到朋友圈 | 收藏 |
|---|---|---|---|
| 首页 | 标题「墨痕Nails 穿戴甲|扫码咨询下单」,配图用首页背景图 | 支持 | 支持 |
| 款式详情 | 标题带款式名与价格,好友点开直达该款式 | 支持,点开是该款式 | 支持 |
| 通知 | 转发的是店铺首页 | 未开放(通知页没有值得分享的内容) | 未开放 |
另外在每个页面都调用了 wx.showShareMenu({ menus: ['shareAppMessage', 'shareTimeline'] }) 打开右上角菜单入口。
首页保持简洁,只通过右上角「···」转发;详情页底部额外放了一个 <button open-type="share"> 形式的
「分享给好友」按钮,顾客在看的款式可以一键转发给好友。
要点说明:
- 分享只能由用户主动触发(右上角菜单或页面里的转发按钮)。小程序内无法用代码主动弹出分享面板,这是微信的限制。
- 转发卡片配图不能直接使用
cloud://文件 ID,代码会把云存储图片解析成 https 临时链接再交给微信; 解析失败时自动退回微信默认截图(页面顶部 80% 屏幕宽度的画面)。 - 本地款式转发用
?code=001,云端款式用?id=…,两种分享路径都能被详情页正确打开。 - 微信官方对朋友圈分享的限制:基础库 2.11.3 及以上、iOS 需微信 8.0.24 及以上;朋友圈里打开的是 「单页模式」(场景值 1154),没有 tabBar、不能跳转页面,底部会有微信自带的「前往小程序」按钮进入完整小程序。 代码已针对单页模式隐藏转发按钮、禁用页面跳转并给出文字提示。
- 单页模式下云开发资源需要开启「未登录访问」才能读取云存储图片: 云开发控制台 → 选择环境 → 设置 → 未登录访问(或把存储权限设为「所有用户可读」)。
- 请勿做「分享后才能解锁 / 分享得优惠」这类诱导分享,微信《小程序平台运营规范》会处罚。
- 微信开发者工具重新编译:点右上角胶囊「···」,应能看到「转发」可用(之前首页这个是灰的)。
- 点「转发」检查卡片标题、配图,以及好友点开后进入的页面(详情页要能直达对应款式)。
- 「分享到朋友圈」开发者工具无法模拟,需要用真机:上传体验版 → 手机微信打开 → 点「···」→「分享到朋友圈」→ 再用另一个微信号从朋友圈点开,确认单页模式下款式图、价格、二维码都正常,并能点「前往小程序」。
代码改动要重新「上传」并提交审核、发布后,线上版本才会带上转发功能;预览版和体验版立即生效。