Zoe-life/rest-shop

GitHub: Zoe-life/rest-shop

一个基于 MERN 技术栈的生产级电商平台,采用 Cloudflare Workers 边缘代理架构,集成多支付网关和企业级安全特性。

Stars: 1 | Forks: 0

# 具备 React 前端的 RESTful 电子商务平台 [![CI/CD Pipeline](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/08f2788207000501.svg)](https://github.com/Zoe-life/rest-shop/actions/workflows/ci-cd.yml) [![Security](https://img.shields.io/badge/security-helmet-brightgreen)](https://helmetjs.github.io/) [![License](https://img.shields.io/badge/license-ISC-blue.svg)](LICENSE) 一个现代化的全栈电子商务平台,采用双后端架构(Node.js + Cloudflare Workers)和 React TypeScript 前端。 ## 前端演示 - **在线演示**: [Cloudflare Pages](https://rest-shop-frontend.pages.dev) - **功能特性**: - 日间/夜间模式切换 - 完全响应式设计 - 藏红花色与海军蓝主题 - 在 Cloudflare Pages 上拥有极速性能 ## 仓库结构 ``` rest-shop/ │ ├─ frontend/ ← React + TypeScript + Tailwind CSS │ ├─ src/ │ │ ├─ components/ # Reusable components │ │ ├─ pages/ # Page components │ │ ├─ contexts/ # React contexts (Auth, Theme) │ │ ├─ api/ # API configuration │ │ └─ App.tsx │ ├─ public/ │ └─ package.json │ ├─ api/ ← Node + Express + Mongoose │ ├─ models/ │ ├─ routes/ │ ├─ controllers/ │ ├─ middleware/ │ ├─ services/ │ ├─ config/ │ ├─ utils/ │ ├─ test/ │ ├─ server.js │ └─ package.json │ ├─ worker/ ← Cloudflare Worker (Edge Proxy) │ ├─ src/ │ │ └─ index.js │ ├─ wrangler.toml │ └─ package.json │ ├─ docs/ ← Comprehensive documentation └─ README.md ``` ## 目录 - [概述](#overview) - [前端特性](#frontend-features) - [架构](#architecture) - [连接 Worker 到 Node.js 后端](#-connecting-the-worker-to-the-nodejs-backend) - [功能特性](#features) - [增强功能](#enhanced-features) - [安全特性](#security-features) - [性能特性](#performance-features) - [技术栈](#technologies-used) - [快速开始](#getting-started) - [前置条件](#prerequisites) - [安装](#installation) - [配置](#configuration) - [运行应用](#running-the-application) - [API 端点](#api-endpoints) - [文档](#documentation) - [部署](#deployment) - [CI/CD 流水线](#cicd-pipeline) - [测试](#testing) - [监控与可观测性](#monitoring-and-observability) - [贡献](#contributing) ## 概述 这是一个全面的、**专业级全栈电子商务平台**,包含: - **现代 React 前端**: TypeScript, Tailwind CSS, 响应式设计 - **RESTful API 后端**: Node.js, Express, Mongoose, MongoDB - **边缘分发**: Cloudflare Workers 代理,实现全球性能优化 - **企业级功能**: 支付处理 (Stripe, PayPal, M-Pesa),身份验证,订单管理 - **自动化 CI/CD**: GitHub Actions 实现持续部署 ## 前端特性 ### 现代 UI/UX - **主题色**: 鲜艳的藏红花色 (#FF9933) 和海军蓝 (#002366) - **深色/浅色模式**: 切换功能,通过 localStorage 持久化 - **响应式设计**: 移动优先,适配所有屏幕尺寸 - **简洁界面**: 专业、直观且用户友好 ### 技术栈 - **React 19** 与 TypeScript - **Tailwind CSS** 用于样式 - **React Router** 用于导航 - **Context API** 用于状态管理 (Auth, Theme, Cart) - **Axios** 用于 API 通信 ### 页面与功能 - **首页**: Hero 区域,包含特色产品和价值主张 - **产品浏览**: 网格布局,包含图片、价格和库存状态;支持添加到购物车 - **购物车与结账**: 持久化购物车,支持多种支付方式 (Card, Stripe, PayPal, M-Pesa) - **身份验证**: 登录、注册和 OAuth 社交登录页面 - **订单管理**: 查看订单历史和状态 - **支付历史**: 认证用户的完整交易日志 - **关于与联系**: 带有联系表单的信息页面 - **管理后台**: 受保护的面板,用于管理产品、订单和用户 - **主题切换**: 无缝的日间/夜间模式切换 详细的前端文档请参阅 [Frontend README](./frontend/README.md)。 ## 架构 ### Cloudflare Workers 兼容的代理架构 应用采用 **三层代理架构**: ``` Frontend (Cloudflare Pages) ↓ HTTPS Cloudflare Workers (Edge Proxy) ↓ HTTPS Node.js Backend (Render) ↓ MongoDB Atlas ``` **组件:** - **Frontend** (~100KB): React SPA 部署到 Cloudflare Pages - **Cloudflare Workers** (~10KB): 轻量级边缘代理,用于全球分发 - **Node.js Backend**: 完整的 API,包含 Mongoose/MongoDB 操作 - **MongoDB Atlas**: 云数据库 **优势:** - 前端的全球 CDN 分发 - 通过 Workers 实现快速边缘路由 - Node.js 中可靠的 Mongoose/MongoDB 操作 - 所有层的独立扩展 - 行业标准的架构模式 **部署:** - Frontend: Cloudflare Pages (通过 GitHub Actions 自动部署) - Workers: Cloudflare Workers (通过 GitHub Actions 自动部署) - Backend: Render (推送时自动部署) 详细文档请参阅: - [完整部署指南](docs/FULL_DEPLOYMENT_GUIDE.md) - [GitHub CI/CD 设置](docs/GITHUB_SECRETS_CICD_GUIDE.md) - [代理架构说明](docs/CLOUDFLARE_WORKERS_PROXY_ARCHITECTURE.md) ### 旧版微服务架构(已弃用) 以前的架构尝试使用 Durable Objects 在 Workers 中直接运行 Mongoose。这已被上面的代理架构取代,以解决运行时不兼容问题。 ### 部署命令 ``` # 部署所有服务 npm run deploy:all # 部署单个服务 npm run deploy:base # Base service npm run deploy:payments # Payment service npm run deploy:gateway # Gateway (main entry point) ``` ## 连接 Worker 到 Node.js 后端 **最重要的一步:** Cloudflare Worker 充当代理,需要知道你的 Node.js 后端运行在哪里。 ### 快速设置 1. **部署你的 Node.js 后端** (Render 或 VPS): # 使用 Render 示例 # 在 Render 控制面板连接你的 GitHub 仓库 # 获取你的 URL: https://your-app.onrender.com 2. **在你的 worker 中设置后端 URL**: cd worker wrangler secret put BACKEND_API_URL # 输入: https://your-app.onrender.com 3. **部署 worker**: wrangler deploy 4. **测试连接**: curl https://your-worker.workers.dev/health # 应该显示 worker 和 backend 都是 ok 的 ### 本地开发 你可以完全跳过 worker,直接将前端连接到后端: ``` # 仅运行 Node.js 后端 npm start # 后端运行在 http://localhost:3001 # 将前端指向:http://localhost:3001 ``` ### 详细指南 请参阅 **[连接指南](docs/CONNECTION_GUIDE.md)** 了解: - 分步说明 - 多种部署选项 (Render, VPS) - 常见问题排查 - 配置验证脚本 ### 验证脚本 检查你的后端是否正确连接: ``` node api/scripts/validate-connection.js [worker-url] # 示例: node api/scripts/validate-connection.js https://your-app.onrender.com https://your-worker.workers.dev ``` ## 功能特性 ### 核心功能 - 使用 JWT 的用户身份验证和管理 - OAuth 2.0 集成 (Google, Microsoft, Apple) - 多网关支付处理 (Stripe, PayPal, M-Pesa) - 产品管理,支持搜索、过滤和分页 - 高级订单管理,包含状态跟踪 - 基于角色的访问控制 (Admin/User) - 产品图片的文件上传 - 库存跟踪(库存水平, SKU) - 支付历史和交易日志 - 用于支付回调的 Webhook 处理 - 全面的错误处理 - GitHub Actions CI/CD 流水线 - Cloudflare Workers 部署就绪 ### 增强功能 #### 安全增强 - **邮箱验证**: 使用有时限的 Token 进行安全邮箱验证(24小时过期) - **密码重置**: 带有邮件通知的安全密码重置功能(1小时过期) - **双因素认证 (2FA)**: 基于验证器应用的 TOTP 2FA (Google Authenticator, Authy) - 生成 QR 码以便轻松设置 - 10 个备用代码用于账户恢复 - 基于时间的一次性密码(符合 RFC 6238 标准) - **API 版本控制**: `/api/v1` 端点,保持对旧版路由的向后兼容性 #### 性能特性 - **Redis 缓存**: 对 GET 请求进行自动响应缓存 - 每个端点可配置的 TTL - 变更时自动使缓存失效 - 如果 Redis 不可用,则优雅降级 - **数据库索引**: 为常用查询字段优化索引 - **延迟加载**: 使用 Mongoose populate 进行选择性字段加载 - **CDN 集成**: 使用 Cloudinary 优化图片交付 #### 实时功能 - **WebSocket 通知**: 即时订单和支付状态更新 - 用户特定的通知通道 - 受 CORS 保护的 WebSocket 连接 - 自动重连处理 - **邮件通知**: 订单状态变更的自动邮件提醒 #### 测试与质量 - **自动化测试**: 使用 Mocha/Chai 的全面测试套件 - **负载测试**: 基于 Artillery 的性能测试场景 - **集成测试**: 完整的工作流测试 - **安全测试**: npm audit, Snyk, CodeQL 集成 **详细文档请参阅:** - [增强功能指南](docs/ENHANCED_FEATURES.md) - 完整的设置和使用指南 - [监控与可观测性](docs/MONITORING_OBSERVABILITY.md) - APM, 指标和告警 - [测试指南](docs/TESTING_GUIDE.md) - 全面的测试文档 ## 支付集成 ### 支持的支付方式 - **Stripe**: 信用卡/借记卡支付(全球) - **PayPal**: PayPal 账户支付(全球) - **M-Pesa**: 肯尼亚用户的移动货币(肯尼亚特定) ### 支付功能 - **安全交易处理**: 符合 PCI 标准的支付处理 - **实时支付验证**: 即时支付状态更新 - **Webhook 集成**: 自动回调处理 - **多币种支持**: USD, EUR, GBP, KES - **交易日志**: 完整的审计跟踪 - **支付状态跟踪**: 实时订单更新 - **退款支持**: 内置退款功能 (Stripe, PayPal) 详细集成说明请参阅 [Payment API Documentation](docs/PAYMENT_API_DOCUMENTATION.md) 和 [M-Pesa Setup Guide](docs/MPESA_SETUP_GUIDE.md)。 ## 安全特性 ### 生产级安全 - **Helmet.js**: 安全头 (CSP, HSTS, X-Frame-Options, XSS protection) - **CORS**: 可配置的源限制 - **速率限制**: - API 端点: 100 请求/15分钟 - 身份验证: 5 次尝试/15分钟 - 注册: 5 个账户/小时 - **输入验证**: 所有路由上的 express-validator - **密码安全**: 带有强度要求的 Bcrypt 哈希 - **请求净化**: 使用 xss 库进行全面 XSS 防护 - **ObjectId 验证**: 防止注入攻击 - **JWT**: 1小时 Token 过期 - **OAuth 2.0**: 使用一次性交换码的安全第三方身份验证 — JWT 绝不会出现在重定向 URL 中(消除浏览器历史记录、服务器日志和 `Referer` 泄露) - **HMAC State**: 用于 OAuth 流程的无状态 CSRF 保护 (RFC 6749 §10.12) - **支付安全**: 加密支付数据,交易日志 - **PCI 合规就绪**: 服务器上不存储卡数据 ### 支付安全 - **Tokenization**: 不存储卡详情 (Stripe tokens) - **Webhook 验证**: 加密签名验证 - **IP 白名单**: 将支付回调限制为网关 IP - **交易加密**: 敏感支付元数据已加密 - **审计日志**: 完整的交易历史 ### 密码要求 - 至少 8 个字符 - 至少一个大写字母 - 至少一个小写字母 - 至少一个数字 - 至少一个特殊字符 (@$!%*?&) ## 技术栈 ### 前端 - **React 19**: 现代 UI 库 - **TypeScript**: 类型安全的 JavaScript - **Tailwind CSS**: 实用优先的 CSS 框架 - **React Router**: 客户端路由 - **Axios**: 用于 API 请求的 HTTP 客户端 - **Context API**: 状态管理 ### 后端 - **运行时**: Node.js 18.x/20.x - **框架**: Express.js 4.x - **数据库**: MongoDB Atlas 与 Mongoose 8.x(带有用于可扩展性的索引) - 详见 [Database Migration Analysis](docs/DATABASE_MIGRATION_ANALYSIS.md) 了解替代选项 - 详见 [Mongoose Troubleshooting Guide](docs/MONGOOSE_TROUBLESHOOTING.md) 了解常见问题 - **身份验证**: JWT (jsonwebtoken), Passport.js, OAuth 2.0 - **OAuth 提供商**: Google, Microsoft, Apple - **支付网关**: - Stripe (Credit/Debit cards) - PayPal (PayPal accounts) - M-Pesa Daraja API (Mobile money - Kenya) - **HTTP 客户端**: Axios (用于支付网关 API) - **安全**: Helmet, CORS, express-rate-limit, express-validator, xss - **文件上传**: Multer, Cloudinary - **测试**: Mocha, Chai, Sinon, Supertest - **日志**: Morgan, 自定义交易日志 - **环境**: dotenv ### 部署 - **Frontend**: Cloudflare Pages - **Edge Layer**: Cloudflare Workers - **Backend**: Render/VPS - **CI/CD**: GitHub Actions - **Database**: MongoDB Atlas ## 快速开始 ### 前置条件 - Node.js (v 或更高) - MongoDB Atlas 账户 - npm 或 yarn 包管理器 - Git ### 安装 1. 克隆仓库: git clone https://github.com/Zoe-life/rest-shop.git cd rest-shop 2. 为所有组件安装依赖: # 安装后端依赖 cd api && npm install # 安装 worker 依赖 cd ../worker && npm install # 安装前端依赖 cd ../frontend && npm install ### 配置 #### 1. 后端配置 在 `api/` 目录下创建 `.env` 文件(或从 `.env.example` 复制): ``` cd api cp ../env.example .env ``` 根据你的配置编辑 `.env` 文件: ``` # 核心配置 MONGODB_URI=mongodb+srv://username:password@cluster0.lifak.mongodb.net/ MONGO_ATLAS_PW=your_mongo_password JWT_KEY=your_jwt_secret_key NODE_ENV=development ALLOWED_ORIGINS=http://localhost:3001,http://localhost:5173 FRONTEND_URL=http://localhost:5173 PORT=3001 # 后端 API URL (用于 OAuth 回调) # 用于本地开发:http://localhost:3001 # 用于生产环境:https://your-backend.onrender.com 或您部署的 URL BACKEND_API_URL=http://localhost:3001 # 邮件服务 (用于验证和密码重置) SMTP_HOST=smtp.example.com SMTP_PORT=587 SMTP_SECURE=false SMTP_USER=your-email@example.com SMTP_PASS=your-smtp-password EMAIL_FROM=noreply@rest-shop.com # Redis 缓存 (可选 - 用于性能优化) REDIS_URL=redis://localhost:6379 # 或者使用单独的设置: REDIS_HOST=localhost REDIS_PORT=6379 REDIS_PASSWORD=your-redis-password # OAuth (可选 - 用于社交登录) # 从 https://console.cloud.google.com/apis/credentials 获取凭据 GOOGLE_CLIENT_ID=your-google-client-id GOOGLE_CLIENT_SECRET=your-google-client-secret GOOGLE_CALLBACK_URL=http://localhost:3001/auth/google/callback # 从 https://portal.azure.com 获取凭据 MICROSOFT_CLIENT_ID=your-microsoft-client-id MICROSOFT_CLIENT_SECRET=your-microsoft-client-secret MICROSOFT_CALLBACK_URL=http://localhost:3001/auth/microsoft/callback # 从 https://developer.apple.com 获取凭据 APPLE_CLIENT_ID=your-apple-client-id APPLE_TEAM_ID=your-apple-team-id APPLE_KEY_ID=your-apple-key-id APPLE_CALLBACK_URL=http://localhost:3001/auth/apple/callback # 支付网关 (可选 - 用于支付处理) STRIPE_SECRET_KEY=your-stripe-secret-key PAYPAL_CLIENT_ID=your-paypal-client-id PAYPAL_CLIENT_SECRET=your-paypal-client-secret MPESA_CONSUMER_KEY=your-mpesa-consumer-key MPESA_CONSUMER_SECRET=your-mpesa-consumer-secret ``` **重要说明:** - 对于 **生产部署**,将 `BACKEND_API_URL` 设置为你部署的后端 URL(例如 `https://your-app.onrender.com`) - OAuth 回调 URL 必须与你在 OAuth 提供商控制台中配置的完全一致 - 如果 `GOOGLE_CALLBACK_URL` 未设置,则默认为 `{BACKEND_API_URL}/auth/google/callback` #### 2. 前端配置 在 `frontend/` 目录下创建 `.env` 文件(或从 `.env.example` 复制): ``` cd frontend cp .env.example .env ``` `.env` 文件应包含: ``` VITE_BACKEND_URL=http://localhost:3001 ``` #### 3. MongoDB Atlas 设置 - 在 https://cloud.mongodb.com 创建集群 - 将你的 IP 添加到 IP 访问列表 - 创建数据库用户 - 获取你的连接字符串 **配置指南:** - [OAuth Setup Guide](docs/OAUTH_SETUP.md) - 配置社交登录 - [Payment Setup](docs/PAYMENT_API_DOCUMENTATION.md) - 支付网关配置 - [M-Pesa Setup](docs/MPESA_SETUP_GUIDE.md) - M-Pesa 集成 - [Enhanced Features](docs/ENHANCED_FEATURES.md) - 邮箱、2FA、WebSocket、Redis 设置 **数据库连接故障排除:** 如果连接 MongoDB 时遇到问题,请参阅 [Mongoose Troubleshooting Guide](docs/MONGOOSE_TROUBLESHOOTING.md) 了解常见解决方案。 ### 运行应用 #### 填充示例产品(可选) 要使用专业的示例产品填充你的数据库以获得逼真的电子商务体验: ``` cd api # 查看将被填充的内容 (安全模式) npm run seed # 添加 12 个带有描述和图片的示例产品 npm run seed:force # 清除现有产品并重新填充 npm run seed:clear ``` 这将添加专业的示例产品,包括: - 电子产品(耳机、智能手表、扬声器、键盘) - 配件(包、太阳镜) - 运动与健身(瑜伽垫、水瓶、跑鞋) - 服装(有机棉 T 恤) - 家居与厨房(咖啡杯、台灯) 所有产品都包含专业的描述、逼真的定价、高质量的图片和库存数量。 #### 开发模式 - 全栈 **终端 1 - 后端 API:** ``` cd api && npm start # 服务器运行在 http://localhost:3001 ``` **终端 2 - 前端:** ``` cd frontend && npm run dev # 前端运行在 http://localhost:5173 ``` 访问 [http://localhost:5173](http://localhost:5173) 查看应用。 #### 开发模式 - 仅 API ``` cd api && npm start # 服务器运行在 http://localhost:3001 ``` #### 生产模式 ``` cd api && NODE_ENV=production node server.js ``` #### 部署 Worker ``` npm run deploy:worker # 或者 cd worker && npm run deploy ``` #### 运行测试 ``` npm test # 或者 cd api && npm test ``` ## API 端点 ### 健康检查 ``` GET /health ``` 返回系统健康状态和数据库连接状态。 ### 用户端点 #### 注册新用户 ``` POST /user/signup Content-Type: application/json { "email": "user@example.com", "password": "SecurePass123!" } ``` #### 登录(本地认证) ``` POST /user/login Content-Type: application/json { "email": "user@example.com", "password": "SecurePass123!" } ``` #### OAuth 2.0 认证 OAuth 流程使用 **一次性交换码** 模式,将真正的 JWT 保留在浏览器历史记录、服务器日志和 `Referer` 头之外。请参阅 [OAuth Exchange Code Guide](docs/OAUTH_EXCHANGE_CODE.md)。 **使用 Google 登录** ``` GET /auth/google # 重定向到 Google 登录页面 # 成功后重定向到:FRONTEND_URL/auth/success?code= ``` **使用 Microsoft 登录** ``` GET /auth/microsoft # 重定向到 Microsoft 登录页面 # 成功后重定向到:FRONTEND_URL/auth/success?code= ``` **用交换码换取 JWT** *(由前端自动调用)* ``` POST /auth/exchange Content-Type: application/json { "code": "" } # 返回:{ "token": "", "expiresAt": "..." } # 代码在首次使用后删除,并在 30 秒后过期 ``` 详细配置说明请参阅 [OAuth Setup Guide](docs/OAUTH_SETUP.md)。 #### 邮箱验证 ``` POST /user/request-verification Content-Type: application/json { "email": "user@example.com" } GET /user/verify-email/:token ``` #### 密码重置 ``` POST /user/request-password-reset Content-Type: application/json { "email": "user@example.com" } POST /user/reset-password/:token Content-Type: application/json { "password": "NewSecurePassword123!" } ``` #### 双因素认证 (2FA) ``` # 设置 2FA POST /user/2fa/setup Authorization: Bearer # 启用 2FA POST /user/2fa/enable Authorization: Bearer Content-Type: application/json { "token": "123456" } # 验证 2FA POST /user/2fa/verify Content-Type: application/json { "userId": "user_id", "token": "123456" } # 禁用 2FA POST /user/2fa/disable Authorization: Bearer Content-Type: application/json { "password": "YourPassword123!" } ``` 完整详情请参阅 [Enhanced Features Documentation](docs/ENHANCED_FEATURES.md)。 #### 删除用户(仅限管理员) ``` DELETE /user/:userId Authorization: Bearer ``` ### 产品端点 #### 获取所有产品 ``` GET /products ``` #### 创建产品(仅限管理员) ``` POST /products Authorization: Bearer Content-Type: multipart/form-data name: "Product Name" price: 99.99 productImage: ``` #### 获取单个产品 ``` GET /products/:productId ``` #### 更新产品(仅限管理员) ``` PATCH /products/:productId Authorization: Bearer Content-Type: application/json { "name": "Updated Name", "price": 149.99 } ``` #### 删除产品(仅限管理员) ``` DELETE /products/:productId Authorization: Bearer ``` ### 订单端点 #### 获取所有订单(已认证) ``` GET /orders Authorization: Bearer ``` #### 获取单个订单(已认证) ``` GET /orders/:orderId Authorization: Bearer ``` #### 创建订单(已认证) ``` POST /orders Authorization: Bearer Content-Type: application/json { "productId": "507f1f77bcf86cd799439011", "quantity": 2 } ``` #### 删除订单(仅限管理员) ``` DELETE /orders/:orderId Authorization: Bearer ``` #### 更新订单状态(仅限管理员) ``` PATCH /orders/:orderId/status Authorization: Bearer Content-Type: application/json { "status": "shipped" } ``` ### 支付端点 #### 发起支付 ``` POST /payments/initiate Authorization: Bearer Content-Type: application/json { "orderId": "507f1f77bcf86cd799439011", "paymentMethod": "mpesa", "paymentData": { "phoneNumber": "254712345678" } } ``` **支持的支付方式**: `stripe`, `card`, `paypal`, `mpesa` #### 验证支付 ``` GET /payments/verify/:paymentId Authorization: Bearer ``` #### 获取支付详情 ``` GET /payments/:paymentId Authorization: Bearer ``` #### 获取支付历史 ``` GET /payments/history?page=1&limit=10 Authorization: Bearer ``` #### M-Pesa 回调(Webhook) ``` POST /payments/mpesa/callback Content-Type: application/json (Called automatically by M-Pesa servers) ``` **完整的支付 API 文档请参阅:** - [Payment API Documentation](docs/PAYMENT_API_DOCUMENTATION.md) - [M-Pesa Setup Guide](docs/MPESA_SETUP_GUIDE.md) ## 文档 ### 完整文档库 #### 快速开始 - [Installation & Configuration](#getting-started) - 设置和配置指南 - [OAuth Setup Guide](docs/OAUTH_SETUP.md) - 配置 Google, Microsoft, 和 Apple OAuth - [OAuth Exchange Code Guide](docs/OAUTH_EXCHANGE_CODE.md) - 一次性交换码安全模式 #### 架构与部署 - **[Complete Deployment Guide](docs/FULL_DEPLOYMENT_GUIDE.md)** - 全栈部署演示 - **[GitHub CI/CD Setup](docs/GITHUB_SECRETS_CICD_GUIDE.md)** - 使用 GitHub Actions 自动化部署 - [Microservices Architecture](docs/MICROSERVICES_ARCHITECTURE.md) - 详细架构概述 - [Microservices Quickstart](docs/MICROSERVICES_QUICKSTART.md) - 快速部署指南 - [Cloudflare Deployment](docs/CLOUDFLARE_DEPLOYMENT.md) - 部署到 Cloudflare Workers - [Cloudflare Secrets Setup](docs/CLOUDFLARE_SECRETS_SETUP.md) - 配置 secrets - [Frontend README](frontend/README.md) - 前端专用文档 #### 增强功能 - **[Enhanced Features Guide](docs/ENHANCED_FEATURES.md)** - 完整指南,包括: - 邮箱验证和密码重置 - 双因素认证 (2FA) 设置 - 实时 WebSocket 通知 - Redis 缓存配置 - API 版本控制使用 #### 支付集成 - [Payment API Documentation](docs/PAYMENT_API_DOCUMENTATION.md) - 完整的支付 API 参考 - [M-Pesa Setup Guide](docs/MPESA_SETUP_GUIDE.md) - M-Pesa 集成指南 #### 监控与运维 - **[Monitoring & Observability](docs/MONITORING_OBSERVABILITY.md)** - 综合指南,包括: - 应用性能监控 (APM) 集成 - 分布式追踪设置 - 自定义指标和仪表盘 - 告警配置 - 健康检查和探针 #### 测试 - **[Testing Guide](docs/TESTING_GUIDE.md)** - 完整的测试文档: - 单元和集成测试 - 使用 Artillery 进行负载测试 - 使用 Cypress 进行端到端测试 - 契约测试 - 测试覆盖率策略 #### 数据库 - [Database Migration Analysis](docs/DATABASE_MIGRATION_ANALYSIS.md) - 数据库选项 - [MongoDB Cloudflare Strategy](docs/MONGODB_CLOUDFLARE_STRATEGY.md) - Cloudflare 上的 MongoDB - [Mongoose Troubleshooting](docs/MONGOOSE_TROUBLESHOOTING.md) - 常见问题和解决方案 #### 故障排除 - [Troubleshooting Guide](docs/TROUBLESHOOTING.md) - 常见问题和解决方案 - [Implementation Summary](docs/IMPLEMENTATION_SUMMARY.md) - 技术实现细节 - [Before/After Comparison](docs/BEFORE_AFTER_COMPARISON.md) - 功能演进 ## 部署 ### 使用 GitHub Actions 自动部署 项目包含通过 GitHub Actions 实现的完整 CI/CD 自动化,用于: - Cloudflare Workers (Edge proxy) - Cloudflare Pages (Frontend) - 自动化测试和安全扫描 **快速设置:** 1. 配置 [GitHub Secrets](docs/GITHUB_SECRETS_CICD_GUIDE.md) 2. 推送到 `main` 分支 3. GitHub Actions 处理剩下的工作! **详细指南请参阅:** - **[GitHub CI/CD Setup Guide](docs/GITHUB_SECRETS_CICD_GUIDE.md)** - 完整的自动化设置 - **[Full Deployment Guide](docs/FULL_DEPLOYMENT_GUIDE.md)** - 手动部署演示 ### 部署后端(Render) 后端通过 Render 内置的 CI/CD 自动部署: **Render:** ``` # 连接 GitHub 仓库 # Render 在推送到 main 分支时自动部署 # 在 Render 仪表板中配置环境变量 ``` ### 手动部署 #### 手动部署 Worker ``` cd worker wrangler secret put BACKEND_API_URL # One-time setup wrangler deploy ``` #### 手动部署 Frontend ``` cd frontend npm run build wrangler pages deploy build --project-name=rest-shop-frontend ``` ## CI/CD 流水线 项目使用 GitHub Actions 进行自动化持续集成和部署。 ### 流水线阶段 1. **代码质量与 Linting** - ESLint, 代码风格检查 2. **安全扫描** - npm audit, Snyk, CodeQL 3. **测试** - 使用 MongoDB Memory Server 的完整测试套件 4. **构建验证** - 构建 worker 和 frontend 5. **部署 Worker** - 自动部署到 Cloudflare Workers(仅限 main 分支) 6. **部署 Frontend** - 自动部署到 Cloudflare Pages(仅限 main 分支) ### 必需的 GitHub Secrets 在 GitHub 仓库设置 → Secrets and variables → Actions 中配置: ``` CLOUDFLARE_API_TOKEN - Cloudflare API token for deployments CLOUDFLARE_ACCOUNT_ID - Your Cloudflare account ID REACT_APP_API_URL - Worker URL for frontend (e.g., https://rest-shop-worker.workers.dev) ``` 可选: ``` JWT_KEY - For CI tests only (not production) SNYK_TOKEN - For Snyk security scanning ``` ### 触发部署 **自动:** - 推送到 `main` 分支会触发完整部署 - Pull 请求仅触发测试(不部署) **手动:** - 进入 Actions 标签页 → CI/CD Pipeline → Run workflow **详细指南请参阅:** [GitHub Secrets & CI/CD Setup](docs/GITHUB_SECRETS_CICD_GUIDE.md) ## 测试 ### 测试套件概述 项目包含多个级别的全面测试: #### 单元与集成测试 ``` # 运行所有测试 npm test # 在监视模式下运行测试 npm run test:watch ``` #### 使用 Artillery 进行负载测试 ``` # 产品端点负载测试 npm run test:load # 已认证用户旅程 npm run test:load:auth # Spike 测试 (突发负载增加) npm run test:load:spike ``` ### 测试结构 ``` test/ ├── setup.js # MongoDB Memory Server setup ├── controllers/ │ ├── user.test.js # User authentication tests │ ├── products.test.js # Product CRUD tests │ ├── orders.test.js # Order management tests │ ├── payments.test.js # Payment processing tests │ ├── auth.test.js # Email verification & password reset │ └── twoFactor.test.js # 2FA functionality tests └── middleware/ └── check-auth.test.js # Authentication middleware tests tests/load/ ├── products-load-test.yml # Product browsing scenarios ├── auth-load-test.yml # Authenticated user flows └── spike-test.yml # Sudden traffic spike test ``` ### 测试前置条件 - **MongoDB Memory Server**: 测试使用内存中的 MongoDB 实例 - **Node.js**: v20.x 或更高 - **Ubuntu 22.04+**: 配置为 OpenSSL 3.x 兼容 (MongoDB 7.0.14) ### 测试覆盖范围 - 用户身份验证(注册、登录、删除、邮箱验证、密码重置) - 双因素认证(设置、启用、验证、禁用) - 带有缓存的产品 CRUD 操作 - 带有实时通知的订单管理 - 支付处理 (Stripe, PayPal, M-Pesa) - JWT 中间件和授权 - WebSocket 连接和通知 - 错误处理和安全 - 负载测试场景 - **目标覆盖率**: > 90% **完整的测试文档请参阅 [Testing Guide](docs/TESTING_GUIDE.md)** ## 监控与可观测性 ### 可用的监控功能 #### 应用监控 - **健康检查端点**: `/health` - 系统健康和数据库状态 - **结构化日志**: 带有 trace ID 的 JSON 格式日志 - **审计日志**: 安全事件跟踪(登录、注册、失败) #### 性能指标 - 响应时间跟踪 - 请求吞吐量 - 错误率监控 - 缓存命中/未命中率 - WebSocket 连接数 #### APM 集成支持 - New Relic - Datadog APM - Elastic APM - Prometheus/Grafana #### 分布式追踪 - 跨服务的 Trace ID 传播 - 请求关联 - 性能瓶颈识别 #### 告警 - 高错误率告警 - 慢响应时间通知 - 数据库连接失败 - 支付网关问题 - 内存和 CPU 使用率警告 **完整的监控设置请参阅 [Monitoring & Observability Guide](docs/MONITORING_OBSERVABILITY.md)** ## 中间件 ### 安全中间件 - **Helmet**: 安全头 - **CORS**: 跨源资源共享 - **Rate Limiting**: 请求节流 - **Input Validation**: express-validator - **Sanitization**: XSS 防护 ### 认证中间件 - **checkAuth**: 验证 JWT Token - **checkRole**: 基于角色的访问控制 ### 自定义中间件 - **Error Handler**: 集中错误处理 - **Morgan Logger**: HTTP 请求日志 ## 错误处理 所有错误返回一致的 JSON 格式: ``` { "error": { "message": "Error description" } } ``` ### HTTP 状态码 - `200` - 成功 - `201` - 已创建 - `400` - 错误请求(验证错误) - `401` - 未授权(认证失败) - `403` - 禁止访问(权限不足) - `404` - 未找到 - `409` - 冲突(资源重复) - `429` -请求过多(速率限制) - `500` - 内部服务器错误 ## 贡献 1. Fork 本仓库 2. 创建功能分支 (`git checkout -b feature/AmazingFeature`) 3. 提交你的更改 (`git commit -m 'Add some AmazingFeature'`) 4. 推送到分支 (`git push origin feature/AmazingFeature`) 5. 打开一个 Pull Request ### 开发指南 - 为新功能编写测试 - 遵循现有的代码风格 - 更新文档 - 确保所有测试通过 - 保持提交原子化且描述清晰 ## 许可证 本项目基于 ISC 许可证授权。 ## 作者 **Merlyn Zawadi** ## 支持 如有问题或疑问: - 在 GitHub 上提出 issue - 查看现有文档 - 在 Postman 集合中查看 API 端点 ## 致谢 - Express.js 社区 - MongoDB Atlas - Cloudflare Workers - 所有贡献者
标签:API网关, CISA项目, Express, GNU通用公共许可证, Helmet, MERN架构, MITM代理, MongoDB, Node.js, React, RESTful API, Syscall, Syscalls, Tailwind CSS, TypeScript, Web开发, 前后端分离, 双后端架构, 响应式设计, 安全插件, 提示词优化, 搜索引擎查询, 电商系统, 电商网站建设, 程序员工具, 系统可扩展性, 网络安全, 自定义脚本, 自定义脚本, 自定义脚本, 边缘计算, 隐私保护, 高并发