SSM+微信小程序实现的餐厅堂食预订与点餐平台:桌台订座、预点菜与宴席预订单设计
本文记录一个面向中型中餐厅的堂食预订与点餐平台的完整设计与实现过程。与市面上常见的综合在线订餐、扫码点餐类系统不同,本文把关注点放在「到店」场景:顾客提前订座、到店享用预先点好的菜品,以及婚宴寿宴这类宴席的预订单管理。
一、前言
餐饮行业里,把客人请进店里,和把餐食送出去,是两条完全不同的业务线。后者比拼的是时效与运力调度,而堂食餐厅更关心的是:今晚的包间还有没有空、顾客能不能提前把菜点好、周六那场六十人的婚宴由谁来确认档期。
笔者参与的一个实践项目就来自这样一家中型中餐厅。餐厅设散台区、三间主题包间和两个无柱宴会厅,工作日以散客与商务宴请为主,周末则大量承接婚宴、寿宴。在此之前,订座靠电话加纸质登记簿,漏记、撞档是常态;宴席的菜单和布置要求靠微信语音反复沟通,信息零散。基于这些痛点,我们把系统目标定为三件事:
- 在线订座:顾客在小程序上选日期、选时段、选桌台,提交后形成一条预订单,由店员在后台确认;
- 预点菜:顾客到店前即可浏览菜品并加入点菜篮,到店落座后由店员核销出单,缩短等菜时间;
- 宴席预订单:把宴席当作一种特殊预订类型管理,备注栏记录主题布置、套系选择等需求,形成可追溯的电子台账。
全文按技术选型、功能设计、数据库设计、系统演示的顺序展开,最后给出小结。
二、技术栈
系统整体采用经典的分层架构,全部选型围绕「稳定、好部署、易答辩讲解」三个原则:
| 层 | 技术 | 说明 |
|---|---|---|
| 后端框架 | Spring + SpringMVC + MyBatis-Plus 2.3 | SSM 组合,war 包部署 |
| 数据库 | MySQL 5.7(InnoDB,utf8mb4) | 15 张业务表 |
| 连接池 | Druid | 带慢 SQL 与监控支持 |
| 管理端前端 | Vue 2 + Element UI | vue-cli 构建,静态产物内嵌 war 包 |
| 用户端 | 微信小程序(uniapp 语法编译产物) | 原生 wx.request 调用后端 REST 接口 |
| 构建 | Maven 3.9 + JDK 8 | 编译开启 -g 保留参数名调试信息 |
后端按controller / service / dao / entity四层组织,接口统一返回code / msg / data结构。管理端 Vue 应用构建后放在webapp/admin/dist,与后端同源部署,避免了跨域配置;小程序端则通过配置的后端地址直接访问 REST 接口。登录鉴权采用服务端签发 token、请求头携带校验的方式,公开接口(菜品列表、桌台查询等)通过注解放行,未登录也可浏览。
值得说明的是参数名调试信息的处理:SpringMVC 的分页查询接口依赖方法参数名完成参数绑定,命令行编译时若不保留调试信息,全站分页查询会报参数缺失错误。所以在编译配置里显式加入-g,这也是老工程迁移构建时容易被忽略的一处。
三、功能设计
系统按角色拆成「顾客端小程序」和「店员管理后台」两部分。
顾客端(微信小程序)底部导航为首页、菜品、购物车、预订、我的五个入口:
- 首页轮播展示餐厅公告与活动横幅;
- 菜品页按「招牌凉菜、精品热菜、滋补汤羹、主食点心、酒水饮品、宴席套系」六个分类浏览菜品,支持口味筛选与菜品评论;
- 点菜篮支持多菜品合并结算,提交后形成预点单,可选现金或储值余额两种支付方式;
- 预订页是在线订座的核心入口:依次选择用餐日期(只能选当天及以后)、用餐时段(午市 11:00-14:00 / 晚市 17:00-21:00)、预订类型(散台预订 / 包间预订 / 宴席预订单)、具体桌台与人数,填写预订人与联系电话后提交,系统按「业务前缀+日期+随机码」规则生成预订单号;
- 「我的预订」按联系电话拉取本人预订单,展示待确认、已确认、已到店、已完成、已取消五种状态的进度,顾客可直观看到预订推进到了哪一步。
预订状态机是整个预订链路的骨架:预订单由顾客提交后进入「待确认」,店员核对档期后置为「已确认」,顾客到店落座记「已到店」,用餐结束收「已完成」,任一环节顾客改期或取消则记「已取消」。状态只允许沿固定方向流转,配合后台的修改与删除权限,保证任何一条预订单都可以追溯到最初的提交记录。
店员管理后台按角色展示菜单,管理员具备全部能力:
- 桌台管理:维护桌台编号、名称、所属区域(散台区/包间/宴会厅)、容纳人数与实时状态(空闲/已预订/使用中),每张桌台配展示图;
- 堂食预订管理:查看全部预订单,执行确认、修改、取消;宴席预订单的备注会记录布置要求,作为宴会策划的依据;
- 预点单管理:按状态区分未支付、已支付、已完成、已取消、已退款五类,已支付订单支持「核销」操作,对应到店确认用餐的业务动作;
- 菜品与分类管理:维护菜品档案、价格、口味偏好与图文介绍;
- 会员管理:维护会员档案与储值余额,支持储值礼遇的运营动作;
- 系统管理:轮播图、系统公告与餐厅简介维护;意见反馈模块承接预订咨询,店员逐条回复。
四、数据库设计
数据库restaurant_booking共 15 张表,围绕「桌台—预订单—菜品—预点单」四条主线展开:
| 表 | 说明 | 关键字段 |
|---|---|---|
| zhuotai | 餐桌桌台 | 桌台编号、名称、区域、容纳人数、状态 |
| yuding | 堂食预订单 | 预订单号、预订桌台、用餐日期、时段、人数、预订类型、联系人、状态 |
| caipin / caipinfenlei | 菜品与分类 | 编号、名称、口味、价格、图文 |
| orders | 预点单 | 订单号、菜品、数量、金额、状态、就餐桌位、出餐状态 |
| cart | 点菜篮 | 会员、菜品、数量、单价 |
| xuesheng | 会员档案 | 会员账号、姓名、手机、储值余额 |
| users | 管理员账号 | 用户名、密码、角色 |
| discusscaipin / storeup | 菜品评论 / 收藏 | 关联菜品、内容、回复 |
| messages / news / guanyuwomen | 咨询留言 / 公告 / 餐厅简介 | 内容与回复 |
| config / token | 轮播图配置 / 登录令牌 | 键值 / 令牌与过期时间 |
设计上有三个要点。其一,预订单表把「用餐日期」与「用餐时段」拆成两个字段,便于按周检索档期,也方便后续做同期对比;预订类型字段将散台、包间与宴席统一到一张表,避免为宴席单独建表带来的状态同步问题。其二,预点单表在保留金额字段的同时增设「就餐桌位」与「出餐状态」字段,使同一套订单链路贴合堂食语义,店员在后台可以直接按桌位出餐。其三,桌台表与预订单表通过桌台名称弱关联而非外键强约束,桌台档案调整(如包间改名)不会破坏历史预订单的可读性,这在业务台账类系统里是经过验证的稳妥做法。
五、系统演示
以下截图均为真实运行数据。
后台登录页采用青柠鲜绿渐变底与柠光环纹的品牌化设计:
登录后进入管理端首页,顶部横向菜单按业务域分组:
桌台管理维护散台区、包间、宴会厅三类桌台,列表实时反映桌台状态:
新增桌台表单包含区域选择、容纳人数与桌台图片上传:
堂食预订管理是系统的核心页面,预订单覆盖散台、包间与宴席三类,状态列区分待确认、已确认、已取消与已完成:
打开一条已确认的预订单详情,可核对用餐日期、时段、人数与备注中的布置要求:
菜品管理维护十四道菜品档案,含价格与图文介绍:
已支付预点单支持核销操作,出餐状态列区分备餐中与已出餐:
会员管理维护会员档案与储值余额:
系统公告用于发布营业时间调整、储值礼遇与宴席服务升级等运营信息:
六、小结
这个项目把「订座—预点菜—宴席预订单」三条堂食业务线收拢到一个平台里:小程序端降低了顾客提交预订的门槛,管理端让桌台档期与预订单状态一目了然。实现层面,SSM 后端以 15 张表支撑了完整的业务闭环,预订单表「一类多态」的设计让宴席与普通订座共用一条确认链路,预点单的就餐桌位与出餐状态字段则完成了订单语义向堂食场景的转换。对同样想做餐饮到店场景的同学来说,值得优先想清楚的不是界面长什么样,而是预订状态机如何流转、桌台档期如何表达这两个问题——把这两件事定下来,剩下的表结构与接口设计都会顺理成章。
如果在实现类似系统时遇到问题,欢迎评论区交流。
餐厅堂食预订与点餐平台源码 SSM+微信小程序(毕业设计/课程设计)