"""管理员用户表模型"""
import datetime
from typing import Optional
import sqlalchemy as sa
from sqlalchemy import func
from sqlalchemy.orm import Mapped, mapped_column
from backend.core.database import Base
class AdminUser(Base):
"""管理员用户表
用于管理看板的登录认证,支持多管理员。
密码使用 hashlib + 随机 salt 存储。
role: super_admin(高级管理员)/ admin(普通管理员)。
"""
__tablename__ = "admin_users"
id: Mapped[int] = mapped_column(sa.Integer, primary_key=True, autoincrement=True)
username: Mapped[str] = mapped_column(sa.String(64), nullable=False, unique=True)
password_hash: Mapped[str] = mapped_column(sa.String(128), nullable=False)
salt: Mapped[str] = mapped_column(sa.String(32), nullable=False)
role: Mapped[str] = mapped_column(sa.String(20), default="admin", nullable=False)
is_active: Mapped[bool] = mapped_column(sa.Boolean, default=True)
login_fail_count: Mapped[int] = mapped_column(sa.Integer, default=0, nullable=False)
locked_until: Mapped[Optional[datetime.datetime]] = mapped_column(sa.DateTime, nullable=True)
created_at: Mapped[datetime.datetime] = mapped_column(
sa.DateTime, nullable=False, server_default=func.now(),
)
updated_at: Mapped[datetime.datetime] = mapped_column(
sa.DateTime, nullable=False, server_default=func.now(), onupdate=func.now(),
)
def __repr__(self) -> str:
return f"<AdminUser(id={self.id}, username={self.username}, role={self.role})>"