SpringBoot+Vue校园食堂点餐系统设计与实现
2026/9/14 3:43:45 网站建设 项目流程

1. 项目背景与需求分析

轻工学院食堂点餐平台的设计与开发是一个典型的校园信息化建设项目。随着高校数字化建设的推进,传统食堂窗口排队点餐模式已经无法满足师生多样化的用餐需求。尤其在疫情期间,无接触点餐、错峰取餐等需求更加凸显。

这个毕业设计项目需要解决以下几个核心痛点:

  • 用餐高峰期窗口排队时间长,效率低下
  • 食堂菜品信息不透明,师生无法提前了解当日供应
  • 人工统计就餐数据困难,难以优化菜品结构和供应量
  • 支付方式单一,现金交易存在卫生隐患

基于SpringBoot的技术选型主要考虑以下因素:

  1. 轻量级框架适合快速开发,能够满足毕业设计周期要求
  2. 丰富的starter依赖可以快速集成MySQL、Redis等常用组件
  3. 内嵌Tomcat服务器简化部署流程
  4. 完善的文档和社区支持,便于解决开发中遇到的问题

2. 系统架构设计

2.1 技术栈选型

前端技术:

  • Vue.js 3.x(PC端管理后台)
  • 微信小程序(移动端用户界面)
  • Element Plus(管理后台UI组件库)
  • Vant Weapp(小程序UI组件库)

后端技术:

  • SpringBoot 2.7.x
  • MyBatis-Plus 3.5.x
  • Redis 6.x(缓存和会话管理)
  • MySQL 8.0(主数据库)
  • Swagger 3.0(API文档生成)

基础设施:

  • Nginx(反向代理和静态资源服务)
  • 阿里云OSS(图片存储)
  • 微信支付SDK(支付接口)

2.2 系统模块划分

  1. 用户模块

    • 学生/教师注册登录(对接学校统一认证)
    • 个人信息管理
    • 消费记录查询
  2. 菜品模块

    • 菜品分类管理
    • 菜品信息维护
    • 每日菜单发布
  3. 订单模块

    • 购物车管理
    • 订单创建与支付
    • 订单状态追踪
  4. 配送模块

    • 取餐点管理
    • 取餐码生成
    • 配送状态更新
  5. 评价模块

    • 菜品评价
    • 投诉建议
    • 评价统计
  6. 管理后台

    • 数据统计分析
    • 运营报表生成
    • 系统参数配置

3. 数据库设计关键点

3.1 核心表结构

  1. 用户表(user)
