Initial project commit
This commit is contained in:
@@ -0,0 +1,48 @@
|
||||
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}>"
|
||||
Reference in New Issue
Block a user