from fastapi import APIRouter, Depends, HTTPException from sqlalchemy import or_, select from sqlalchemy.ext.asyncio import AsyncSession from app.api.deps import get_current_user from app.core.database import get_db from app.core.security import create_access_token, hash_password, verify_password from app.models import User from app.schemas.core import LoginIn, TokenOut, UserCreate, UserOut, UserUpdate from app.schemas.common import Page router = APIRouter(prefix="/auth", tags=["认证"]) @router.post("/login", response_model=TokenOut) async def login(payload: LoginIn, db: AsyncSession = Depends(get_db)): result = await db.execute( select(User).where( or_(User.username == payload.username, User.email == payload.username), User.is_deleted == False, ) ) user = result.scalar_one_or_none() if not user or not verify_password(payload.password, user.password_hash): raise HTTPException(status_code=400, detail="用户名或密码错误") if user.status != "enabled": raise HTTPException(status_code=403, detail="用户已禁用") return TokenOut(access_token=create_access_token(user.id, {"username": user.username})) @router.get("/me", response_model=UserOut) async def me(user: User = Depends(get_current_user)): return user