CREATE TABLE `user` ( `id` bigint NOT NULL AUTO_INCREMENT, `student_id` varchar(20) NOT NULL COMMENT '学号', `name` varchar(50) NOT NULL, `phone` varchar(20) DEFAULT NULL, `balance` decimal(10,2) DEFAULT '0.00' COMMENT '账户余额', `avatar` varchar(255) DEFAULT NULL COMMENT '头像URL', `status` tinyint DEFAULT '1' COMMENT '状态(0禁用1正常)', `create_time` datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `idx_student_id` (`student_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
  1. 菜品表(dish)
CREATE TABLE `dish` ( `id` bigint NOT NULL AUTO_INCREMENT, `category_id` bigint NOT NULL COMMENT '分类ID', `name` varchar(100) NOT NULL, `price` decimal(10,2) NOT NULL, `image` varchar(255) DEFAULT NULL, `description` varchar(500) DEFAULT NULL, `status` tinyint DEFAULT '1' COMMENT '状态(0下架1上架)', `sales` int DEFAULT '0' COMMENT '月销量', `create_time` datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `idx_category` (`category_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
  1. 订单表(order)
CREATE TABLE `order` ( `id` bigint NOT NULL AUTO_INCREMENT, `order_no` varchar(32) NOT NULL COMMENT '订单编号', `user_id` bigint NOT NULL, `total_amount` decimal(10,2) NOT NULL COMMENT '订单总金额', `pay_amount` decimal(10,2) NOT NULL COMMENT '实付金额', `pay_type` tinyint DEFAULT NULL COMMENT '支付方式(1余额2微信)', `status` tinyint DEFAULT '0' COMMENT '状态(0待支付1已支付2已取消3已完成)', `take_code` varchar(10) DEFAULT NULL COMMENT '取餐码', `take_location` varchar(50) DEFAULT NULL COMMENT '取餐点', `create_time` datetime DEFAULT CURRENT_TIMESTAMP, `pay_time` datetime DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `idx_order_no` (`order_no`), KEY `idx_user` (`user_id`), KEY `idx_create_time` (`create_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

3.2 性能优化考虑

  1. 订单表按学期水平分表,避免单表数据过大
  2. 高频查询的菜品信息使用Redis缓存
  3. 建立合适的索引提高查询效率
  4. 使用读写分离架构减轻主库压力

4. 核心功能实现

4.1 微信小程序登录集成

@RestController @RequestMapping("/api/auth") public class AuthController { @Autowired private WechatService wechatService; @PostMapping("/wxLogin") public Result<LoginVO> wxLogin(@RequestBody WxLoginDTO dto) { // 1. 调用微信接口获取openid String openid = wechatService.getOpenid(dto.getCode()); if(StringUtils.isEmpty(openid)) { throw new BusinessException("微信登录失败"); } // 2. 查询或创建用户 User user = userService.getByOpenid(openid); if(user == null) { user = new User(); user.setOpenid(openid); user.setNickname(dto.getNickname()); user.setAvatar(dto.getAvatar()); userService.save(user); } // 3. 生成JWT token String token = JwtUtil.generateToken(user.getId()); // 4. 返回登录结果 LoginVO vo = new LoginVO(); vo.setToken(token); vo.setUserInfo(user); return Result.success(vo); } }

4.2 购物车与订单创建

@Service public class OrderServiceImpl implements OrderService { @Transactional @Override public String createOrder(OrderCreateDTO dto) { // 1. 验证用户 Long userId = SecurityUtil.getCurrentUserId(); User user = userService.getById(userId); if(user == null) { throw new BusinessException("用户不存在"); } // 2. 验证购物车项 List<CartItem> cartItems = cartService.listByUser(userId); if(cartItems.isEmpty()) { throw new BusinessException("购物车为空"); } // 3. 计算总金额 BigDecimal totalAmount = cartItems.stream() .map(item -> item.getPrice().multiply(BigDecimal.valueOf(item.getQuantity()))) .reduce(BigDecimal.ZERO, BigDecimal::add); // 4. 创建订单 Order order = new Order(); order.setOrderNo(OrderNoGenerator.generate()); order.setUserId(userId); order.setTotalAmount(totalAmount); order.setPayAmount(totalAmount); // 暂不考虑优惠 order.setStatus(OrderStatus.UNPAID.getCode()); order.setTakeLocation(dto.getTakeLocation()); order.setTakeCode(RandomStringUtils.randomNumeric(4)); orderMapper.insert(order); // 5. 创建订单明细 List<OrderDetail> details = cartItems.stream() .map(item -> { OrderDetail detail = new OrderDetail(); detail.setOrderId(order.getId()); detail.setDishId(item.getDishId()); detail.setDishName(item.getDishName()); detail.setQuantity(item.getQuantity()); detail.setPrice(item.getPrice()); return detail; }).collect(Collectors.toList()); orderDetailService.saveBatch(details); // 6. 清空购物车 cartService.clearByUser(userId); return order.getOrderNo(); } }

4.3 微信支付集成

@Service public class WxPayServiceImpl implements WxPayService { @Autowired private WxPayProperties wxPayProperties; @Override public Map<String, String> createPayOrder(String orderNo, BigDecimal amount, String openid) { try { // 1. 配置微信支付参数 WxPayConfig config = new WxPayConfig(); config.setAppId(wxPayProperties.getAppId()); config.setMchId(wxPayProperties.getMchId()); config.setMchKey(wxPayProperties.getMchKey()); config.setKeyPath(wxPayProperties.getKeyPath()); // 2. 创建支付请求 WxPayUnifiedOrderRequest request = new WxPayUnifiedOrderRequest(); request.setBody("轻工学院食堂点餐"); request.setOutTradeNo(orderNo); request.setTotalFee(amount.multiply(new BigDecimal("100")).intValue()); request.setSpbillCreateIp("127.0.0.1"); request.setNotifyUrl(wxPayProperties.getNotifyUrl()); request.setTradeType("JSAPI"); request.setOpenid(openid); // 3. 调用支付接口 WxPayService wxPayService = new WxPayServiceImpl(); wxPayService.setConfig(config); WxPayUnifiedOrderResult result = wxPayService.unifiedOrder(request); // 4. 生成前端支付参数 Map<String, String> payParams = new HashMap<>(); payParams.put("appId", config.getAppId()); payParams.put("timeStamp", String.valueOf(System.currentTimeMillis() / 1000)); payParams.put("nonceStr", WxPayUtil.generateNonceStr()); payParams.put("package", "prepay_id=" + result.getPrepayId()); payParams.put("signType", "MD5"); String paySign = WxPayUtil.generateSignature(payParams, config.getMchKey()); payParams.put("paySign", paySign); return payParams; } catch (Exception e) { throw new BusinessException("微信支付创建失败", e); } } }

5. 系统部署与运维

5.1 生产环境部署方案

  1. 服务器配置建议:

    • 应用服务器:2核4G(SpringBoot应用)
    • 数据库服务器:4核8G(MySQL)
    • 缓存服务器:2核4G(Redis)
    • 文件存储:阿里云OSS 50GB
  2. 部署流程:

# 1. 克隆代码 git clone https://github.com/xxx/canteen-order-system.git # 2. 构建前端 cd frontend npm install npm run build # 3. 构建后端 cd ../backend mvn clean package # 4. 部署前端 cp -r frontend/dist/* /usr/share/nginx/html/ # 5. 启动后端 nohup java -jar backend/target/canteen-order-1.0.0.jar --spring.profiles.active=prod > app.log 2>&1 &

5.2 监控与日志

  1. SpringBoot Actuator配置:
management: endpoints: web: exposure: include: health,info,metrics endpoint: health: show-details: always
  1. 日志收集方案:
  • 使用Logback记录日志
  • 按天滚动日志文件
  • 关键操作记录审计日志

6. 项目开发经验分享

6.1 开发中的常见问题

  1. 微信支付回调验证失败

    • 确保服务器时间与网络时间同步
    • 检查商户密钥配置是否正确
    • 验证签名时注意参数顺序
  2. 高并发下的库存扣减

    • 使用Redis分布式锁
    • 采用乐观锁机制
    • 数据库事务隔离级别设置为READ_COMMITTED
  3. 小程序图片加载慢

    • 使用CDN加速
    • 图片压缩处理
    • 懒加载技术

6.2 性能优化实践

  1. 数据库查询优化:
// 错误示例 - N+1查询问题 List<Order> orders = orderMapper.selectList(queryWrapper); orders.forEach(order -> { List<OrderDetail> details = orderDetailMapper.selectByOrderId(order.getId()); order.setDetails(details); }); // 正确做法 - 使用JOIN一次查询 List<Order> orders = orderMapper.selectWithDetails(queryWrapper);
  1. 缓存使用策略:
  • 菜品信息:缓存时间30分钟
  • 用户信息:缓存时间2小时
  • 订单状态:不缓存,保证实时性
  1. 接口响应优化:
  • 使用SpringBoot的@Async实现异步处理
  • 分页查询默认每页10条记录
  • 大数据量导出使用Excel模板

6.3 毕业设计答辩准备

  1. 技术亮点展示:
  • 微信小程序与SpringBoot的完整集成方案
  • 高并发场景下的订单处理设计
  • 前后端分离的开发模式实践
  1. 答辩常见问题:
  • 系统如何保证数据一致性?
  • 支付流程的安全性如何保障?
  • 如果食堂同时有1000人下单,系统如何应对?
  1. 论文写作建议:
  • 突出系统设计思路而非代码细节
  • 用流程图和时序图说明关键业务流程
  • 对比分析传统点餐模式与系统的优势

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询