""" 管理员认证接口 """ from fastapi import APIRouter, Depends, HTTPException, Request from sqlalchemy.orm import Session from pydantic import BaseModel from app.database import get_db from app.models.admin import Admin from app.core.security import verify_password, create_access_token from app.core.logger import get_admin_logger logger = get_admin_logger() from datetime import datetime from app.utils.timezone import beijing_now router = APIRouter() class LoginRequest(BaseModel): """登录请求""" username: str password: str @router.post("/login") async def login( req: LoginRequest, request: Request, db: Session = Depends(get_db) ): """管理员登录""" # 查找管理员 admin = db.query(Admin).filter(Admin.username == req.username).first() if not admin: raise HTTPException(status_code=401, detail="用户名或密码错误") # 验证密码 if not verify_password(req.password, admin.password): raise HTTPException(status_code=401, detail="用户名或密码错误") # 检查状态 if admin.status != 1: raise HTTPException(status_code=403, detail="账号已被禁用") # 更新登录信息 client_ip = request.client.host if request.client else None admin.last_login_time = beijing_now() admin.last_login_ip = client_ip admin.updated_at = beijing_now() db.commit() # 生成令牌 token = create_access_token({"sub": admin.username}) logger.info(f"管理员登录成功: {req.username}") return { "code": 200, "msg": "登录成功", "data": { "token": token, "admin": { "id": admin.id, "username": admin.username, "real_name": admin.real_name, "role": admin.role } } } @router.post("/logout") async def logout(): """退出登录""" return {"code": 200, "msg": "退出成功"}