51521fc0dd
- 微信支付从 APIv3 降级为 APIv2(MD5/XML) - 积分系统:充值下单、微信回调、消费冻结/结算/退款 - SMS B2M 短信验证码服务 - 双 Token 认证(Access 30min + Refresh 30days) - SSE 单设备踢人 - 用户设备管理、积分账户模型 - Alembic 迁移脚本
82 lines
2.0 KiB
Python
82 lines
2.0 KiB
Python
"""
|
|
基础模型定义
|
|
============
|
|
"""
|
|
|
|
import uuid
|
|
from datetime import UTC, datetime
|
|
|
|
from sqlalchemy import BigInteger, DateTime
|
|
from sqlalchemy.dialects.postgresql import UUID
|
|
from sqlalchemy.orm import Mapped, mapped_column
|
|
|
|
from app.db.session import Base
|
|
|
|
|
|
class BaseModel(Base):
|
|
"""
|
|
基础模型 - UUID 主键
|
|
|
|
适用于需要暴露给外部、跨系统的表(如用户表)。
|
|
提供 UUID 主键 + 创建时间 + 更新时间。
|
|
"""
|
|
|
|
__abstract__ = True
|
|
|
|
id: Mapped[uuid.UUID] = mapped_column(
|
|
UUID(as_uuid=True),
|
|
primary_key=True,
|
|
default=uuid.uuid4,
|
|
)
|
|
|
|
created_at: Mapped[datetime] = mapped_column(
|
|
DateTime(timezone=True),
|
|
default=lambda: datetime.now(UTC),
|
|
nullable=False,
|
|
)
|
|
|
|
updated_at: Mapped[datetime] = mapped_column(
|
|
DateTime(timezone=True),
|
|
default=lambda: datetime.now(UTC),
|
|
onupdate=lambda: datetime.now(UTC),
|
|
nullable=False,
|
|
)
|
|
|
|
def to_dict(self) -> dict:
|
|
"""转换为字典(用于序列化)"""
|
|
return {column.name: getattr(self, column.name) for column in self.__table__.columns}
|
|
|
|
|
|
class BaseModelBigInt(Base):
|
|
"""
|
|
基础模型 - BigInt 自增主键
|
|
|
|
适用于内部表、数据量大的表(如积分流水、设备记录)。
|
|
提供 BigInt 自增主键 + 创建时间 + 更新时间。
|
|
"""
|
|
|
|
__abstract__ = True
|
|
|
|
id: Mapped[int] = mapped_column(
|
|
BigInteger,
|
|
primary_key=True,
|
|
autoincrement=True,
|
|
)
|
|
|
|
created_at: Mapped[datetime] = mapped_column(
|
|
DateTime(timezone=True),
|
|
default=lambda: datetime.now(UTC),
|
|
nullable=False,
|
|
)
|
|
|
|
updated_at: Mapped[datetime] = mapped_column(
|
|
DateTime(timezone=True),
|
|
default=lambda: datetime.now(UTC),
|
|
onupdate=lambda: datetime.now(UTC),
|
|
nullable=False,
|
|
)
|
|
|
|
def to_dict(self) -> dict:
|
|
"""转换为字典(用于序列化)"""
|
|
return {column.name: getattr(self, column.name) for column in self.__table__.columns}
|