nkds

导航

 

MonkeyCode SDD规范模板库:开箱即用的行业标准(2026完全版)

"SDD(Software Design Specification)不是文档,是代码质量的基因。好的SDD让AI生成的代码从一开始就走在正确的道路上。"


一、为什么需要SDD规范?

1.1 没有SDD的AI编程是什么样?

┌─────────────────────────────────────────────────────────────┐
│           有SDD vs 无SDD 的AI编码效果对比                     │
│                                                              │
│  ❌ 无SDD的AI编码:                             │
│                                                              │
│  用户: "帮我写一个用户登录接口"                               │
│    ↓                                                         │
│  AI: [生成了一段能跑但质量参差的代码]                         │
│    ↓                                                         │
│  结果:                                                      │
│  ✗ 密码用明文存储                                           │
│  ✗ 没有输入校验                                              │
│  ✗ 没有防暴力破解                                            │
│  ✗ 错误处理不统一                                            │
│  ✗ 日志格式混乱                                              │
│  ✗ 接口风格与项目其他部分不一致                               │
│  ✗ 没有单元测试                                              │
│  ✗ 没有API文档                                               │
│                                                              │
│  后果: 能用,但技术债务从第一天就开始累积                      │
│       Code Review时被打回重写 → 浪费时间                     │
│       上线后发现安全问题 → 紧急修复                           │
│                                                              │
│  ✅ 有SDD约束的AI编码("规范驱动"模式):                     │
│                                                              │
│  用户: "基于SDD模板 user-auth-v2 规范,                       │
│        实现用户登录接口"                                     │
│    ↓                                                         │
│  AI: [读取SDD规范 → 理解约束 → 生成合规代码]                 │
│    ↓                                                         │
│  结果:                                                      │
│  ✓ 密码使用bcrypt加密(SDD强制要求)                          │
│  ✓ 输入使用Joi/Zod Schema校验(SDD定义了字段规则)            │
│  ✓ 内置Rate Limiter(SDD安全章节要求)                        │
│  ✓ 统一错误码格式(SDD定义了Error Schema)                    │
│  ✓ 结构化日志(SDD定义了Log Format)                         │
│  ✓ RESTful风格 + OpenAPI注解(SDD API规范)                  │
│  ✓ 自动附带Jest测试用例(SDD测试要求)                        │
│  ✓ Swagger文档自动生成                                       │
│                                                              │
│  后果: 一次通过Code Review的概率 >85%                        │
│       安全扫描零Critical问题                                  │
│       新人看代码也能快速理解                                 │
└─────────────────────────────────────────────────────────────┘

1.2 MonkeyCode SDD的核心价值

# SDD规范的六大核心价值

core_values:

  # 价值1: 质量左移(Shift Left)
  - name: "Quality Left Shift"
    description: "在写第一行代码之前就确定质量标准"
    before_sdd: "先写代码 → 发现问题 → 重构 → 再发现 → 循环"
    after_sdd: "先定规范 → 写代码 → 符合预期 → 验收通过"
    metrics:
      code_review_rework_rate: "↓ 60%"     # Review返工率降低60%
      first_commit_pass_rate: "↑ 40%"      # 首次提交通过率提升40%
      security_issues_at_launch: "↓ 85%"   # 上线时安全问题减少85%

  # 价值2: 团队认知对齐
  - name: "Team Cognitive Alignment"
    description: "所有人(包括AI)对'好代码'的定义一致"
    problem: "每个开发者有自己的编码习惯,AI更不知道你的偏好"
    solution: "SDD作为单一事实来源(Single Source of Truth)"
    benefits:
      - "新人Onboarding时间缩短50%"
      - "跨团队协作冲突减少70%"
      - "AI输出风格100%符合团队标准"

  # 价值3: 可审计可追溯
  - name: "Auditability & Traceability"
    description: "每行代码都能追溯到设计决策"
    capabilities:
      - "需求→设计→代码→测试的全链路追溯"
      - "为什么这样写的决策记录"
      - "合规审计时的证据链"

  # 价值4: AI编程的"宪法"
  - name: "AI Coding Constitution"
    description: "给AI Agent明确的边界和规则"
    analogy: "就像国家的宪法——不是限制自由,而是保障秩序"
    effect: |
      没有SDD: AI像没有交通规则的司机,
              技术上能开车,但随时可能出事故
      
      有SDD: AI像遵守交通规则的司机,
             在规则范围内高效行驶,安全到达目的地

  # 价值5: 知识资产沉淀
  - name: "Knowledge Asset Accumulation"
    description: "将团队的最佳实践固化为可复用的模板"
    evolution:
      stage_1: "个人经验(存在脑子里)"
      stage_2: "团队规范(写在Wiki里,没人看)"
      stage_3: "SDD模板(嵌入AI工作流,自动执行)"
      stage_4: "行业模板库(开源共享,持续进化)"

  # 价值6: 降低AI幻觉风险
  - name: "Reducing AI Hallucination Risk"
    description: "用结构化约束减少AI的'创造性发挥'"
    mechanism: |
      AI的本质是概率模型——它倾向于生成"看起来合理"的内容。
      
      SDD通过以下方式约束AI:
      1. 明确的输入/输出格式 → 减少格式幻觉
      2. 必须使用的库和版本 → 减少依赖幻觉
      3. 禁止的模式列表 → 减少安全幻觉
      4. 必须覆盖的场景 → 减少遗漏幻觉

二、SDD规范的核心结构

2.1 标准SDD文档结构

// types/sdd-spec.ts
// MonkeyCode SDD 规范的类型定义

