49 lines
2.1 KiB
Python
49 lines
2.1 KiB
Python
from datetime import datetime
|
|
|
|
from sqlalchemy import (
|
|
Boolean, DateTime, ForeignKey, Integer, Numeric,
|
|
String, Text, func,
|
|
)
|
|
from sqlalchemy.orm import Mapped, mapped_column, relationship
|
|
|
|
from app.db.base import Base
|
|
|
|
|
|
class MembershipPlan(Base):
|
|
"""会员方案"""
|
|
__tablename__ = "membership_plans"
|
|
|
|
id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
|
|
name: Mapped[str] = mapped_column(String(100), nullable=False)
|
|
description: Mapped[str | None] = mapped_column(Text)
|
|
duration_days: Mapped[int] = mapped_column(Integer, nullable=False)
|
|
price: Mapped[float] = mapped_column(Numeric(10, 2), nullable=False)
|
|
benefits: Mapped[str | None] = mapped_column(Text)
|
|
extra_uploads: Mapped[int] = mapped_column(Integer, default=0)
|
|
extra_top_count: Mapped[int] = mapped_column(Integer, default=0)
|
|
is_active: Mapped[bool] = mapped_column(Boolean, default=True)
|
|
sort_order: Mapped[int] = mapped_column(Integer, default=0)
|
|
created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now())
|
|
|
|
def __repr__(self) -> str:
|
|
return f"<MembershipPlan {self.id} {self.name}>"
|
|
|
|
|
|
class UserMembership(Base):
|
|
"""用户会员记录"""
|
|
__tablename__ = "user_memberships"
|
|
|
|
id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
|
|
user_id: Mapped[int] = mapped_column(Integer, ForeignKey("users.id"), nullable=False, index=True)
|
|
plan_id: Mapped[int] = mapped_column(Integer, ForeignKey("membership_plans.id"), nullable=False)
|
|
start_date: Mapped[datetime] = mapped_column(DateTime(timezone=True), nullable=False)
|
|
end_date: Mapped[datetime] = mapped_column(DateTime(timezone=True), nullable=False)
|
|
is_active: Mapped[bool] = mapped_column(Boolean, default=True)
|
|
created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now())
|
|
|
|
user = relationship("User", lazy="selectin")
|
|
plan = relationship("MembershipPlan", lazy="selectin")
|
|
|
|
def __repr__(self) -> str:
|
|
return f"<UserMembership {self.id} user={self.user_id}>"
|