# 用户种子数据(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 作为主要方式