初次代码

This commit is contained in:
jianqi
2026-09-11 23:40:12 +08:00
commit cea442451d
11 changed files with 338 additions and 0 deletions
+98
View File
@@ -0,0 +1,98 @@
# 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