rashid-mamun/bdshop-server

GitHub: rashid-mamun/bdshop-server

一个使用 Express 和 MongoDB 构建的电商后端 API,提供商品管理、结算支付、订单追踪和后台运营等完整的电商业务能力。

Stars: 0 | Forks: 0

# BDShop Server BDShop Server 是一个全栈电商平台的后端 API,使用 Express、TypeScript、MongoDB 和 Stripe 构建。它通过产品目录 API、身份验证、结账、支付、订单追踪、后台管理操作、文件上传、邮件工作流以及安全中间件为 BDShop 前端提供支持。 本仓库仅包含后端 API。前端应用位于单独的 `bdshop-client` 仓库中。 ## 项目概述 BDShop 是一个用于销售电子产品、车辆和配件等商品的生产级电商项目。服务器负责核心可信的业务逻辑:产品数据、用户账户、结账总额、优惠券、库存预留、订单创建、支付集成、订单追踪和后台管理。 后端支持游客结账以及登录用户结账。每个订单都会获得一个公开的 `BDS-...` 订单号,以便客户无需登录即可追踪订单。 ## 主要功能 ### 电商 API - 产品目录支持搜索、分类筛选、价格筛选、排序和分页。 - 后台产品 CRUD。 - 库存字段和库存更新支持。 - 购物车 API。 - 评论 API 和评论统计。 - 地址簿 API。 - 订单创建、列表、状态更新、删除和统计。 - 通过 `BDS-...` 订单号或 Mongo 订单 ID 进行公开订单追踪。 ### 结账与支付 - 服务器端结账报价计算。 - 可靠的小计、运费、税费、折扣和最终总额。 - 优惠券支持。 - 使用邮箱的游客结账。 - 使用登录用户邮箱的授权结账。 - 订单创建期间的库存预留。 - 支持 Stripe PaymentIntent。 - 用于更新支付状态的 Stripe webhook endpoint。 - 支持货到付款(Cash on Delivery)。 ### 身份验证与用户管理 - 邮箱/密码注册和登录。 - 支持 JWT access token 和 refresh token。 - 支持 HttpOnly cookie。 - Google 和 Facebook OAuth 路由。 - 密码重置请求和重置流程。 - 用户个人资料和密码修改。 - 后台角色管理。 - 用户激活和停用。 ### 公开工作流 - 时事通讯订阅。 - 退货申请提交。 - 公开内容路由。 - 面向客户的安全错误消息。 - 用于密码重置、订单确认和退货通知的邮件服务。 ### 上传与库存通知 - 后台图片上传路由。 - 支持 Cloudinary 上传。 - 本地上传兜底方案。 - 待处理上传追踪和清理。 - 待处理上传配额限制。 - 到货通知服务。 ### 安全与可靠性 - Helmet 安全标头。 - CORS 配置。 - Rate limiting。 - 针对不安全 API 方法的 CSRF 防护。 - 请求日志记录。 - 集中式错误处理。 - 适用于生产环境的公开错误响应。 - 生产环境变量验证。 - 支持 Docker 的构建设置。 ## 技术栈 - Node.js - Express - TypeScript - MongoDB - Mongoose - Stripe - Nodemailer - Cloudinary - JWT - Jest - Supertest - MongoDB Memory Server ## 仓库结构 ``` bdshop-server/ src/ config/ # Database, environment, logger, Cloudinary constants/ # App constants, messages, status codes controllers/ # HTTP request handlers middleware/ # Auth, validation, CSRF, rate limiting, errors models/ # Mongoose schemas routes/ # Express routes services/ # Business logic types/ # TypeScript interfaces utils/ # Response, JWT, logging, async helpers app.ts # Express app seed.ts # Seed script tests/ integration/ # API integration tests unit/ # Unit tests setup.js # Test database setup server.ts # Server entry point Dockerfile docker-compose.yml env.example package.json ``` ## 环境要求 - 推荐使用 Node.js 20 或更高版本。 - npm。 - 用于本地开发的 MongoDB。 - 用于银行卡支付的 Stripe 账户。 - 用于发送真实邮件的 SMTP 提供商。 - 用于持久化图片托管的 Cloudinary 账户。 测试使用 MongoDB Memory Server,因此 Jest 测试套件不需要本地 MongoDB 实例。 ## 环境变量 从 `env.example` 创建 `.env`: ``` cp env.example .env ``` 核心本地示例: ``` NODE_ENV=development PORT=5000 API_PREFIX=/api MONGODB_URI=mongodb://localhost:27017/bdshop JWT_SECRET=replace-with-a-long-random-secret JWT_REFRESH_SECRET=replace-with-another-long-random-secret CORS_ORIGIN=http://localhost:5173 FRONTEND_URL=http://localhost:5173 STRIPE_SECRET_KEY=sk_test_replace_me STRIPE_WEBHOOK_SECRET=whsec_replace_me CLOUDINARY_CLOUD_NAME=replace_me CLOUDINARY_API_KEY=replace_me CLOUDINARY_API_SECRET=replace_me SMTP_HOST=smtp.gmail.com SMTP_PORT=465 SMTP_USER=replace_me SMTP_PASS=replace_me EMAIL_FROM="BDShop " ``` ### 环境说明 - 切勿提交真实的密钥。 - 生产环境需要高强度的 JWT 密钥。 - Stripe 银行卡支付需要真实的 Stripe 密钥以及匹配的前端 publishable key。 - Stripe webhook 处理需要 `STRIPE_WEBHOOK_SECRET`。 - Gmail SMTP 通常需要应用密码,而不是常规的账户密码。 - 如果 SMTP 发送失败,服务器会记录失败日志,并尽可能保证关键流程可用。 ## 安装 ``` npm install ``` ## 本地运行 ``` npm run dev ``` 默认 API: ``` http://localhost:5000/api ``` 健康检查: ``` http://localhost:5000/health ``` 根 endpoint: ``` http://localhost:5000/ ``` ## 构建与启动 构建 TypeScript: ``` npm run build ``` 启动编译后的服务器: ``` npm start ``` 直接使用 TypeScript 运行: ``` npm run start:ts ``` ## 种子数据 ``` npm run seed ``` 全新种子数据: ``` npm run seed:fresh ``` ## 可用脚本 ``` npm run dev # Start development server with nodemon npm run start:ts # Start using ts-node npm run build # Compile TypeScript npm start # Start compiled dist/server.js npm test # Run all Jest tests npm run test:watch # Run tests in watch mode npm run test:coverage # Run tests with coverage npm run test:integration # Run integration tests npm run seed # Seed database npm run seed:fresh # Clear and seed database npm run lint # Run ESLint npm run format # Format files ``` ## 重要 API 领域 ### 产品 ``` GET /api/services GET /api/services/:id POST /api/services PUT /api/services/:id DELETE /api/services/:id ``` 创建、更新和删除需要后台管理员身份验证。 ### 结账与订单 ``` POST /api/orders/quote POST /api/orders GET /api/orders/my-orders GET /api/orders/my-stats GET /api/orders/track/:id?email=customer@example.com GET /api/orders PUT /api/orders/:id ``` 游客结账使用请求正文中提供的邮箱。授权结账使用登录用户的邮箱。 ### Stripe Webhook ``` POST /api/orders/stripe/webhook ``` webhook 路由在 JSON body 解析之前注册,以便 Stripe 签名验证可以使用原始请求正文。 处理的事件: - `payment_intent.succeeded` - `payment_intent.payment_failed` ### 公开订单追踪 每个新订单都会获得一个公开的订单号: ``` BDS-MPXWIHDH-QHUJ ``` 追踪订单方式: ``` GET /api/orders/track/BDS-MPXWIHDH-QHUJ?email=customer@example.com ``` `:id` 参数也可以是 Mongo 订单 ID。无效的公开 ID 会返回友好的“未找到”响应,而不是数据库 cast 错误。 ### 公开路由 ``` POST /api/public/newsletter POST /api/public/returns ``` ### 上传 ``` POST /api/upload DELETE /api/upload/pending/expired ``` 上传路由需要管理员权限。 ## 结账规则 服务器是结账总额的唯一可信源。 前端发送商品 ID、数量、地址、优惠券代码和支付方式信息。后端会: 1. 从数据库加载产品价格。 2. 验证库存。 3. 计算小计。 4. 应用优惠券折扣。 5. 添加运费和税费。 6. 在订单创建期间预留库存。 7. 创建订单。 8. 如果配置了 SMTP,则发送确认邮件。 永远不能信任前端的最终总额。 ## 错误处理策略 API 避免在面向客户的响应中暴露原始内部错误。 隐藏的详细信息示例: - 数据库 cast 错误。 - 堆栈追踪。 - SMTP 凭证失败。 - Stripe 密钥/提供商错误。 - 内部服务器消息。 对于服务器错误,公开响应是通用的: ``` { "success": false, "error": "Something went wrong. Please try again." } ``` 在确保安全的前提下,验证错误仍会提供可操作的提示。 ## 测试 运行所有测试: ``` npm test ``` 运行针对性测试套件: ``` npm run test:integration:orders npm run test:integration:users npm run test:integration:services npm run test:integration:carts npm run test:integration:reviews npm run test:integration:addresses npm run test:integration:auth npm run test:integration:upload ``` 测试覆盖率: ``` npm run test:coverage ``` 测试技术栈: - Jest - Supertest - MongoDB Memory Server - ts-jest 重要的已测流程包括: - 身份验证与授权。 - 产品目录。 - 购物车。 - 订单与游客结账。 - 通过 `BDS-...` 订单号进行公开订单追踪。 - 评论。 - 地址。 - 上传权限。 - 安全的公开错误响应。 ## Docker 构建并运行: ``` docker compose up --build ``` Dockerfile 使用构建阶段,并从 `dist/server.js` 启动编译后的服务器。 在运行类生产环境的容器之前,请确保提供了所需的环境变量。 ## 生产环境检查清单 - 设置 `NODE_ENV=production`。 - 使用高强度的 `JWT_SECRET` 和 `JWT_REFRESH_SECRET`。 - 设置精确的 `CORS_ORIGIN` 和 `FRONTEND_URL`。 - 配置 MongoDB 连接字符串。 - 配置 Stripe 密钥和 webhook 密钥。 - 在客户端仓库中配置前端的 Stripe publishable key。 - 配置 SMTP 凭证。 - 配置 Cloudinary 凭证。 - 运行 `npm run build`。 - 运行 `npm test`。 - 运行 `npm audit --omit=dev`。 - 验证游客结账、银行卡支付、货到付款(Cash on Delivery)、订单追踪和后台订单更新。 ## 相关仓库 前端客户端: ``` bdshop-client ``` 前端应将此服务器的 `/api` URL 用作 `VITE_API_BASE_URL`。 ## 当前限制 - 完整的支付可靠性取决于生产环境的 Stripe webhook 配置。 - 真实的邮件投递取决于有效的 SMTP 凭证。 - 尚未包含完整的 E2E 浏览器测试。 - 高级库存报表功能有待进一步扩展。 ## 路线图 - 服务器同步的愿望清单和购物车合并。 - 更详细的后台库存分析。 - 更多的邮件模板和通知事件。 - 针对结账、支付和身份验证的端到端测试。 - 结合前后端的请求关联结构化日志记录。
标签:GNU通用公共许可证, MITM代理, MongoDB, Node.js, RESTful API, Stripe支付, 后端API, 提示词优化, 电子商务, 自动化攻击, 请求拦截