From 3f96c9c6502243b06efd4bb34a189e72e3a5557c Mon Sep 17 00:00:00 2001
From: yearning <10538594+wangweifeng1999@user.noreply.gitee.com>
Date: 星期一, 28 九月 2026 19:24:55 +0800
Subject: [PATCH] 复制项目

---
 backend/app/routers/auth_router.py |   42 ++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 42 insertions(+), 0 deletions(-)

diff --git a/backend/app/routers/auth_router.py b/backend/app/routers/auth_router.py
new file mode 100644
index 0000000..c5f18c9
--- /dev/null
+++ b/backend/app/routers/auth_router.py
@@ -0,0 +1,42 @@
+from fastapi import APIRouter, Depends, HTTPException
+from sqlalchemy.orm import Session
+
+from app.auth import create_access_token, get_current_user, hash_password, verify_password
+from app.database import get_db
+from app.login_guard import clear_login_lock, ensure_login_allowed, record_login_failure
+from app.models import User
+from app.schemas import ChangePasswordRequest, LoginRequest, TokenResponse, UserMe
+
+router = APIRouter(prefix="/api/auth", tags=["auth"])
+
+
+@router.post("/login", response_model=TokenResponse)
+def login(body: LoginRequest, db: Session = Depends(get_db)):
+    ensure_login_allowed(db, body.username)
+    user = db.query(User).filter(User.username == body.username).first()
+    if not user or not user.is_active or not verify_password(body.password, user.password_hash):
+        record_login_failure(db, body.username)
+        raise HTTPException(401, detail="鐢ㄦ埛鍚嶆垨瀵嗙爜閿欒")
+    clear_login_lock(db, body.username)
+    token = create_access_token(user.id, user.role)
+    return TokenResponse(access_token=token)
+
+
+@router.get("/me", response_model=UserMe)
+def me(user: User = Depends(get_current_user)):
+    return user
+
+
+@router.post("/change-password")
+def change_password(
+    body: ChangePasswordRequest,
+    db: Session = Depends(get_db),
+    user: User = Depends(get_current_user),
+):
+    if body.old_password == body.new_password:
+        raise HTTPException(400, detail="鏂板瘑鐮佷笉鑳戒笌鏃у瘑鐮佺浉鍚�")
+    if not verify_password(body.old_password, user.password_hash):
+        raise HTTPException(400, detail="鍘熷瘑鐮佷笉姝g‘")
+    user.password_hash = hash_password(body.new_password)
+    db.commit()
+    return {"ok": True}

--
Gitblit v1.8.0