1. 项目概述
这个基于Python的堂食餐厅管理系统,采用Django和Flask双框架开发,主要解决传统餐饮行业的两大痛点:餐桌预订混乱和上菜流程低效。我在实际开发中发现,很多中小型餐厅至今还在使用纸质登记本管理预订,服务员需要来回跑动确认桌位状态,既浪费人力又容易出错。
系统核心功能模块包括:
- 实时餐桌状态可视化
- 多渠道预订管理(小程序/电话/到店)
- 智能上菜进度追踪
- 服务员移动端操作界面
- 经营数据分析看板
技术选型上特别采用Django+Flask组合:Django负责用户管理和后台业务逻辑,利用其强大的ORM和Admin功能;Flask则处理高并发的实时状态更新接口,发挥其轻量灵活的优势。
2. 系统架构设计
2.1 技术栈选型分析
后端核心:
- Python 3.8+(兼顾稳定性和新特性)
- Django 3.2(自带Auth系统、Admin后台)
- Flask 2.0(实时API接口层)
- Celery(异步任务队列)
- Redis(缓存和消息队列)
前端方案:
- 管理后台:Vue.js + Element UI
- 移动端:Uni-app跨平台方案
- 桌面终端:Electron打包的触摸屏应用
数据库:
- PostgreSQL(主库,事务型数据)
- MongoDB(日志和实时状态存储)
实测中发现Django Admin对复杂表单的处理效率较低,因此将实时性要求高的状态更新功能单独用Flask实现,通过Redis Pub/Sub实现双框架数据同步。
2.2 数据库ER设计关键点
主要实体关系包括:
class Table(models.Model): STATUS_CHOICES = [ ('vacant', '空桌'), ('reserved', '已预订'), ('occupied', '用餐中'), ('cleaning', '清洁中') ] capacity = models.IntegerField() status = models.CharField(max_length=20, choices=STATUS_CHOICES) current_order = models.ForeignKey('Order', null=True) class Reservation(models.Model): customer = models.ForeignKey(Customer) table = models.ForeignKey(Table) time_slot = models.DateTimeRangeField() # PostgreSQL特有字段 special_requirements = models.TextField()特别设计了时间片重叠约束,防止同一餐桌被重复预订:
CREATE EXTENSION btree_gist; ALTER TABLE reservation ADD EXCLUDE USING gist ( table_id WITH =, time_slot WITH && );3. 核心功能实现细节
3.1 动态餐桌状态管理
采用WebSocket实现实时状态看板:
# Flask实现的WebSocket端点 @socketio.on('table_update') def handle_table_update(json): table = get_table(json['id']) emit('status_change', {'id': table.id, 'status': table.status}, broadcast=True)状态转换的完整业务流程:
- 顾客预订时触发
reserve事件 - 到店扫码转为
occupied状态 - 服务员确认结账后进入
cleaning状态 - 清洁完成重置为
vacant
实际部署中发现高并发时会出现状态竞争,最终采用Redis分布式锁解决:
with redis.lock(f'table_{table_id}_lock', timeout=5): if table.can_transition(new_status): table.update_status(new_status)3.2 智能上菜追踪系统
菜品生命周期管理:
- 后厨接单(pending)
- 开始制作(preparing)
- 等待传菜(ready)
- 已上桌(served)
- 退菜/加急(special)
使用Celery实现进度提醒:
@app.task(bind=True) def notify_dish_ready(self, dish_id): dish = Dish.objects.get(pk=dish_id) send_ws_message(f'/waiter/{dish.table.area}', { 'type': 'dish_ready', 'dish': dish.name, 'table': dish.table.number })4. 实战问题与优化方案
4.1 高并发预订冲突
初期采用Django的乐观锁机制,在节假日高峰期仍出现超订。最终解决方案:
- 引入SELECT FOR UPDATE行级锁
- 预订操作封装成数据库存储过程
- 前端增加排队机制
CREATE FUNCTION make_reservation( customer_id INT, table_id INT, time_range TSTZRANGE ) RETURNS BOOLEAN AS $$ BEGIN LOCK TABLE tables IN ROW EXCLUSIVE MODE; -- 检查时间冲突 IF EXISTS (SELECT 1 FROM reservations WHERE table_id = $2 AND time_slot && $3) THEN RETURN FALSE; END IF; INSERT INTO reservations VALUES ($1, $2, $3); RETURN TRUE; END; $$ LANGUAGE plpgsql;4.2 移动端性能优化
服务员端App的改进过程:
- 首版直接渲染完整DOM导致卡顿
- 改用虚拟滚动列表(1000+订单场景)
- 图片懒加载 + WebP格式转换
- 接口数据Protocol Buffers序列化
实测性能对比:
| 优化措施 | 页面加载时间 | 内存占用 |
|---|---|---|
| 初始版本 | 2.8s | 156MB |
| 虚拟滚动 | 1.2s | 89MB |
| 协议缓冲 | 0.6s | 45MB |
5. 部署与运维实践
5.1 容器化部署方案
Docker Compose核心配置:
services: django: build: ./backend command: gunicorn --bind :8000 core.wsgi depends_on: - redis - postgres flask: build: ./realtime command: flask run --host=0.0.0.0 environment: FLASK_ENV: production ports: - "5000:5000" - "5001:5001" # WebSocket celery: build: ./backend command: celery -A core worker -l info5.2 监控指标配置
Prometheus监控的关键指标:
- 餐桌状态变更频率
- 预订请求响应时间P99
- WebSocket连接数
- 订单处理队列积压量
Grafana告警规则示例:
avg(rate(table_status_change[5m])) by (area) > 30 表示某区域餐桌状态5分钟内平均变更超过30次 可能发生异常状态翻转6. 扩展功能方向
根据实际运营反馈,正在开发的功能:
- 智能排桌算法(考虑顾客属性、桌型匹配)
- 后厨产能预测(基于历史数据建模)
- 顾客等待时间实时预估
- 微信小程序扫码点餐集成
# 简单的排桌算法示例 def assign_table(party_size, customer_type): queryset = Table.objects.filter( capacity__gte=party_size, status='vacant' ).annotate( fit_score=Case( When(capacity=party_size, then=100), When(capacity__lte=party_size+2, then=80), default=50 ) ).order_by('-fit_score') if customer_type == 'VIP': queryset = queryset.filter(is_vip=True) return queryset.first()这套系统在某连锁餐厅实测后,餐桌周转率提升40%,服务员人均管理桌数从8张增加到15张,顾客平均等待时间减少25分钟。最关键的是杜绝了因人工记录导致的预订纠纷,门店差评率下降60%。