第二步

This commit is contained in:
amb
2026-09-01 12:24:43 +08:00
parent 47bf6cc5ca
commit 1d8621717a
14 changed files with 815 additions and 9 deletions
+49
View File
@@ -0,0 +1,49 @@
"""Plan 套餐模型。"""
from sqlalchemy import Boolean, Integer, String, Text
from sqlalchemy.orm import Mapped, mapped_column, relationship
from app.models.base import Base, TimestampMixin, UUIDPrimaryKeyMixin
class Plan(UUIDPrimaryKeyMixin, TimestampMixin, Base):
"""用户套餐(免费/基础/专业等)。
技术审查 §2.2:plans 表。
"""
__tablename__ = "plans"
code: Mapped[str] = mapped_column(
String(32),
unique=True,
nullable=False,
comment="套餐代码 (free/basic/pro)",
)
name: Mapped[str] = mapped_column(
String(64),
nullable=False,
comment="套餐名称",
)
storage_quota: Mapped[int] = mapped_column(
Integer,
nullable=False,
comment="存储配额 (字节)",
)
max_file_size: Mapped[int] = mapped_column(
Integer,
nullable=False,
comment="单文件大小上限 (字节)",
)
is_active: Mapped[bool] = mapped_column(
Boolean,
default=True,
nullable=False,
comment="是否可用",
)
# 关系
users = relationship("User", back_populates="plan", lazy="selectin")
def __repr__(self) -> str:
return f"<Plan {self.code!r} ({self.name!r})>"