baoxiang/backend/app/routers/user.py
2025-12-16 18:38:01 +08:00

136 lines
3.6 KiB
Python

"""
用户相关路由
"""
from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.orm import Session
from typing import List
from ..core.database import get_db
from ..models.user import User
from ..schemas.user import UserResponse, UserUpdate, TransactionResponse, ChangePasswordRequest
from ..services.user_service import UserService
from ..utils.deps import get_current_user, get_current_admin
router = APIRouter(prefix="/api/users", tags=["users"])
@router.get("/me", response_model=UserResponse)
def get_me(current_user: User = Depends(get_current_user)):
"""
获取当前用户信息
"""
return current_user
@router.get("/me/transactions", response_model=List[TransactionResponse])
def get_my_transactions(
limit: int = 50,
db: Session = Depends(get_db),
current_user: User = Depends(get_current_user)
):
"""
获取我的交易流水
"""
return UserService.get_user_transactions(db, current_user.id, 0, limit)
@router.post("/me/allowance")
def claim_allowance(
db: Session = Depends(get_db),
current_user: User = Depends(get_current_user)
):
"""
领取低保
"""
try:
UserService.claim_daily_allowance(db, current_user)
return {"message": "低保领取成功", "balance": current_user.balance}
except ValueError as e:
raise HTTPException(status_code=400, detail=str(e))
@router.get("/me/allowance-info")
def get_allowance_info(
db: Session = Depends(get_db),
current_user: User = Depends(get_current_user)
):
"""
获取低保领取信息
"""
return UserService.get_next_allowance_time(db, current_user)
@router.get("/ranking/rich", response_model=List[UserResponse])
def get_rich_ranking(
limit: int = 10,
db: Session = Depends(get_db)
):
"""
获取富豪榜
"""
return UserService.get_rich_ranking(db, limit)
@router.get("/", response_model=List[UserResponse])
def get_users(
skip: int = 0,
limit: int = 100,
db: Session = Depends(get_db),
current_user: User = Depends(get_current_admin)
):
"""
获取用户列表(仅管理员)
"""
return db.query(User).offset(skip).limit(limit).all()
@router.patch("/{user_id}", response_model=UserResponse)
def update_user(
user_id: int,
user_data: UserUpdate,
db: Session = Depends(get_db),
current_user: User = Depends(get_current_admin)
):
"""
更新用户信息(仅管理员)
"""
user = UserService.get_user_by_id(db, user_id)
if not user:
raise HTTPException(status_code=404, detail="User not found")
return UserService.update_user(db, user, user_data)
@router.post("/{user_id}/adjust-balance")
def adjust_user_balance(
user_id: int,
amount: int,
description: str,
db: Session = Depends(get_db),
current_user: User = Depends(get_current_admin)
):
"""
管理员调整用户余额
"""
user = UserService.get_user_by_id(db, user_id)
if not user:
raise HTTPException(status_code=404, detail="User not found")
UserService.adjust_balance_with_version(db, user, amount, description, current_user)
return {"message": "余额调整成功", "new_balance": user.balance}
@router.post("/me/change-password")
def change_password(
change_request: ChangePasswordRequest,
db: Session = Depends(get_db),
current_user: User = Depends(get_current_user)
):
"""
修改当前用户密码
"""
try:
UserService.change_password(db, current_user, change_request)
return {"message": "密码修改成功"}
except ValueError as e:
raise HTTPException(status_code=400, detail=str(e))