Files
DP/Server/app/models/business.py
zuowei1216 1b19ff1b92 20251222
2025-12-22 21:06:29 +08:00

88 lines
3.4 KiB
Python

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())