# Identity Service 部署和测试指南

## 项目架构验证

本项目采用DDD（领域驱动设计）四层架构：

### 1. 表现层（API Layer）
- 位置：`src/api/`
- 职责：处理HTTP请求，参数验证，响应格式化
- 主要组件：Controllers, DTOs, Validators

### 2. 应用层（Application Layer）  
- 位置：`src/application/`
- 职责：编排业务流程，事务管理，命令查询分离
- 主要组件：Commands, Queries, Application Services

### 3. 领域层（Domain Layer）
- 位置：`src/domain/`
- 职责：业务逻辑，领域模型，业务规则
- 主要组件：Aggregates, Entities, Value Objects, Domain Services, Events

### 4. 基础设施层（Infrastructure Layer）
- 位置：`src/infrastructure/`
- 职责：技术实现细节，外部服务集成
- 主要组件：Repositories, Redis, Kafka, External Services

## 构建和部署

### 环境准备

1. **Node.js**: 需要 Node.js 20.x 或更高版本
2. **Docker**: 用于容器化部署
3. **PostgreSQL**: 数据库（可通过Docker运行）
4. **Redis**: 缓存服务（可通过Docker运行）
5. **Kafka**: 消息队列（可通过Docker运行）

### 本地开发

1. **克隆项目并安装依赖**
```bash
cd identity-service
npm install
```

2. **配置环境变量**
```bash
cp .env.example .env
# 编辑 .env 文件，配置数据库连接等信息
```

3. **启动依赖服务（使用Docker）**
```bash
docker compose up -d postgres redis kafka
```

4. **初始化数据库**
```bash
# 生成Prisma Client
npm run prisma:generate

# 运行数据库迁移
npm run prisma:migrate
```

5. **启动服务**
```bash
# 开发模式（支持热重载）
npm run start:dev

# 生产模式
npm run build
npm run start:prod
```

### Docker部署

1. **使用Docker Compose一键部署**
```bash
# 构建并启动所有服务
docker-compose up -d

# 查看日志
docker-compose logs -f identity-service

# 停止服务
docker-compose down
```

2. **单独构建Docker镜像**
```bash
# 构建镜像
docker build -t identity-service:latest .

# 运行容器
docker run -d \
  -p 3000:3000 \
  -e DATABASE_URL="postgresql://user:pass@host:5432/db" \
  -e REDIS_HOST="redis-host" \
  -e KAFKA_BROKERS="kafka:9092" \
  --name identity-service \
  identity-service:latest
```

## API测试

### 1. 访问Swagger文档
启动服务后访问：http://localhost:3000/api/docs

### 2. 主要API端点

#### 自动创建账户（首次使用）
```bash
curl -X POST http://localhost:3000/api/v1/user/auto-create \
  -H "Content-Type: application/json" \
  -d '{
    "deviceId": "device-123-456",
    "deviceName": "iPhone 15 Pro",
    "inviterReferralCode": "ABCD1234",
    "provinceCode": "GD",
    "cityCode": "GZ"
  }'
```

#### 用助记词恢复账户
```bash
curl -X POST http://localhost:3000/api/v1/user/recover-by-mnemonic \
  -H "Content-Type: application/json" \
  -d '{
    "accountSequence": 1000001,
    "mnemonic": "your twelve word mnemonic phrase here",
    "newDeviceId": "device-789",
    "deviceName": "New Device"
  }'
```

#### 自动登录（Token刷新）
```bash
curl -X POST http://localhost:3000/api/v1/user/auto-login \
  -H "Content-Type: application/json" \
  -d '{
    "refreshToken": "your-refresh-token",
    "deviceId": "device-123-456"
  }'
```

#### 获取个人资料（需要认证）
```bash
curl -X GET http://localhost:3000/api/v1/user/my-profile \
  -H "Authorization: Bearer your-access-token"
```

#### 绑定手机号
```bash
# 1. 发送验证码
curl -X POST http://localhost:3000/api/v1/user/send-sms-code \
  -H "Content-Type: application/json" \
  -d '{
    "phoneNumber": "+8613812345678",
    "type": "BIND_PHONE"
  }'

# 2. 绑定手机号
curl -X POST http://localhost:3000/api/v1/user/bind-phone \
  -H "Authorization: Bearer your-access-token" \
  -H "Content-Type: application/json" \
  -d '{
    "phoneNumber": "+8613812345678",
    "smsCode": "123456"
  }'
```

## 生产环境部署建议

### 1. 数据库优化
- 使用连接池
- 设置合适的索引
- 定期备份

### 2. Redis配置
- 启用持久化（RDB或AOF）
- 设置合适的内存限制
- 配置密码认证

### 3. Kafka配置
- 设置合适的分区数
- 配置副本因子
- 监控消费者滞后

### 4. 安全建议
- 使用强密码的JWT密钥
- 启用HTTPS
- 配置CORS白名单
- 使用环境变量管理敏感信息

### 5. 监控和日志
- 集成监控工具（Prometheus、Grafana）
- 配置结构化日志
- 设置告警规则

## 故障排查

### 常见问题

1. **数据库连接失败**
   - 检查DATABASE_URL配置
   - 确认PostgreSQL服务正在运行
   - 检查网络连接

2. **Redis连接失败**
   - 检查REDIS_HOST和REDIS_PORT
   - 确认Redis服务正在运行
   - 检查防火墙设置

3. **Kafka连接失败**
   - 检查KAFKA_BROKERS配置
   - 确认Kafka和Zookeeper正在运行
   - 检查网络连接

4. **Prisma错误**
   - 运行 `npm run prisma:generate`
   - 检查数据库模式是否最新
   - 运行 `npm run prisma:migrate`

### 日志查看
```bash
# Docker日志
docker-compose logs -f identity-service

# 本地开发日志
npm run start:dev
```

## 性能优化

1. **启用查询优化**
   - 使用Prisma的`select`和`include`优化查询
   - 实现分页
   - 使用Redis缓存热数据

2. **并发处理**
   - 使用NestJS的异步特性
   - 合理配置线程池
   - 使用消息队列处理耗时任务

3. **监控指标**
   - API响应时间
   - 数据库查询性能
   - Redis命中率
   - Kafka消费延迟

## 联系支持

如有问题，请查看项目文档或联系开发团队。
