auth.py 1.9 KB

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