20. 餐饮后厨管理系统(technical-rchitecture)
1. 架构设计
系统采用现代化的前后端分离架构,核心依赖 Supabase 提供的实时数据库能力,以满足后厨对订单同步毫秒级延迟的高要求。
2. 技术描述
- 前端框架:React@18 + TypeScript + Vite
- 选用原因:生态丰富,性能优异,适合构建复杂的单页应用。
- UI组件库:Ant Design@5 (配合自定义深色主题)
- 针对后厨环境定制 "大屏/触控" 友好的组件样式。
- 状态管理:Zustand
- 轻量级状态管理,用于处理全局的订单队列和用户会话。
- 实时通信:Supabase Realtime
- 监听
orders和order_items表的INSERT和UPDATE事件,实现订单秒级同步。
- 监听
- 图表库:Recharts
- 用于销量统计和库存趋势的可视化。
- 后端服务:Supabase
- 数据库:PostgreSQL
- 工具库:
dayjs: 处理时间显示和计算。lodash: 数据处理。clsx/tailwind-merge: 样式类名管理。
3. 路由定义
| 路由路径 | 页面名称 | 功能描述 |
|---|---|---|
| / | 订单接收面板 | 默认首页,实时展示待处理订单 |
| /cooking | 制作进度 | 监控各菜品的制作状态和耗时 |
| /inventory | 库存管理 | 原料库存查询、出入库、预警查看 |
| /menu | 菜单管理 | 菜品录入、分类管理、估清设置 |
| /schedule | 厨师排班 | 人员排班查看与编辑 |
| /stats | 销量统计 | 销售数据报表分析 |
| /procurement | 采购管理 | 采购单据处理 |
| /login | 登录页 | 员工登录 |
4. API定义 (Supabase Integration)
前端主要通过 @supabase/supabase-js 与后端交互。
4.1 实时订阅 (Realtime)
订单监听
supabase
.channel('orders-channel')
.on(
'postgres_changes',
{ event: 'INSERT', schema: 'public', table: 'orders' },
(payload) => {
// 收到新订单,播放提示音,更新状态
playNotificationSound();
addNewOrder(payload.new);
}
)
.subscribe()
4.2 核心数据交互
- 获取待处理订单:查询
orders表中状态不为completed的记录,按时间正序排列。 - 更新制作状态:更新
order_items的status字段 (pending -> cooking -> done)。 - 库存扣减:
- 方案A:前端调用 RPC 函数
deduct_inventory(dish_id, quantity)。 - 方案B:数据库触发器在订单完成时自动扣减。
- 方案A:前端调用 RPC 函数
5. 数据模型
5.1 ER图
5.2 数据库Schema定义
Dishes Table (菜品)
CREATE TABLE dishes (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
name TEXT NOT NULL,
price DECIMAL(10, 2) NOT NULL,
image_url TEXT,
category_id UUID REFERENCES categories(id),
is_available BOOLEAN DEFAULT true,
created_at TIMESTAMPTZ DEFAULT NOW()
);
Ingredients Table (食材/库存)
CREATE TABLE ingredients (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
name TEXT NOT NULL,
stock_quantity DECIMAL(10, 3) DEFAULT 0,
warning_threshold DECIMAL(10, 3) DEFAULT 10,
unit TEXT DEFAULT 'kg',
updated_at TIMESTAMPTZ DEFAULT NOW()
);
Orders Table (订单)
CREATE TABLE orders (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
table_number TEXT NOT NULL,
status TEXT DEFAULT 'pending', -- pending, processing, completed, cancelled
remark TEXT,
created_at TIMESTAMPTZ DEFAULT NOW(),
completed_at TIMESTAMPTZ
);
Order Items Table (订单详情)
CREATE TABLE order_items (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
order_id UUID REFERENCES orders(id),
dish_id UUID REFERENCES dishes(id),
quantity INT DEFAULT 1,
status TEXT DEFAULT 'pending', -- pending, cooking, done
started_at TIMESTAMPTZ,
finished_at TIMESTAMPTZ
);
Procurement Table (采购)
CREATE TABLE procurements (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
ingredient_id UUID REFERENCES ingredients(id),
quantity DECIMAL(10, 3) NOT NULL,
purchaser_id UUID REFERENCES auth.users(id),
status TEXT DEFAULT 'requested', -- requested, purchased, received
created_at TIMESTAMPTZ DEFAULT NOW()
);
20大项目拆解:从PRD到架构 文章被收录于专栏
想独立做出一个完整的项目却不知从何下手?本专栏是你的终极路线图。我们由浅入深,通过20个经典项目案例,手把手带你走过产品构思、需求撰写、功能设计、技术选型、架构搭建的全过程。从“音乐播放器”到“企业后台”,你将逐步建立对软件系统的完整认知,完成从理论到实践、从单一技能到复合能力的飞跃。
