auth.py 1.9 KB

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