56 lines
2.0 KiB
Python
56 lines
2.0 KiB
Python
from fastapi import APIRouter, HTTPException, Depends
|
|
from pydantic import BaseModel
|
|
import db
|
|
import auth
|
|
|
|
router = APIRouter()
|
|
|
|
class UserAuth(BaseModel):
|
|
username: str
|
|
password: str
|
|
|
|
@router.post("/api/register")
|
|
def register(user: UserAuth):
|
|
if not user.username or not user.password:
|
|
raise HTTPException(status_code=400, detail="用户名和密码不能为空")
|
|
if len(user.username) < 3 or len(user.username) > 20:
|
|
raise HTTPException(status_code=400, detail="用户名长度需在3-20个字符之间")
|
|
if len(user.password) < 6:
|
|
raise HTTPException(status_code=400, detail="密码长度至少6个字符")
|
|
|
|
existing_user = db.get_user_by_username(user.username)
|
|
if existing_user:
|
|
raise HTTPException(status_code=400, detail="用户名已存在")
|
|
|
|
hashed_password = auth.get_password_hash(user.password)
|
|
new_user = db.create_user({"username": user.username, "password": hashed_password})
|
|
|
|
return {"message": "注册成功", "userId": new_user["id"]}
|
|
|
|
@router.post("/api/login")
|
|
def login(user: UserAuth):
|
|
if not user.username or not user.password:
|
|
raise HTTPException(status_code=400, detail="用户名和密码不能为空")
|
|
|
|
db_user = db.get_user_by_username(user.username)
|
|
if not db_user:
|
|
raise HTTPException(status_code=401, detail="用户名或密码错误")
|
|
|
|
if not auth.verify_password(user.password, db_user["password"]):
|
|
raise HTTPException(status_code=401, detail="用户名或密码错误")
|
|
|
|
token = auth.create_access_token({"id": db_user["id"], "username": db_user["username"]})
|
|
return {
|
|
"message": "登录成功",
|
|
"token": token,
|
|
"user": {"id": db_user["id"], "username": db_user["username"]}
|
|
}
|
|
|
|
@router.get("/api/me")
|
|
def get_me(current_user: dict = Depends(auth.get_current_user)):
|
|
return {"user": {"id": current_user["id"], "username": current_user["username"]}}
|
|
|
|
@router.post("/api/logout")
|
|
def logout():
|
|
return {"message": "已退出登录"}
|