# api/users.py # 本文件定义用户相关的所有 API 路由(Controller 层) from fastapi import APIRouter, Depends, HTTPException, Query from sqlalchemy.orm import Session from typing import List from database import get_db from dao.users_dao import UserDAO from scheme.users import UserCreate, UserUpdate, UserResponse # 创建路由器,前缀将在 main0814.py 中统一添加 router = APIRouter() # ---------- 查询所有用户(分页) ---------- @router.get("/", response_model=List[UserResponse]) async def get_users( skip: int = Query(0, ge=0, description="跳过的记录数"), limit: int = Query(100, ge=1, le=200, description="返回的最大记录数"), db: Session = Depends(get_db) # 依赖注入获得数据库会话 ): """ 获取用户列表,支持分页 """ users = UserDAO.get_all(db, skip=skip, limit=limit) return users # FastAPI 自动根据 response_model 转换为 JSON # ---------- 根据 ID 查询单个用户 ---------- @router.get("/{user_id}", response_model=UserResponse) async def get_user( user_id: int, db: Session = Depends(get_db) ): """ 根据用户 ID 获取详细信息 """ user = UserDAO.get_by_id(db, user_id) if not user: raise HTTPException(status_code=404, detail="用户不存在") return user # ---------- 创建新用户 ---------- @router.post("/", response_model=UserResponse, status_code=201) async def create_user( user_data: UserCreate, db: Session = Depends(get_db) ): """ 创建新用户,需要提供用户名、邮箱和全名(全名可选) 注意:用户名必须唯一 """ # 检查用户名是否已被占用 existing = UserDAO.get_by_username(db, user_data.username) if existing: raise HTTPException(status_code=400, detail="用户名已被占用") # 调用 DAO 创建用户 new_user = UserDAO.create(db, user_data) return new_user # ---------- 更新用户信息 ---------- @router.put("/{user_id}", response_model=UserResponse) async def update_user( user_id: int, user_data: UserUpdate, db: Session = Depends(get_db) ): """ 更新用户信息(只更新传入的字段) """ # 检查用户是否存在 existing = UserDAO.get_by_id(db, user_id) if not existing: raise HTTPException(status_code=404, detail="用户不存在") # 如果更新用户名,需要检查新用户名是否与其他用户冲突(排除自身) if user_data.username is not None: conflict = UserDAO.get_by_username(db, user_data.username) if conflict and conflict.id != user_id: raise HTTPException(status_code=400, detail="用户名已被其他用户占用") # 执行更新 updated = UserDAO.update(db, user_id, user_data) return updated # ---------- 删除用户 ---------- @router.delete("/{user_id}", status_code=204) async def delete_user( user_id: int, db: Session = Depends(get_db) ): """ 删除用户,成功返回 204 No Content """ success = UserDAO.delete(db, user_id) if not success: raise HTTPException(status_code=404, detail="用户不存在") # 返回 None 表示 204 状态码(无内容) return None