437 lines
10 KiB
Markdown
437 lines
10 KiB
Markdown
# Pilates Server
|
||
|
||
一个基于 NestJS 的恋爱话题和聊天建议 API 服务,为移动应用提供后端支持,包含用户管理、Apple 登录、话题收藏、任务生成等功能。
|
||
|
||
## 🚀 功能特性
|
||
|
||
- **用户管理系统**
|
||
- Apple Sign-In 集成
|
||
- 游客登录支持
|
||
- JWT 认证和刷新令牌
|
||
- 用户资料管理
|
||
- 账户删除功能
|
||
|
||
- **话题管理**
|
||
- 话题库管理
|
||
- 话题收藏功能
|
||
- 话题分类和搜索
|
||
- 个性化推荐
|
||
|
||
- **任务系统**
|
||
- 任务创建和管理
|
||
- 任务重新生成
|
||
- 任务分类管理
|
||
|
||
- **支付集成**
|
||
- App Store 服务器通知处理
|
||
- RevenueCat Webhook 支持
|
||
- 订阅状态管理
|
||
|
||
- **安全特性**
|
||
- AES-256-GCM 端到端加密
|
||
- 数据传输加密
|
||
- 安全的密钥管理
|
||
|
||
- **云服务集成**
|
||
- 腾讯云 COS 存储
|
||
- 客户端日志收集
|
||
- 文件上传管理
|
||
|
||
## 🛠 技术栈
|
||
|
||
- **框架**: NestJS 11.x
|
||
- **语言**: TypeScript
|
||
- **数据库**: MySQL 3.x + Sequelize ORM
|
||
- **认证**: JWT + Apple Sign-In
|
||
- **文档**: Swagger/OpenAPI
|
||
- **部署**: PM2 + 自动化部署脚本
|
||
- **云服务**: 腾讯云 COS
|
||
- **加密**: AES-256-GCM
|
||
- **测试**: Jest
|
||
|
||
## 📋 环境要求
|
||
|
||
- Node.js >= 18.0.0
|
||
- MySQL >= 8.0
|
||
- yarn 或 npm
|
||
- PM2 (生产环境)
|
||
|
||
## 🚀 快速开始
|
||
|
||
### 1. 克隆项目
|
||
|
||
```bash
|
||
git clone <repository-url>
|
||
cd pilates-server
|
||
```
|
||
|
||
### 2. 安装依赖
|
||
|
||
```bash
|
||
yarn install
|
||
# 或
|
||
npm install
|
||
```
|
||
|
||
### 3. 环境配置
|
||
|
||
创建 `.env` 文件并配置以下环境变量:
|
||
|
||
```bash
|
||
# 数据库配置
|
||
DB_HOST=localhost
|
||
DB_PORT=3306
|
||
DB_USERNAME=your_username
|
||
DB_PASSWORD=your_password
|
||
DB_DATABASE=love_tips
|
||
|
||
# JWT 配置
|
||
JWT_SECRET=your_jwt_secret
|
||
JWT_EXPIRES_IN=7d
|
||
REFRESH_TOKEN_SECRET=your_refresh_token_secret
|
||
REFRESH_TOKEN_EXPIRES_IN=30d
|
||
|
||
# Apple 配置
|
||
APPLE_BUNDLE_ID=com.yourcompany.yourapp
|
||
APPLE_KEY_ID=your_key_id
|
||
APPLE_ISSUER_ID=your_issuer_id
|
||
APPLE_PRIVATE_KEY_PATH=path/to/your/private/key.p8
|
||
APPLE_APP_SHARED_SECRET=your_shared_secret
|
||
|
||
# 加密配置
|
||
ENCRYPTION_KEY=your-32-character-secret-key-here
|
||
|
||
# 腾讯云 COS 配置
|
||
COS_SECRET_ID=your_secret_id
|
||
COS_SECRET_KEY=your_secret_key
|
||
COS_REGION=your_region
|
||
COS_BUCKET=your_bucket
|
||
|
||
# 服务配置
|
||
PORT=3000
|
||
NODE_ENV=development
|
||
```
|
||
|
||
### 4. 数据库初始化
|
||
|
||
```bash
|
||
# 创建数据库
|
||
mysql -u root -p -e "CREATE DATABASE love_tips;"
|
||
|
||
# 运行迁移(如果有)
|
||
yarn run migration:run
|
||
```
|
||
|
||
### 5. 启动开发服务器
|
||
|
||
```bash
|
||
# 开发模式
|
||
yarn start:dev
|
||
|
||
# 或使用脚本
|
||
./start-dev.sh
|
||
```
|
||
|
||
服务器将在 `http://localhost:3000` 启动,API 文档可在 `http://localhost:3000/api/docs` 查看。
|
||
|
||
## 📖 API 文档
|
||
|
||
### 主要接口
|
||
|
||
#### 用户认证
|
||
- `POST /api/users/auth/apple/login` - Apple 登录
|
||
- `POST /api/users/auth/guest/login` - 游客登录
|
||
- `POST /api/users/auth/refresh` - 刷新令牌
|
||
- `POST /api/users/delete-account` - 删除账户
|
||
|
||
#### 用户管理
|
||
- `GET /api/users` - 获取用户资料
|
||
- `PUT /api/users/update` - 更新用户信息
|
||
- `PUT /api/users/relations` - 更新用户关系信息
|
||
- `GET /api/users/relations/:userId` - 获取用户关系信息
|
||
|
||
#### 话题管理
|
||
- `POST /api/topic/list` - 获取话题列表
|
||
- `POST /api/topic/favorite` - 收藏话题
|
||
- `POST /api/topic/unfavorite` - 取消收藏
|
||
- `POST /api/topic/favorites` - 获取收藏列表
|
||
|
||
#### 任务管理
|
||
- `POST /api/tasks` - 创建任务
|
||
- `GET /api/tasks/:id` - 获取任务详情
|
||
- `POST /api/tasks/recreate` - 重新生成任务
|
||
- `POST /api/tasks/categories` - 获取任务分类
|
||
|
||
#### 系统接口
|
||
- `POST /api/users/logs` - 创建客户端日志
|
||
- `POST /api/users/app-store-notifications` - App Store 通知
|
||
- `POST /api/users/revenuecat-webhook` - RevenueCat Webhook
|
||
|
||
完整的 API 文档请访问:`http://localhost:3000/api/docs`
|
||
|
||
## 🚀 部署指南
|
||
|
||
项目提供了三种部署方式:
|
||
|
||
### 1. 优化版部署(推荐)
|
||
|
||
```bash
|
||
./deploy-optimized.sh
|
||
```
|
||
|
||
- 只上传源代码,服务器端构建
|
||
- 传输文件少,部署速度快
|
||
- 包含完整的错误处理和备份
|
||
|
||
### 2. 完整版部署
|
||
|
||
```bash
|
||
# 查看帮助
|
||
./deploy.sh --help
|
||
|
||
# 模拟运行
|
||
./deploy.sh --dry-run
|
||
|
||
# 正式部署
|
||
./deploy.sh
|
||
```
|
||
|
||
### 3. 简化版部署
|
||
|
||
```bash
|
||
./deploy-simple.sh
|
||
```
|
||
|
||
### 服务器配置
|
||
|
||
- **服务器地址**: 119.91.211.52
|
||
- **用户**: root
|
||
- **部署目录**: /usr/local/web/pilates-server
|
||
|
||
### 生产环境启动
|
||
|
||
```bash
|
||
# 使用 PM2 启动
|
||
yarn pm2:start
|
||
|
||
# 查看状态
|
||
yarn pm2:status
|
||
|
||
# 查看日志
|
||
yarn pm2:logs
|
||
|
||
# 重启服务
|
||
yarn pm2:restart
|
||
```
|
||
|
||
详细部署说明请参考 [`DEPLOY.md`](DEPLOY.md)
|
||
|
||
## 🏗 项目结构
|
||
|
||
```
|
||
pilates-server/
|
||
├── src/ # 源代码目录
|
||
│ ├── app.module.ts # 应用主模块
|
||
│ ├── main.ts # 应用入口文件
|
||
│ ├── base.dto.ts # 基础 DTO
|
||
│ ├── common/ # 通用模块
|
||
│ │ ├── decorators/ # 装饰器
|
||
│ │ ├── guards/ # 守卫
|
||
│ │ └── encryption.service.ts # 加密服务
|
||
│ ├── database/ # 数据库模块
|
||
│ ├── users/ # 用户模块
|
||
│ │ ├── users.controller.ts # 用户控制器
|
||
│ │ ├── users.service.ts # 用户服务
|
||
│ │ ├── dto/ # 数据传输对象
|
||
│ │ ├── models/ # 数据模型
|
||
│ │ └── services/ # 业务服务
|
||
│ └── tasks/ # 任务模块
|
||
│ ├── task.controller.ts # 任务控制器
|
||
│ ├── task.service.ts # 任务服务
|
||
│ ├── dto/ # 数据传输对象
|
||
│ └── models/ # 数据模型
|
||
├── docs/ # 文档目录
|
||
│ ├── topic-favorite-api.md # 话题收藏 API 文档
|
||
│ ├── app-store-server-notifications.md # App Store 通知文档
|
||
│ └── ios-encryption-guide.md # iOS 加密对接指南
|
||
├── test/ # 测试文件
|
||
├── deploy*.sh # 部署脚本
|
||
├── start*.sh # 启动脚本
|
||
├── ecosystem.config.js # PM2 配置
|
||
├── package.json # 项目配置
|
||
└── README.md # 项目说明
|
||
```
|
||
|
||
## ⚙️ 开发指南
|
||
|
||
### 开发环境设置
|
||
|
||
```bash
|
||
# 安装依赖
|
||
yarn install
|
||
|
||
# 启动开发服务器
|
||
yarn start:dev
|
||
|
||
# 运行测试
|
||
yarn test
|
||
|
||
# 运行 E2E 测试
|
||
yarn test:e2e
|
||
|
||
# 代码格式化
|
||
yarn format
|
||
|
||
# 代码检查
|
||
yarn lint
|
||
```
|
||
|
||
### 代码规范
|
||
|
||
- 使用 TypeScript 严格模式
|
||
- 遵循 ESLint 配置规则
|
||
- 使用 Prettier 进行代码格式化
|
||
- 编写单元测试和集成测试
|
||
- 使用 Swagger 注解生成 API 文档
|
||
|
||
### Git 工作流
|
||
|
||
1. 从 `main` 分支创建功能分支
|
||
2. 提交代码前运行测试和代码检查
|
||
3. 创建 Pull Request
|
||
4. 代码审查通过后合并
|
||
|
||
## 🔒 安全特性
|
||
|
||
### 数据加密
|
||
|
||
项目支持 AES-256-GCM 端到端加密:
|
||
|
||
- **算法**: AES-256-GCM
|
||
- **密钥长度**: 256位 (32字节)
|
||
- **IV长度**: 96位 (12字节)
|
||
- **认证标签长度**: 128位 (16字节)
|
||
|
||
详细的 iOS 端对接指南请参考 [`docs/ios-encryption-guide.md`](docs/ios-encryption-guide.md)
|
||
|
||
### 认证授权
|
||
|
||
- JWT 令牌认证
|
||
- Apple Sign-In 集成
|
||
- 刷新令牌机制
|
||
- 角色权限控制
|
||
|
||
## 📊 监控和日志
|
||
|
||
### 日志管理
|
||
|
||
```bash
|
||
# 查看应用日志
|
||
pm2 logs pilates-server
|
||
|
||
# 查看错误日志
|
||
tail -f logs/error.log
|
||
|
||
# 查看访问日志
|
||
tail -f logs/output.log
|
||
```
|
||
|
||
### 性能监控
|
||
|
||
- PM2 进程监控
|
||
- 内存使用限制 (1GB)
|
||
- 自动重启机制
|
||
- 集群模式支持
|
||
|
||
## 🤝 贡献指南
|
||
|
||
1. Fork 项目
|
||
2. 创建功能分支 (`git checkout -b feature/AmazingFeature`)
|
||
3. 提交更改 (`git commit -m 'Add some AmazingFeature'`)
|
||
4. 推送到分支 (`git push origin feature/AmazingFeature`)
|
||
5. 创建 Pull Request
|
||
|
||
## 📄 许可证
|
||
|
||
本项目采用 UNLICENSED 许可证。
|
||
|
||
## 📞 支持
|
||
|
||
如有问题或建议,请通过以下方式联系:
|
||
|
||
- 创建 Issue
|
||
- 发送邮件至项目维护者
|
||
- 查看项目文档
|
||
|
||
---
|
||
|
||
**注意**: 生产环境部署前请确保所有环境变量已正确配置,特别是数据库连接和 Apple 相关配置。
|
||
|
||
## 恢复购买功能
|
||
|
||
### 功能说明
|
||
恢复购买功能允许用户将之前在 RevenueCat 中的购买记录与当前登录的账号关联,确保用户能够访问他们已购买的内容。
|
||
|
||
### API 接口
|
||
|
||
**POST** `/users/restore-purchase`
|
||
|
||
### 请求参数
|
||
```json
|
||
{
|
||
"revenueCatUserId": "可选的RevenueCat用户ID,如果不提供将使用当前登录用户ID"
|
||
}
|
||
```
|
||
|
||
### 响应示例
|
||
```json
|
||
{
|
||
"code": 0,
|
||
"message": "购买记录恢复成功",
|
||
"data": {
|
||
"restoredPurchases": [
|
||
{
|
||
"productId": "com.app.premium.monthly",
|
||
"transactionId": "1000000123456789",
|
||
"purchaseDate": "2024-01-15T10:30:00Z",
|
||
"expirationDate": "2024-02-15T10:30:00Z",
|
||
"entitlementId": "premium",
|
||
"store": "app_store"
|
||
}
|
||
],
|
||
"membershipExpiration": "2024-02-15T10:30:00Z",
|
||
"message": "成功恢复 1 个购买记录,会员有效期至 2024-02-15T10:30:00Z"
|
||
}
|
||
}
|
||
```
|
||
|
||
### 环境变量配置
|
||
|
||
需要在 `.env` 文件中配置以下 RevenueCat API 密钥:
|
||
|
||
```env
|
||
# RevenueCat 公开 API 密钥(用于读取用户信息)
|
||
REVENUECAT_PUBLIC_API_KEY=your_public_api_key_here
|
||
|
||
# RevenueCat 私密 API 密钥(用于用户关联,可选)
|
||
REVENUECAT_SECRET_API_KEY=your_secret_api_key_here
|
||
```
|
||
|
||
### 工作原理
|
||
|
||
1. **获取购买历史**: 通过 RevenueCat REST API 获取指定用户的购买历史
|
||
2. **解析购买记录**: 解析订阅和非续费购买,提取产品信息和过期时间
|
||
3. **更新用户状态**: 将最新的会员过期时间更新到当前用户
|
||
4. **用户关联**: 如果提供了不同的 RevenueCat 用户ID,会尝试进行用户关联
|
||
|
||
### 使用场景
|
||
|
||
- 用户更换设备后需要恢复购买
|
||
- 用户重新安装应用后需要恢复会员状态
|
||
- 用户使用不同的账号登录但想关联之前的购买
|
||
|
||
### 注意事项
|
||
|
||
- 需要确保 RevenueCat 项目已正确配置
|
||
- 公开 API 密钥用于读取用户信息,私密 API 密钥用于用户关联
|
||
- 恢复购买不会重复收费,只是将现有购买记录与当前账号关联 |