jacobajak/Restop_public

GitHub: jacobajak/Restop_public

基于二维码扫描的多租户餐厅数字点餐 SaaS 平台,集成了非洲移动支付和实时订单管理功能。

Stars: 0 | Forks: 0

# RESTOP - 基于二维码的多租户餐厅点餐平台 一个使用二维码的综合数字点餐平台,顾客可以扫描并从数字菜单中点餐,同时餐厅老板可以通过专用的仪表板管理运营。 ## 🚀 项目概述 RESTOP 是一个处于 MVP 阶段的平台,设计为多租户系统,支持: - **顾客界面**:通过扫描二维码访问的 Web 应用程序进行点餐 - **租户仪表板**:餐厅管理和订单处理 - **后端服务**:多租户订单、菜单和支付处理 - **实时更新**:基于 WebSocket 的实时订单通知 - **MoMo 准备就绪**:为移动支付集成准备的支付架构 ## 📁 项目结构 ``` RESTOP/ ├── frontend/ # Next.js customer & dashboard interface │ ├── src/ │ │ ├── app/ # Next.js app directory │ │ ├── components/ # React components │ │ ├── services/ # API service layer │ │ ├── types/ # TypeScript type definitions │ │ ├── hooks/ # Custom React hooks │ │ ├── context/ # Context API providers │ │ └── styles/ # Global styles │ └── package.json ├── backend/ # NestJS API server │ ├── src/ │ │ ├── modules/ # Feature modules │ │ ├── common/ # Guards, middleware, decorators │ │ ├── database/ # Database entities & migrations │ │ └── config/ # Configuration files │ └── package.json ├── docker/ # Docker compositions ├── docs/ # Documentation └── README.md ``` ## 🛠️ 技术栈 ### 前端 - **框架**:Next.js 14 - **样式**:Tailwind CSS - **状态管理**:Zustand - **API 客户端**:Axios + React Query - **实时通信**:Socket.IO ### 后端 - **框架**:NestJS - **数据库**:PostgreSQL - **ORM**:TypeORM - **身份验证**:JWT + Passport - **实时通信**:WebSockets (Socket.IO) - **缓存**:Redis ### 基础设施与服务 - **容器化**:Docker - **CI/CD**:GitHub Actions - **部署**:AWS/GCP/DigitalOcean - **支付网关**:Flutterwave (MTN/Airtel Mobile Money) - **电子邮件**:Ethereal (测试) / SendGrid (生产) - **监控**:内置断路器、健康检查 ## 🚀 快速开始 ### 前置条件 - Node.js 18+ - PostgreSQL 14+ - Redis 7+ - Docker(可选) ### 设置前端 ``` cd frontend cp .env.example .env.local npm install npm run dev # 前端可通过 http://localhost:3000 访问 ``` ### 设置后端 ``` cd backend cp .env.example .env npm install npm run dev # 后端可通过 http://localhost:3001 访问 ``` ## 📊 核心功能 (MVP) ### 顾客功能 - ✅ 扫描二维码 - ✅ 浏览数字菜单 - ✅ 将商品添加到购物车 - ✅ 查看包含平台费用的商品明细定价 - ✅ 下单并进行现金确认 - ✅ 实时订单状态更新 - ✅ **Mobile Money 支付**(通过 Flutterwave 的 MTN/Airtel) - ✅ 自动扣除佣金 (10%) - ✅ 幂等性保护的交易 ### 租户(餐厅)功能 - ✅ 用于订单管理的仪表板 - ✅ 菜单管理(添加/编辑/删除商品) - ✅ 实时订单通知 - ✅ 支持多种支付方式 - ✅ **支付账户注册**(MTN/Airtel) - ✅ 自动支付结算(<5 分钟) - ✅ 订单状态管理 - ✅ 销售分析 - ✅ 二维码管理 ### 管理/平台功能 - ✅ 多租户隔离 - ✅ 租户入驻 - ✅ **平台佣金追踪**(实时钱包) - ✅ **佣金分类账**(支付历史) - ✅ 收入追踪与分析 - ✅ 系统监控 - ✅ 支付验证与对账 - ✅ 断路器与弹性模式 ## 🔐 安全 - 基于 JWT 的身份验证 - 使用 tenant_id 过滤实现租户数据隔离 - Bcrypt 密码哈希 - CORS 保护 - 速率限制 - 输入验证 - HTTPS 强制执行(生产环境) ## 🔄 API 架构 基础 URL:`/api/v1` ### 支付端点(新增) - `POST /orders/{orderId}/pay` - 发起 MTN/Airtel 支付 - `PATCH /orders/{orderId}/mark-paid` - 将现金订单标记为已支付 - `POST /webhooks/flutterwave` - Flutterwave Webhook 接收器 - `POST /tenants/{tenantId}/payment-accounts` - 注册支付账户 - `GET /admin/wallet` - 查看平台佣金钱包 - `GET /admin/ledger` - 查看佣金历史 ### 菜单 API - `GET /menu/{tenant_slug}` - 获取餐厅菜单 - `POST /menu/items` - 添加菜单项(租户) - `PUT /menu/items/{id}` - 更新菜单项 - `PATCH /menu/items/{id}/availability` - 切换可用状态 **订单 API** - `POST /orders` - 创建订单 - `GET /orders` - 获取订单(租户) - `PATCH /orders/{id}/confirm` - 确认订单 - `PATCH /orders/{id}/reject` - 拒绝订单 - `PATCH /orders/{id}/status` - 更新订单状态 **分析 API** - `GET /analytics/sales` - 销售分析 - `GET /financial-analytics/summary` - 财务概览 **完整 API 参考(91+ 个端点)请参见 [ENDPOINT_REFERENCE_GUIDE.md](ENDPOINT_REFERENCE_GUIDE.md)** ## 💳 支付集成 ### Flutterwave 原生集成(2026 年 4 月) RESTOP 现在使用 **Flutterwave 的原生支付时分账模型**: **工作原理:** 1. 顾客发起 MTN/Airtel 支付 2. Flutterwave 自动拆分支付: - 平台获得 10% 佣金 - 租户获得 90%(自动支付 <5 分钟) 3. 订单标记为 PAID,并启动支付 4. 佣金记录在管理员钱包中 **功能:** - ✅ 10% 自动扣除佣金 - ✅ <5 分钟支付结算 - ✅ 带有幂等性的 Webhook 验证 - ✅ 断路器错误处理 - ✅ 每 5-10 分钟自动对账 - ✅ 网络故障时的优雅降级 **支付方式:** - 🇷🇼 MTN Mobile Money (0788/0789) - 🇷🇼 Airtel Money (0773/0774) - 💰 现金(货到付款) **完整功能清单请参见 [PAYMENT_FEATURES_AND_GAPS_ANALYSIS.md](PAYMENT_FEATURES_AND_GAPS_ANALYSIS.md)** ## 📚 文档 完整文档整理在 [DOCUMENTATION_INDEX.md](DOCUMENTATION_INDEX.md) 中。 ### 核心文档 - 📖 [DOCUMENTATION_INDEX.md](DOCUMENTATION_INDEX.md) - 中央文档指南 - 🔧 [ENDPOINT_REFERENCE_GUIDE.md](ENDPOINT_REFERENCE_GUIDE.md) - API 端点 (91+) - 💳 [PAYMENT_FEATURES_AND_GAPS_ANALYSIS.md](PAYMENT_FEATURES_AND_GAPS_ANALYSIS.md) - 支付功能清单 - 🧪 [FLUTTERWAVE_TESTING_GUIDE_NOW.md](FLUTTERWAVE_TESTING_GUIDE_NOW.md) - 逐步测试指南 - 🚀 [QUICK_CURL_TESTS.md](QUICK_CURL_TESTS.md) - 快速测试的 curl 命令 - 🌐 [FRONTEND_ROUTES_AND_ACCESS.md](FRONTEND_ROUTES_AND_ACCESS.md) - 前端路由指南 - 🔐 [RBAC_DEVELOPER_GUIDE.md](RBAC_DEVELOPER_GUIDE.md) - 身份验证与授权 - 📱 [OFFLINE_READINESS_ANALYSIS.md](OFFLINE_READINESS_ANALYSIS.md) - 离线能力分析 - 📊 [MVP_FEATURE_SUMMARY.md](MVP_FEATURE_SUMMARY.md) - MVP 功能概览 ## 🧪 快速测试 ### 测试支付端点 (CLI) ``` # 详细的测试指南请参见 QUICK_CURL_TESTS.md # Health check curl http://localhost:3001/api/v1/admin/health # 创建订单 curl -X POST http://localhost:3001/api/v1/orders \ -H "Authorization: Bearer YOUR_JWT_TOKEN" \ -d '{"tenant_id": "test-tenant", "total_amount": 10000, "payment_method": "MTN"}' # 发起支付 curl -X POST http://localhost:3001/api/v1/orders/{orderId}/pay \ -H "Authorization: Bearer YOUR_JWT_TOKEN" \ -d '{"customer_phone": "0788123456"}' ``` **综合测试指南:** 参见 [FLUTTERWAVE_TESTING_GUIDE_NOW.md](FLUTTERWAVE_TESTING_GUIDE_NOW.md) ## ⚙️ 配置 ### 环境变量(后端) ``` # Database DATABASE_URL=postgresql://restop:restop_password@localhost:5432/restop_db # Flutterwave (Staging) FLUTTERWAVE_CLIENT_ID=your-client-id FLUTTERWAVE_SECRET_KEY=your-secret-key FLUTTERWAVE_SECRET_HASH=your-webhook-hash FLUTTERWAVE_ENV=staging # JWT JWT_SECRET=your-jwt-secret # Redis (可选,graceful fallback) REDIS_HOST=localhost REDIS_PORT=6379 ``` ## 📱 离线能力状态 **当前:** ⚠️ 需要联网(Flutterwave 支付,实时数据库) **分析:** 在 [OFFLINE_READINESS_ANALYSIS.md](OFFLINE_READINESS_ANALYSIS.md) 中的全面离线准备情况分析 **可能实现的离线功能:** - ✅ 菜单浏览(缓存) - ✅ 挂起的订单创建 - ✅ 重新连接时同步 **需要联网的功能:** - ❌ Flutterwave MoMo 支付 - ❌ 实时订单更新 - ❌ 佣金结算 **建议:** 在第二阶段实现 PWA + 离线队列(需 3-4 周时间) ## 🚀 部署 ### Docker ``` docker-compose up ``` ### 手动部署 前端部署到 Vercel: ``` cd frontend vercel deploy ``` 后端部署(Docker): ``` cd backend docker build -t restop-backend . docker run -p 3001:3001 restop-backend ``` ## 📝 数据库架构 所有表都包含 `tenant_id` 用于多租户隔离。 核心表: - `tenants` - 餐厅信息 - `users` - 餐厅员工 - `menu_categories` - 菜单分类 - `menu_items` - 单个菜单项 - `orders` - 顾客订单 - `order_items` - 订单子项 - `payments` - 支付记录 - `qr_codes` - 二维码映射 ## 🔮 第二阶段及以后的增强 ### 第二阶段(MVP 之后) - 📱 带有 PWA + Service Worker 的离线模式 - 🔌 高级离线支付队列与同步 - 📧 电子邮件/短信通知(Ethereal 测试 → SendGrid 生产) - 📊 高级分析仪表板 - 🛏️ 餐桌管理系统 - ⭐ 顾客评论与评分 - 👥 会员忠诚度计划 ### 第三阶段及以后 - 🌍 多语言支持 - 📱 移动应用(iOS/Android) - 📅 预订系统 - 💳 多币种支持 - 🔄 订阅计费 - 📈 预测性分析 ## 🤝 贡献 欢迎贡献代码!请遵循现有的代码结构和提交信息规范。 ## 🧹 项目维护 **上次清理:** 2026 年 4 月 21 日 - ✅ 移除了 59 个不必要的文件(测试文件、日志、旧迁移) - ✅ 将 14 个冗余的支付文档合并 → 4 个核心文档 - ✅ 通过 DOCUMENTATION_INDEX.md 组织文档 - ✅ 验证后端编译零 TypeScript 错误 - ✅ 修复了 NestJS 依赖注入问题 **关键数据:** - 📊 15+ 个模块中的 91+ 个 API 端点 - 🗄️ 25+ 个具有多租户隔离的数据库表 - 🔐 带有 RBAC 的 JWT + Passport 身份验证 - 🌊 具有断路器弹性的 Flutterwave 集成 - ✅ 后端已测试并在端口 3001 上运行 - ✅ 前端已在端口 3000 上准备就绪 ## 📄 许可证 MIT 许可证 - 详情请参见 LICENSE 文件 ## 📧 支持与贡献 如有问题或疑问,请: 1. 首先查看 [DOCUMENTATION_INDEX.md](DOCUMENTATION_INDEX.md) 2. 审阅上述列表中的相关文档 3. 在仓库中创建一个 Issue,包含: - 对问题的清晰描述 - 重现步骤 - 相关日志/错误 欢迎贡献代码!请遵循现有的代码结构和提交信息规范。
标签:API服务, Axios, CISA项目, IP 地址批量处理, NestJS, React, React Query, SaaS平台, Syscalls, Tailwind CSS, TypeScript, WebSocket, Web应用开发, Zustand, 二维码菜单, 依赖分析, 前后端分离, 在线点餐系统, 外卖点单系统, 多租户架构, 安全插件, 实时订单通知, 扫码点餐, 搜索引擎查询, 数字化转型, 测试用例, 点单系统, 移动支付集成, 移动钱包, 自动化攻击, 请求拦截, 餐厅管理面板, 餐饮数字化