20. 餐饮后厨管理系统(technical-rchitecture)

alt

1. 架构设计

系统采用现代化的前后端分离架构,核心依赖 Supabase 提供的实时数据库能力,以满足后厨对订单同步毫秒级延迟的高要求。

alt

2. 技术描述

  • 前端框架:React@18 + TypeScript + Vite
    • 选用原因:生态丰富,性能优异,适合构建复杂的单页应用。
  • UI组件库:Ant Design@5 (配合自定义深色主题)
    • 针对后厨环境定制 "大屏/触控" 友好的组件样式。
  • 状态管理:Zustand
    • 轻量级状态管理,用于处理全局的订单队列和用户会话。
  • 实时通信:Supabase Realtime
    • 监听 ordersorder_items 表的 INSERTUPDATE 事件,实现订单秒级同步。
  • 图表库: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_itemsstatus 字段 (pending -> cooking -> done)。
  • 库存扣减
    • 方案A:前端调用 RPC 函数 deduct_inventory(dish_id, quantity)
    • 方案B:数据库触发器在订单完成时自动扣减。

5. 数据模型

5.1 ER图

alt

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个经典项目案例,手把手带你走过产品构思、需求撰写、功能设计、技术选型、架构搭建的全过程。从“音乐播放器”到“企业后台”,你将逐步建立对软件系统的完整认知,完成从理论到实践、从单一技能到复合能力的飞跃。

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务