去年帮学弟调试毕业设计时,发现餐饮管理系统这个选题每年都有大量学生选择,但真正能把SpringBoot+Vue这套技术栈玩转的却不多。这个项目看似简单,实则涉及前后端分离架构设计、复杂业务状态流转、高并发场景优化等工程化问题。本文将基于实际开发经验,拆解从技术选型到部署上线的完整实现路径。
典型应用场景包括连锁餐厅的中央厨房管理、高校食堂的档口结算、外卖平台的商户后台等。系统核心要解决三大问题:一是多角色权限管控(店长/厨师/服务员/顾客),二是高峰时段订单并发处理,三是经营数据的可视化分析。下面以SpringBoot 2.7 + Vue 3 + MySQL 8.0技术栈为例,详解实现方案。
采用浏览器/服务器(B/S)模式,前端Vue 3使用Composition API编写,通过axios与后端通信。后端SpringBoot采用三层架构:
@RestController处理HTTP请求@Service实现菜品管理、订单处理等核心逻辑JpaRepository完成MySQL持久化关键配置:在application.yml中设置跨域允许
yaml复制spring:
mvc:
cors:
allowed-origins: "http://localhost:8080"
allowed-methods: "*"
MySQL表结构设计遵循第三范式,核心表包括:
dish菜品表:记录价格、库存、分类(需建立分类索引)order_master订单主表:含订单状态枚举(0未支付/1已支付/2已取消)order_detail订单明细:与主表一对多关联employee员工表:使用shiro进行MD5加盐加密sql复制CREATE TABLE `order_master` (
`order_id` varchar(32) NOT NULL,
`buyer_phone` varchar(20) NOT NULL,
`order_amount` decimal(8,2) NOT NULL,
`order_status` tinyint(3) NOT NULL DEFAULT '0',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`order_id`),
KEY `idx_phone` (`buyer_phone`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
采用状态模式处理订单流转,避免if-else嵌套:
java复制public interface OrderState {
void pay(String orderId);
void cancel(String orderId);
}
@Service
@RequiredArgsConstructor
public class UnpaidState implements OrderState {
private final OrderRepository repository;
@Override
@Transactional
public void pay(String orderId) {
repository.updateStatus(orderId, 1);
// 触发库存扣减
}
}
Vue前端需特别注意:
javascript复制// 前端接收订单状态推送
const eventSource = new EventSource('/api/order/stream');
eventSource.onmessage = (e) => {
store.updateOrderStatus(JSON.parse(e.data));
};
java复制@Cacheable(value = "dish", key = "#dishId")
public Dish getById(Long dishId) {
return dishRepository.findById(dishId).orElseThrow();
}
SELECT FOR UPDATE影响吞吐量sql复制SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1;
bash复制npm run build -- --mode=production
nginx复制location /api {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
}
sql复制SET GLOBAL time_zone = '+8:00';
yaml复制spring:
servlet:
multipart:
max-file-size: 10MB
plantuml复制@startuml
actor 顾客
顾客 -> 前端: 提交订单
前端 -> 后端: POST /api/order
后端 -> MySQL: 事务操作
@enduml
开发过程中最大的体会是:餐饮系统看似业务简单,但要把状态流转、并发控制这些细节处理到位,需要建立完整的领域模型。建议在编码前先绘制完整的订单状态转换图,这会节省大量后期调试时间。