1. 项目背景与需求分析
校园餐饮服务一直是高校后勤管理中的重要环节。传统的食堂就餐模式存在高峰期排队时间长、菜品选择有限、支付效率低下等问题。随着移动互联网技术的普及,学生群体对便捷、个性化的餐饮服务需求日益增长。
德州大学作为一所拥有数万名师生的大型高校,原有的餐饮系统已经无法满足以下需求:
- 就餐高峰期的分流压力
- 特殊饮食需求(如清真、素食、低糖等)的个性化服务
- 外卖配送的时效管理和追踪
- 食堂档口的数字化运营需求
基于Spring Boot的校园智慧餐饮服务平台正是为解决这些问题而设计。系统需要实现以下核心功能:
- 多角色用户管理(学生、商户、配送员、管理员)
- 智能推荐和个性化菜单展示
- 在线支付与订单实时追踪
- 食堂档口后台管理系统
- 数据统计与分析功能
2. 技术选型与架构设计
2.1 技术栈选择理由
选择Spring Boot作为基础框架主要基于以下考虑:
- 快速开发:Spring Boot的自动配置和起步依赖可以大幅减少配置时间
- 微服务友好:便于后期扩展为微服务架构
- 丰富的生态系统:与Spring Data、Spring Security等组件无缝集成
- 社区支持:Java生态中最为成熟的企业级框架
完整技术栈如下:
- 后端:Spring Boot 3.x + Spring MVC + Spring Data JPA
- 数据库:MySQL 8.0(关系型)+ Redis(缓存)
- 前端:Vue.js 3 + Element Plus
- 消息队列:RabbitMQ(订单状态变更通知)
- 搜索引擎:Elasticsearch(菜品搜索)
- 地图服务:高德地图API(配送路线规划)
2.2 系统架构设计
采用分层架构设计,各层职责明确:
code复制表现层:处理HTTP请求和响应
↓
业务逻辑层:核心业务处理
↓
数据访问层:数据库操作
↓
基础设施层:缓存、消息队列等
关键设计决策:
- 使用JWT进行无状态认证,避免Session共享问题
- 采用领域驱动设计(DDD)划分核心子域
- 重要业务操作记录操作日志
- 敏感数据加密存储
3. 核心功能实现细节
3.1 用户系统实现
用户模块采用RBAC权限模型,主要实体关系如下:
java复制@Entity
public class User {
@Id @GeneratedValue
private Long id;
private String username;
private String password; // BCrypt加密
@Enumerated(EnumType.STRING)
private UserType type; // STUDENT, MERCHANT, DELIVERY, ADMIN
@ManyToMany
private Set<Role> roles;
// 其他字段及方法
}
安全配置关键代码:
java复制@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.csrf().disable()
.authorizeHttpRequests(auth -> auth
.requestMatchers("/api/public/**").permitAll()
.requestMatchers("/api/student/**").hasRole("STUDENT")
// 其他角色配置
.anyRequest().authenticated()
)
.addFilterBefore(jwtFilter(), UsernamePasswordAuthenticationFilter.class);
return http.build();
}
}
3.2 订单系统设计
订单状态机设计是核心难点,采用状态模式实现:
java复制public interface OrderState {
void pay(Order order);
void cancel(Order order);
void confirm(Order order);
// 其他状态转换方法
}
public class CreatedState implements OrderState {
@Override
public void pay(Order order) {
// 支付逻辑
order.setState(new PaidState());
}
// 其他方法实现
}
订单表关键字段设计:
sql复制CREATE TABLE `order` (
`id` bigint NOT NULL AUTO_INCREMENT,
`user_id` bigint NOT NULL,
`merchant_id` bigint NOT NULL,
`total_amount` decimal(10,2) NOT NULL,
`status` varchar(20) NOT NULL, -- CREATED/PAID/DELIVERING/COMPLETED/CANCELLED
`create_time` datetime NOT NULL,
`pay_time` datetime,
`delivery_address` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
3.3 智能推荐系统
基于用户历史订单和协同过滤算法实现推荐:
java复制public class RecommendationService {
public List<Dish> recommendDishes(Long userId) {
// 1. 获取用户历史订单
List<Order> historyOrders = orderRepository.findByUserId(userId);
// 2. 提取特征向量
Map<Long, Double> userVector = extractUserVector(historyOrders);
// 3. 计算相似用户
List<Long> similarUsers = findSimilarUsers(userVector);
// 4. 生成推荐列表
return generateRecommendations(similarUsers);
}
// 其他辅助方法
}
4. 关键问题解决方案
4.1 高并发下单问题
在中午高峰期可能面临大量并发下单请求,采用以下解决方案:
-
库存预扣减:使用Redis原子操作
java复制public boolean preDeductStock(Long dishId, int quantity) { String key = "stock:" + dishId; long value = redisTemplate.opsForValue().decrement(key, quantity); if (value < 0) { // 库存不足,回滚 redisTemplate.opsForValue().increment(key, quantity); return false; } return true; } -
订单创建异步化:使用RabbitMQ消息队列削峰
java复制@RabbitListener(queues = "order.create") public void handleOrderCreate(OrderCreateMessage message) { orderService.createOrder(message); } -
数据库优化:订单表分库分表,按用户ID哈希分片
4.2 实时位置追踪
配送员位置更新采用WebSocket实现实时推送:
java复制@RestController
@RequestMapping("/api/delivery")
public class DeliveryController {
@Autowired
private SimpMessagingTemplate messagingTemplate;
@PostMapping("/location")
public void updateLocation(@RequestBody LocationUpdateDTO dto) {
// 更新数据库
deliveryService.updateLocation(dto);
// 推送位置更新
messagingTemplate.convertAndSend(
"/topic/location/" + dto.getOrderId(),
dto
);
}
}
前端订阅代码:
javascript复制const socket = new SockJS('/ws');
const stompClient = Stomp.over(socket);
stompClient.connect({}, () => {
stompClient.subscribe(`/topic/location/${orderId}`, (message) => {
updateMap(JSON.parse(message.body));
});
});
5. 系统部署与性能优化
5.1 生产环境部署方案
采用Docker容器化部署,docker-compose.yml关键配置:
yaml复制version: '3'
services:
app:
image: food-delivery:latest
ports:
- "8080:8080"
environment:
- SPRING_PROFILES_ACTIVE=prod
depends_on:
- mysql
- redis
mysql:
image: mysql:8.0
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_DATABASE=food_delivery
volumes:
- mysql_data:/var/lib/mysql
redis:
image: redis:alpine
ports:
- "6379:6379"
volumes:
mysql_data:
5.2 性能优化措施
-
缓存策略:
- 使用Redis缓存热门菜品信息
- 实现多级缓存(本地缓存+分布式缓存)
-
数据库优化:
- 为常用查询字段添加索引
- 使用读写分离
- 慢查询监控
-
JVM调优:
bash复制
java -jar -Xms512m -Xmx1024m -XX:+UseG1GC \ -XX:MaxGCPauseMillis=200 food-delivery.jar -
静态资源优化:
- 启用HTTP/2
- 使用CDN加速
- 图片懒加载
6. 项目总结与扩展方向
在实际开发过程中,有几个关键经验值得分享:
- 领域模型设计要尽早确定,特别是聚合根的划分
- 订单状态转换的幂等性处理非常重要
- 支付回调接口要做好签名验证和重试机制
- 测试阶段要模拟真实的高并发场景
未来可能的扩展方向:
- 引入大数据分析,预测各时段用餐人数
- 增加智能调度算法优化配送路线
- 开发微信小程序版本提升用户体验
- 接入更多支付方式(如校园卡支付)
系统已在德州大学试运行3个月,日均订单量达到2000+,高峰期并发订单处理能力达到500TPS,平均响应时间保持在200ms以内,有效缓解了食堂就餐压力,获得了师生的一致好评。
