from sqlalchemy import Column, Integer, String, Boolean, DateTime, BigInteger, Text from sqlalchemy.orm import relationship from sqlalchemy.sql import func from app.core.database import Base class User(Base): __tablename__ = "users" id = Column(Integer, primary_key=True, index=True) username = Column(String(50), unique=True, index=True, nullable=False) email = Column(String(100), index=True, nullable=False) password_hash = Column(String(255), nullable=False) # 用户资料 avatar_url = Column(String(500), nullable=True) # 存储配额 storage_quota = Column(BigInteger, default=104857600) # 100MB in bytes storage_used = Column(BigInteger, default=0) # 用户状态 is_active = Column(Boolean, default=True) is_verified = Column(Boolean, default=False) # 时间戳 last_login_at = Column(DateTime(timezone=True), nullable=True) created_at = Column(DateTime(timezone=True), server_default=func.now()) updated_at = Column(DateTime(timezone=True), server_default=func.now(), onupdate=func.now()) # 关联关系 files = relationship("File", back_populates="user") def __repr__(self): return f"" def to_dict(self): return { "id": self.id, "username": self.username, "email": self.email, "avatar_url": self.avatar_url, "storage_quota": self.storage_quota, "storage_used": self.storage_used, "is_active": self.is_active, "is_verified": self.is_verified, "last_login_at": self.last_login_at.isoformat() if self.last_login_at else None, "created_at": self.created_at.isoformat() if self.created_at else None, "updated_at": self.updated_at.isoformat() if self.updated_at else None, } def is_storage_available(self, required_size: int) -> bool: """检查是否有足够的存储空间""" return (self.storage_used + required_size) <= self.storage_quota def get_storage_percentage(self) -> float: """获取已使用存储空间的百分比""" if self.storage_quota == 0: return 0.0 return (self.storage_used / self.storage_quota) * 100