59 lines
2.4 KiB
Python
59 lines
2.4 KiB
Python
"""
|
|
用户模型
|
|
"""
|
|
from sqlalchemy import Column, Integer, String, BigInteger, Enum, DateTime, Text, func, DECIMAL
|
|
from sqlalchemy.dialects.mysql import TINYINT
|
|
from enum import Enum as PyEnum
|
|
|
|
from .base import Base
|
|
|
|
|
|
class UserRole(PyEnum):
|
|
"""用户角色"""
|
|
USER = "USER"
|
|
STREAMER = "STREAMER"
|
|
ADMIN = "ADMIN"
|
|
|
|
|
|
class UserStatus(PyEnum):
|
|
"""用户状态"""
|
|
ACTIVE = "ACTIVE"
|
|
DISABLED = "DISABLED"
|
|
BANNED = "BANNED"
|
|
|
|
|
|
class User(Base):
|
|
"""用户表"""
|
|
__tablename__ = "users"
|
|
|
|
id = Column(Integer, primary_key=True, autoincrement=True, index=True)
|
|
username = Column(String(50), unique=True, index=True, nullable=False, comment="用户名")
|
|
email = Column(String(100), unique=True, index=True, nullable=False, comment="邮箱")
|
|
hashed_password = Column(String(255), nullable=False, comment="哈希密码")
|
|
role = Column(Enum(UserRole, native_enum=True), default=UserRole.USER, nullable=False, comment="用户角色")
|
|
nickname = Column(String(64), comment="用户昵称")
|
|
avatar_url = Column(String(255), comment="头像URL")
|
|
phone = Column(String(20), comment="手机号")
|
|
status = Column(Enum(UserStatus, native_enum=True), default=UserStatus.ACTIVE, comment="用户状态")
|
|
balance = Column(BigInteger, default=0, comment="余额(分)")
|
|
version = Column(Integer, default=0, comment="乐观锁版本号")
|
|
last_login_at = Column(DateTime, comment="最后登录时间")
|
|
login_count = Column(Integer, default=0, comment="登录次数")
|
|
created_at = Column(DateTime, server_default=func.now(), comment="创建时间")
|
|
updated_at = Column(DateTime, server_default=func.now(), onupdate=func.now(), comment="更新时间")
|
|
is_active = Column(TINYINT, default=1, comment="是否激活(1:是 0:否)")
|
|
|
|
|
|
class Transaction(Base):
|
|
"""交易流水表"""
|
|
__tablename__ = "transactions"
|
|
|
|
id = Column(Integer, primary_key=True, autoincrement=True, index=True)
|
|
user_id = Column(Integer, nullable=False, index=True, comment="用户ID")
|
|
type = Column(String(30), nullable=False, comment="交易类型")
|
|
amount = Column(BigInteger, nullable=False, comment="金额(分)")
|
|
balance_after = Column(BigInteger, nullable=False, comment="交易后余额")
|
|
related_id = Column(Integer, comment="关联ID")
|
|
description = Column(Text, comment="描述")
|
|
created_at = Column(DateTime, server_default=func.now(), comment="创建时间")
|