/**
 * SDD(Software Design Specification)— 软件设计规格说明书
 * 
 * 这是MonkeyCode中驱动AI编码的核心文档类型。
 * 一个完整的SDD包含以下所有章节(可根据项目复杂度裁剪)。
 */
export interface SDDDocument {
  // ========== 元信息 ==========
  meta: SDDMeta;
  
  // ========== 第一章:概述 ==========
  overview: SDDOverview;
  
  // ========== 第二章:功能需求 ==========
  functionalRequirements: SDDFunctionalRequirements;
  
  // ========== 第三章:非功能需求 ==========
  nonFunctionalRequirements: SDDNonFunctionalRequirements;
  
  // ========== 第四章:架构设计 ==========
  architecture: SDDArchitecture;
  
  // ========== 第五章:接口设计 ==========
  apiDesign: SDDAPIDesign;
  
  // ========== 第六章:数据设计 ==========
  dataDesign: SDDDataDesign;
  
  // ========== 第七章:安全设计 ==========
  securityDesign: SDDSecurityDesign;
  
  // ========== 第八章:测试策略 ==========
  testingStrategy: SDDTestingStrategy;
  
  // ========== 第九章:部署运维 ==========
  deploymentOps: SDDDeploymentOps;
}

// ======== 各章节详细定义 ========

interface SDDMeta {
  /** SDD唯一标识符 */
  sddId: string;  // 格式: SDD-{project}-{module}-{version}
                   // 例: SDD-user-service-auth-v2
  
  /** 关联的需求编号 */
  requirementIds: string[];  // 如 ["REQ-AUTH-001", "JIRA-PROJ-123"]
  
  /** 版本号(语义化版本) */
  version: string;  // 如 "2.1.0"
  
  /** 创建日期 */
  createdAt: string;  // ISO 8601
  
  /** 最后更新日期 */
  updatedAt: string;
  
  /** 作者/负责人 */
  author: string;
  
  /** 审核人 */
  reviewers: string[];
  
  /** 状态 */
  status: 'draft' | 'review' | 'approved' | 'deprecated' | 'archived';
  
  /** 适用范围 */
  scope: {
    project: string;
    modules: string[];
    team: string;
  };
  
  /** 关键词(用于检索和分类) */
  tags: string[];
  
  /** 变更记录 */
  changelog: SDDChangeLog[];
}

interface SDDChangeLog {
  version: string;
  date: string;
  author: string;
  changes: string[];
  type: 'major' | 'minor' | 'patch' | 'breaking';
}

interface SDDOverview {
  /** 一句话描述这个模块做什么 */
  summary: string;
  
  /** 详细背景和上下文 */
  background: string;
  
  /** 解决什么问题 */
  problemStatement: string;
  
  /** 目标用户/调用方 */
  stakeholders: string[];
  
  /** 与其他模块的关系 */
  dependencies: {
    upstream: SDDDependency[];   // 依赖谁
    downstream: SDDDependency[];  // 被谁依赖
  };
  
  /** 核心术语表(确保全员理解一致) */
  glossary: Record<string, string>;
  
  /** 设计原则和决策依据 */
  designPrinciples: SDDDesignDecision[];
}

interface SDDDependency {
  module: string;
  interface: string;
  type: 'sync' | 'async' | 'event';
  criticality: 'critical' | 'high' | 'medium' | 'low';
  fallback?: string;  // 降级方案
}

interface SDDDesignDecision {
  id: string;       // 如 "ADR-001"
  title: string;
  context: string;  // 为什么面临这个选择
  decision: string; // 最终决定
  consequences: {
    positive: string[];
    negative: string[];
  };
  alternatives: Array<{ option: string; rejectedReason: string }>;
}

// ... 其他接口定义类似,此处省略以节省篇幅
// 完整定义见: https://github.com/chaitin/monkeycode/blob/main/packages/sdd/types/index.ts

2.2 最小可用SDD(MVP版)

# sdd-templates/minimal-sdd.yaml
# 最小可用SDD模板 —— 适合简单功能模块

# 使用场景: 工具函数、简单CRUD、配置项等不需要复杂设计的场景
# 复杂度等级: ⭐ (1/5)
# 预计填写时间: 5-10分钟

sdd_template:
  name: "Minimal SDD"
  version: "1.0"
  complexity: "minimal"
  
  sections:
    
    # 唯一必须填写的部分
    - section: "Identity"
      required: true
      fields:
        - name: "Module Name"
          desc: "模块/功能的名称"
          example: "Password Hashing Utility"
          validation: "必填,不超过50字符"
          
        - name: "Purpose"
          desc: "一句话说明这个模块做什么"
          example: "提供密码哈希和验证功能,支持bcrypt和argon2两种算法"
          validation: "必填,不超过200字符"
          
        - name: "Entry Point"
          desc: "主要的导出函数/类/接口"
          example: "export { hashPassword, verifyPassword } from './crypto'"
          validation: "必填"
    
    # 强烈推荐的部分
    - section: "Interface Contract"
      required: true
      fields:
        - name: "Input/Output Types"
          desc: "函数签名或接口定义"
          example: |
            interface PasswordService {
              hashPassword(plain: string): Promise<string>
              verifyPassword(plain: string, hash: string): Promise<boolean>
            }
            
        - name: "Error Cases"
          desc: "可能抛出的异常/返回的错误码"
          example: |
            - EmptyPasswordError: 输入为空
            - WeakPasswordError: 强度不足(可选启用)
            - HashError: 哈希计算失败
            
        - name: "Constraints"
          desc: "必须遵守的硬性约束"
          example: |
            - 密码长度: 8-128字符
            - 哈希算法: bcrypt(cost>=12) 或 argon2(memory>=64MB)
            - 禁止: MD5, SHA1, 明文存储
    
    # 可选但有价值的部分
    - section: "Quality Gates"
      required: false
      fields:
        - name: "Test Coverage Target"
          desc: "最低测试覆盖率要求"
          default: "90%"
          
        - name: "Performance Requirement"
          desc: "性能指标"
          example: "hashPassword < 500ms (bcrypt cost=12)"
          
        - name: "Security Requirements"
          desc: "安全相关要求"
          example: |
            - 通过OWASP Password Storage Cheat Sheet检查
            - 不记录明文密码到任何日志
            - 使用恒定时间比较防止时序攻击

