from fastapi import APIRouter,Depends,HTTPException from sqlalchemy.orm import Session from sqlalchemy import func from sqlalchemy_fastapi_demo.scheme.statistics import StudentAge, ClassCount, ScoreCount, ScoreAvg, Employment, EmploymentOff from sqlalchemy_fastapi_demo.database import get_db router = APIRouter() from sqlalchemy_fastapi_demo.model.students import Student from sqlalchemy_fastapi_demo.model.Score import Score from sqlalchemy_fastapi_demo.model.employment import EmploymentBase,EmploymentOffer from sqlalchemy_fastapi_demo.model.c_lass import Classinfo from fastapi import FastAPI, Depends, HTTPException, Query from sqlalchemy.orm import Session from sqlalchemy_fastapi_demo.database import get_db from sqlalchemy_fastapi_demo.dao.statistics import (students_age, class_statistics,score_above, score_fail, avg_scores,top_salary,stu_every,class_avg) # app = FastAPI(title="统计接口") # -动态年龄范围查询**:支持用户输入年龄阈值及比较条件(如大于、小于、等于、区间等),动态查询符合条件的学员信息。 @router.get("/students/age") def api_students_age(op: str = Query(..., description=">, <, =, >=, <=, between"), age_value: int = Query(None),age_min: int = Query(None), age_max: int = Query(None),db: Session = Depends(get_db)): try: rows = students_age(db, op, age_value, age_min, age_max) except ValueError as e: raise HTTPException(status_code=400, detail=str(e)) return [{"stu_id": s.stu_id, "stu_name": s.stu_name, "age": s.age, "gender": s.gender, "class_id": s.class_id,} for s in rows] # 多维度班级统计**:统计每个班级的总人数,以及按性别(男、女)细分的人数分布。 @router.get("/classes/statistics") def api_class_statistics(db: Session = Depends(get_db)): return class_statistics(db) # - 查询每次考试成绩都在输入分数线(如80分)以上的学生的编号、姓名和成绩。 @router.get("/scores/above") def api_score_above( score_input: int = Query(..., ge=0, le=100), db: Session = Depends(get_db)): rows = score_above(db, score_input) return [{"stu_id": i[0], "stu_name": i[1], "exam_order": i[2], "score": i[3]} for i in rows] # - 查询有输入指定次数(如两次)以上不及格的学生的姓名、班级和不及格成绩明细。 @router.get("/scores/fail") def api_score_fail( fail_times: int = Query(..., ge=1), fail_score: int = Query(60, ge=0, le=100), db: Session = Depends(get_db)): rows = score_fail(db, fail_times, fail_score) return [{"stu_name": i[0], "class_id": i[1], "exam_order": i[2], "score": i[3]} for i in rows] # 统计每次考试每个班级的平均分,并支持按分数从高到低或从低到高动态排序 @router.get("/scores/avg") def api_avg_scores(order: str = Query("desc", pattern="^(asc|desc)$"), db: Session = Depends(get_db)): a = avg_scores(db, order) return [{"exam_id": i.exam_id, "class_id": i.class_id, "avg_score": round(float(i.avg_score), 2)} for i in a] #就业统计 # - 统计就业薪资排名 Top N(动态输入 N)的学生的姓名、班级、就业时间和就业公司。 @router.get("/employment/top") def api_top_salary(n: int = Query(5, ge=1), db: Session = Depends(get_db)): return top_salary(db, n) # - 统计每个学生的就业时长(计算公式:offer下发时间 - 就业开放时间)。 @router.get("/employment/every") def api_stu_every(db: Session = Depends(get_db)): return stu_every(db) # 每个班级的平均就业时长 @router.get("/employment/class_avg") def api_class_duration(db: Session = Depends(get_db)): return class_avg(db)