Kamixitong/app/models/admin.py
2025-11-12 15:11:05 +08:00

104 lines
4.0 KiB
Python

from datetime import datetime
from werkzeug.security import generate_password_hash, check_password_hash
from flask_login import UserMixin
from app import db, login_manager
class Admin(UserMixin, db.Model):
"""管理员模型"""
__tablename__ = 'admin'
admin_id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(32), unique=True, nullable=False, index=True)
password_hash = db.Column(db.String(128), nullable=False)
email = db.Column(db.String(64), nullable=True)
role = db.Column(db.Integer, nullable=False, default=0) # 0=普通管理员, 1=超级管理员
status = db.Column(db.Integer, nullable=False, default=1) # 0=禁用, 1=正常
is_deleted = db.Column(db.Integer, nullable=False, default=0) # 0=未删除, 1=已删除(软删除)
create_time = db.Column(db.DateTime, default=datetime.utcnow)
update_time = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
delete_time = db.Column(db.DateTime, nullable=True) # 软删除时间
last_login_time = db.Column(db.DateTime, nullable=True)
last_login_ip = db.Column(db.String(32), nullable=True)
def __init__(self, **kwargs):
super(Admin, self).__init__(**kwargs)
if self.password_hash is None and 'password' in kwargs:
self.set_password(kwargs['password'])
def set_password(self, password):
"""设置密码"""
self.password_hash = generate_password_hash(password)
def check_password(self, password):
"""验证密码"""
from werkzeug.security import check_password_hash
print(f"DEBUG: Checking password for user {self.username} (ID: {self.admin_id})")
print(f"DEBUG: Stored hash: {self.password_hash}")
print(f"DEBUG: Provided password: {password}")
result = check_password_hash(self.password_hash, password)
print(f"DEBUG: Password check result: {result}")
return result
def is_super_admin(self):
"""是否为超级管理员"""
return self.role == 1
@property
def is_active(self):
"""账号是否激活"""
return self.status == 1
def update_last_login(self, ip_address):
"""更新最后登录信息"""
self.last_login_time = datetime.utcnow()
self.last_login_ip = ip_address
db.session.commit()
def get_id(self):
"""Flask-Login 需要的方法,返回用户唯一标识"""
return str(self.admin_id)
# 为了兼容性,也可以添加 id 属性
@property
def id(self):
"""Flask-Login 需要的 id 属性"""
return self.admin_id
def to_dict(self):
"""转换为字典"""
return {
'admin_id': self.admin_id,
'username': self.username,
'email': self.email,
'role': self.role,
'role_name': '超级管理员' if self.role == 1 else '普通管理员',
'status': self.status,
'status_name': '正常' if self.status == 1 else '禁用',
'is_deleted': self.is_deleted,
'create_time': self.create_time.strftime('%Y-%m-%d %H:%M:%S') if self.create_time else None,
'update_time': self.update_time.strftime('%Y-%m-%d %H:%M:%S') if self.update_time else None,
'delete_time': self.delete_time.strftime('%Y-%m-%d %H:%M:%S') if self.delete_time else None,
'last_login_time': self.last_login_time.strftime('%Y-%m-%d %H:%M:%S') if self.last_login_time else None,
'last_login_ip': self.last_login_ip
}
def soft_delete(self):
"""软删除"""
self.is_deleted = 1
self.delete_time = datetime.utcnow()
@staticmethod
def get_query():
"""获取未删除的查询"""
return Admin.query.filter(Admin.is_deleted == 0)
def __repr__(self):
return f'<Admin {self.username}>'
@login_manager.user_loader
def load_user(admin_id):
"""Flask-Login用户加载器"""
try:
return Admin.query.get(int(admin_id))
except (TypeError, ValueError):
return None