1、立项背景和目标
本项目是一个面向个人学习与技术展示的电商微信小程序全栈项目。立项目标是为解决个人开发者缺乏企业资质、无法申请真实微信商户号和备案域名的痛点,打造一套“既能跑通真实业务闭环,又能在无资质环境下完整演示”的电商系统。通过本项目,旨在全面掌握从前端交互到后端服务、数据库设计、安全鉴权以及支付协议的完整全栈开发能力。
2、软件功能、核心功能模块介绍
系统包含六大核心模块:
① 用户鉴权模块:基于微信静默登录获取openid,由后端签发JWT Token,实现前后端分离的登录态管理;
② 商品展示与搜索模块:支持商品瀑布流展示、分类Tab筛选、关键词模糊搜索及分页上拉加载;
③ 购物车模块:支持多端同步(数据落库),实现未登录本地缓存与登录后无感合并的“Upsert”防重设计;
④ 订单与地址模块:包含收货地址CRUD(含省市区选择与默认地址维护)、订单创建(事务+行锁防超卖)、订单状态流转;
⑤ 支付与安全模块:对接微信支付V3(JSAPI),实现RSA签名、AES解密、回调验签及支付降级双模式;
⑥ 后台自动任务模块:基于定时任务实现订单超时自动关闭与库存回滚。
3、业务流程、功能路径描述
用户进入首页浏览商品,可通过分类Tab或关键词搜索筛选,点击商品进入详情页,选择“加入购物车”或“立即购买”。进入确认订单页后,系统自动拉取默认收货地址或使用下单时冻结的地址快照。提交订单时,后端通过数据库事务和行锁校验并扣减库存,生成订单。随后拉起微信支付(无证书时自动降级为模拟支付),支付成功后回调后端更新订单状态并清空购物车。用户可在“我的订单”中查看订单列表与详情。对于15分钟未支付的订单,系统定时任务会自动关闭订单并回滚库存。
1、整体架构和设计思路,不同模块使用的技术栈
项目采用前后端分离的架构设计。
前端:微信小程序原生开发,引入 Vant Weapp 组件库和 @vant/area-data 省市区数据源。采用模块化封装,统一 request.js 网络请求拦截器,统一注入 JWT Token,并处理 401 登录过期自动重登逻辑。
后端:基于 Node.js + Express 框架,采用 MVC 分层架构(Router -> Middleware -> Controller -> Model)。核心的微信支付V3协议,不依赖第三方包,完全使用 Node.js 内置 crypto 模块自行实现 RSA-SHA256 签名和 AES-256-GCM 回调解密,提升了系统的稳定性和安全性。
数据库:MySQL 8.0,使用 mysql2 驱动。金额全链路以“分”为单位存 INT,杜绝浮点误差。数据表包含:用户、商品、分类、地址、购物车、订单、订单明细、支付回调日志等。
2、“我”的负责模块和结果(尽可能量化)
作为独立开发者,我负责了项目的全部模块。
鉴权与安全:完成后端JWT中间件与全站路由守卫覆盖(用户、购物车、地址、订单、支付等8+个核心接口),彻底堵死越权漏洞,无Token请求均返回401,带有效Token请求正常返回200。
高并发与一致性:实现订单创建的事务+行锁防超卖机制,并通过 node-cron 实现了每分钟扫描超时订单的自动关单任务,成功实现了库存的精确回滚(已实际验证订单状态变更与库存恢复)。
支付模块:完成微信支付V3接口对接,实现真实支付与模拟支付的自动降级(无证书环境降级为模拟支付,保证项目可完整演示),支付回调验签逻辑已就绪。
3、“我”遇到的难点、坑,和解决方案
坑1:Windows CMD 导入 SQL 的中文乱码问题。执行包含中文的 SQL 文件时频繁报错 ERROR 1366。解决方案:在命令行执行时强制指定编码,使用 mysql -u root -p --default-character-set=utf8mb4 < xxx.sql,彻底解决乱码。
坑2:微信开发者工具的编译缓存问题。修改了分页逻辑后,模拟器显示的 total 竟然还是旧值,导致逻辑判断错误。解决方案:通过“工具 -> 清缓存 -> 全部清除”后重新编译,发现是新代码未被工具识别,清缓存后立即恢复正常。
坑3:JWT改造过程中的“读写不一致”断层。把商品加购的“写”逻辑改成了写入服务端MySQL,但购物车页面的“读”逻辑还是读取本地缓存,导致购物车显示为空。解决方案:全面梳理前后端数据流,将 cart.js 和 confirm.js 的读操作也全部切换到服务端接口,统一了读写路径,打通了多端同步。
坑4:敏感安全改造的平滑过渡。在全面启用JWT鉴权