---
# 使用示例(填充后)

filled_example:
  module_name: "PasswordHasher"
  purpose: "为认证服务提供安全的密码哈希和验证能力"
  entry_point: "src/utils/password.ts"
  
  interface_contract:
    types: |
      export interface IPasswordHasher {
        /**
         * 哈希明文密码
         * @param plain 明文密码(8-128字符)
         * @returns 哈希值(bcrypt $2b$ 格式)
         */
        hash(plain: string): Promise<string>
        
        /**
         * 验证密码是否匹配
         * @param plain 待验证的明文密码
         * @param hash 已存储的哈希值
         * @returns 是否匹配
         */
        verify(plain: string, hash: string): Promise<boolean>
        
        /**
         * 检查密码强度
         * @param plain 明文密码
         * @returns 强度评估结果
         */
        checkStrength(plain: string): PasswordStrengthResult
      }
      
    errors:
      - { code: "ERR_EMPTY_PASSWORD", message: "密码不能为空", httpStatus: 400 }
      - { code: "ERR_PASSWORD_TOO_LONG", message: "密码不能超过128字符", httpStatus: 400 }
      - { code: "ERR_HASH_FAILED", message: "哈希计算失败", httpStatus: 500 }
      
    constraints:
      - "必须使用bcrypt(cost >= 12)或argon2id"
      - "禁止使用MD5、SHA1、SHA256等快速哈希"
      - "禁止在任何地方记录明文密码(包括日志)"
      - "verify方法必须使用恒定时间比较(timing-safe compare)"
      
  quality_gates:
    test_coverage: "95%+"
    performance: "hash() < 500ms (bcrypt cost=12), < 200ms (argon2id)"
    security: |
      - ✅ 通过MonkeyScan安全扫描
      - ✅ 无已知CVE依赖
      - ✅ 密码强度检查覆盖常见弱密码Top 1000

2.3 完整SDD模板(企业级)

# SDD-{PROJECT}-{MODULE}-{VERSION}
> **Software Design Specification — 软件设计规格说明书**

## 📋 文档元信息

| 字段 | 值 |
|------|-----|
| **SDD ID** | SDD-payment-gateway-v2.1 |
| **关联需求** | REQ-PAY-001 ~ REQ-PAY-015, JIRA-PAY-2024-089 |
| **版本** | 2.1.0 |
| **状态** | ✅ Approved |
| **作者** | 张三 (Tech Lead) |
| **审核** | 李四 (Architect), 王五 (Security) |
| **创建** | 2026-03-15 |
| **更新** | 2026-06-20 |

## 1. 概述

### 1.1 一句话总结
统一的支付网关服务,支持微信支付、支付宝、银联等多种支付渠道,提供幂等的订单创建、支付、退款全流程管理。

### 1.2 背景与上下文
当前系统存在三个独立的支付模块(分别对接微信、支付宝、银联),导致:
- 支付逻辑重复实现,维护成本高
- 对账逻辑分散,财务对账困难
- 新增支付渠道需要大量重复开发
- 缺乏统一的异常处理和降级策略

本SDD旨在设计一个统一的支付网关,解决上述问题。

### 1.3 利益相关方
| 角色 | 关注点 | 期望 |
|------|--------|------|
| 业务方 | 支付成功率 | >99.5%,支持主流渠道 |
| 财务 | 对账准确 | T+1自动对账,差异<0.01% |
| 运维 | 系统稳定性 | 可用性99.99%,P99延迟<500ms |
| 安全 | 资金安全 | 幂等性、防重放、加密传输 |
| 开发 | 开发效率 | 新增渠道<3天完成接入 |

### 1.4 模块依赖关系

┌──────────────┐
│ Order Service│ ← 下游:订单服务(创建支付订单)
└──────┬───────┘
│ RPC
┌──────▼───────┐
│ Payment GW │ ← 本模块(核心)
│ (本文档范围) │
└──┬───┬───┬───┘
│ │ │
┌───────┘ │ └───────┐
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐
│ WeChat │ │ Alipay │ │ UnionPay │
│ Pay API │ │ API │ │ API │
└──────────┘ └──────────┘ └──────────┘

上游依赖:
- Config Center: 渠道配置、密钥管理
- Redis: 分布式锁、幂等Key存储
- DB(MySQL): 订单流水、对账记录
- Message Queue(Kafka): 支付事件通知


## 2. 功能需求

### 2.1 功能清单
| ID | 功能 | 优先级 | 复杂度 | 说明 |
|----|------|--------|--------|------|
| F001 | 创建支付订单 | P0 | 中 | 统一的订单创建接口 |
| F002 | 发起支付 | P0 | 中 | 调用第三方支付SDK |
| F003 | 支付回调处理 | P0 | 高 | 异步回调验签和处理 |
| F004 | 支付结果查询 | P0 | 低 | 主动查询支付状态 |
| F005 | 退款 | P1 | 中 | 全额/部分退款 |
| F006 | 对账 | P1 | 高 | T+1自动对账 |
| F007 | 渠道路由 | P1 | 中 | 智能选择最优渠道 |
| F008 | 降级策略 | P2 | 中 | 渠道故障自动切换 |

