feat: 初始化web项目,接口创建种子用户
This commit is contained in:
231
apps/api/src/modules/user/README-SEEDER.md
Normal file
231
apps/api/src/modules/user/README-SEEDER.md
Normal file
@@ -0,0 +1,231 @@
|
||||
# 用户种子数据(Seeder)使用说明
|
||||
|
||||
## 概述
|
||||
|
||||
本项目提供了两种创建初始管理员用户的方式:
|
||||
|
||||
1. **SQL 脚本方式** (`init-admin-user.sql`) - 手动执行 SQL
|
||||
2. **Seeder 方式** (`user.seeder.ts`) - 应用启动时自动执行(推荐)
|
||||
|
||||
## 方式对比
|
||||
|
||||
### SQL 脚本方式
|
||||
|
||||
**优点:**
|
||||
|
||||
- ✅ 简单直接,适合快速初始化
|
||||
- ✅ 不依赖应用代码,可以在应用启动前执行
|
||||
- ✅ 适合数据库迁移场景
|
||||
- ✅ 可以批量创建多个用户
|
||||
|
||||
**缺点:**
|
||||
|
||||
- ❌ 需要手动执行,容易忘记
|
||||
- ❌ 密码哈希需要提前生成
|
||||
- ❌ 不便于版本控制(如果修改需要更新 SQL)
|
||||
- ❌ 无法使用业务逻辑验证
|
||||
|
||||
**适用场景:**
|
||||
|
||||
- 数据库迁移脚本
|
||||
- 一次性初始化
|
||||
- 生产环境手动创建用户
|
||||
|
||||
### Seeder 方式(推荐)
|
||||
|
||||
**优点:**
|
||||
|
||||
- ✅ 代码化管理,版本控制友好
|
||||
- ✅ 自动执行,无需手动操作
|
||||
- ✅ 可以使用业务逻辑(密码加密、验证等)
|
||||
- ✅ 环境变量配置,灵活性强
|
||||
- ✅ 幂等性:如果用户已存在,不会重复创建
|
||||
- ✅ 可以集成到 CI/CD 流程
|
||||
|
||||
**缺点:**
|
||||
|
||||
- ❌ 需要应用启动后才能执行
|
||||
- ❌ 如果应用启动失败,无法创建用户
|
||||
|
||||
**适用场景:**
|
||||
|
||||
- 开发/测试环境自动初始化
|
||||
- 新环境部署
|
||||
- 需要动态配置的场景
|
||||
|
||||
## 使用方式
|
||||
|
||||
### 方式1:Seeder 自动创建(推荐)
|
||||
|
||||
#### 1. 配置环境变量
|
||||
|
||||
在 `.env` 或 `.env.development` 文件中添加:
|
||||
|
||||
```env
|
||||
# 启用用户种子数据(生产环境默认关闭)
|
||||
ENABLE_USER_SEEDER=true
|
||||
|
||||
# 管理员用户配置(可选,有默认值)
|
||||
ADMIN_USERNAME=admin
|
||||
ADMIN_PASSWORD=admin123
|
||||
ADMIN_EMAIL=admin@vestmind.com
|
||||
ADMIN_NICKNAME=系统管理员
|
||||
ADMIN_ROLE=admin
|
||||
```
|
||||
|
||||
#### 2. 确保 UserSeeder 已注册
|
||||
|
||||
在 `user.module.ts` 中,`UserSeeder` 应该已经在 `providers` 中:
|
||||
|
||||
```typescript
|
||||
@Module({
|
||||
imports: [TypeOrmModule.forFeature([User])],
|
||||
providers: [UserService, UserSeeder], // 确保包含 UserSeeder
|
||||
// ...
|
||||
})
|
||||
```
|
||||
|
||||
#### 3. 启动应用
|
||||
|
||||
```bash
|
||||
pnpm start:dev
|
||||
```
|
||||
|
||||
应用启动时会自动检查并创建管理员用户(如果不存在)。
|
||||
|
||||
### 方式2:SQL 脚本手动创建
|
||||
|
||||
#### 1. 生成密码哈希(如果需要修改密码)
|
||||
|
||||
```bash
|
||||
node src/modules/user/generate-password-hash.js your_password
|
||||
```
|
||||
|
||||
#### 2. 修改 SQL 文件
|
||||
|
||||
编辑 `init-admin-user.sql`,更新密码哈希值。
|
||||
|
||||
#### 3. 执行 SQL
|
||||
|
||||
```bash
|
||||
psql -U postgres -d your_database -f src/modules/user/init-admin-user.sql
|
||||
```
|
||||
|
||||
## 环境配置说明
|
||||
|
||||
### 开发环境
|
||||
|
||||
```env
|
||||
# .env.development
|
||||
ENABLE_USER_SEEDER=true
|
||||
ADMIN_USERNAME=admin
|
||||
ADMIN_PASSWORD=admin123
|
||||
ADMIN_EMAIL=admin@vestmind.com
|
||||
```
|
||||
|
||||
### 测试环境
|
||||
|
||||
```env
|
||||
# .env.test
|
||||
ENABLE_USER_SEEDER=true
|
||||
ADMIN_USERNAME=test_admin
|
||||
ADMIN_PASSWORD=test_password_123
|
||||
ADMIN_EMAIL=test@vestmind.com
|
||||
```
|
||||
|
||||
### 生产环境
|
||||
|
||||
**推荐做法:**
|
||||
|
||||
1. **方式1:手动创建(最安全)**
|
||||
- 使用 SQL 脚本手动创建
|
||||
- 或通过管理后台创建
|
||||
- 不启用自动 Seeder
|
||||
|
||||
2. **方式2:首次部署时启用**
|
||||
```env
|
||||
# .env.production(仅首次部署时)
|
||||
ENABLE_USER_SEEDER=true
|
||||
ADMIN_PASSWORD=强密码
|
||||
```
|
||||
创建完成后,移除 `ENABLE_USER_SEEDER` 或设置为 `false`
|
||||
|
||||
## 最佳实践建议
|
||||
|
||||
### 1. 开发环境
|
||||
|
||||
- ✅ 使用 Seeder 自动创建
|
||||
- ✅ 使用简单的默认密码(如 admin123)
|
||||
- ✅ 在 README 中说明默认账号密码
|
||||
|
||||
### 2. 测试环境
|
||||
|
||||
- ✅ 使用 Seeder 自动创建
|
||||
- ✅ 使用测试专用的账号密码
|
||||
- ✅ 可以通过环境变量灵活配置
|
||||
|
||||
### 3. 生产环境
|
||||
|
||||
- ⚠️ **不推荐**自动创建(安全考虑)
|
||||
- ✅ 使用 SQL 脚本手动创建
|
||||
- ✅ 或通过管理后台首次创建
|
||||
- ✅ 使用强密码
|
||||
- ✅ 创建后立即修改密码
|
||||
|
||||
### 4. Docker/容器部署
|
||||
|
||||
- ✅ 可以在启动脚本中执行 SQL
|
||||
- ✅ 或使用初始化容器执行 Seeder
|
||||
- ✅ 确保只执行一次(幂等性)
|
||||
|
||||
## 安全建议
|
||||
|
||||
1. **密码安全**
|
||||
- 生产环境必须使用强密码
|
||||
- 不要在代码中硬编码密码
|
||||
- 使用环境变量或密钥管理服务
|
||||
|
||||
2. **权限控制**
|
||||
- 生产环境默认不启用自动创建
|
||||
- 通过环境变量显式控制
|
||||
|
||||
3. **审计日志**
|
||||
- 记录管理员用户的创建时间
|
||||
- 记录创建来源(Seeder/SQL/手动)
|
||||
|
||||
4. **定期检查**
|
||||
- 定期检查管理员账号
|
||||
- 删除未使用的测试账号
|
||||
|
||||
## 故障排查
|
||||
|
||||
### Seeder 未执行
|
||||
|
||||
1. 检查 `UserSeeder` 是否在 `user.module.ts` 的 `providers` 中
|
||||
2. 检查环境变量 `ENABLE_USER_SEEDER` 是否设置为 `true`
|
||||
3. 检查日志输出,查看是否有错误信息
|
||||
|
||||
### 用户已存在但想重新创建
|
||||
|
||||
1. 删除现有用户:
|
||||
```sql
|
||||
DELETE FROM "users" WHERE username = 'admin';
|
||||
```
|
||||
2. 重启应用,Seeder 会自动创建
|
||||
|
||||
### 修改管理员密码
|
||||
|
||||
1. 使用 `generate-password-hash.js` 生成新密码哈希
|
||||
2. 更新数据库:
|
||||
```sql
|
||||
UPDATE "users"
|
||||
SET password_hash = '$2b$10$新的哈希值',
|
||||
updated_at = NOW()
|
||||
WHERE username = 'admin';
|
||||
```
|
||||
|
||||
## 总结
|
||||
|
||||
- **开发/测试环境**:推荐使用 Seeder,自动化程度高
|
||||
- **生产环境**:推荐使用 SQL 脚本或管理后台,更安全可控
|
||||
- **两种方式可以并存**:SQL 作为备用方案,Seeder 作为主要方式
|
||||
Reference in New Issue
Block a user