最近在帮朋友开发一套餐饮管理系统,发现市面上很多现成方案要么功能臃肿,要么价格昂贵。于是决定基于SpringBoot+Vue技术栈,从零开发一套轻量级但功能完备的餐饮管理系统。这套系统经过3个月的实际开发和2家餐厅的试运行,目前已经稳定运行半年多,日均处理订单量超过500单。
系统采用前后端分离架构,后端使用SpringBoot提供RESTful API,前端用Vue.js构建响应式界面,数据库选用MySQL配合MyBatis-Plus进行数据持久化。特别在高峰期订单处理上,通过Redis缓存和消息队列优化,系统响应时间控制在300ms以内。
SpringBoot 2.7.x作为后端框架是经过多方面考虑的:
数据库操作层使用MyBatis-Plus 3.5.x,相比原生MyBatis:
java复制// MyBatis-Plus分页查询示例
Page<Dish> page = new Page<>(1, 10);
LambdaQueryWrapper<Dish> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(Dish::getStatus, 1);
dishMapper.selectPage(page, queryWrapper);
Vue 3.x + Element Plus构建管理后台:
前端工程化配置要点:
javascript复制// 封装axios请求
const service = axios.create({
baseURL: import.meta.env.VITE_APP_BASE_API,
timeout: 10000
})
// 请求拦截器
service.interceptors.request.use(config => {
if (store.getters.token) {
config.headers['Authorization'] = `Bearer ${store.getters.token}`
}
return config
})
订单状态机设计:
mermaid复制stateDiagram
[*] --> 待支付
待支付 --> 已支付: 支付成功
待支付 --> 已取消: 超时未支付
已支付 --> 已完成: 菜品上齐
已支付 --> 已退款: 申请退款
关键代码实现:
java复制@Transactional
public Result createOrder(OrderDTO orderDTO) {
// 1. 校验库存
List<DishStock> stockList = checkStock(orderDTO.getItems());
// 2. 扣减库存
reduceStock(stockList);
// 3. 生成订单
Order order = buildOrder(orderDTO);
orderMapper.insert(order);
// 4. 记录订单明细
saveOrderItems(order.getId(), orderDTO.getItems());
// 5. 发送MQ消息
rabbitTemplate.convertAndSend("order.create", order);
return Result.success(order.getId());
}
实时库存计算方案:
java复制public boolean reduceStock(Long dishId, Integer quantity) {
String key = "stock:" + dishId;
Long value = redisTemplate.opsForValue().decrement(key, quantity);
if (value != null && value < 0) {
// 库存不足回滚
redisTemplate.opsForValue().increment(key, quantity);
return false;
}
return true;
}
多级缓存架构:
缓存更新策略:
MySQL调优关键点:
sql复制-- 订单表索引设计
ALTER TABLE `order_info`
ADD INDEX `idx_user_status` (`user_id`, `order_status`),
ADD INDEX `idx_create_time` (`create_time`);
-- 慢查询优化示例
EXPLAIN SELECT * FROM dish_info
WHERE category_id = 5 AND status = 1
ORDER BY sales DESC LIMIT 10;
分库分表方案:
Docker Compose编排:
yaml复制version: '3'
services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: 123456
volumes:
- ./mysql/data:/var/lib/mysql
redis:
image: redis:6.2
ports:
- "6379:6379"
backend:
build: ./backend
ports:
- "8080:8080"
depends_on:
- mysql
- redis
Prometheus + Grafana监控看板:
日志收集方案:
java复制// 分布式锁使用示例
RLock lock = redissonClient.getLock("order:lock:" + userId);
try {
if (lock.tryLock(3, 10, TimeUnit.SECONDS)) {
// 业务逻辑
}
} finally {
lock.unlock();
}
这套系统目前已经开源,包含完整的开发文档和部署指南。对于想学习企业级开发的同学,建议重点关注: