lhmin0604andClaude 0a3c8e834d feat(r2): 地址与设计清单完整 CRUD(事务/归属校验/状态机)
addresses:
- 补 PATCH /:id、DELETE /:id(契约 §4 全路由齐备)
- 默认地址唯一性事务:create/update/setDefault 先清旧默认再写入
- 首个地址自动设为默认;删除默认地址事务内补偿最新一条
- 归属校验统一:不存在 404,非本人 403

design-list:
- 补 PATCH /:id、DELETE /:id、POST /batch-delete(宽松语义返回 deleted 数)
- items 强制恰好 1 个元素(一条设计=一条清单,阶段0 决策#1)
- designData 白名单 7 键放行、单条 ≤1MB 校验(400)
- 单向状态机 DRAFT→SUBMITTED→PROCESSING→DONE,回退/跳级 400
- PATCH 部分更新语义,不传 items 不清 designData(R4 wordcloud 保护)

infra:
- main.ts: JSON body 上限 100KB→2MB,使契约 1MB 设计数据可达(>2MB 返回 413)
- exceptions filter: body-parser entity.too.large 映射 413
- api-contract-v1.md §5 补实现说明(非契约变更)

验证:nest build 通过;本地 3091 实例 + mock 登录实测 35 项全过
(CRUD/默认地址补偿/越权 403/404/状态机/1MB 边界/413/未登录 401)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-12 02:37:53 +08:00

wxmp-backend

微信小程序后端 API,基于 NestJS + Prisma + PostgreSQL + Redis + BullMQ + 腾讯云 COS。

技术栈

选型
运行时 Node.js 22 + TypeScript
框架 NestJS 11
ORM Prisma 6
数据库 PostgreSQL 16
缓存/队列 Redis 7 + BullMQ
对象存储 腾讯云 COS
鉴权 JWTpassport-jwt
文档 Swagger / OpenAPI/docs
部署 Docker + docker compose

目录约定

src/
├── common/      # 公共:统一响应、全局守卫/过滤器/拦截器、装饰器、通用 DTO
├── config/      # 环境变量读取 + Joi 启动校验
├── prisma/      # PrismaService(全局单例)
├── redis/       # ioredis 实例(全局)
├── wechat/      # 微信 SDK 封装:code2Session(已实现)、支付(占位)
├── auth/        # 微信登录 + JWT 签发与校验(已完整实现)
├── users/       # 用户查/建、/users/me
├── products/ categories/ design-list/ addresses/  # 业务(空壳+路由+DTO,逻辑 TODO
├── orders/ payments/ upload/                       # 业务(同上)
├── queue/       # BullMQ 定制任务(占位处理器)
└── health/      # 健康检查

统一响应格式:{ code, message, data }(成功 code:0,失败为对应 HTTP 状态码)。

本地启动

  1. 安装依赖
    npm install
    
  2. 复制环境变量并填写
    cp .env.example .env
    # 填入 WX_APPID / WX_SECRET / JWT_SECRET 等
    
  3. 起 PostgreSQL + Redis(需 Docker
    npm run db:up
    
  4. 初始化数据库
    npx prisma migrate dev --name init
    npm run prisma:seed
    
  5. 启动开发服务
    npm run start:dev
    
  6. 访问
    • 健康检查:http://localhost:3000/health
    • Swagger 文档:http://localhost:3000/docs

微信登录流程(安全要点)

核心原则:服务端以微信 code2Session 返回的 openid 为准,绝不信任前端传入的 openid。

  1. 小程序端 wx.login() 拿到临时 code
  2. POST /api/auth/login,请求体仅需 { code }
  3. 服务端 wechat.code2Session(code) 用服务端持有的 appid + secret 请求微信 sns/jscode2session,换得 openid + session_key
  4. users.findOrCreateByOpenid(openid) 查/建用户。
  5. session_key 存入 Rediswx:session:{userId},TTL 7 天),供后续解密小程序 encryptedData / 手机号。
  6. @nestjs/jwt 签发 { sub: userId, openid } 的 JWT 返回 accessToken
  7. 小程序将 accessToken 存 storage,后续请求带 Authorization: Bearer <token>JwtAuthGuard 默认守护所有路由,@Public() 标记的路由(如 /auth/login/health)免鉴权。

无真实 appid 时,可临时 mock WechatService.code2Session 返回固定 openid 走通链路。

常用脚本

命令 说明
npm run start:dev 开发热重载
npm run build 编译到 dist/
npm run prisma:migrate:dev 生成并应用迁移(开发)
npm run prisma:migrate 应用迁移(生产,deploy 模式)
npm run prisma:seed 写入种子数据
npm run db:up / db:down 起/停本地 postgres + redis

环境变量

.env.example。关键项(缺失即启动失败):

  • DATABASE_URL — PostgreSQL 连接串
  • REDIS_URL — Redis 连接串
  • JWT_SECRET — JWT 签名密钥(≥16 位,生产用高熵随机串)
  • JWT_EXPIRES — access token 有效期(秒)
  • WX_APPID / WX_SECRET — 微信小程序凭证(服务端持有,不下发前端)

微信支付、COS 相关变量本轮可留空。

当前状态与后续迭代

已实现:工程骨架、Prisma 全量 schema、微信登录 + JWT、统一响应/异常、Swagger、Docker、健康检查。

待实现(已预留模块/路由/DTO,标 TODO):

  • 商品/分类/设计清单/地址/订单/上传的完整业务逻辑(分页、权限、事务、金额重算等)
  • 微信支付 V3(统一下单、回调验签、查单、退款)
  • COS 直传凭证 / 预签名
  • BullMQ 定制任务真实处理
  • 管理后台(React + Ant Design,独立仓库)
  • 单元 / e2e 测试
S
Description
No description provided
Readme
596 KiB
Languages
TypeScript 99.3%
Dockerfile 0.7%