107 lines
3.1 KiB
Python
107 lines
3.1 KiB
Python
# ===========================================
|
|
# 班级操行分管理系统 - 后端服务
|
|
#
|
|
# 开发者: Canglan
|
|
# 联系方式: admin@sea-studio.top
|
|
# 版权归属: Sea Network Technology Studio
|
|
# 许可证: MIT License
|
|
#
|
|
# 版权所有 © Sea Network Technology Studio
|
|
# ===========================================
|
|
|
|
from fastapi import APIRouter, Request, HTTPException
|
|
from typing import Dict, Any
|
|
|
|
from schemas.auth import LoginRequest, ChangePasswordRequest
|
|
from services.auth_service import AuthService
|
|
from middleware.permission import get_current_user
|
|
from utils.response import success_response, error_response, unauthorized_response
|
|
from utils.logger import get_logger
|
|
|
|
router = APIRouter()
|
|
logger = get_logger(__name__)
|
|
|
|
|
|
@router.post("/login")
|
|
async def login(request: LoginRequest, http_request: Request):
|
|
"""
|
|
用户登录
|
|
"""
|
|
# 获取客户端IP
|
|
client_ip = http_request.client.host
|
|
user_agent = http_request.headers.get("user-agent", "")
|
|
|
|
result = await AuthService.login(
|
|
username=request.username,
|
|
password=request.password,
|
|
ip=client_ip,
|
|
user_agent=user_agent
|
|
)
|
|
|
|
if result["success"]:
|
|
return success_response(
|
|
data={
|
|
"token": result["token"],
|
|
"user_id": result["user_id"],
|
|
"username": result["username"],
|
|
"real_name": result["real_name"],
|
|
"user_type": result["user_type"],
|
|
"student_id": result.get("student_id"),
|
|
"role": result.get("role"),
|
|
"need_change_password": result["need_change_password"],
|
|
"redirect": result["redirect"]
|
|
},
|
|
message="登录成功"
|
|
)
|
|
else:
|
|
return error_response(message=result["message"], code=401)
|
|
|
|
|
|
@router.post("/logout")
|
|
async def logout(request: Request):
|
|
"""
|
|
用户登出
|
|
"""
|
|
user = await get_current_user(request)
|
|
result = await AuthService.logout(user["user_id"])
|
|
|
|
if result["success"]:
|
|
return success_response(message="登出成功")
|
|
else:
|
|
return error_response(message=result["message"])
|
|
|
|
|
|
@router.post("/change-password")
|
|
async def change_password(request: Request, req: ChangePasswordRequest):
|
|
"""
|
|
修改密码
|
|
"""
|
|
user = await get_current_user(request)
|
|
|
|
# 首次登录强制改密时跳过旧密码验证
|
|
force = req.force if hasattr(req, 'force') else False
|
|
result = await AuthService.change_password(
|
|
user_id=user["user_id"],
|
|
old_password=req.old_password,
|
|
new_password=req.new_password,
|
|
force=force
|
|
)
|
|
|
|
if result["success"]:
|
|
return success_response(message="密码修改成功,请重新登录")
|
|
else:
|
|
return error_response(message=result["message"])
|
|
|
|
|
|
@router.get("/me")
|
|
async def get_current_user_info(request: Request):
|
|
"""
|
|
获取当前用户信息
|
|
"""
|
|
user = await get_current_user(request)
|
|
|
|
# 获取用户详细信息
|
|
from services.auth_service import AuthService
|
|
user_info = await AuthService.get_user_info(user["user_id"])
|
|
|
|
return success_response(data=user_info) |