# api/statistics_api.py # 统计分析模块(动态查询与综合能力锻炼): # 聚合 / 分组 / 关联 / 动态查询条件全部沉在 dao.statistics_dao,这里只暴露接口。 from typing import Optional from fastapi import APIRouter, Depends, Query from sqlalchemy.orm import Session from dao import statistics_dao from database import get_db router = APIRouter() @router.get("/overview", summary="系统总览统计") def overview(db: Session = Depends(get_db)): """统计学生、班级、教师、顾问、已就业人数及就业率。""" return statistics_dao.overview(db) @router.get("/student/gender", summary="学生性别分布") def student_gender_distribution(db: Session = Depends(get_db)): return statistics_dao.student_gender_distribution(db) @router.get("/student/education", summary="学生学历分布") def student_education_distribution(db: Session = Depends(get_db)): return statistics_dao.student_education_distribution(db) @router.get("/student/state", summary="学生就读状态分布") def student_state_distribution(db: Session = Depends(get_db)): return statistics_dao.student_state_distribution(db) @router.get("/student/hometown", summary="学生生源地分布(Top N)") def student_hometown_distribution( limit: int = Query(10, ge=1, le=100, description="返回前 N 个生源地"), db: Session = Depends(get_db), ): return statistics_dao.student_hometown_distribution(db, limit=limit) @router.get("/score/summary", summary="成绩综合统计(平均/最高/最低/及格率)") def score_summary( cls_id: Optional[str] = Query(None, description="按班级过滤(不传则统计全部)"), db: Session = Depends(get_db), ): """统计平均分、最高分、最低分、及格人数与及格率,可动态按班级过滤(关联 stu_info)。""" return statistics_dao.score_summary(db, cls_id=cls_id) @router.get("/score/distribution", summary="成绩等级分布") def score_level_distribution(db: Session = Depends(get_db)): return statistics_dao.score_level_distribution(db) @router.get("/employ/summary", summary="就业综合统计(就业率/薪资)") def employ_summary(db: Session = Depends(get_db)): return statistics_dao.employ_summary(db)