e423ab2d733250b852abd2e5ff9a7d5cb0bfba54
智绘微刻小程序开发说明
项目简介
智绘微刻(Smart-Engraving)微信小程序,为用户提供词云生成 + 个性化激光雕刻定制服务。
技术栈
- 框架: Taro 3.6.31 + React 18 + TypeScript
- 样式: SCSS(CSS 变量驱动主题系统)
- 目标平台: 微信小程序
- 包管理器: npm
项目结构
smart-engraving-miniapp/
├── config/ # Taro 配置文件
│ └── index.js # 构建配置(含 copy patterns:icon、img 资源复制)
├── src/
│ ├── app.tsx # 应用入口(全局 ThemeProvider 挂载)
│ ├── app.scss # 全局样式(CSS 变量 + 主题工具类)
│ ├── app.config.ts # 应用配置(页面路由、tabBar、window)
│ ├── custom-tab-bar/ # 自定义底部导航(4 tab:首页/设计清单/订单/我的)
│ ├── types/
│ │ └── index.ts # TypeScript 类型定义(ProductCategory、DesignItem、OrderItem 等)
│ ├── utils/
│ │ ├── productConfig.ts # 产品品类配置(5 个品类 + iconImg 映射)
│ │ └── store.ts # Data Access 层(Storage 读写,openid 隔离)
│ ├── context/
│ │ └── ThemeContext.tsx # 全局主题 Context(light/dark)
│ ├── components/
│ │ ├── ThemeToggle/ # 主题切换按钮(onTap 触发)
│ │ ├── LoginGuard/ # 登录守卫(未登录时居中提示)
│ │ └── LoginModal/ # 登录弹窗(历史组件)
│ └── pages/
│ ├── index/ # 首页(品类入口、成品轮播、搜索)
│ ├── product/ # 商品详情页(轮播图 + 加入设计清单弹窗)
│ ├── diy/ # DIY 工作台(贴纸拖拽、缩放、碰撞检测)
│ ├── checkout/ # 设计效果确认页(收货地址 + 下单)
│ ├── designList/ # 我的设计清单(需登录)
│ ├── orders/ # 订单列表(需登录)
│ ├── orderDetail/ # 订单详情(收货地址 + 物流时间轴)
│ ├── profile/ # 个人中心(5 状态入口、6 宫格菜单、企业定制)
│ ├── service/ # 联系客服页
│ ├── wordcloud/ # 词云生成
│ ├── address/ # 收货地址管理
│ ├── settings/ # 设置(个人信息、账号管理、退出登录)
│ ├── agreement/ # 使用协议
│ └── userDatabase/ # 账号管理(密码保护:zhihui2024)
├── src/icon/ # 19 个 icon PNG(28~56px,打包到 dist/icon)
├── src/img/ # 8 张产品实物压缩图(打包到 dist/img)
├── package.json
├── tsconfig.json
└── project.config.json # 微信开发者工具配置
页面说明
| 页面 | 路径 | 功能 |
|---|---|---|
| 首页 | /pages/index/index |
品类入口、成品轮播、搜索框、热门品类网格 |
| 商品详情 | /pages/product/index |
轮播图、单价/工期/尺寸、加入设计清单弹窗 |
| DIY 工作台 | /pages/diy/index |
选品类→上传图片/相机→拖拽缩放→碰撞检测→预览下单 |
| 设计效果确认 | /pages/checkout/index |
展示设计效果、选择/修改收货地址、确认下单 |
| 设计清单 | /pages/designList/index |
清单列表(全部/待设计/未设计/设计中/已下单) |
| 订单列表 | /pages/orders/index |
订单列表(全部/待付款/待发货/待收货/已完成) |
| 订单详情 | /pages/orderDetail/index |
订单详情页(收货地址 + 物流时间轴) |
| 个人中心 | /pages/profile/index |
用户信息、5 状态快捷入口、6 宫格菜单、企业定制 |
| 词云生成 | /pages/wordcloud/index |
三步式词云生成 |
| 收货地址 | /pages/address/index |
增删改查 + 省市区选择 + 默认地址 |
| 设置 | /pages/settings/index |
修改信息、账号管理、定制协议、退出登录 |
| 联系客服 | /pages/service/index |
客服电话、微信、邮箱、企业批量定制 |
| 账号管理 | /pages/userDatabase/index |
查看/切换/新建/删除本地用户(密码:zhihui2024) |
核心交互流程
完整业务流程
首页浏览品类 → 商品详情页(轮播图+价格+介绍)
→ 加入设计清单(弹窗选数量)→ 设计清单页(支持自动筛选)
→ 立即下单 → DIY 工作台(直接进入)
→ 添加贴纸(相册/相机)→ 拖动调整位置 → 碰撞检测
→ 预览效果 → 确认完成 → 设计效果确认页(含收货地址)
→ 弹窗确认下单 → 订单生成 → 订单列表/订单详情(可改地址)
→ 物流时间轴追踪 → 确认收货 → 完成
个人主页快捷入口流
个人主页
→ 待设计 / 待付款 / 待发货 / 待收货 / 已完成 → 自动跳转对应页面并筛选
→ 收货地址 → 增删改复 + 省市区选择(微信原生 Picker)+ 默认地址
→ 设置 → 修改昵称头像 / 退出登录 / 定制协议 / 账号管理
→ 账号管理(密码保护:zhihui2024)→ 查看/切换/新建/删除本地用户
→ 企业批量定制 → 客服咨询
关键配置与实现细节
主题系统(Light / Dark)
- 全局 CSS 变量定义在
app.scss:var(--bg-card)、var(--text-primary)、var(--text-secondary)、var(--line-star)等 - 切换方式:根节点
className={theme-${theme}}(theme-light/theme-dark) - 状态管理:
src/context/ThemeContext.tsx(React Context),支持全局同步 - 切换按钮:
src/components/ThemeToggle/index.tsx(使用onTap,非onClick)
事件绑定规范(Taro 小程序兼容)
⚠️ 重要:微信小程序 + Taro React + 微信基础库 3.17.0 存在
onClick兼容风险。现象:动态更新事件 handler 时可能触发
TaroElement.removeEventListener(undefined),导致Cannot read properties of undefined (reading '_num')。本项目已全部使用
onTap替代onClick。后续新增组件也须遵守此规范。
| 平台 | 推荐事件 | 说明 |
|---|---|---|
| 微信小程序 | onTap |
编译为 bindtap,原生稳定 |
| H5 | onClick |
仅在 H5 构建中使用 |
Taro React 生命周期建议
- 页面显示刷新:使用
import { useDidShow } from '@tarojs/taro',而非手动覆盖page.onShow - 手动
page.onShow = function(){}在热更新时会重复叠加,导致异常
前端 DA 层设计
所有数据操作通过 src/utils/store.ts 抽象:
pages/
└─ 调用 store.getDesignList() / addDesign() / designToOrder() 等业务接口
└─ store.ts 内封装 Taro.getStorageSync / setStorageSync
└─ key = ${scope}_${openid} 实现多用户数据隔离
后端替换方案:上线时只需重写 store.ts 中的函数为 wx.request HTTP 调用,页面层零改动。
Icon 系统(emoji 已完全移除)
- 19 个 icon 存放在
src/icon/,构建时通过config/index.jscopy 到dist/icon/ - 产品 icon 映射:
src/utils/productConfig.ts中每个产品有iconImg字段 - 旧数据兼容:列表渲染时检测
productIcon是否以/icon/开头,否则通过PRODUCT_ICON_MAP查映射表
遮罩尺寸
详见 docs/mask-config-guide.md。当实际产品尺寸确定后,仅需修改 src/utils/productConfig.ts 中的 PRODUCTS 数组。
后端接口(待接入)
当前代码中以下功能需要接入后端 API:
- 词云生成:调用
/api/wordcloud/generate提交底图+名单,生成词云图 - 图片保存:调用
/api/upload上传用户设计图 - 订单创建:调用
/api/order/create提交订单 - 登录授权:当前
openid为 mock 值,接入真实后端后替换wx.login的code
启动开发
安装依赖
npm install
# 或
yarn install
开发模式(微信小程序)
npm run dev:weapp
构建(微信小程序)
npm run build:weapp
H5 预览
npm run dev:h5
图片资源与包体积说明
当前项目的产品实物照片(src/img/)已内置在小程序中。由于微信小程序预览/上传代码包体积上限为 2MB,大量高分辨率照片会导致超限。
已采取的措施(两步压缩脚本)
compress-images.js(基于 sharp)已配置到项目中,支持批量:- resize:最大边长限制到 800px
- format:PNG → JPG
- quality:JPG 质量 60%
- 执行一次即可:
node compress-images.js - 当前编译后
dist/总大小约 1.02 MB,满足微信限制。
⚠️ 注意:压缩 ≠ 长期方案
压缩后的图片在手机上画质会有可见损失(尤其缩放到全屏轮播时)。建议上线前迁移到 CDN:
- 注册 腾讯云 COS(微信小程序配套,国内访问最快)或 阿里云 OSS。
- 将
src/img/中的实物照片上传到对象存储。 - 拿到每个图片的 HTTPS 外链 URL。
- 修改
src/utils/productConfig.ts中各产品的images字段,从本地路径/img/xxx.jpg替换为网络 URL:// 改之前 images: ['/img/penbox/The1.jpg'] // 改之后 images: ['https://your-bucket.cos.ap-guangzhou.myqcloud.com/penbox/The1.jpg'] - 修改
config/index.js,缩小copy.patterns范围(只 copy icon/占位图等小文件),或直接移除src/img的 copy 规则,减少构建体积。
迁移优点:
- 图片清晰度恢复到原图级别;
- 小程序包体积长期保持 < 500KB;
- 后续更换产品图只需在图床后台操作,无需重新发版。
最近更新记录(2026-08-01)
Batch 10 — 夜间模式适配 + 地址弹窗统一 + 空状态主题化
| 序号 | 修改内容 |
|---|---|
| 1 | 订单详情页夜间模式文字修复:补充 .status-text、.logistics-title/num、.meta-title/label/value、.timeline-status/time/desc 等 CSS 变量配色,夜间模式自动变亮 |
| 2 | 地址选择弹窗统一:提取 .modal-overlay + .addr-picker-sheet 为 app.scss 全局统一样式;移除 checkout/orderDetail 中的重复覆写 |
| 3 | 收货地址空状态主题适配:📍 emoji → <Image src='/icon/地址.png'>;空状态文字使用 CSS 变量;同步修复 orders/index.scss 中硬编码颜色 |
Batch 9(2026-07-29)— emoji → icon 彻底收尾
productConfig.ts增加iconImg字段store.ts写入层修复(存iconImg而非 emoji)- 运行时旧数据兼容映射
PRODUCT_ICON_MAP - 商品详情页弹窗去 emoji
Batch 8(2026-07-29)— Taro 事件兼容修复
- 全量
onClick→onTap(15 个文件,82 处) - Profile
STATUS_MAP.map消除 Fragment(改为View.status-group) useEffect + page.onShow重写为useDidShow- 删除废弃
permission.scope.writePhotosAlbum
下一步开发计划
高优先级
- 接入后端词云生成 API,替换模拟数据
- 实现图片上传接口
- 实现订单创建与支付流程
- 接入真实微信登录授权(替换 mock openid)
- 订单物流接口接入(目前为静态 mock)
中优先级
- 将实物照片迁移到 CDN(腾讯云 COS / 阿里云 OSS)
- 添加更多词云底图模板
- 支持从微信聊天记录导入 Excel 名单
- 实现设计稿保存到草稿箱功能
低优先级
- 3D 效果预览(模拟材质纹理)
- 批量下单优惠逻辑
- 完善企业定制专属通道
Languages
TypeScript
46.8%
HTML
31.6%
SCSS
19.1%
JavaScript
2.5%