1. 项目背景与核心需求
莘想面包店小程序是一个典型的O2O电商应用,旨在为线下烘焙门店提供线上销售渠道。这类项目在计算机专业毕业设计中具有很高代表性,因为它涵盖了企业级开发的核心技术栈:SpringBoot后端、微信小程序前端、MySQL数据库的完整整合。
从技术选型来看,SpringBoot作为当前Java领域最主流的轻量级框架,其自动配置、起步依赖等特性能够显著降低毕业设计的搭建复杂度。而微信小程序凭借10亿+的用户基础和即用即走的特性,成为连接线下门店与消费者的理想载体。MySQL作为关系型数据库的标配,在商品管理、订单处理等业务场景中能保证数据一致性。
实际开发中,这类项目通常需要解决三个核心问题:
- 多端数据同步:小程序用户操作需要实时反映到后台管理系统
- 高并发订单处理:促销活动时的瞬时流量冲击
- 微信生态整合:用户登录、支付、消息模板等接口的合规调用
2. 技术架构设计
2.1 整体架构方案
采用经典的三层架构模式:
客户端层:微信小程序(WXML+WXSS+JS) 业务层:SpringBoot 2.7.x + MyBatis-Plus 数据层:MySQL 8.0 + Redis缓存微信小程序通过HTTPS调用SpringBoot RESTful API,后端采用JWT进行接口鉴权。考虑到毕业设计的实现成本,建议使用内网穿透工具(如ngrok)解决本地开发环境的公网访问问题,避免购买云服务器。
2.2 数据库设计要点
面包店业务主要涉及6个核心表:
- 用户表(openid作为主键)
- 商品表(包含分类、库存、上下架状态)
- 订单表(状态机设计:待支付->已支付->配送中->已完成)
- 购物车表(临时存储用户未结算商品)
- 地址表(用户收货地址管理)
- 评价表(订单完成后用户反馈)
特别注意微信小程序用户体系与后台管理账号的隔离设计。推荐方案:
CREATE TABLE `user` ( `openid` varchar(32) PRIMARY KEY COMMENT '微信用户唯一标识', `nickname` varchar(64) COMMENT '微信昵称', `avatar` varchar(255) COMMENT '头像URL', `phone` varchar(20) COMMENT '绑定手机号', `create_time` datetime DEFAULT CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;3. 核心功能实现
3.1 微信登录集成
小程序端调用wx.login()获取code,传给后端换取openid:
@RestController @RequestMapping("/auth") public class AuthController { @Value("${wx.appid}") private String appid; @Value("${wx.secret}") private String secret; @PostMapping("/login") public Result login(@RequestParam String code) { String url = "https://api.weixin.qq.com/sns/jscode2session?" + "appid=" + appid + "&secret=" + secret + "&js_code=" + code + "&grant_type=authorization_code"; // 使用RestTemplate发起HTTP请求 String response = restTemplate.getForObject(url, String.class); JSONObject json = JSON.parseObject(response); String openid = json.getString("openid"); // 查询或创建用户 User user = userService.getOrCreate(openid); String token = JwtUtil.generateToken(user); return Result.success(token); } }关键点:session_key需要妥善保管但不要传到前端,建议结合Redis设置合理过期时间
3.2 商品展示优化
采用分级缓存策略提升性能:
- 静态资源:商品图片使用CDN加速
- 热点数据:Redis缓存商品详情(JSON格式存储)
- 数据库查询:MyBatis-Plus二级缓存
典型商品查询实现:
@Service public class ProductServiceImpl implements ProductService { @Autowired private RedisTemplate<String, String> redisTemplate; @Override public ProductDetailVO getDetail(Long id) { String cacheKey = "product:" + id; String cached = redisTemplate.opsForValue().get(cacheKey); if (StringUtils.isNotBlank(cached)) { return JSON.parseObject(cached, ProductDetailVO.class); } Product product = productMapper.selectById(id); if (product == null) { throw new BusinessException("商品不存在"); } ProductDetailVO vo = convertToVO(product); redisTemplate.opsForValue().set(cacheKey, JSON.toJSONString(vo), 30, TimeUnit.MINUTES); return vo; } }4. 典型业务场景实现
4.1 购物车设计
小程序端采用本地存储+服务端同步的方案:
- 未登录状态:使用wx.setStorageSync存储本地购物车
- 登录后:合并本地购物车到服务端
- 关键数据结构:
// 小程序端购物车结构 { "productId": { "id": 123, "name": "全麦面包", "price": 15.00, "count": 2, "selected": true } }服务端使用Redis Hash存储用户购物车:
public void addToCart(String openid, Long productId, Integer count) { String key = "cart:" + openid; String field = productId.toString(); // 原子性操作:存在则增量,不存在则新增 redisTemplate.opsForHash().increment(key, field, count); // 设置购物车过期时间(7天) redisTemplate.expire(key, 7, TimeUnit.DAYS); }4.2 订单支付流程
微信支付典型时序:
- 小程序调用统一下单API生成预支付订单
- 服务端签名返回支付参数
- 小程序调用wx.requestPayment发起支付
- 处理支付结果异步通知
防重复支付关键代码:
@Transactional public String createPrepayOrder(String openid, OrderCreateDTO dto) { // 1. 校验库存 checkInventory(dto.getItems()); // 2. 创建订单(状态为UNPAID) Order order = buildOrder(openid, dto); orderMapper.insert(order); // 3. 扣减库存(乐观锁) reduceInventory(dto.getItems()); // 4. 调用微信支付接口 WxPayUnifiedOrderRequest request = new WxPayUnifiedOrderRequest(); request.setOutTradeNo(order.getOrderNo()); request.setTotalFee(order.getActualPrice()); request.setBody("莘想面包店-订单支付"); request.setOpenid(openid); try { WxPayUnifiedOrderResult result = wxPayService.unifiedOrder(request); return buildPayParams(result); } catch (WxPayException e) { throw new BusinessException("支付创建失败:" + e.getErrCodeDes()); } }重要:必须处理MQ消息堆积的情况,建议在订单表添加支付截止时间字段,通过定时任务扫描超时订单
5. 部署与监控
5.1 多环境配置
SpringBoot支持profile区分环境:
# application-dev.yml server: port: 8080 wx: appid: dev_appid secret: dev_secret datasource: url: jdbc:mysql://localhost:3306/bakery_dev # application-prod.yml server: port: 80 wx: appid: prod_appid secret: prod_secret datasource: url: jdbc:mysql://mysql-prod:3306/bakery_prod启动时指定环境:
java -jar bakery.jar --spring.profiles.active=prod5.2 基础监控方案
毕业设计级别可采用的轻量级监控:
- Spring Boot Actuator:暴露/health、/metrics端点
- Prometheus + Grafana(可选):
@Configuration public class PrometheusConfig { @Bean MeterRegistryCustomizer<MeterRegistry> configurer() { return registry -> registry.config().commonTags("application", "bakery"); } }- 日志收集:Logback按天滚动,关键操作添加MDC追踪
<!-- logback-spring.xml --> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>logs/app.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>logs/app.%d{yyyy-MM-dd}.log</fileNamePattern> <maxHistory>30</maxHistory> </rollingPolicy> </appender>6. 毕业设计扩展建议
6.1 技术深化方向
秒杀功能实现:
- Redis预减库存
- 消息队列削峰
- 接口限流(Guava RateLimiter)
智能推荐:
- 基于用户行为的协同过滤
- 使用Mahout或Spark MLlib
可视化大屏:
- ECharts展示销售热力图
- WebSocket实时推送数据
6.2 论文撰写要点
技术论文建议包含以下章节:
- 系统架构设计图(使用PlantUML绘制)
- 数据库ER图(PowerDesigner导出)
- 核心算法流程图(如推荐算法)
- 性能测试报告(JMeter压测结果)
- 微信小程序页面截图(真机效果)
实测中发现三个易错点需要特别注意:
- 微信支付证书路径问题:建议放在resources/cert目录下
- 小程序真机调试时域名校验:提前配置合法域名
- MySQL时区设置:统一使用UTC+8避免时间错乱
这个项目我在指导毕业生时发现,最大的价值不在于功能有多复杂,而在于完整走通"需求分析→技术选型→编码实现→部署上线"的全流程。建议在README.md中详细记录每个环节的关键决策和问题解决方法,这将成为答辩时的重要加分项。