上传文件至「/」
This commit is contained in:
@@ -0,0 +1,68 @@
|
||||
# ============================================================
|
||||
# api/advisor_api.py —— 顾问模块路由层(Controller)
|
||||
# 职责:定义顾问相关的所有 HTTP 接口,调用 dao 层完成业务处理
|
||||
# 统一前缀:/advisor(在 main.py 中挂载)
|
||||
# ============================================================
|
||||
|
||||
from fastapi import APIRouter, Depends, HTTPException, Query
|
||||
from sqlalchemy.orm import Session
|
||||
from dao import advisor_dao # 顾问数据访问层
|
||||
from database import get_db # 数据库会话依赖
|
||||
from scheme.advisor_scheme import (
|
||||
AdvisorCreate, # 新增顾问请求模型
|
||||
AdvisorResp, # 顾问响应模型
|
||||
AdvisorStudentResp, # 顾问名下学生响应模型
|
||||
AdvisorUpdate, # 更新顾问请求模型
|
||||
)
|
||||
|
||||
# router = APIRouter(prefix="/advisor", tags=["顾问管理模块"])
|
||||
router = APIRouter() # 前缀在 main.py 统一挂载为 /advisor
|
||||
|
||||
# 新增顾问(POST /advisor/)
|
||||
@router.post("/", response_model=AdvisorResp, summary="新增顾问")
|
||||
def add_advisor(advisor: AdvisorCreate, db: Session = Depends(get_db)):
|
||||
# 校验顾问编号唯一性:已存在则拒绝新增
|
||||
if advisor_dao.get_advisor_by_no(db, advisor.advisor_no):
|
||||
raise HTTPException(status_code=400, detail=f"顾问编号 {advisor.advisor_no} 已存在")
|
||||
return advisor_dao.create_advisor(db, advisor)
|
||||
|
||||
# 顾问列表/搜索(GET /advisor/):可按编号或姓名模糊搜索
|
||||
@router.get("/", response_model=list[AdvisorResp], summary="顾问列表/搜索")
|
||||
def get_advisor_list(
|
||||
search_keyword: str | None = Query(default=None, description="按顾问编号或姓名模糊搜索"),
|
||||
db: Session = Depends(get_db),
|
||||
):
|
||||
return advisor_dao.get_advisor_list(db, search_keyword)
|
||||
|
||||
# 按编号查询单个顾问(GET /advisor/{advisor_no})
|
||||
@router.get("/{advisor_no}", response_model=AdvisorResp, summary="按编号查询顾问")
|
||||
def get_advisor(advisor_no: str, db: Session = Depends(get_db)):
|
||||
advisor = advisor_dao.get_advisor_by_no(db, advisor_no)
|
||||
if not advisor:
|
||||
raise HTTPException(status_code=404, detail=f"顾问 {advisor_no} 不存在")
|
||||
return advisor
|
||||
|
||||
# 查询该顾问名下所有学生(GET /advisor/{advisor_no}/students)
|
||||
@router.get("/{advisor_no}/students", response_model=list[AdvisorStudentResp], summary="查询顾问名下学生")
|
||||
def get_advisor_students(advisor_no: str, db: Session = Depends(get_db)):
|
||||
# 先确认顾问存在
|
||||
if not advisor_dao.get_advisor_by_no(db, advisor_no):
|
||||
raise HTTPException(status_code=404, detail=f"顾问 {advisor_no} 不存在")
|
||||
return advisor_dao.get_students_by_advisor_no(db, advisor_no)
|
||||
|
||||
# 更新顾问信息(PUT /advisor/{advisor_no})
|
||||
@router.put("/{advisor_no}", response_model=AdvisorResp, summary="更新顾问")
|
||||
def update_advisor(advisor_no: str, update: AdvisorUpdate, db: Session = Depends(get_db)):
|
||||
# model_dump(exclude_unset=True):只传被修改的字段(没传的不覆盖)
|
||||
advisor = advisor_dao.update_advisor(db, advisor_no, update.model_dump(exclude_unset=True))
|
||||
if not advisor:
|
||||
raise HTTPException(status_code=404, detail=f"顾问 {advisor_no} 不存在")
|
||||
return advisor
|
||||
|
||||
# 删除顾问(DELETE /advisor/{advisor_no},逻辑删除)
|
||||
@router.delete("/{advisor_no}", response_model=AdvisorResp, summary="删除顾问")
|
||||
def delete_advisor(advisor_no: str, db: Session = Depends(get_db)):
|
||||
advisor = advisor_dao.delete_advisor(db, advisor_no)
|
||||
if not advisor:
|
||||
raise HTTPException(status_code=404, detail=f"顾问 {advisor_no} 不存在")
|
||||
return advisor
|
||||
Reference in New Issue
Block a user