替代 Eatigo/OpenTable 的马来西亚本地化餐厅预约管理系统
你是一位资深全栈工程师。请帮我搭建一个完整的餐厅订位系统,专为马来西亚餐饮业设计,替代 Eatigo/OpenTable。
## 项目概述
- 餐厅名称:{restaurant_name}
- 餐厅类型:{restaurant_type}
- 桌数:{num_tables} 张
- 最大派对人数:{max_party_size} 人
- 营业时间:{operating_hours}
- 品牌主色:{primary_color}
- 可预订提前天数:{booking_lead_days} 天
## 技术栈
- 前端:Next.js 16(App Router)+ Tailwind CSS 4 + shadcn/ui
- 后端/数据库:Supabase(Postgres + Auth + Realtime)
- 部署:Vercel
- 通知:模拟 WhatsApp 发送(预留接口)
## 核心功能
### 顾客端(移动优先)
- 分步预订表单:选择日期(禁用封锁日期,最多提前 {booking_lead_days} 天)→ 选择时段(显示剩余容量)→ 填写人数及特殊要求 → 填写姓名、+60 手机号、邮箱选填。底部固定 {primary_color} 确认按钮。成功后显示确认码及模拟 WhatsApp 预览。
- 预订状态页:输入确认码查询状态,可取消(提前 2 小时以上)。
- 等位页面:输入姓名、手机号、人数,加入后显示排队位置和预计等待时间(实时更新)。
### 管理端(桌面优先)
- 仪表盘:今日预订概览(总数、已确认、已就座、no-show)、等位人数、本周趋势图。
- 预订管理:表格视图,可按日期/状态筛选,操作包括确认、就座、完成、no-show、取消。
- 楼层管理:桌位列表,显示桌号、容量、区域、状态,可拖拽分配桌位。
- 设置:营业时间编辑、时段容量配置、封锁日期管理、通知模板编辑。
## 业务规则
- 防止超额预订:预订前检查时段容量,使用事务锁定行,插入后递增已订数,取消时递减。
- 确认流程:提交后生成确认码,模拟发送 WhatsApp 确认,顾客点击链接确认,预订前 2 小时发送提醒。
- No-Show 政策:累计 3 次显示警告,5 次要求定金(UI 提示),管理员可清除记录。
- 等位管理:自动分配排队位置,有空桌时通知第一位,10 分钟无响应则跳过。
## 马来西亚本地化
- 界面双语:简体中文为主,英文切换。
- 手机号格式:+60 开头,验证马来西亚号码。
- 时区:Asia/Kuala_Lumpur (UTC+8)。
- 日期格式:YYYY年MM月DD日 / DD/MM/YYYY。
- 考虑农历新年、开斋节等节假日。
## 示例数据
- 餐厅:{restaurant_name}({restaurant_type}),地址:Jalan Alor, Bukit Bintang, KL。
- 桌位:{num_tables} 张(按实际容量分配)。
- 今日预订 8 笔(混合状态),等位 3 人,历史 no-show 2 笔,本周封锁 1 天。
## 构建要求
- 先给出简短实施计划,优先主流程。
- 使用 Supabase Realtime 实现实时更新。
- 所有数据库操作使用事务。
- 代码注释中英双语。
- 部署到 Vercel,环境变量通过 .env.local 管理。
## 构建顺序(请严格遵守)
请按以下顺序开发,让我尽早在屏幕上看到成果,不要长时间没有画面:
1. 先做界面:用接近真实的示例数据,把所有页面做出来(暂时不接数据库),让我能马上看到、能点击。做完先停下来,等我确认。
2. 再做功能:我确认界面后,才让按钮、表单和计算真正可用(继续用示例数据)。
3. 再接 Supabase:功能都正常后,才连接 Supabase 保存真实数据和登录(如需要)。
4. 最后上线:先确保在我电脑上运行正常,再把代码上传到 GitHub,经我同意后部署到 Vercel。
请保持简单——我是非技术背景的老板。有不清楚或需要决定的事,先问我,不要自己假设。