47 lines
2.0 KiB
Python
47 lines
2.0 KiB
Python
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,
|
|
}
|