### 2.2 核心流程:支付主流程

用户下单 → 创建支付订单(F001)

选择支付渠道(F007)

调起支付SDK(F002)

┌─────────┴─────────┐
▼ ▼
用户完成支付 用户取消/超时
↓ ↓
回调通知(F003) 订单超时关闭

验签 + 幂等检查

更新订单状态

发送支付成功事件(Kafka)

通知下游(Order Service)


## 3. 非功能需求

### 3.1 性能要求
| 指标 | 目标值 | 测量方式 |
|------|--------|----------|
| 创建订单P50延迟 | < 100ms | Prometheus histogram |
| 创建订单P99延迟 | < 300ms | Prometheus histogram |
| 支付回调处理 | < 200ms | 从接收到处理完成 |
| 并发支撑 | 5000 QPS | 压测验证 |
| 吞吐量 | 10000 TPS | 峰值容量 |

### 3.2 可靠性要求
| 指标 | 目标值 |
|------|--------|
| 服务可用性(SLA) | 99.99%/月(停机<4.3分钟) |
| 数据持久性 | 99.999999%(9个9) |
| RTO(恢复时间目标) | < 30秒 |
| RPO(恢复点目标) | = 0(同步复制) |
| 降级可用能力 | 核心支付功能在DB故障时可降级只读 |

### 3.3 安全要求
| 要求 | 具体措施 |
|------|----------|
| 传输加密 | 全链路TLS 1.3 |
| 敏感数据加密 | 支付密钥AES-256-GCM加密存储 |
| 幂等性 | 所有写操作基于业务唯一ID做幂等 |
| 防重放 | 回调请求5分钟内不处理相同请求 |
| 操作审计 | 所有资金操作记录完整审计日志 |
| 访问控制 | RBAC + 最小权限原则 |

## 4. 架构设计

### 4.1 技术选型
| 层面 | 选型 | 理由 |
|------|------|------|
| 语言 | TypeScript (Node.js) | 团队熟悉度 + 异步IO适合支付场景 |
| 框架 | NestJS | 企业级框架,内置DI/Middleware/Guard |
| ORM | TypeORM | 类型安全,支持多数据源 |
| 缓存 | Redis Cluster | 高性能 + 分布式锁 |
| MQ | Apache Kafka | 事件驱动,保证顺序 |
| DB | MySQL 8.0 (主从) | ACID事务保证 |
| 配置 | Apollo/Nacos | 动态配置 + 灰度发布 |
| 监控 | Prometheus + Grafana + AlertManager | 全链路可观测 |

### 4.2 模块划分

src/
├── modules/
│ ├── payment-order/ # 支付订单管理
│ │ ├── payment-order.service.ts
│ │ ├── payment-order.entity.ts
│ │ └── payment-order.repository.ts
│ │
│ ├── channel/ # 渠道适配层(策略模式)
│ │ ├── channel.strategy.interface.ts
│ │ ├── wechat-pay.strategy.ts
│ │ ├── alipay.strategy.ts
│ │ ├── unionpay.strategy.ts
│ │ └── channel-router.service.ts
│ │
│ ├── callback/ # 回调处理
│ │ ├── callback.controller.ts
│ │ ├── callback.service.ts
│ │ └── signature.verifier.ts
│ │
│ ├── refund/ # 退款
│ │ └── refund.service.ts
│ │
│ ├── reconciliation/ # 对账
│ │ └── reconciliation.job.ts
│ │
│ └── common/ # 公共组件
│ ├── idempotency.guard.ts # 幂等守卫
│ ├── encrypt.util.ts # 加密工具
│ ├── payment.exception.ts # 异常体系
│ └── audit.log.decorator.ts # 审计日志装饰器

├── config/
│ ├── payment.config.ts
│ └── channels.config.ts

└── tests/
├── unit/
├── integration/
└── e2e/


## 5. 接口设计

### 5.1 RESTful API 定义

