Skip to content

Repository files navigation

墨痕Nails 穿戴甲小程序

微信云开发小程序:不做在线支付。顾客浏览上架的美甲款式,在详情页长按保存店主上传的微信二维码,再用微信「扫一扫 → 相册」扫码添加店主咨询下单。

功能

  • 首页:顶部展示 back.HEIC 转换后的背景图与艺术字店名「墨痕Nails」。
  • 首页商品:读取 miniprogram/nails_picture/products.js 中配置的商品,展示编号、价格、库存。
  • 详情页:多张轮播图、名称、价格、库存、售罄提示,以及店主上传的微信二维码图片;二维码图片支持长按保存。
  • 中英文切换:首页「EN / 中文」按钮切换,选择会保存在本机。
  • 转发分享:首页、款式详情页可「发送给朋友」和「分享到朋友圈」,通知页可转发店铺首页(见下文「转发与分享到朋友圈」)。
  • 「通知」板块:展示配送等消息通知;后台管理页保留在代码中但入口已从页面移除,目前首页商品来自本地 nails_picture/products.js

★ 日常改商品资料(最重要的文件)

首页顶部背景、商品图片和商品列表都来自同一个封装目录(已放入项目):

新增商品的流程:

  1. 先把 iPhone 的 HEIC 照片转成真正的 JPEG(见下文「商品图片格式」一节,非常重要,否则安卓手机看不到图)。
  2. 在微信开发者工具里登录「我的」后台,打开 素材上传,选择图片或演示视频;上传完成后复制“文件 ID”(形如 cloud://…)。开发者工具里可直接从电脑本地选文件。
  3. 打开 products.js,复制其中一段商品配置,把云存储文件 ID 填到 images(演示视频填到 videos),并修改编号、名称、价格。
  4. 每个商品编号(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 为准。

1. 导入项目

用微信开发者工具导入 /Users/damen/NailShopproject.config.json 已配置 miniprogramRootcloudfunctionRoot)。

2. 开通云开发并确认环境

在开发者工具顶部点击「云开发」,开通后得到一个环境 ID。

  • miniprogram/app.jswx.cloud.initenv 留空表示使用默认环境;如果账号下有多个环境,请把环境 ID 填进去。

3. 修改管理员密码

打开 cloudfunctions/admin/index.js,把:

const ADMIN_PASSWORD = process.env.ADMIN_PASSWORD || '123456';

中的 '123456' 改成你自己的密码,然后保存。

也可以不改代码,在云开发控制台给 admin 云函数配置环境变量 ADMIN_PASSWORD,环境变量会优先生效。

4. 部署云函数

在开发者工具中右键 cloudfunctions/admin上传并部署:云端安装依赖

5. 首次登录初始化

在模拟器中打开小程序「我的」→ 输入管理员密码登录。登录成功后会自动创建两个集合:

  • products:美甲商品
  • settings:微信二维码设置

6. 云端后台开始使用

  1. 进入「后台设置」上传你的微信二维码图片。
  2. 顾客进入详情页长按二维码图片保存,再用微信扫码添加你。

7. 素材上传(商品图 / 演示视频)

  1. 登录后台后进入「素材上传」,选择本地图片或视频(开发者工具里可以直接从电脑选文件),或点击「一键上传项目当前的两张示例图」。
  2. 上传成功后复制“文件 ID”,把 cloud://… 地址填入 products.jsimages / videos
  3. 将本地大文件移出 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、不能跳转页面,底部会有微信自带的「前往小程序」按钮进入完整小程序。 代码已针对单页模式隐藏转发按钮、禁用页面跳转并给出文字提示。
  • 单页模式下云开发资源需要开启「未登录访问」才能读取云存储图片: 云开发控制台 → 选择环境 → 设置 → 未登录访问(或把存储权限设为「所有用户可读」)。
  • 请勿做「分享后才能解锁 / 分享得优惠」这类诱导分享,微信《小程序平台运营规范》会处罚。

自测步骤

  1. 微信开发者工具重新编译:点右上角胶囊「···」,应能看到「转发」可用(之前首页这个是灰的)。
  2. 点「转发」检查卡片标题、配图,以及好友点开后进入的页面(详情页要能直达对应款式)。
  3. 「分享到朋友圈」开发者工具无法模拟,需要用真机:上传体验版 → 手机微信打开 → 点「···」→「分享到朋友圈」→ 再用另一个微信号从朋友圈点开,确认单页模式下款式图、价格、二维码都正常,并能点「前往小程序」。

代码改动要重新「上传」并提交审核、发布后,线上版本才会带上转发功能;预览版和体验版立即生效。

About

NailShop WeChat mini program - nail salon storefront with admin console

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages