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 }