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
« prev ^ index » next coverage.py v7.10.7, created at 2025-10-13 18:58 +0000
1"""
2用户数据模型
3"""
5from datetime import datetime
6from enum import Enum
7from typing import Optional
9from pydantic import BaseModel, Field, field_validator
12class UserType(str, Enum):
13 """用户类型枚举"""
15 ADMIN = "admin"
16 USER = "user"
19class UserStatus(str, Enum):
20 """用户状态枚举"""
22 ACTIVE = "active"
23 INACTIVE = "inactive"
24 SUSPENDED = "suspended"
27class UserBase(BaseModel):
28 """用户基础模型"""
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="用户状态")
37class UserCreate(UserBase):
38 """创建用户模型"""
40 password: str = Field(..., min_length=6, description="密码")
43class UserUpdate(BaseModel):
44 """更新用户模型"""
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="密码(留空表示不修改)")
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
64class User(UserBase):
65 """用户模型"""
67 id: str = Field(..., description="用户ID")
68 created_at: datetime = Field(..., description="创建时间")
69 updated_at: datetime = Field(..., description="更新时间")
71 class Config:
72 from_attributes = True
75class UserResponse(User):
76 """用户响应模型(不包含密码)"""
78 pass
81class LoginRequest(BaseModel):
82 """登录请求模型"""
84 username: str = Field(..., description="用户名")
85 password: str = Field(..., description="密码")
86 captcha: str = Field(..., description="验证码")
89class LoginResponse(BaseModel):
90 """登录响应模型"""
92 access_token: str = Field(..., description="访问令牌")
93 token_type: str = Field(default="bearer", description="令牌类型")
94 user: UserResponse = Field(..., description="用户信息")
97class AccountBase(BaseModel):
98 """账户基础模型"""
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="货币类型")
107class AccountCreate(AccountBase):
108 """创建账户模型"""
110 user_id: str = Field(..., description="用户ID")
113class Account(AccountBase):
114 """账户模型"""
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="更新时间")
121 class Config:
122 from_attributes = True