Coverage for core/models/user.py: 92.31%

65 statements  

« prev     ^ index     » next       coverage.py v7.10.7, created at 2025-10-13 18:58 +0000

1""" 

2用户数据模型 

3""" 

4 

5from datetime import datetime 

6from enum import Enum 

7from typing import Optional 

8 

9from pydantic import BaseModel, Field, field_validator 

10 

11 

12class UserType(str, Enum): 

13 """用户类型枚举""" 

14 

15 ADMIN = "admin" 

16 USER = "user" 

17 

18 

19class UserStatus(str, Enum): 

20 """用户状态枚举""" 

21 

22 ACTIVE = "active" 

23 INACTIVE = "inactive" 

24 SUSPENDED = "suspended" 

25 

26 

27class UserBase(BaseModel): 

28 """用户基础模型""" 

29 

30 username: str = Field(..., min_length=3, max_length=50, description="用户名") 

31 email: str = Field(..., description="邮箱") 

32 phone: Optional[str] = Field(None, description="手机号") 

33 user_type: UserType = Field(default=UserType.USER, description="用户类型") 

34 status: UserStatus = Field(default=UserStatus.ACTIVE, description="用户状态") 

35 

36 

37class UserCreate(UserBase): 

38 """创建用户模型""" 

39 

40 password: str = Field(..., min_length=6, description="密码") 

41 

42 

43class UserUpdate(BaseModel): 

44 """更新用户模型""" 

45 

46 username: Optional[str] = Field(None, min_length=3, max_length=50) 

47 email: Optional[str] = None 

48 phone: Optional[str] = None 

49 user_type: Optional[UserType] = None 

50 status: Optional[UserStatus] = None 

51 password: Optional[str] = Field(None, description="密码(留空表示不修改)") 

52 

53 @field_validator("password") 

54 @classmethod 

55 def validate_password(cls, v): 

56 """验证密码字段,允许空字符串和None""" 

57 if v is None or v == "": 

58 return None 

59 if len(v) < 6: 

60 raise ValueError("密码长度至少6位") 

61 return v 

62 

63 

64class User(UserBase): 

65 """用户模型""" 

66 

67 id: str = Field(..., description="用户ID") 

68 created_at: datetime = Field(..., description="创建时间") 

69 updated_at: datetime = Field(..., description="更新时间") 

70 

71 class Config: 

72 from_attributes = True 

73 

74 

75class UserResponse(User): 

76 """用户响应模型(不包含密码)""" 

77 

78 pass 

79 

80 

81class LoginRequest(BaseModel): 

82 """登录请求模型""" 

83 

84 username: str = Field(..., description="用户名") 

85 password: str = Field(..., description="密码") 

86 captcha: str = Field(..., description="验证码") 

87 

88 

89class LoginResponse(BaseModel): 

90 """登录响应模型""" 

91 

92 access_token: str = Field(..., description="访问令牌") 

93 token_type: str = Field(default="bearer", description="令牌类型") 

94 user: UserResponse = Field(..., description="用户信息") 

95 

96 

97class AccountBase(BaseModel): 

98 """账户基础模型""" 

99 

100 account_type: str = Field(..., description="账户类型") 

101 balance: float = Field(default=0.0, description="账户余额") 

102 available_balance: float = Field(default=0.0, description="可用余额") 

103 frozen_balance: float = Field(default=0.0, description="冻结余额") 

104 currency: str = Field(default="CNY", description="货币类型") 

105 

106 

107class AccountCreate(AccountBase): 

108 """创建账户模型""" 

109 

110 user_id: str = Field(..., description="用户ID") 

111 

112 

113class Account(AccountBase): 

114 """账户模型""" 

115 

116 id: str = Field(..., description="账户ID") 

117 user_id: str = Field(..., description="用户ID") 

118 created_at: datetime = Field(..., description="创建时间") 

119 updated_at: datetime = Field(..., description="更新时间") 

120 

121 class Config: 

122 from_attributes = True