1. 项目概述
校园外卖点餐平台是一个基于SpringBoot后端框架和微信小程序前端技术的校园餐饮服务系统。作为一名有10年开发经验的Java全栈工程师,我设计这个项目的初衷是为了解决校园内学生就餐高峰期排队时间长、食堂选择有限等实际问题。
这个系统采用了当前主流的技术栈:后端使用SpringBoot+MyBatisPlus,前端使用微信小程序+Vue.js,数据库采用MySQL。系统实现了用户注册登录、商家管理、菜品浏览、购物车、订单管理、支付对接等完整的外卖业务流程。
技术选型理由:SpringBoot简化了传统SSM框架的配置复杂度;微信小程序无需安装即可使用,符合学生使用习惯;MySQL作为成熟的关系型数据库,能满足校园规模的数据存储需求。
2. 系统架构设计
2.1 技术架构图解
整个系统采用分层架构设计,分为表现层、业务逻辑层、数据访问层和基础设施层:
[微信小程序] | [HTTP/HTTPS] | [SpringBoot REST API] | [MyBatisPlus ORM] | [MySQL Database]2.2 核心组件说明
2.2.1 SpringBoot后端
- 内嵌Tomcat服务器
- 自动配置Spring MVC
- 集成MyBatisPlus
- 使用Spring Security进行认证授权
- 采用Redis缓存热点数据
2.2.2 微信小程序前端
- 使用WXML+WXSS+JS开发
- 采用Vue.js风格的组件化开发
- 使用微信支付API
- 集成腾讯地图SDK
2.2.3 数据库设计
- MySQL 8.0版本
- 采用InnoDB引擎
- 建立适当的索引优化查询
- 定期备份机制
3. 核心功能实现
3.1 用户认证模块
采用JWT(JSON Web Token)实现无状态认证,关键代码:
// 生成Token public String generateToken(User user) { return Jwts.builder() .setSubject(user.getUsername()) .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME)) .signWith(SignatureAlgorithm.HS512, SECRET) .compact(); } // 验证Token public boolean validateToken(String token) { try { Jwts.parser().setSigningKey(SECRET).parseClaimsJws(token); return true; } catch (Exception e) { return false; } }安全提示:SECRET密钥需要足够复杂并妥善保管,建议定期轮换;设置合理的EXPIRATION_TIME(通常2小时)
3.2 订单处理流程
订单状态机设计:
stateDiagram [*] --> 待支付 待支付 --> 已取消: 超时未支付 待支付 --> 已支付: 支付成功 已支付 --> 商家已接单 商家已接单 --> 配送中 配送中 --> 已完成 已完成 --> [*]关键业务逻辑:
- 创建订单时锁定库存
- 支付超时(30分钟)自动取消
- 订单状态变更通知用户
- 异常订单处理机制
4. 数据库设计
4.1 主要表结构
用户表(users)
CREATE TABLE `users` ( `id` bigint NOT NULL AUTO_INCREMENT, `username` varchar(50) NOT NULL, `password` varchar(100) NOT NULL, `phone` varchar(20) NOT NULL, `avatar` varchar(255) DEFAULT NULL, `status` tinyint DEFAULT '1', `created_at` datetime DEFAULT CURRENT_TIMESTAMP, `updated_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `idx_username` (`username`), UNIQUE KEY `idx_phone` (`phone`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;订单表(orders)
CREATE TABLE `orders` ( `id` bigint NOT NULL AUTO_INCREMENT, `order_no` varchar(32) NOT NULL, `user_id` bigint NOT NULL, `total_amount` decimal(10,2) NOT NULL, `status` tinyint NOT NULL DEFAULT '0', `address` varchar(255) NOT NULL, `remark` varchar(255) DEFAULT NULL, `created_at` datetime DEFAULT CURRENT_TIMESTAMP, `updated_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `idx_order_no` (`order_no`), KEY `idx_user_id` (`user_id`), KEY `idx_status` (`status`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;4.2 索引优化建议
- 高频查询字段建立索引
- 联合查询考虑复合索引
- 避免过度索引影响写入性能
- 定期使用EXPLAIN分析慢查询
5. 微信小程序实现
5.1 页面结构
pages/ ├── index/ # 首页 ├── shop/ # 商家列表 ├── food/ # 菜品详情 ├── cart/ # 购物车 ├── order/ # 订单相关 │ ├── create # 创建订单 │ ├── list # 订单列表 │ └── detail # 订单详情 └── user/ # 用户中心5.2 核心交互实现
购物车功能示例代码:
// 添加商品到购物车 function addToCart(food) { const cart = wx.getStorageSync('cart') || {} if (cart[food.id]) { cart[food.id].quantity += 1 } else { cart[food.id] = { ...food, quantity: 1, selected: true } } wx.setStorageSync('cart', cart) updateCartBadge() } // 更新购物车角标 function updateCartBadge() { const cart = wx.getStorageSync('cart') || {} const count = Object.values(cart).reduce((sum, item) => sum + item.quantity, 0) wx.setTabBarBadge({ index: 2, text: count > 0 ? count.toString() : '' }) }6. 部署与运维
6.1 服务器部署
推荐配置:
- 2核4G云服务器(CentOS 7.6+)
- JDK 1.8+
- MySQL 8.0
- Redis 6.0+
部署步骤:
- 打包SpringBoot应用:
mvn clean package - 上传jar包到服务器
- 使用nohup后台运行:
nohup java -jar your-app.jar & - 配置Nginx反向代理
- 设置开机自启动
6.2 微信小程序发布
- 开发环境配置
- 体验版测试
- 提交微信审核
- 正式发布
7. 常见问题解决
7.1 微信支付集成问题
问题现象:支付签名验证失败
解决方案:
- 检查商户密钥是否正确
- 验证签名算法是否一致
- 确保时间戳在有效期内
- 使用微信支付沙箱环境测试
7.2 高并发场景优化
- 商品详情页加入Redis缓存
- 订单创建使用分布式锁
- 数据库读写分离
- 热点数据预加载
8. 项目扩展方向
- 智能推荐:基于用户历史订单推荐菜品
- 配送跟踪:集成实时地图API
- 评价系统:用户反馈收集与分析
- 营销工具:优惠券、满减活动
在实际开发过程中,我特别建议重视日志系统的建设,完善的日志可以帮助快速定位问题。同时,要建立完整的监控体系,包括服务器资源监控、应用性能监控和业务指标监控。
这个项目作为毕业设计具有很好的实践价值,涵盖了前后端开发的多个关键技术点。开发过程中要注意代码规范,做好模块划分,编写清晰的文档注释。对于初学者来说,可以先从核心功能开始实现,再逐步完善其他模块。