auth.py 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. """
  2. 管理员认证接口
  3. """
  4. from fastapi import APIRouter, Depends, HTTPException, Request
  5. from sqlalchemy.orm import Session
  6. from pydantic import BaseModel
  7. from app.database import get_db
  8. from app.models.admin import Admin
  9. from app.core.security import verify_password, create_access_token
  10. from app.core.logger import logger
  11. from datetime import datetime
  12. router = APIRouter()
  13. class LoginRequest(BaseModel):
  14. """登录请求"""
  15. username: str
  16. password: str
  17. @router.post("/login")
  18. async def login(
  19. req: LoginRequest,
  20. request: Request,
  21. db: Session = Depends(get_db)
  22. ):
  23. """管理员登录"""
  24. # 查找管理员
  25. admin = db.query(Admin).filter(Admin.username == req.username).first()
  26. if not admin:
  27. raise HTTPException(status_code=401, detail="用户名或密码错误")
  28. # 验证密码
  29. if not verify_password(req.password, admin.password):
  30. raise HTTPException(status_code=401, detail="用户名或密码错误")
  31. # 检查状态
  32. if admin.status != 1:
  33. raise HTTPException(status_code=403, detail="账号已被禁用")
  34. # 更新登录信息
  35. client_ip = request.client.host if request.client else None
  36. admin.last_login_time = datetime.now()
  37. admin.last_login_ip = client_ip
  38. admin.updated_at = datetime.now()
  39. db.commit()
  40. # 生成令牌
  41. token = create_access_token({"sub": admin.username})
  42. logger.info(f"管理员登录成功: {req.username}")
  43. return {
  44. "code": 200,
  45. "msg": "登录成功",
  46. "data": {
  47. "token": token,
  48. "admin": {
  49. "id": admin.id,
  50. "username": admin.username,
  51. "role": admin.role
  52. }
  53. }
  54. }
  55. @router.post("/logout")
  56. async def logout():
  57. """退出登录"""
  58. return {"code": 200, "msg": "退出成功"}