Files
CosScene/server/app/models/membership.py
T
2026-05-09 16:40:29 +08:00

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}>"