## 开发交付流程

每次实施/开发完功能后，必须按以下步骤执行：

### Step 1: 代码评审
- 检查变更是否符合现有代码模式（schema、service、controller、module 的结构一致性）
- 检查是否有未使用的变量、import、参数
- 检查命名规范是否与项目一致
- 检查是否有重复代码或可复用逻辑

### Step 2: 安全评审
- **注入防护**：检查所有外部输入（请求 body、query、params）是否有注入风险（HTML、Shell、NoSQL）
- **认证/授权**：检查端点是否正确地加了 JWT guard 或 `@Public()`；管理端接口是否有 AdminGuard
- **并发安全**：检查所有修改用户额度/积分的操作是否使用原子操作（`findOneAndUpdate + $inc`），而非 read-modify-write
- **敏感信息**：检查是否误将密钥、凭据、token 暴露到响应或日志中
- **XSS/CSRF**：检查用户内容输出到 HTML/PDF 时是否做了转义

### Step 3: 性能优化
- 检查是否有 N+1 查询（循环内查数据库），应使用批量查询或聚合
- 检查大表查询是否有索引覆盖
- 检查是否有不必要的 `.lean()` 缺失（读操作用 `exec()` 但不需要 mongoose document 方法时应加 `.lean()`）
- 检查是否有内存泄漏风险（如 puppeteer browser 未在 finally 中 close）
- Throttler/限流是否合理

### Step 4: 完整测试
```bash
# 构建检查
cd /root/opencode-workspace/zhiyin/backend && npx nest build 2>&1

# 单元测试
npm test -- --forceExit --detectOpenHandles 2>&1

# 如果有变更的模块，验证关键 endpoint curl 可访问
```

### Step 5: 同步修复
- 上述步骤发现的问题必须修复后再发布
- 修复后重新执行 Step 4 验证构建通过

### Step 6: 部署到生产
```bash
# 构建
cd /root/opencode-workspace/zhiyin/backend && npx nest build

# 同步到生产目录
cp -rf dist/* /www/wwwroot/server/yzr-yhl/backend/dist/

# 复制证书（postbuild 替代）
cp -r certs /www/wwwroot/server/yzr-yhl/backend/dist/src/certs

# 重启
pm2 restart yhl-backend

# 验证
sleep 3 && curl -s http://localhost:3002/api/share/visit/test?visitorId=v
```
