为健身工作室打造完整的课程预约与会员管理系统
你是一位资深全栈开发工程师,为马来西亚中小型健身房构建课程预约与会员管理系统。使用 Next.js 14(App Router)、TypeScript、Tailwind CSS、shadcn/ui 和 Supabase。
健身房名称:{gym_name}
课程类型:{class_types}
会员等级:{membership_tiers}
课程最大容量:{max_capacity} 人
## 角色与背景
你是一位资深全栈工程师,专为马来西亚健身工作室打造替代 Mindbody 的本地化系统。
## 项目目标
构建一个完整的课程预约与会员管理平台,支持会员注册、课程浏览、预约、签到、付款追踪及管理后台。
## 目标用户
- 会员:浏览课程时间表、预约课程、管理个人资料、查看历史记录
- 教练:查看个人排班
- 管理员:管理会员、课程、教练、付款,查看仪表板
## 核心体验与页面
- 每周课程时间表(/schedule):以日历网格展示课程,支持按课程类型、教练、难度筛选。课程卡片显示名称、教练、时间、容量进度条、难度徽章。点击弹出详情模态框,含预约或候补按钮。移动端为垂直列表。
- 会员注册(/register):多步表单收集个人信息、选择会员套餐(展示 {membership_tiers} 对比卡片)、选择付款方式。
- 会员个人主页(/member/[id]):显示会员状态、到期日、剩余 credits、即将参加的课程(可取消)、历史记录、QR 码用于签到。
- 管理员仪表板(/admin):今日概览(课程数、预约人次、出勤率、收入)、即将到期会员列表、热门课程排名、新会员趋势图。
- 管理员会员管理(/admin/memberships):查看所有会员订阅,高亮即将到期者,支持续费和冻结处理。
- 教练管理(/admin/instructors):教练卡片展示,新增/编辑教练信息,查看教练排班日历。
- 签到界面(/checkin):扫描会员 QR 码或手动搜索,一键签到,显示今日课程签到状态总览。
- 预约历史(/bookings):分标签展示即将到来、历史、已取消的预约,可取消预约并说明退款政策。
- 付款追踪(/admin/payments):付款记录表格,支持筛选、新增付款、月度收入图表。
## 主要工作流程
1. 会员注册并选择套餐,管理员确认付款后激活会员资格。
2. 会员浏览课程时间表,预约课程(检查会员资格、容量、高峰时段限制)。
3. 预约确认或加入候补队列;取消时自动晋升候补第一位。
4. 会员到店签到,管理员标记出勤或旷课。
5. 管理员追踪付款、管理会员续费和冻结。
## 业务规则
- 预约截止:开课前 1 小时(可配置)。
- 取消窗口:开课前 2 小时,逾期取消不退 credit。
- 候补晋升:有名额时自动晋升,30 分钟内未确认则顺延。
- 会员冻结:每年最多 30 天(按套餐设定),冻结期间不扣月费。
- 单次收费:非会员或 credit 不足时按课程单次价格收费。
- 高峰时段:基础会员不可预约 07:00-09:00 和 18:00-20:00 的课程。
- 旷课惩罚:3 次旷课后暂停预约权限 7 天。
- 马来西亚本地化:RM 货币、+60 手机格式、Asia/Kuala_Lumpur 时区。
## 设计方向
- 深色导航栏(#0F172A)+ 白色内容区 + 黄色强调色(#FCD34D)。
- 圆角卡片,细边框。容量进度条:绿色(>50%空位)→ 黄色(<30%)→ 红色(满员)。
- 移动端优先:底部固定导航栏,大按钮。
## 构建方法
- 先实现数据库表(members、membership_plans、memberships、instructors、classes、class_schedule、bookings、attendance、payments)及行级安全策略。
- 使用 Supabase Auth 管理管理员和会员身份。
- 使用 Server Actions 处理预约、取消等业务逻辑。
- 使用 Supabase Edge Function 实现每日会员到期检查和旷课计数器重置。
- 提供完整可运行代码,包括环境变量配置和部署说明。
## 构建顺序(请严格遵守)
请按以下顺序开发,让我尽早在屏幕上看到成果,不要长时间没有画面:
1. 先做界面:用接近真实的示例数据,把所有页面做出来(暂时不接数据库),让我能马上看到、能点击。做完先停下来,等我确认。
2. 再做功能:我确认界面后,才让按钮、表单和计算真正可用(继续用示例数据)。
3. 再接 Supabase:功能都正常后,才连接 Supabase 保存真实数据和登录(如需要)。
4. 最后上线:先确保在我电脑上运行正常,再把代码上传到 GitHub,经我同意后部署到 Vercel。
请保持简单——我是非技术背景的老板。有不清楚或需要决定的事,先问我,不要自己假设。