1. 项目背景与核心价值
校园餐饮服务一直是高校后勤管理的痛点。传统食堂窗口排队时间长、错峰就餐压力大、外卖配送混乱等问题长期困扰着师生。我在大三担任学生会生活部部长期间,曾组织过校园餐饮满意度调研,数据显示78%的学生对现有就餐体验不满意,其中等待时间过长(平均27分钟)和菜品信息不透明是主要槽点。
这个基于SpringBoot的智能校园点餐管理系统,正是为解决这些痛点而生。它通过微信小程序前端+SpringBoot后端的架构,实现了三大核心价值:
- 分流减压:提前点餐功能使食堂可预知各时段订单量,合理调配人力,实测能将高峰时段排队时间缩短至8分钟内
- 透明消费:每道菜品的原料来源、营养成分、用户评价完整展示,后厨监控直播功能已在我们试点食堂落地
- 智能推荐:基于用户历史订单和体质数据(如过敏源)的推荐算法,使复购率提升42%
提示:选择校园场景时要特别注意数据合规性。学生姓名学号属于敏感信息,我们采用学号哈希值作为用户ID,且所有数据处理都在校内服务器完成。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术架构设计解析
2.1 整体技术栈选型
mermaid复制graph TD
A[微信小程序] --> B[SpringBoot 2.7.16]
B --> C[MySQL 8.0]
B --> D[Redis 6.2]
C --> E[ShardingSphere 5.3.2]
D --> F[秒杀库存控制]
这套技术组合的决策依据:
- 微信小程序:无需安装,打开即用,符合学生使用习惯(调研显示92%学生每日使用微信超3小时)
- SpringBoot:快速开发特性适合6个月毕设周期,自动装配机制大幅减少XML配置
- ShardingSphere:预计毕业季订单峰值达3000+/分钟,需对订单表进行水平分片
2.2 核心业务表设计
主要表结构及其关系:
| 表名 | 关键字段 | 索引设计 | 备注 |
|---|---|---|---|
| t_order | order_id(雪花ID),user_hash,window_id,status | 联合索引(user_hash,create_time) | 分片键:window_id |
| t_window | window_id,canteen_id,current_queue | 唯一索引(window_id) | 实时更新排队人数 |
| t_dish | dish_id,window_id,stock,day_limit | 联合索引(window_id,is_active) | 秒杀商品单独标记 |
java复制// 订单状态机设计示例
public enum OrderState {
UNPAID(1) {
@Override
public boolean canChangeTo(OrderState newState) {
return newState == PAID || newState == CANCELLED;
}
},
PAID(2) {...},
COMPLETED(3) {...};
}
3. 关键功能实现细节
3.1 高并发订餐处理
食堂11:30-12:30的秒杀场景是最大挑战。我们采用三级防护策略:
- 前端限流:小程序按钮点击后立即禁用,防止重复提交
- Redis预减:使用Lua脚本保证原子性
lua复制local stock = redis.call('get', KEYS[1])
if stock and tonumber(stock) > 0 then
redis.call('decr', KEYS[1])
return 1
end
return 0
- 数据库最终扣减:通过CAS乐观锁保证一致性
sql复制UPDATE t_dish
SET stock = stock - 1
WHERE dish_id = ? AND stock = ?
实测在4核8G服务器上可稳定处理4200QPS,比纯数据库方案提升17倍。
3.2 智能推荐算法
采用改进的协同过滤算法,特别处理了校园场景的冷启动问题:
python复制# 混合权重计算示例
def hybrid_score(user, dish):
base_score = cf_model.predict(user, dish)
time_penalty = 1 - abs(current_hour - pref_time)/12.0
health_factor = calculate_nutrition_match(user.health_data, dish.nutrition)
return base_score * 0.6 + time_penalty * 0.2 + health_factor * 0.2
算法效果对比:
| 版本 | 点击率提升 | 复购率提升 |
|---|---|---|
| 基础CF | 18% | 23% |
| 混合算法 | 37% | 42% |
4. 典型问题排查实录
4.1 微信支付回调丢失
现象:支付成功但订单状态未更新,发生率为0.3%
排查过程:
- 检查支付日志发现回调延迟达8-15秒
- 发现Nginx配置了10秒默认超时
- 支付处理中调用了第三方营养分析API耗时较长
解决方案:
java复制// 异步处理方案
@Transactional
public void handlePayNotify(String orderId) {
orderDao.updateStatus(orderId, PAID);
executor.submit(() -> {
nutritionService.analyze(orderId); // 异步执行
});
}
4.2 缓存穿透问题
在冬季学期末出现大量查询已下架菜品的情况,导致数据库负载飙升。
优化方案:
- BloomFilter预处理无效ID
- 缓存空值并设置短过期时间
java复制public Dish getDishWithCache(String dishId) {
if (bloomFilter.mightContain(dishId)) {
Dish dish = redisTemplate.opsForValue().get(dishId);
if (dish == null) {
dish = dishDao.selectById(dishId);
redisTemplate.opsForValue().set(dishId, dish != null ? dish : EMPTY_OBJECT,
dish != null ? 30MIN : 2MIN);
}
return dish == EMPTY_OBJECT ? null : dish;
}
return null;
}
5. 部署与监控方案
5.1 容器化部署
采用Docker Compose编排方案:
yaml复制version: '3'
services:
app:
image: openjdk:17-jdk
deploy:
resources:
limits:
cpus: '2'
memory: 2G
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080/actuator/health"]
interval: 30s
timeout: 5s
retries: 3
redis:
image: redis:6.2-alpine
command: redis-server --save 60 1 --loglevel warning
5.2 监控指标配置
重点监控项及其阈值:
- 订单创建TP99 < 500ms
- Redis内存使用率 < 70%
- MySQL活跃连接数 < 50
- 支付回调成功率 > 99.5%
Grafana看板包含以下关键图表:
- 各食堂窗口实时订单热力图
- 菜品销量趋势对比
- 支付各阶段耗时分布
6. 毕设答辩技巧
根据指导12个毕设组的经验,特别提醒:
-
演示数据准备:提前录制真实场景操作视频作为备用,现场演示常遇到的坑:
- 校园WiFi屏蔽微信支付
- 食堂网络信号不稳定
-
性能对比图表:用Before-After形式展示优化效果,例如:
- 分库分表前后查询延迟对比
- 缓存命中率提升曲线
-
扩展性问题:准备应对评委关于规模扩展的提问,比如:
- 如何支持多校区?
- 突发流量如何处理?
建议答案方向:
- 通过canteen_id进行数据分区
- 预留了Kafka消息队列接口
项目源码中特别标注了以下毕设加分点:
/docs/architecture.md中的AB测试对比数据/src/main/java/com/campus/order/ratelimit下的分布式限流实现/experimental目录下的智能餐柜对接方案
