feat: 初始化项目

This commit is contained in:
richarjiang
2025-08-13 15:17:33 +08:00
commit 4f9d648a50
72 changed files with 29051 additions and 0 deletions

437
README.md Normal file
View File

@@ -0,0 +1,437 @@
# 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 密钥用于用户关联
- 恢复购买不会重复收费,只是将现有购买记录与当前账号关联