Files
chat/backend/app/models/user.py
T
2026-06-14 11:16:42 +08:00

44 lines
2.5 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 (presence)
custom_status: Mapped[str | None] = mapped_column(String(50), nullable=True) # 个人心情状态文字
status_emoji: Mapped[str | None] = mapped_column(String(10), nullable=True) # 心情 emoji
status_expires_at: Mapped[datetime | None] = mapped_column(DateTime, nullable=True) # 状态到期自动清空
email_verified: Mapped[bool] = mapped_column(Boolean, default=False) # 邮箱是否已验证
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")