#### POST /api/v1/payment/orders — 创建支付订单
```typescript
// 请求
interface CreatePaymentOrderRequest {
  /** 业务订单号(由Order Service生成) */
  bizOrderId: string;
  /** 支付金额(单位:分) */
  amount: number;
  /** 货币代码 */
  currency: 'CNY' | 'USD';
  /** 商品描述 */
  subject: string;
  /** 用户ID */
  userId: string;
  /** 可选支付渠道(不传则自动路由) */
  preferredChannel?: 'wechat' | 'alipay' | 'unionpay';
  /** 过期时间(秒),默认30分钟 */
  expireSeconds?: number;
  /** 扩展元数据(透传给支付渠道) */
  metadata?: Record<string, string>;
  /** 客户端IP(风控用) */
  clientIp: string;
}

// 响应
interface CreatePaymentOrderResponse {
  /** 支付订单号 */
  paymentOrderId: string;
  /** 支付状态 */
  status: 'PENDING' | 'PROCESSING';
  /** 支付参数(直接传给前端调起支付SDK) */
  payParams: WechatPayParams | AlipayParams | UnionPayParams;
  /** 过期时间 */
  expireAt: string;  // ISO 8601
}

POST /api/v1/payment/callback/{channel} — 支付回调

// 注意:此接口由第三方支付平台调用,需做严格的验签
// 请求体因渠道而异,统一经过signature.verifier处理后转为内部事件

GET /api/v1/payment/orders/{orderId} — 查询订单

interface PaymentOrderResponse {
  paymentOrderId: string;
  bizOrderId: string;
  status: PaymentStatus;
  amount: number;
  paidAmount: number;
  channel: string;
  channelTransactionId: string;
  createdAt: string;
  paidAt?: string;
  expiredAt: string;
}

5.2 内部事件定义(Kafka)

// Topic: payment-events
interface PaymentEvent {
  eventType: 
    | 'PAYMENT_CREATED'
    | 'PAYMENT_SUCCESS'
    | 'PAYMENT_FAILED'
    | 'PAYMENT_EXPIRED'
    | 'REFUND_INITIATED'
    | 'REFUND_SUCCESS'
    | 'REFUND_FAILED'
    | 'RECONCILIATION_COMPLETE';
  eventId: string;        // UUID
  timestamp: string;       // ISO 8601
  traceId: string;         // 链路追踪ID
  payload: {
    paymentOrderId: string;
    bizOrderId: string;
    amount: number;
    channel: string;
    // ... 事件特有字段
  };
}

6. 数据设计

6.1 ER图(核心实体)

┌─────────────────────┐       ┌─────────────────────┐
│   payment_order      │       │   payment_refund     │
├─────────────────────┤       ├─────────────────────┤
│ PK id (BIGINT)      │──┐    │ PK id (BIGINT)      │
│    payment_order_id │  │    │ FK order_id          │
│    biz_order_id     │  │    │    refund_no         │
│    amount           │  └───▶│    refund_amount     │
│    status           │       │    status            │
│    channel          │       │    reason            │
│    channel_txn_id   │       │    created_at        │
│    pay_params(JSON) │       └─────────────────────┘
│    expired_at       │
│    paid_at          │       ┌─────────────────────┐
│    created_at       │       │   reconciliation_log │
│    updated_at       │       ├─────────────────────┤
└─────────────────────┘       │ PK id                │
                              │    reconcile_date    │
                              │    channel           │
                              │    total_count       │
                              │    total_amount      │
                              │    success_count     │
                              │    success_amount    │
                              │    diff_count        │
                              │    diff_details(JSON)│
                              │    status            │
                              └─────────────────────┘

6.2 关键索引

-- payment_order 表索引
CREATE UNIQUE INDEX uk_payment_order_id ON payment_order(payment_order_id);
CREATE INDEX idx_biz_order_id ON payment_order(biz_order_id);
CREATE INDEX idx_status_created ON payment_order(status, created_at);
CREATE INDEX idx_channel_status ON payment_order(channel, status);

-- 幂等Key索引(防止重复支付)
CREATE UNIQUE INDEX uk_idempotent_key ON payment_order(idempotent_key);

7. 安全设计

7.1 威胁模型

威胁 风险等级 防护措施
回调伪造 🔴 Critical RSA/SHA256双重验签 + IP白名单
金额篡改 🔴 Critical 服务端金额校验 + 签名验证
重放攻击 🟠 High nonce + timestamp + 5分钟窗口
订单信息泄露 🟠 High 敏感字段加密存储 + 访问控制
并发重复支付 🟠 High 分布式锁 + 幂等检查
中间人攻击 🟡 Medium 全链路TLS + 证书固定(Pinning)

7.2 加密方案

// 敏感字段加密示例
const ENCRYPTION_CONFIG = {
  algorithm: 'aes-256-gcm',
  keyRotationDays: 90,
  encryptedFields: [
    'pay_params',       // 支付参数含敏感信息
    'channel_txn_id',   // 渠道交易凭证
    'user_identity',    // 用户身份信息
  ],
};

8. 测试策略

8.1 测试矩阵

测试类型 覆盖目标 工具 自动化
单元测试 核心逻辑覆盖率>90% Jest ✅ CI自动运行
集成测试 API接口+DB交互 Supertest ✅ CI自动运行
契约测试 渠道SDK交互 Pact ✅ CI自动运行
E2E测试 完整支付流程 Playwright ✅ 每日夜间
压力测试 性能指标达标 k6/Artillery ✅ 发版前必跑
安全测试 OWASP Top 10 MonkeyScan ✅ 每次PR触发
混沌测试 故障恢复能力 Chaos Mesh ✅ 每周一次

8.2 关键测试用例

// 核心测试场景(必须全部通过才能合并)
const CRITICAL_TEST_CASES = [
  // 正常流程
  { name: '正常创建订单并支付', priority: 'P0' },
  { name: '支付回调正确处理', priority: 'P0' },
  { name: '退款全流程', priority: 'P0' },
  
  // 异常流程
  { name: '重复回调幂等处理', priority: 'P0' },
  { name: '回调签名伪造拒绝', priority: 'P0' },
  { name: '订单过期自动关闭', priority: 'P0' },
  { name: '金额不一致拒绝', priority: 'P0' },
  { name: '并发支付只成功一笔', priority: 'P0' },
  
  // 边界条件
  { name: '金额为0拒绝', priority: 'P1' },
  { name: '金额超大值处理', priority: 'P1' },
  { name: '特殊字符注入', priority: 'P1' },
  { name: '超长subject截断', priority: 'P2' },
];

9. 部署运维

9.1 部署架构

# Kubernetes部署规格
deployment:
  replicas: 3
  resources:
    requests:
      cpu: "500m"
      memory: "512Mi"
    limits:
      cpu: "2000m"
      memory: "2Gi"
  
  healthCheck:
    livenessPath: /health/live
    readinessPath: /health/ready
    
  strategy:
    type: RollingUpdate
    maxUnavailable: 0
    maxSurge: 1
    
  podDisruptionBudget:
    minAvailable: 2
    
autoscaling:
  minReplicas: 3
  maxReplicas: 20
  targetCPUUtilization: 70
  targetMemoryUtilization: 80

9.2 监控告警

alerts:
  - name: "PaymentOrderCreationHighLatency"
    condition: "histogram_quantile(0.95, payment_order_duration_seconds) > 0.5"
    severity: warning
    action: "slack + pagerduty"
    
  - name: "PaymentCallbackFailureRate"
    condition: "rate(payment_callback_errors_total[5m]) / rate(callback_requests_total[5m]) > 0.05"
    severity: critical
    action: "pagerduty + phone"
    
  - name: "PendingOrderBacklog"
    condition: "payment_orders_pending_count > 1000"
    severity: warning
    action: "slack"

附录

A. 变更记录

版本 日期 作者 变更内容
1.0.0 2026-03-15 张三 初始版本
2.0.0 2026-05-10 张三 新增银联渠道支持
2.1.0 2026-06-20 李四 优化对账逻辑,增加差异自动修复

B. 参考资料

C. ADR记录


---

## 三、行业级SDD模板库

### 3.1 模板分类总览

MonkeyCode SDD 模板库 (v2.0):

📁 sdd-templates/

├── 📄 by-complexity/ # 按复杂度分类
│ ├── minimal-sdd.yaml # ⭐ 最简版(工具函数/简单CRUD)
│ ├── standard-sdd.yaml # ⭐⭐ 标准版(常规业务模块)
│ ├── advanced-sdd.yaml # ⭐⭐⭐ 进阶版(核心系统/复杂业务)
│ └── enterprise-sdd.yaml # ⭐⭐⭐⭐ 企业版(金融/政务/医疗)

├── 📄 by-domain/ # 按领域分类
│ ├── web-api-sdd.yaml # Web API服务
│ ├── microservice-sdd.yaml # 微服务模块
│ ├── data-pipeline-sdd.yaml # 数据管道/ETL
│ ├── mobile-backend-sdd.yaml # 移动端后端
│ ├── admin-panel-sdd.yaml # 管理后台
│ ├── scheduled-job-sdd.yaml # 定时任务/批处理
│ └── library-sdk-sdd.yaml # 库/SDK/公共组件

├── 📄 by-industry/ # 按行业分类
│ ├── fintech-sdd.yaml # 金融科技(支付/风控/合规)
│ ├── healthcare-sdd.yaml # 医疗健康(HIPAA/隐私保护)
│ ├── ecommerce-sdd.yaml # 电商(商品/订单/库存/物流)
│ ├── edtech-sdd.yaml # 教育(课程/考试/学习路径)
│ ├── govtech-sdd.yaml # 政务信息化(等保/国密/审批流)
│ └── iot-sdd.yaml # IoT物联网(设备管理/协议适配)

├── 📄 by-framework/ # 按技术栈分类
│ ├── nestjs-sdd.yaml # NestJS (TypeScript)
│ ├── springboot-sdd.yaml # Spring Boot (Java)
│ ├── django-sdd.yaml # Django (Python)
│ ├── gin-sdd.yaml # Gin (Go)
│ ├── nextjs-sdd.yaml # Next.js (React Fullstack)
│ └── rails-sdd.yaml # Ruby on Rails

└── 📄 custom/ # 自定义模板(企业内部)
└── my-company-sdd.yaml # 你公司的定制模板


### 3.2 金融科技SDD模板(重点展示)

```yaml
# sdd-templates/by-industry/fintech-sdd.yaml
# 金融科技行业专用SDD模板

