| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- from datetime import datetime
- from zoneinfo import ZoneInfo
- from app.constants import UserRole, UserStatus
- from app.models import db
- class User(db.Model):
- """
- 用户模型类,表示数据库中的 'user' 表。
- 该类存储用户的基本信息,包括用户名、邮箱、密码(加密存储)、角色、状态等。
- 用户可以是不同的角色(管理员、开发者、普通用户),并且支持多个外键关联,
- 如模型、媒体文件、检测分割记录和系统操作等。
- Attributes:
- user_id (int): 用户的唯一标识符(主键)。自动递增。
- username (str): 用户名,必须唯一,不能为空。
- email (str): 用户的邮箱,必须唯一,不能为空。
- password (str): 用户的密码,经过加密存储,不能为空。
- first_name (str): 用户的名字(可选)。
- last_name (str): 用户的姓氏(可选)。
- role (str): 用户的角色,使用枚举类型('admin', 'developer', 'user'),默认是 'user'。
- avatar_path (str): 用户头像的存储路径(可选)。
- phone (str): 用户的手机号,必须唯一(可选)。
- last_login (datetime): 用户最后一次登录的时间(可选)。
- status (str): 用户的状态,使用枚举类型('active', 'inactive', 'banned'),默认是 'active'。
- created_at (datetime): 用户记录的创建时间,自动生成。
- updated_at (datetime): 用户记录的最后更新时间,自动更新。
- deleted_at (datetime): 用户记录的注销时间(可选)。
- Relationships:
- models (Model): 一个用户可以拥有多个模型(反向关系,表示用户的模型)。
- medias (Media): 一个用户可以拥有多个媒体文件(反向关系,表示用户的媒体文件)。
- detections (Detection): 一个用户可以有多个检测分割记录(反向关系,表示用户的检测任务)。
- operations (Operation): 一个用户可以执行多个操作(反向关系,表示用户的操作记录)。
- """
- __tablename__ = 'user' # 表名
- user_id = db.Column(db.Integer, primary_key=True, autoincrement=True) # 用户 ID
- username = db.Column(db.String(255), unique=True, nullable=False) # 用户名,唯一
- email = db.Column(db.String(255), unique=True, nullable=False) # 用户邮箱,唯一
- password = db.Column(db.String(255), nullable=False) # 密码(加密)
- first_name = db.Column(db.String(100), default="名字") # 名字
- last_name = db.Column(db.String(100), default="姓氏") # 姓氏
- role = db.Column(db.Enum(UserRole), default=UserRole.USER, nullable=False) # 用户角色
- avatar_path = db.Column(db.String(255)) # 头像路径
- phone = db.Column(db.String(20), unique=True) # 手机号
- last_login = db.Column(db.DateTime) # 最后登录时间
- status = db.Column(db.Enum(UserStatus), default=UserStatus.INACTIVE, nullable=False) # 用户状态
- created_at = db.Column(db.DateTime, default=lambda: datetime.now(ZoneInfo("Asia/Shanghai"))) # 用户创建时间
- updated_at = db.Column(db.DateTime, default=lambda: datetime.now(ZoneInfo("Asia/Shanghai")),
- onupdate=lambda: datetime.now(ZoneInfo("Asia/Shanghai"))) # 最后更新时间
- deleted_at = db.Column(db.DateTime, nullable=True) # 用户注销时间
- def __repr__(self):
- return (f"User(user_id={self.user_id}, "
- f"username='{self.username}', "
- f"email='{self.email}', "
- f"first_name='{self.first_name}', "
- f"last_name='{self.last_name}', "
- f"role='{self.role.name}', "
- f"avatar_path='{self.avatar_path}', "
- f"phone='{self.phone}', "
- f"last_login={self.last_login}, "
- f"status='{self.status.name}', "
- f"created_at={self.created_at}, "
- f"updated_at={self.updated_at}, "
- f"deleted_at={self.deleted_at})")
- def to_dict(self):
- """
- 将 User 实例转化为字典。
- """
- return {
- 'user_id': self.user_id,
- 'username': self.username,
- 'email': self.email,
- 'first_name': self.first_name,
- 'last_name': self.last_name,
- 'role': self.role.name,
- 'avatar_path': self.avatar_path,
- 'phone': self.phone,
- 'last_login': self.last_login,
- 'status': self.status.name,
- 'created_at': self.created_at,
- 'updated_at': self.updated_at,
- 'deleted_at': self.deleted_at
- }
|