218 lines
5.8 KiB
TypeScript
218 lines
5.8 KiB
TypeScript
/**
|
||
* 用户数据传输对象模块
|
||
*
|
||
* 功能描述:
|
||
* - 定义用户创建和更新的数据传输对象
|
||
* - 提供完整的数据验证规则和错误提示
|
||
* - 支持多种登录方式的数据格式验证
|
||
*
|
||
* 依赖模块:
|
||
* - class-validator: 数据验证装饰器
|
||
* - class-transformer: 数据转换工具
|
||
*
|
||
* @author moyin
|
||
* @version 1.0.0
|
||
* @since 2025-12-17
|
||
*/
|
||
|
||
import {
|
||
IsString,
|
||
IsEmail,
|
||
IsPhoneNumber,
|
||
IsInt,
|
||
Min,
|
||
Max,
|
||
IsOptional,
|
||
Length,
|
||
IsNotEmpty
|
||
} from 'class-validator';
|
||
|
||
/**
|
||
* 创建用户数据传输对象
|
||
*
|
||
* 职责:
|
||
* - 定义用户创建时的数据结构和验证规则
|
||
* - 确保输入数据的格式正确性和业务规则符合性
|
||
* - 提供友好的错误提示信息
|
||
*
|
||
* 主要字段:
|
||
* - username: 唯一用户名,用于登录识别
|
||
* - email: 邮箱地址,用于通知和账户找回
|
||
* - phone: 手机号码,支持全球格式
|
||
* - password_hash: 密码哈希值,OAuth登录时可为空
|
||
* - nickname: 显示昵称,在游戏中展示
|
||
* - github_id: GitHub第三方登录标识
|
||
* - avatar_url: 用户头像链接
|
||
* - role: 用户角色,控制权限级别
|
||
*
|
||
* 使用场景:
|
||
* - 用户注册接口的请求体验证
|
||
* - 管理员创建用户的数据验证
|
||
* - 第三方登录用户信息同步
|
||
*
|
||
* 验证规则:
|
||
* - 必填字段:username, nickname
|
||
* - 唯一性字段:username, email, phone, github_id
|
||
* - 长度限制:username(1-50), nickname(1-50), github_id(1-100)
|
||
* - 格式验证:email格式, phone国际格式
|
||
* - 数值范围:role(1-9)
|
||
*/
|
||
export class CreateUserDto {
|
||
/**
|
||
* 用户名
|
||
*
|
||
* 业务规则:
|
||
* - 必填字段,用于用户登录和唯一标识
|
||
* - 长度限制:1-50个字符
|
||
* - 全局唯一性:不允许重复
|
||
* - 建议使用字母、数字、下划线组合
|
||
*
|
||
* 验证规则:
|
||
* - 非空验证:确保用户名不为空
|
||
* - 字符串类型验证
|
||
* - 长度范围验证:1-50字符
|
||
*/
|
||
@IsString()
|
||
@IsNotEmpty({ message: '用户名不能为空' })
|
||
@Length(1, 50, { message: '用户名长度需在1-50字符之间' })
|
||
username: string;
|
||
|
||
/**
|
||
* 邮箱地址
|
||
*
|
||
* 业务规则:
|
||
* - 可选字段,用于账户找回和通知
|
||
* - 全局唯一性:不允许重复
|
||
* - 支持标准邮箱格式验证
|
||
* - OAuth登录时可能为空
|
||
*
|
||
* 验证规则:
|
||
* - 可选字段验证
|
||
* - 邮箱格式验证:符合RFC标准
|
||
* - 长度限制:最大100字符(数据库约束)
|
||
*/
|
||
@IsOptional()
|
||
@IsEmail({}, { message: '邮箱格式不正确' })
|
||
email?: string;
|
||
|
||
/**
|
||
* 手机号码
|
||
*
|
||
* 业务规则:
|
||
* - 可选字段,用于账户找回和通知
|
||
* - 全局唯一性:不允许重复
|
||
* - 支持国际手机号格式
|
||
* - 用于短信验证和双因子认证
|
||
*
|
||
* 验证规则:
|
||
* - 可选字段验证
|
||
* - 国际手机号格式验证
|
||
* - 长度限制:最大30字符(数据库约束)
|
||
*/
|
||
@IsOptional()
|
||
@IsPhoneNumber(null, { message: '手机号格式不正确' })
|
||
phone?: string;
|
||
|
||
/**
|
||
* 密码哈希值
|
||
*
|
||
* 业务规则:
|
||
* - 可选字段,OAuth登录时为空
|
||
* - 存储加密后的密码,不存储明文
|
||
* - 用于传统用户名密码登录方式
|
||
* - 应使用bcrypt等安全哈希算法
|
||
*
|
||
* 验证规则:
|
||
* - 可选字段验证
|
||
* - 字符串类型验证
|
||
* - 长度限制:最大255字符(数据库约束)
|
||
*
|
||
* 安全注意:
|
||
* - 传输过程中应使用HTTPS
|
||
* - 日志记录时会自动脱敏处理
|
||
*/
|
||
@IsOptional()
|
||
@IsString({ message: '密码哈希必须是字符串' })
|
||
password_hash?: string;
|
||
|
||
/**
|
||
* 用户昵称
|
||
*
|
||
* 业务规则:
|
||
* - 必填字段,用于游戏内显示
|
||
* - 长度限制:1-50个字符
|
||
* - 支持中文、英文、数字等字符
|
||
* - 可以与用户名不同,更友好的显示名称
|
||
*
|
||
* 验证规则:
|
||
* - 非空验证:确保昵称不为空
|
||
* - 字符串类型验证
|
||
* - 长度范围验证:1-50字符
|
||
*/
|
||
@IsString()
|
||
@IsNotEmpty({ message: '昵称不能为空' })
|
||
@Length(1, 50, { message: '昵称长度需在1-50字符之间' })
|
||
nickname: string;
|
||
|
||
/**
|
||
* GitHub用户标识
|
||
*
|
||
* 业务规则:
|
||
* - 可选字段,用于GitHub OAuth登录
|
||
* - 全局唯一性:不允许重复
|
||
* - 存储GitHub用户的唯一标识符
|
||
* - 用于关联GitHub账户信息
|
||
*
|
||
* 验证规则:
|
||
* - 可选字段验证
|
||
* - 字符串类型验证
|
||
* - 长度范围验证:1-100字符
|
||
*/
|
||
@IsOptional()
|
||
@IsString({ message: 'GitHub ID必须是字符串' })
|
||
@Length(1, 100, { message: 'GitHub ID长度需在1-100字符之间' })
|
||
github_id?: string;
|
||
|
||
/**
|
||
* 用户头像链接
|
||
*
|
||
* 业务规则:
|
||
* - 可选字段,用于显示用户头像
|
||
* - 支持GitHub头像或自定义头像
|
||
* - 应为有效的HTTP/HTTPS链接
|
||
* - 建议使用CDN加速访问
|
||
*
|
||
* 验证规则:
|
||
* - 可选字段验证
|
||
* - 字符串类型验证
|
||
* - 长度限制:最大255字符(数据库约束)
|
||
*/
|
||
@IsOptional()
|
||
@IsString({ message: '头像URL必须是字符串' })
|
||
avatar_url?: string;
|
||
|
||
/**
|
||
* 用户角色
|
||
*
|
||
* 业务规则:
|
||
* - 可选字段,默认为普通用户(1)
|
||
* - 角色级别:1-普通用户,9-管理员
|
||
* - 控制用户在系统中的权限范围
|
||
* - 管理员具有系统管理权限
|
||
*
|
||
* 验证规则:
|
||
* - 可选字段验证
|
||
* - 整数类型验证
|
||
* - 数值范围验证:1-9之间
|
||
* - 默认值:1(普通用户)
|
||
*
|
||
* 权限说明:
|
||
* - 1: 普通用户 - 基础游戏功能
|
||
* - 9: 管理员 - 系统管理权限
|
||
*/
|
||
@IsOptional()
|
||
@IsInt({ message: '角色必须是数字' })
|
||
@Min(1, { message: '角色值最小为1' })
|
||
@Max(9, { message: '角色值最大为9' })
|
||
role?: number = 1;
|
||
} |