template_info:
  name: "FinTech SDD Template"
  industry: "Financial Technology"
  compliance_frameworks:
    - "PCI-DSS v4.0"        # 支付卡行业数据安全标准
    - "等保三级"             # 中国网络安全等级保护
    - "GDPR"                 # 欧盟通用数据保护条例
    - "人行支付清算管理办法"   # 中国央行监管要求
  complexity: "enterprise"
  estimated_fill_time: "2-4小时"

# ======== 金融行业特有的额外章节 ========

extra_sections:

  # 合规章节(金融必备)
  - section: "Compliance & Regulatory"
    required: true
    subsections:
      - name: "Data Classification"
        template: |
          ## 数据分级
          | 级别 | 定义 | 示例 | 存储要求 | 传输要求 |
          |------|------|------|----------|----------|
          | L4-绝密 | 核心密钥 | 支付私钥 | HSM硬件加密 | 端到端加密 |
          | L3-机密 | 个人敏感 | 身份证号 | AES-256加密 | TLS + 字段加密 |
          | L2-秘密 | 业务数据 | 交易金额 | 透明加密 | TLS 1.3 |
          | L1-公开 | 公开信息 | 商品名称 | 明文 | HTTPS |
          
      - name: "Audit Trail Requirements"
        template: |
          ## 审计日志规范
          - 所有资金操作必须记录完整审计日志
          - 日志保留期限: ≥ 7年(监管要求)
          - 日志不可篡改(WORM存储或区块链存证)
          - 必须记录的字段:
            * 操作者身份(who)
            * 操作时间(when)
            * 操作内容(what - before/after快照)
            * 操作原因(why)
            * 操作来源IP(where)
            * 关联的业务单据号(which)
            
      - name: "Regulatory Reporting"
        template: |
          ## 监管报送
          ### 大额交易报告
          - 单笔≥5万人民币或等值外币 → 自动触发大额报告
          - 当日累计≥20万人民币 → 自动触发可疑报告
          
          ### 报送时效
          - 大额交易报告: T+1
          - 可疑交易报告: 10个工作日内
          - 数据格式: 符合人行XML Schema

  # 风控章节
  - section: "Risk Control"
    required: true
    subsections:
      - name: "Fraud Prevention"
        template: |
          ## 反欺诈策略
          ### 设备指纹
          - 收集设备指纹(设备ID、IP、UA、地理位置)
          - 异常设备标记(模拟器/Root/代理IP)
          
          ### 行为分析
          - 用户行为基线建立(首次使用→正常模式)
          - 异常行为检测:
            * 异地登录(距离上次>500km且<1h)
            * 非正常时间段操作(凌晨0-5点高频操作)
            * 操作频率异常(短时间内大量请求)
            
          ### 规则引擎
          ```yaml
          risk_rules:
            - rule: "HIGH_FREQUENCY_ORDER"
              condition: "orders_last_10min > 10"
              action: "require_captcha + manual_review"
              score: 80
              
            - rule: "NEW_DEVICE_LARGE_AMOUNT"
              condition: "is_new_device AND amount > 10000"
              action: "require_sms_otp + step_up_auth"
              score: 70
              
            - rule: "VELOCITY_CHECK"
              condition: "amount_change_rate > 500%"
              action: "freeze_account + alert_fraud_team"
              score: 95
          ```

      - name: "Transaction Limits"
        template: |
          ## 交易限额
          | 场景 | 单笔限额 | 日累计限额 | 月累计限额 |
          |------|----------|------------|------------|
          | 个人转账 | ¥50,000 | ¥100,000 | ¥500,000 |
          | 商户收款 | ¥100,000 | ¥1,000,000 | ¥10,000,000 |
          | 国际汇款 | $5,000 | $10,000 | $50,000 |
          
          ### 特殊处理
          - 超限额 → 需要高级别认证(人脸+U盾)
          - 连续3次超限额 → 冻结账户,人工审核
          - 可疑交易 → 延迟结算(T+7)

  # 容灾章节
  - section: "Business Continuity"
    required: true
    subsections:
      - name: "DR Strategy"
        template: |
          ## 灾难恢复策略
          ### RTO/RPO目标
          | 场景 | RTO | RPO | 方案 |
          |------|-----|-----|------|
          | 单节点故障 | <30s | 0 | K8s自动迁移 |
          | AZ整体故障 | <5min | <1min | 跨AZ热备切换 |
          | Region级故障 | <30min | <5min | 异地双活 |
          
          ### 数据备份
          - 实时备份: 主从同步(异步→最终一致性)
          - 定期快照: 每日全量 + 每小时增量
          - 跨地域复制: 异步复制到备用Region
          - 备份加密: AES-256 at rest
          - 备份验证: 每周随机抽取恢复验证
          
      - name: "Degradation Plan"
        template: |
          ## 降级预案
          ### Level 1: 渠道降级
          - 触发: 某渠道成功率<90%
          - 动作: 自动切换到备用渠道
          - 影响: 用户无感知
          
          ### Level 2: 功能降级
          - 触发: 所有渠道不可用
          - 动作: 
            * 暂停新订单创建
            * 已创建订单进入排队队列
            * 展示"维护中"提示
          - 影响: 无法新建支付,已有订单不受影响
          
          ### Level 3: 只读模式
          - 触发: 数据库主库不可用
          - 动作:
            * 切换到只读从库
            * 仅支持查询和退款
            * 新建订单返回"暂时不可用"
          - 影响: 核心读功能保持,写功能暂停

