40 lines
2.1 KiB
Python
40 lines
2.1 KiB
Python
"""用户模型"""
|
|
|
|
from datetime import datetime, timezone
|
|
|
|
from sqlalchemy import String, Boolean, DateTime, Text
|
|
from sqlalchemy.orm import Mapped, mapped_column, relationship
|
|
|
|
from app.database import Base
|
|
|
|
|
|
class User(Base):
|
|
__tablename__ = "users"
|
|
|
|
id: Mapped[str] = mapped_column(String(36), primary_key=True)
|
|
username: Mapped[str] = mapped_column(String(50), unique=True, nullable=False, index=True)
|
|
nickname: Mapped[str | None] = mapped_column(String(50), nullable=True)
|
|
email: Mapped[str] = mapped_column(String(255), unique=True, nullable=False, index=True)
|
|
password_hash: Mapped[str] = mapped_column(String(255), nullable=False)
|
|
avatar_url: Mapped[str | None] = mapped_column(String(500), nullable=True)
|
|
bio: Mapped[str | None] = mapped_column(String(200), nullable=True)
|
|
status: Mapped[str] = mapped_column(String(20), default="offline") # online/offline/away
|
|
is_admin: Mapped[bool] = mapped_column(Boolean, default=False)
|
|
is_banned: Mapped[bool] = mapped_column(Boolean, default=False)
|
|
banned_reason: Mapped[str | None] = mapped_column(String(500), nullable=True)
|
|
last_seen_at: Mapped[datetime | None] = mapped_column(DateTime, nullable=True)
|
|
created_at: Mapped[datetime] = mapped_column(DateTime, default=lambda: datetime.utcnow())
|
|
updated_at: Mapped[datetime] = mapped_column(
|
|
DateTime,
|
|
default=lambda: datetime.utcnow(),
|
|
onupdate=lambda: datetime.utcnow(),
|
|
)
|
|
|
|
# 关系
|
|
sent_messages = relationship("Message", back_populates="sender", foreign_keys="Message.sender_id")
|
|
conversations = relationship("ConversationMember", back_populates="user")
|
|
friends = relationship("Friend", foreign_keys="Friend.user_id", back_populates="user")
|
|
friend_of = relationship("Friend", foreign_keys="Friend.friend_user_id", back_populates="friend_user")
|
|
sent_requests = relationship("FriendRequest", foreign_keys="FriendRequest.from_user_id", back_populates="from_user")
|
|
received_requests = relationship("FriendRequest", foreign_keys="FriendRequest.to_user_id", back_populates="to_user")
|