user.py 4.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. from datetime import datetime
  2. from zoneinfo import ZoneInfo
  3. from app.constants import UserRole, UserStatus
  4. from app.models import db
  5. class User(db.Model):
  6. """
  7. 用户模型类,表示数据库中的 'user' 表。
  8. 该类存储用户的基本信息,包括用户名、邮箱、密码(加密存储)、角色、状态等。
  9. 用户可以是不同的角色(管理员、开发者、普通用户),并且支持多个外键关联,
  10. 如模型、媒体文件、检测分割记录和系统操作等。
  11. Attributes:
  12. user_id (int): 用户的唯一标识符(主键)。自动递增。
  13. username (str): 用户名,必须唯一,不能为空。
  14. email (str): 用户的邮箱,必须唯一,不能为空。
  15. password (str): 用户的密码,经过加密存储,不能为空。
  16. first_name (str): 用户的名字(可选)。
  17. last_name (str): 用户的姓氏(可选)。
  18. role (str): 用户的角色,使用枚举类型('admin', 'developer', 'user'),默认是 'user'。
  19. avatar_path (str): 用户头像的存储路径(可选)。
  20. phone (str): 用户的手机号,必须唯一(可选)。
  21. last_login (datetime): 用户最后一次登录的时间(可选)。
  22. status (str): 用户的状态,使用枚举类型('active', 'inactive', 'banned'),默认是 'active'。
  23. created_at (datetime): 用户记录的创建时间,自动生成。
  24. updated_at (datetime): 用户记录的最后更新时间,自动更新。
  25. deleted_at (datetime): 用户记录的注销时间(可选)。
  26. Relationships:
  27. models (Model): 一个用户可以拥有多个模型(反向关系,表示用户的模型)。
  28. medias (Media): 一个用户可以拥有多个媒体文件(反向关系,表示用户的媒体文件)。
  29. detections (Detection): 一个用户可以有多个检测分割记录(反向关系,表示用户的检测任务)。
  30. operations (Operation): 一个用户可以执行多个操作(反向关系,表示用户的操作记录)。
  31. """
  32. __tablename__ = 'user' # 表名
  33. user_id = db.Column(db.Integer, primary_key=True, autoincrement=True) # 用户 ID
  34. username = db.Column(db.String(255), unique=True, nullable=False) # 用户名,唯一
  35. email = db.Column(db.String(255), unique=True, nullable=False) # 用户邮箱,唯一
  36. password = db.Column(db.String(255), nullable=False) # 密码(加密)
  37. first_name = db.Column(db.String(100), default="名字") # 名字
  38. last_name = db.Column(db.String(100), default="姓氏") # 姓氏
  39. role = db.Column(db.Enum(UserRole), default=UserRole.USER, nullable=False) # 用户角色
  40. avatar_path = db.Column(db.String(255)) # 头像路径
  41. phone = db.Column(db.String(20), unique=True) # 手机号
  42. last_login = db.Column(db.DateTime) # 最后登录时间
  43. status = db.Column(db.Enum(UserStatus), default=UserStatus.INACTIVE, nullable=False) # 用户状态
  44. created_at = db.Column(db.DateTime, default=lambda: datetime.now(ZoneInfo("Asia/Shanghai"))) # 用户创建时间
  45. updated_at = db.Column(db.DateTime, default=lambda: datetime.now(ZoneInfo("Asia/Shanghai")),
  46. onupdate=lambda: datetime.now(ZoneInfo("Asia/Shanghai"))) # 最后更新时间
  47. deleted_at = db.Column(db.DateTime, nullable=True) # 用户注销时间
  48. def __repr__(self):
  49. return (f"User(user_id={self.user_id}, "
  50. f"username='{self.username}', "
  51. f"email='{self.email}', "
  52. f"first_name='{self.first_name}', "
  53. f"last_name='{self.last_name}', "
  54. f"role='{self.role.name}', "
  55. f"avatar_path='{self.avatar_path}', "
  56. f"phone='{self.phone}', "
  57. f"last_login={self.last_login}, "
  58. f"status='{self.status.name}', "
  59. f"created_at={self.created_at}, "
  60. f"updated_at={self.updated_at}, "
  61. f"deleted_at={self.deleted_at})")
  62. def to_dict(self):
  63. """
  64. 将 User 实例转化为字典。
  65. """
  66. return {
  67. 'user_id': self.user_id,
  68. 'username': self.username,
  69. 'email': self.email,
  70. 'first_name': self.first_name,
  71. 'last_name': self.last_name,
  72. 'role': self.role.name,
  73. 'avatar_path': self.avatar_path,
  74. 'phone': self.phone,
  75. 'last_login': self.last_login,
  76. 'status': self.status.name,
  77. 'created_at': self.created_at,
  78. 'updated_at': self.updated_at,
  79. 'deleted_at': self.deleted_at
  80. }