1. 项目概述:当果蔬摊遇上小程序
去年帮表弟改造他家社区果蔬店的经历让我意识到,传统果蔬销售模式正面临巨大挑战。每天凌晨3点进货、手工记账、现金找零的低效运营方式,让这个小本生意越来越难做。这正是我们开发这套微信小程序果蔬销售系统的初衷——用最低成本实现最高效的数字化转型。
这套基于SpringBoot+MySQL的微信小程序系统,核心解决了三个痛点:一是将线下交易全面线上化,顾客扫码即可完成选购支付;二是建立数字化库存管理系统,实时监控200+SKU的果蔬商品;三是通过会员体系沉淀社区客户资源。特别适合计算机专业同学作为毕业设计选题,因为涵盖了小程序前端、Java后端、数据库等典型全栈技术栈。
2. 系统架构设计解析
2.1 技术选型背后的思考
选择微信小程序而非原生App主要考虑三点:首先,小程序无需安装即用即走,特别适合买菜这种高频低粘性场景;其次,微信支付生态完善,省去对接银联等复杂流程;最后,开发成本仅为App的1/3左右。实测显示,在红米Note等低端机型上,小程序冷启动时间比H5快2秒以上。
后端采用SpringBoot而非传统SSM框架,看中的是其"约定优于配置"的特性。比如商品模块的RESTful接口,用@RestController一个注解就搞定了前后端数据交互,比写XML配置省时50%以上。数据库选MySQL5.7而非8.0,是因为社区版对存储过程的支持更稳定——我们有个库存预警的存储过程每天要执行300+次。
2.2 典型业务流程拆解
以最核心的"秒杀促销"场景为例(如图2所示),系统需要处理瞬时高并发:
- 前端用wx.requestPayment调用微信支付
- 通过SpringBoot的@Transactional确保扣减库存和生成订单的原子性
- MySQL采用行级锁防止超卖
- 用Redis缓存商品剩余量缓解数据库压力
特别注意:微信小程序支付需要提前配置合法的业务域名,否则会报"requestPayment:fail access denied"错误。我们吃过亏,调试了整整一天才发现是域名证书问题。
3. 核心功能实现细节
3.1 商品模块的三层架构实现
表现层:小程序端用WXML+WXSS构建商品卡片,通过wx.request调用接口。关键技巧是在onReachBottom事件中实现分页加载,配合骨架屏提升体验。
业务层:SpringBoot中用@Cacheable注解实现商品缓存,实测QPS从200提升到1500。特别注意缓存雪崩问题,我们给不同商品设置了随机TTL。
持久层:MySQL表设计遵循"商品主表+SKU子表"原则。一个坑点是果蔬类目需要特别处理计量单位,比如:
sql复制CREATE TABLE `product` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '商品名',
`price` decimal(10,2) NOT NULL COMMENT '基准价',
`unit_type` tinyint(4) NOT NULL COMMENT '1-按斤 2-按个 3-按份',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
3.2 支付系统的防重设计
支付模块最怕重复扣款。我们的解决方案是:
- 前端生成唯一order_no:时间戳+用户ID哈希
- 数据库建唯一索引
- 用Redis分布式锁控制并发
- 支付回调做幂等处理
实测遇到最棘手的是iOS端支付问题,发现微信小程序wx.requestVirtualPayment在未发布状态下有权限限制。最终通过配置测试白名单解决,关键代码:
java复制@GetMapping("/pay/callback")
public String callback(@RequestParam Map<String,String> params){
String orderNo = params.get("out_trade_no");
// 幂等判断
if(orderService.checkPaid(orderNo)){
return "success";
}
// 业务处理...
}
4. 毕业设计避坑指南
4.1 数据库优化实录
初期我们犯了个典型错误——在300万条订单数据上直接JOIN查询,导致页面加载超时。通过EXPLAIN分析发现全表扫描,最终优化方案:
- 给user_id字段加索引
- 拆分冷热数据,历史订单归档处理
- 用存储过程定时统计销售数据
4.2 微信生态对接常见坑
- 小程序登录流程务必保存unionid而非openid,否则多端用户体系会乱
- iOS测试需要配置合法的HTTPS域名,Charles抓包要用真机调试模式
- 微信支付证书每3个月需要更新一次,记得设日历提醒
4.3 性能压测数据对比
在阿里云2核4G服务器上测试结果:
- 商品列表接口:无缓存时QPS 215,加Redis后达1420
- 订单创建接口:MySQL优化前TPS 80,优化索引后提升到350
- 支付回调接口:用线程池处理后,平均响应时间从1.2s降到400ms
5. 项目扩展方向
这套基础框架可以延伸出多个毕业设计变种:
- 增加LBS功能:通过腾讯地图API实现"附近菜场"推荐
- 引入智能推荐:用协同过滤算法实现"猜你喜欢"
- 开发供应商端:用uni-app跨平台技术同步开发管理端APP
- 接入物联网:用SpringBoot MQTT对接智能称重设备
最近帮学妹在原有系统上加了个"预售拼团"功能,核心是利用Redis的INCR命令控制成团人数。有个细节要注意:拼团过期时间要用Redis的EXPIRE设置,比用MySQL定时任务可靠得多。