四、如何在MonkeyCode中使用SDD

4.1 基本使用流程

使用SDD驱动的AI编码完整流程:

Step 1: 选择/创建SDD模板
  │
  ├─ 方式A: 从模板库选择现成模板
  │   monkeycode sdd init --template fintech --name my-payment
  │
  ├─ 方式B: 基于现有代码逆向生成SDD
  │   monkeycode sdd generate-from-code ./src/payment
  │
  └─ 方式C: 从头编写(使用AI辅助)
      monkeycode chat "帮我为支付网关创建一个金融级SDD文档"
  │
  ▼
Step 2: 填充SDD内容(可AI辅助)
  │
  ├─ AI可以帮你:
  │   • 根据需求描述生成初稿
  │   • 补充安全/性能/测试章节
  │   • 检查完整性(是否有遗漏的关键章节)
  │
  └─ 你需要确认/修改:
      • 业务特定的决策和权衡
      • 团队的技术偏好
      • 外部依赖和集成细节
  │
  ▼
Step 3: 审批SDD(可选,推荐团队协作)
  │
  ├─ Tech Lead审核: 架构合理性
  ├─ Security审核: 安全要求完备性
  └─ PM确认: 功能需求覆盖完整性
  │
  ▼
Step 4: 基于SDD进行AI编码
  │
  └─ 命令示例:
      monkeycode gen --sdd ./sdd/payment-gateway-v2.yml \
                     --module payment-order \
                     --output src/modules/payment-order \
                     --with-tests \
                     --security-scan
  │
  ▼
Step 5: 自动验证
  │
  ├─ 代码是否符合SDD中的接口定义? ✓
  ├─ 是否使用了指定的技术栈? ✓
  ├─ 安全要求是否满足? ✓
  ├─ 测试覆盖率是否达标? ✓
  └─ 性能指标是否满足? ✓
  │
  ▼
Step 6: 提交Review + 发布
  │
  └─ MR自动携带:
      • SDD引用链接
      • AI Review意见
      • 安全扫描报告
      • 测试覆盖率报告

4.2 CLI命令速查

# ======== SDD管理命令 ========

# 初始化一个新的SDD(从模板)
monkeycode sdd init \
  --template enterprise \     # 模板名称
  --name payment-gateway \   # SDD名称
  --output ./sdd/ \          # 输出目录
  --interactive              # 交互式填写

# 从现有代码逆向生成SDD
monkeycode sdd reverse \
  --source ./src/services/payment \
  --output ./sdd/generated-payment.yml \
  --include-tests \
  --include-comments

# 验证SDD文件的完整性和有效性
monkeycode sdd validate \
  --file ./sdd/payment-gateway-v2.yml \
  --strict                   # 严格模式(所有required字段必须填写)

