baoxiang/backend/app/models/user.py

59 lines
2.4 KiB
Python
Raw Permalink Normal View History

2025-12-16 18:06:50 +08:00
"""
用户模型
"""
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="创建时间")