from models import db from datetime import datetime import bcrypt class User(db.Model): __tablename__ = 'users' id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(80), unique=True, nullable=False, index=True) email = db.Column(db.String(120), unique=True, nullable=True) password_hash = db.Column(db.String(255), nullable=False) balance = db.Column(db.Numeric(10, 2), default=0.00) total_consumption = db.Column(db.Numeric(10, 2), default=0.00) request_count = db.Column(db.Integer, default=0) user_group = db.Column(db.String(50), default='default') invite_code = db.Column(db.String(20), unique=True, nullable=True) invited_by = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=True) created_at = db.Column(db.DateTime, default=datetime.utcnow) updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) # 关系 tokens = db.relationship('Token', backref='user', lazy=True, cascade='all, delete-orphan') usage_logs = db.relationship('UsageLog', backref='user', lazy=True) recharge_records = db.relationship('RechargeRecord', backref='user', lazy=True) def set_password(self, password): """设置密码""" self.password_hash = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt()).decode('utf-8') def check_password(self, password): """验证密码""" return bcrypt.checkpw(password.encode('utf-8'), self.password_hash.encode('utf-8')) def to_dict(self): """转换为字典""" return { 'id': self.id, 'username': self.username, 'email': self.email, 'balance': float(self.balance), 'total_consumption': float(self.total_consumption), 'request_count': self.request_count, 'user_group': self.user_group, 'invite_code': self.invite_code, 'created_at': self.created_at.isoformat() if self.created_at else None, }