from fastapi import APIRouter, Depends, HTTPException, status from fastapi.security import OAuth2PasswordRequestForm from sqlalchemy.ext.asyncio import AsyncSession from app.core.database import get_db from app.models.user import User from app.schemas.user import Token, UserCreate, UserLogin, UserResponse from app.services.auth import AuthService, auth_service router = APIRouter(prefix="/api/auth", tags=["auth"]) @router.post("/register", response_model=UserResponse, status_code=status.HTTP_201_CREATED) async def register( user_data: UserCreate, db: AsyncSession = Depends(get_db), ): """ 注册新用户 """ user = await auth_service.register_user(db, user_data) return user @router.post("/login", response_model=dict) async def login( login_data: UserLogin, db: AsyncSession = Depends(get_db), ): """ 用户登录 """ user, access_token = await auth_service.authenticate_user(db, login_data) return { "access_token": access_token, "token_type": "bearer", "user": UserResponse.model_validate(user) } @router.post("/logout") async def logout( current_user: User = Depends(auth_service.get_current_user), ): """ 用户登出(客户端需清除 Token) """ return {"message": "登出成功"} @router.get("/me", response_model=UserResponse) async def get_current_user_info( current_user: User = Depends(auth_service.get_current_user), ): """ 获取当前用户信息 """ return current_user @router.post("/refresh", response_model=Token) async def refresh_token( current_user: User = Depends(auth_service.get_current_user), ): """ 刷新 Token """ from app.core.security import create_access_token access_token = create_access_token(data={"sub": str(current_user.id), "email": current_user.email}) return Token(access_token=access_token)