This commit is contained in:
zuowei1216
2025-12-22 21:06:29 +08:00
parent 8ea58fe480
commit 1b19ff1b92
179 changed files with 21895 additions and 3774 deletions

View File

@@ -0,0 +1,87 @@
from sqlalchemy import Column, Integer, String, Boolean, DateTime, Text, Float, Date, Enum, ForeignKey
from sqlalchemy.orm import relationship
from sqlalchemy.sql import func
from app.db import Base
import enum
# Enums
class VipType(str, enum.Enum):
none = "none"
vip = "vip"
svip = "svip"
class FeatureCategory(str, enum.Enum):
general = "general"
ai = "ai"
export = "export"
layer = "layer"
other = "other"
# ========== Config Models ==========
class FeatureConfig(Base):
__tablename__ = "features_config"
id = Column(Integer, primary_key=True, index=True)
feature_key = Column(String(50), unique=True, index=True, nullable=False)
feature_name = Column(String(100), nullable=False)
category = Column(String(50), default="general")
points_cost = Column(Integer, default=0)
vip_points_cost = Column(Integer, default=0)
svip_points_cost = Column(Integer, default=0)
enabled = Column(Boolean, default=True)
description = Column(Text, nullable=True)
created_at = Column(DateTime(timezone=True), server_default=func.now())
updated_at = Column(DateTime(timezone=True), onupdate=func.now())
class VipConfig(Base):
__tablename__ = "vip_config"
id = Column(Integer, primary_key=True, index=True)
vip_type = Column(String(20), unique=True, nullable=False) # 'vip', 'svip'
name = Column(String(50), nullable=False)
price = Column(Float, nullable=False)
daily_quota = Column(Integer, nullable=False) # -1 for infinite
points_multiplier = Column(Float, default=1.0)
enabled = Column(Boolean, default=True)
description = Column(Text, nullable=True)
created_at = Column(DateTime(timezone=True), server_default=func.now())
updated_at = Column(DateTime(timezone=True), onupdate=func.now())
class CheckInConfig(Base):
__tablename__ = "check_in_config"
id = Column(Integer, primary_key=True, index=True)
consecutive_days = Column(Integer, unique=True, nullable=False)
base_points = Column(Integer, nullable=False)
bonus_points = Column(Integer, nullable=False)
total_points = Column(Integer, nullable=False)
enabled = Column(Boolean, default=True)
created_at = Column(DateTime(timezone=True), server_default=func.now())
updated_at = Column(DateTime(timezone=True), onupdate=func.now())
# ========== Record Models ==========
class CheckInRecord(Base):
__tablename__ = "check_in_records"
id = Column(Integer, primary_key=True, index=True)
user_id = Column(Integer, index=True, nullable=False)
username = Column(String(50), nullable=False)
check_in_date = Column(Date, nullable=False, index=True)
points_earned = Column(Integer, nullable=False)
consecutive_days = Column(Integer, nullable=False)
vip_multiplier = Column(Float, default=1.0)
created_at = Column(DateTime(timezone=True), server_default=func.now())
class PointsHistory(Base):
__tablename__ = "points_history"
id = Column(Integer, primary_key=True, index=True)
user_id = Column(Integer, index=True, nullable=False)
username = Column(String(50), nullable=False)
type = Column(String(20), nullable=False) # checkin, consume, refund, admin
amount = Column(Integer, nullable=False)
balance = Column(Integer, nullable=False)
description = Column(String(255), nullable=True)
created_at = Column(DateTime(timezone=True), server_default=func.now())

View File

@@ -1,4 +1,4 @@
from sqlalchemy import Column, Integer, String, DateTime, func, ForeignKey, Text, Boolean
from sqlalchemy import Column, Integer, String, DateTime, func, ForeignKey, Text, Boolean, Date
from sqlalchemy.orm import relationship
from app.db import Base
@@ -23,4 +23,18 @@ class User(Base):
reset_token = Column(String(128), nullable=True)
reset_token_expire = Column(DateTime(timezone=True), nullable=True)
# Profile & VIP & Check-in
nickname = Column(String(50), nullable=True)
avatar = Column(String(500), nullable=True)
points = Column(Integer, default=0)
level = Column(Integer, default=1)
vip_type = Column(String(20), default='none') # 'none', 'vip', 'svip'
vip_expire = Column(DateTime(timezone=True), nullable=True)
vip_daily_quota = Column(Integer, default=0)
vip_quota_reset_date = Column(Date, nullable=True)
total_check_in_days = Column(Integer, default=0)
consecutive_check_in = Column(Integer, default=0)
last_check_in_date = Column(Date, nullable=True)
group = relationship("PluginGroup", back_populates="users")