# 基于SDD生成代码
monkeycode gen \
  --sdd ./sdd/payment-gateway-v2.yml \
  --target all \              # 生成所有模块,或指定具体模块
  --with-tests \             # 同时生成测试
  --with-docs \              # 同时生成API文档
  --security-level high \    # 安全级别
  --output ./src/

# 将SDD关联到当前会话(聊天模式)
monkeycode chat \
  --context-sdd ./sdd/payment-gateway-v2.yml \
  "帮我实现F003支付回调处理模块"

# 检查代码是否符合SDD规范
monkeycode check \
  --sdd ./sdd/payment-gateway-v2.yml \
  --source ./src/modules/payment/ \
  --report-format json \
  --output ./check-report.json

# 导出SDD为多种格式
monkeycode sdd export \
  --file ./sdd/payment-gateway-v2.yml \
  --format markdown \         # markdown | html | pdf | openapi
  --output ./docs/

# 版本管理和变更追踪
monkeycode sdd diff \
  --old ./sdd/payment-v1.yml \
  --new ./sdd/payment-v2.yml \
  --output ./sdd-changelog.md

五、SDD最佳实践

5.1 编写高质量SDD的原则

╔══════════════════════════════════════════════════════╗
║           SDD编写的黄金法则                            ║
║                                                      ║
║  📏 法则1: 具体优于抽象                              ║
║     ❌ "代码要高效"                                   ║
║     ✅ "P99响应时间<300ms,使用Redis缓存热点数据"      ║
║                                                      ║
║  📏 法则2: 约束优于建议                              ║
║     ❌ "建议使用TypeScript"                           ║
║     ✅ "必须使用TypeScript,禁用any类型"               ║
║                                                      ║
║  📏 法则3: 可测量优于主观                              ║
║     ❌ "测试要充分"                                   ║
║     ✅ "分支覆盖率≥85%,关键路径覆盖率=100%"           ║
║                                                      ║
║  📏 法则4: 示例优于描述                              ║
║     ❌ "错误码按照规范定义"                            ║
║     ✅ "错误码格式: ERR_{MODULE}_{SPECIFIC}"          ║
║     ✅ 示例: ERR_PAY_INVALID_AMOUNT, ERR_AUTH_TOKEN_EXP║
║                                                      ║
║  📏 法则5: 渐进优于一步到位                           ║
║     不要试图一次性写出完美的SDD                        ║
║     先写核心(Identity + Interface + Constraints)     ║
║     再逐步补充(Security + Testing + Ops)             ║
║     每次迭代都产出可用的中间版本                        ║
║                                                      ║
║  📏 法则6: 活文档优于死文档                           ║
║     SDD不是写了就不动的                               ║
║     随着代码演进持续更新                               ║
║     建议每次大版本发布时回顾并更新SDD                   ║
║                                                      ║
╚══════════════════════════════════════════════════════╝

5.2 常见误区

⚠️ 误区1: SDD = 需求文档
  ✗ 把产品需求(PRD)原封不动搬进SDD
  ✓ SDD关注的是"怎么实现",不是"做什么"
  PRD回答"What & Why",SDD回答"How & With What Constraints"

⚠️ 误区2: SDD越详细越好
  ✗ 写了100页的SDD,没人看得完
  ✓ 好的SDD应该能在30分钟内读完核心内容
  详细信息放在附录或链接引用

⚠️ 误区3: SDD写完就不用管了
  ✗ 项目开始时写了一版SDD,之后从未更新
  ✓ SDD应该随着代码一起演进
  建议在MR描述中引用相关SDD,方便reviewer对照

⚠️ 误区4: 只有大型项目才需要SDD
  ✗ "我们是个小项目,不需要这么正式"
  ✓ 小项目更需要SDD!因为:
  - 小项目人员流动大,知识容易丢失
  - 小项目更容易走捷径产生技术债务
  - SDD的最小模板只需要5-10分钟就能填完

⚠️ 误区5: SDD会拖慢开发速度
  ✗ "写SDD的时间够我写完代码了"
  ✓ 数据表明:
  - 有SDD的项目,首次提交通过率高40%
  - Code Review返工率降低60%
  - 总体开发周期反而缩短15-25%
  - 因为减少了"返工→再返工"的循环

六、总结

╔══════════════════════════════════════════════════════╗
║                                                      ║
║  MonkeyCode SDD模板库的核心价值:                     ║
║                                                      ║
║  🎯 让AI理解你的标准                                 ║
║     不是教AI怎么写代码,而是告诉AI你的标准是什么     ║
║                                                      ║
║  🎯 让团队达成共识                                   ║
║     SDD是团队对"好代码"的共同契约                     ║
║                                                      ║
║  🎯 让质量可预期                                     ║
║     有SDD约束的代码,质量从第一天就是可控的           ║
║                                                      ║
║  🎯 让知识可沉淀                                     ║
║     最佳实践不再是某人的经验,而是团队的资产           ║
║                                                      ║
║  💬 一句话总结:                                      ║
║  "SDD是你和AI之间的共同语言。"                        ║
║                                                      ║
║  🚀 立即开始:                                        ║
║  monkeycode sdd init --template standard --name demo  ║
║                                                      ║
╚══════════════════════════════════════════════════════╝

系列导航


本文基于MonkeyCode开源项目的SDD规范系统和模板库编写,所有模板均可在v1.2.x版本中使用。

关键词:#MonkeyCode #SDD #软件设计规范 #模板库 #AI编程 #代码质量 #最佳实践 #企业级 #技术规范 #开发标准

posted on 2026-07-13 14:06  MonkeyCode  阅读(38)  评论(0)    收藏  举报