Files
README_hlddz_md/advisor_api.py
T
2026-09-21 21:12:25 +08:00

69 lines
3.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ============================================================
# 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