feat(database): 新增用户资料相关数据模型和处理逻辑

- 新增 LazerUserProfileSections、LazerUserBanners、LazerUserBadge、LazerUserMonthlyPlaycounts、LazerUserPreviousUsername 和 LazerUserReplaysWatched 数据模型- 更新 User 数据模型,添加与新模型的关联关系
- 修改 convert_db_user_to_api_user 函数,支持新数据模型的处理- 完善 MockProfile 类,添加新模型的默认值和辅助方法
This commit is contained in:
jimmy-sketch
2025-07-19 20:43:36 +08:00
parent 757166b665
commit 91f15d572d
2 changed files with 213 additions and 27 deletions

View File

@@ -1,5 +1,5 @@
from sqlalchemy import Column, Integer, String, Boolean, DateTime, Float, Text, JSON, ForeignKey, Date, DECIMAL
from sqlalchemy.dialects.mysql import VARCHAR
from sqlalchemy.dialects.mysql import VARCHAR, TINYINT
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship
from datetime import datetime
@@ -62,14 +62,18 @@ class User(Base):
lazer_profile = relationship("LazerUserProfile", back_populates="user", uselist=False, cascade="all, delete-orphan")
lazer_statistics = relationship("LazerUserStatistics", back_populates="user", cascade="all, delete-orphan")
lazer_achievements = relationship("LazerUserAchievement", back_populates="user", cascade="all, delete-orphan")
lazer_profile_order=relationship("LazerUserProfileOrder", back_populates="user", cascade="all, delete-orphan")
lazer_profile_sections=relationship("LazerUserProfileSection", back_populates="user", cascade="all, delete-orphan")
statistics = relationship("LegacyUserStatistics", back_populates="user", cascade="all, delete-orphan")
achievements = relationship("LazerUserAchievement", back_populates="user", cascade="all, delete-orphan")
team_membership = relationship("TeamMember", back_populates="user", cascade="all, delete-orphan")
daily_challenge_stats = relationship("DailyChallengeStats", back_populates="user", uselist=False, cascade="all, delete-orphan")
rank_history = relationship("RankHistory", back_populates="user", cascade="all, delete-orphan")
avatar = relationship("UserAvatar", back_populates="user", primaryjoin="and_(User.id==UserAvatar.user_id, UserAvatar.is_active==True)", uselist=False)
active_banners=relationship("LazerUserBanners",back_populates="user",cascade="all, delete-orphan")
lazer_badges = relationship("LazerUserBadge", back_populates="user", cascade="all, delete-orphan")
lazer_monthly_playcounts = relationship("LazerUserMonthlyPlaycounts", back_populates="user", cascade="all, delete-orphan")
lazer_previous_usernames = relationship("LazerUserPreviousUsername", back_populates="user", cascade="all, delete-orphan")
lazer_replays_watched = relationship("LazerUserReplaysWatched", back_populates="user", cascade="all, delete-orphan")
# ============================================
# Lazer API 专用表模型
@@ -131,8 +135,9 @@ class LazerUserProfile(Base):
class LazerUserProfileSections(Base):
__tablename__ = "lazer_user_profile_sections"
user_id = Column(Integer, ForeignKey("users.id"), primary_key=True)
section_name = Column(VARCHAR(50))
id=Column(Integer, primary_key=True)
user_id = Column(Integer, ForeignKey("users.id"),nullable=False)
section_name = Column(VARCHAR(50),nullable=False)
display_order=Column(Integer)
created_at=Column(DateTime, default=datetime.utcnow)
@@ -167,7 +172,7 @@ class LazerUserCounts(Base):
user_id = Column(Integer, ForeignKey("users.id"), primary_key=True)
# 统计计数字段
# 统计计数字段f
beatmap_playcounts_count = Column(Integer, default=0)
comments_count = Column(Integer, default=0)
favourite_beatmapset_count = Column(Integer, default=0)
@@ -243,6 +248,17 @@ class LazerUserStatistics(Base):
# 关联关系
user = relationship("User", back_populates="lazer_statistics")
class LazerUserBanners(Base):
__tablename__ = "lazer_user_tournament_banners"
id=Column(Integer,primary_key=True)
user_id = Column(Integer, ForeignKey("users.id"), nullable=False)
tournament_id=Column(Integer, nullable=False)
image_url = Column(VARCHAR(500),nullable=False)
is_active=Column(TINYINT(1))
user=relationship("User", back_populates="lazer_active_banners")
class LazerUserAchievement(Base):
__tablename__ = "lazer_user_achievements"
@@ -257,6 +273,64 @@ class LazerUserAchievement(Base):
user = relationship("User", back_populates="lazer_achievements")
class LazerUserBadge(Base):
__tablename__ = "lazer_user_badges"
id = Column(Integer, primary_key=True, index=True)
user_id = Column(Integer, ForeignKey("users.id"), nullable=False)
badge_id = Column(Integer, nullable=False)
awarded_at = Column(DateTime)
description = Column(Text)
image_url = Column(String(500))
url = Column(String(500))
created_at = Column(DateTime, default=datetime.utcnow)
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
user = relationship("User", back_populates="lazer_badges")
class LazerUserMonthlyPlaycounts(Base):
__tablename__ = "lazer_user_monthly_playcounts"
id = Column(Integer, primary_key=True, index=True)
user_id = Column(Integer, ForeignKey("users.id"), nullable=False)
start_date = Column(Date, nullable=False)
play_count = Column(Integer, default=0)
created_at = Column(DateTime, default=datetime.utcnow)
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
user = relationship("User", back_populates="lazer_monthly_playcounts")
class LazerUserPreviousUsername(Base):
__tablename__ = "lazer_user_previous_usernames"
id = Column(Integer, primary_key=True, index=True)
user_id = Column(Integer, ForeignKey("users.id"), nullable=False)
username = Column(String(32), nullable=False)
changed_at = Column(DateTime, nullable=False)
created_at = Column(DateTime, default=datetime.utcnow)
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
user = relationship("User", back_populates="lazer_previous_usernames")
class LazerUserReplaysWatched(Base):
__tablename__ = "lazer_user_replays_watched"
id = Column(Integer, primary_key=True, index=True)
user_id = Column(Integer, ForeignKey("users.id"), nullable=False)
start_date = Column(Date, nullable=False)
count = Column(Integer, default=0)
created_at = Column(DateTime, default=datetime.utcnow)
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
user = relationship("User", back_populates="lazer_replays_watched")
# ============================================
# 旧的兼容性表模型(保留以便向后兼容)
# ============================================