baoxiang/backend/app/models/user.py
2025-12-16 18:06:50 +08:00

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="创建时间")