from fastapi import APIRouter, Depends, HTTPException from pydantic import BaseModel from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession from app.database import get_db from app.models.user import User import bcrypt import logging logger = logging.getLogger(__name__) router = APIRouter(prefix="/api/auth", tags=["auth"]) class LoginRequest(BaseModel): username: str password: str @router.post("/login") async def login(payload: LoginRequest, db: AsyncSession = Depends(get_db)): result = await db.execute( select(User).where(User.username == payload.username) ) user = result.scalar_one_or_none() if not user or not user.is_active: raise HTTPException(status_code=401, detail="用户名或密码错误") pw_hash = user.password_hash.encode("utf-8") if not bcrypt.checkpw(payload.password.encode("utf-8"), pw_hash): raise HTTPException(status_code=401, detail="用户名或密码错误") return {"message": "登录成功", "username": user.username}