摩尔街网上订餐系统是一个基于Java技术栈的B2C餐饮服务平台,采用前后端分离架构设计。这个系统我前后开发了三个版本,最终选择了SpringBoot+MyBatis这套技术组合,主要考虑到中小型餐饮企业的实际需求和技术团队的普遍技能栈。
系统核心功能包括:餐厅管理、菜品展示、购物车、订单处理、支付对接和用户评价。在性能方面,我们特别针对高并发订餐场景做了优化,比如午餐高峰期时段的订单处理能力。数据库设计上采用读写分离策略,主库负责写入,两个从库负责查询,实测QPS能达到1200+,完全能满足中型城市餐饮连锁的需求。
提示:系统开发时特别要注意支付模块的幂等性设计,我们在实际运营中就遇到过用户重复支付的问题,后来通过订单状态机+支付流水号双重校验解决了这个问题。
SpringBoot 2.7.18作为基础框架,相比传统SSM架构有三大优势:
MyBatis-Plus 3.5.3作为ORM框架,它的Wrapper条件构造器让动态SQL编写效率提升了50%。我们特别定制了BaseMapper,统一处理逻辑删除、乐观锁、自动填充等通用功能。
java复制// 典型Service层实现示例
@Service
public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order>
implements OrderService {
@Transactional(rollbackFor = Exception.class)
public R createOrder(OrderDTO dto) {
// 1. 校验库存
// 2. 生成订单号(雪花算法)
// 3. 保存订单主表/明细
// 4. 扣减库存
// 5. 发送MQ消息(延时检查未支付订单)
}
}
虽然项目描述中提到SpringMVC,但我们实际采用Vue3+Element Plus作为前端框架,通过RESTful API与后端交互。这种前后端分离架构有三大好处:
关键接口设计遵循以下规范:
MySQL 8.0作为主数据库,主要表结构设计如下:
| 表名 | 关键字段 | 索引设计 |
|---|---|---|
| t_restaurant | id, name, address, status | name(前缀索引) |
| t_food | id, restaurant_id, name, price | restaurant_id+status联合索引 |
| t_order | order_no, user_id, total_amount | order_no(唯一索引) |
| t_order_item | order_id, food_id, quantity | order_id外键索引 |
分库分表策略:
订单模块是系统的核心,我们采用分布式锁+库存预扣减的方案:
java复制// 库存扣减Lua脚本
String script = "local current = redis.call('get', KEYS[1]) " +
"if current and tonumber(current) >= tonumber(ARGV[1]) then " +
" return redis.call('decrby', KEYS[1], ARGV[1]) " +
"else return -1 end";
采用Redis+JWT方案替代传统Session:
java复制// JWT配置示例
@Configuration
public class JwtConfig {
@Bean
public JwtFilter jwtFilter() {
return new JwtFilter();
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
支持微信支付和支付宝两种方式:
支付状态机设计:
mermaid复制stateDiagram
[*] --> UNPAID
UNPAID --> PAID: 支付成功
UNPAID --> CANCELLED: 用户取消
UNPAID --> CLOSED: 超时关闭
PAID --> REFUNDED: 发起退款
采用多级缓存架构:
缓存更新策略:
RabbitMQ实现以下异步场景:
队列配置示例:
yaml复制spring:
rabbitmq:
host: 127.0.0.1
virtual-host: /moer
listener:
simple:
concurrency: 5
max-concurrency: 10
Docker Compose编排方案:
yaml复制version: '3'
services:
app:
image: moer-order:1.0
ports:
- "8080:8080"
depends_on:
- redis
- mysql
redis:
image: redis:6
ports:
- "6379:6379"
关键监控指标:
典型问题处理代码:
java复制// 消息重试机制
@RabbitListener(queues = "order.queue")
public void process(OrderMessage message, Channel channel) throws IOException {
try {
orderService.handle(message);
channel.basicAck(deliveryTag, false);
} catch (Exception e) {
channel.basicNack(deliveryTag, false, shouldRetry(e));
}
}
这个项目从架构设计到上线运营共耗时3个月,期间最大的收获是认识到:餐饮系统的核心不在于技术有多先进,而在于业务流程的闭环设计。比如我们最初忽略了退单时优惠券返还的问题,导致后期需要专门做数据修复。建议开发类似系统时,一定要先画出完整的业务状态流转图,把异常场景都考虑清楚再开始编码。