问题
Ristorante Gina 是一家海鲜餐厅,过去完全靠纸张运转:服务员手写点单,厨房和吧台看同一张单子,账单在收银台手工合计。店主希望用一套系统同时服务大堂、厨房和经理,并且日后能支持不止一家餐厅。
我做了什么
我开发了餐厅管理 Web 应用 RistoFlow,并以 Gina 作为第一家餐厅完成部署。
- 平面图——餐桌按厅分组,实时显示状态(空闲、占用、订单处理中、订单已就绪),开台时设定用餐人数。
- 手机点单——服务员按分类下单,每道菜可加备注。发送后订单自动拆分给厨房和吧台,每个岗位只看到自己的工作。
- 厨房显示屏——每 5 秒刷新一次,把每个订单从已发送推进到制作中、已完成和已上菜,突出显示延误,并打印 72mm 小票,必要时自动打印。
- 账单——含餐位费的餐桌总额、可打印的预结单和结账。自 1.5.0 版起,价格只对负责结账的经理可见,服务员和厨房人员看不到。
- 菜单编辑与报表——分类、价格(也支持按 100 克计价)、一键标记售罄菜品,以及每日营业额、用餐人数和畅销菜品。
- 四种角色,多家餐厅——平台管理员、经理、服务员和厨房。每家餐厅拥有各自的用户和数据,彼此隔离。
- 本地服务器安装包——一个安装程序,把应用连同 Gina 真实的菜单和餐桌部署到餐厅内的一台电脑上,并附带每日备份脚本。
技术栈
PHP 8 和 MySQL(PDO),原生 JavaScript,不使用任何外部库。所有调用由同一个 API 端点处理。会话带 CSRF 令牌,密码经过哈希处理。Gina 的菜单和酒单被录入 9 个分类。
为什么这样做
我让应用保持零依赖,并使用简单的轮询而非 websockets,使它能在普通的共享主机上运行。同样的选择也让它很容易迁移到本地服务器:即使互联网断线,订单和账单仍可通过餐厅的 Wi-Fi 正常运作。


