forked from datawhale/whale-town-end
5.9 KiB
5.9 KiB
Users 用户数据管理模块
Users 是应用的核心用户数据管理模块,提供完整的用户数据存储、查询、更新和删除功能,支持数据库和内存两种存储模式,具备统一的异常处理、日志记录和性能监控能力。
用户数据操作
create()
创建新用户记录,支持数据验证和唯一性检查。
createWithDuplicateCheck()
创建用户前进行完整的重复性检查,确保用户名、邮箱、手机号、GitHub ID的唯一性。
findAll()
分页查询所有用户,支持排序和软删除过滤。
findOne()
根据用户ID查询单个用户,支持包含已删除用户的查询。
findByUsername()
根据用户名查询用户,支持精确匹配查找。
findByEmail()
根据邮箱地址查询用户,用于登录验证和账户找回。
findByGithubId()
根据GitHub ID查询用户,支持第三方OAuth登录。
update()
更新用户信息,包含唯一性约束检查和数据验证。
remove()
物理删除用户记录,数据将从存储中永久移除。
softRemove()
软删除用户,设置删除时间戳但保留数据记录。
高级查询功能
search()
根据关键词在用户名和昵称中进行模糊搜索,支持大小写不敏感匹配。
findByRole()
根据用户角色查询用户列表,支持权限管理和用户分类。
createBatch()
批量创建用户,支持事务回滚和错误处理。
count()
统计用户数量,支持条件查询和数据分析。
exists()
检查用户是否存在,用于快速验证和业务逻辑判断。
使用的项目内部依赖
UserStatus (来自 business/user-mgmt/enums/user-status.enum)
用户状态枚举,定义用户的激活、禁用、待验证等状态值。
CreateUserDto (本模块)
用户创建数据传输对象,提供完整的数据验证规则和类型定义。
Users (本模块)
用户实体类,映射数据库表结构和字段约束。
BaseUsersService (本模块)
用户服务基类,提供统一的异常处理、日志记录和数据脱敏功能。
核心特性
双存储模式支持
- 数据库模式:使用TypeORM连接MySQL,适用于生产环境
- 内存模式:使用Map存储,适用于开发测试和故障降级
- 动态模块配置:通过UsersModule.forDatabase()和forMemory()灵活切换
完整的CRUD操作
- 支持用户的创建、查询、更新、删除全生命周期管理
- 提供批量操作和高级查询功能
- 软删除机制保护重要数据
数据完整性保障
- 唯一性约束检查:用户名、邮箱、手机号、GitHub ID
- 数据验证:使用class-validator进行输入验证
- 事务支持:批量操作支持回滚机制
统一异常处理
- 继承BaseUsersService的统一异常处理机制
- 详细的错误分类和用户友好的错误信息
- 完整的日志记录和性能监控
安全性设计
- 敏感信息脱敏:邮箱、手机号、密码哈希自动脱敏
- 软删除保护:重要数据支持软删除而非物理删除
- 并发安全:内存模式支持线程安全的ID生成
高性能优化
- 分页查询:支持limit和offset参数控制查询数量
- 索引优化:数据库模式支持索引加速查询
- 内存缓存:内存模式提供极高的查询性能
潜在风险
内存模式数据丢失
- 内存存储在应用重启后数据会丢失
- 不适用于生产环境的持久化需求
- 建议仅在开发测试环境使用
并发操作风险
- 内存模式的ID生成锁机制相对简单
- 高并发场景可能存在性能瓶颈
- 建议在生产环境使用数据库模式
数据一致性问题
- 双存储模式可能导致数据不一致
- 需要确保存储模式的正确选择和配置
- 建议在同一环境中保持存储模式一致
软删除数据累积
- 软删除的用户数据会持续累积
- 可能影响查询性能和存储空间
- 建议定期清理过期的软删除数据
唯一性约束冲突
- 用户名、邮箱等字段的唯一性约束可能导致创建失败
- 需要前端进行预检查和用户提示
- 建议提供友好的冲突解决方案
使用示例
// 创建用户
const newUser = await usersService.create({
username: 'testuser',
email: 'test@example.com',
nickname: '测试用户',
password_hash: 'hashed_password'
});
// 查询用户
const user = await usersService.findByEmail('test@example.com');
// 更新用户信息
const updatedUser = await usersService.update(user.id, {
nickname: '新昵称'
});
// 搜索用户
const searchResults = await usersService.search('测试', 10);
// 批量创建用户
const batchUsers = await usersService.createBatch([
{ username: 'user1', nickname: '用户1' },
{ username: 'user2', nickname: '用户2' }
]);
模块配置
// 数据库模式
@Module({
imports: [UsersModule.forDatabase()],
})
export class AppModule {}
// 内存模式
@Module({
imports: [UsersModule.forMemory()],
})
export class TestModule {}
版本信息
- 版本: 1.0.1
- 主要作者: moyin, angjustinl
- 创建时间: 2025-12-17
- 最后修改: 2026-01-08
- 测试覆盖: 完整的单元测试和集成测试覆盖
修改记录
- 2026-01-08: 代码风格优化 - 修复测试文件中的require语句转换为import语句并修复Mock问题 (修改者: moyin)
- 2026-01-07: 架构分层修正 - 修正Core层导入Business层的问题,确保依赖方向正确 (修改者: moyin)
- 2026-01-07: 代码质量提升 - 重构users_memory.service.ts的create方法,提取私有方法减少代码重复 (修改者: moyin)
已知问题和改进建议
内存服务限制
- 内存模式的
createWithDuplicateCheck方法已实现,与数据库模式保持一致 - ID生成使用简单锁机制,高并发场景建议使用数据库模式
模块配置建议
- 当前使用字符串token注入服务,建议考虑使用类型安全的注入方式
- 双存储模式切换时需要确保数据一致性