auth.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. from fastapi import APIRouter, Depends, HTTPException, status
  2. from pydantic import BaseModel, ConfigDict
  3. from pydantic.alias_generators import to_camel
  4. from sqlalchemy.orm import Session
  5. from app.database import get_db
  6. from app.core.security import verify_password, hash_password, create_access_token
  7. from app.core.deps import get_current_user
  8. from app.models.user import User
  9. from app.schemas.common import ApiResponse
  10. from app.schemas.user import UserOut
  11. router = APIRouter(prefix="/api/auth", tags=["认证"])
  12. class LoginRequest(BaseModel):
  13. model_config = ConfigDict(populate_by_name=True, alias_generator=to_camel)
  14. username: str
  15. password: str
  16. class RegisterRequest(BaseModel):
  17. model_config = ConfigDict(populate_by_name=True, alias_generator=to_camel)
  18. username: str
  19. password: str
  20. real_name: str
  21. class TokenResponse(BaseModel):
  22. model_config = ConfigDict(populate_by_name=True, alias_generator=to_camel)
  23. access_token: str
  24. token_type: str = "bearer"
  25. @router.post("/login", response_model=ApiResponse[TokenResponse])
  26. def login(body: LoginRequest, db: Session = Depends(get_db)):
  27. user = db.query(User).filter(User.username == body.username, User.del_flag == 0).first()
  28. if not user or not verify_password(body.password, user.password):
  29. raise HTTPException(
  30. status_code=status.HTTP_401_UNAUTHORIZED,
  31. detail="用户名或密码错误",
  32. )
  33. if user.status != 1:
  34. raise HTTPException(
  35. status_code=status.HTTP_403_FORBIDDEN,
  36. detail="用户已被禁用",
  37. )
  38. token = create_access_token(data={"sub": str(user.id)})
  39. return ApiResponse(data=TokenResponse(access_token=token))
  40. @router.post("/register", response_model=ApiResponse[UserOut])
  41. def register(body: RegisterRequest, db: Session = Depends(get_db)):
  42. existing = db.query(User).filter(User.username == body.username, User.del_flag == 0).first()
  43. if existing:
  44. raise HTTPException(
  45. status_code=status.HTTP_400_BAD_REQUEST,
  46. detail="用户名已存在",
  47. )
  48. from app.models.role import Role
  49. employee_role = db.query(Role).filter(Role.role_code == "EMPLOYEE", Role.del_flag == 0).first()
  50. user = User(
  51. username=body.username,
  52. password=hash_password(body.password),
  53. real_name=body.real_name,
  54. status=1,
  55. )
  56. if employee_role:
  57. user.roles.append(employee_role)
  58. db.add(user)
  59. db.commit()
  60. db.refresh(user)
  61. return ApiResponse(data=UserOut.model_validate(user))
  62. @router.get("/me", response_model=ApiResponse[UserOut])
  63. def get_current_user_info(current_user: User = Depends(get_current_user)):
  64. return ApiResponse(data=UserOut.model_validate(current_user))