diff --git a/api1/statistics_api.py b/api1/statistics_api.py new file mode 100644 index 0000000..17573ab --- /dev/null +++ b/api1/statistics_api.py @@ -0,0 +1,18 @@ +# api/stats +# 本文件定义统计分析相关的所有 API 路由(Controller 层) +from itertools import count + +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.statistics_scheme import StatsResponse +from scheme.users import UserCreate, UserUpdate, UserResponse + +router = APIRouter() +# **多维度班级统计**:统计每个班级的总人数,以及按性别(男、女)细分的人数分布。 +@router.get("/class/stats/gender", response_model=List[StatsResponse]) +def get_class_stats(db: Session = Depends(get_db)): + sbg = db.query(StuInfo.cls_id, count(StuInfo.id)).group_by(StuInfo.cls_id, StuInfo.gender).all() \ No newline at end of file diff --git a/main.py b/main.py index ca611b0..25daeed 100644 --- a/main.py +++ b/main.py @@ -5,7 +5,7 @@ from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from database import engine, Base -from api1 import users # 导入 users 子路由 +from api1 import users, statistics_api # 导入 users 子路由 # 1. 创建数据库表(如果表不存在) # Base.metadata.create_all 会扫描所有继承 Base 的模型,生成对应的 CREATE TABLE 语句 @@ -32,6 +32,8 @@ app.add_middleware( # prefix 为路由前缀,所有用户接口都以 /api/users 开头 app.include_router(users.router, prefix="/api/users", tags=["用户管理"]) +app.include_router(statistics_api.router, prefix="/api/stats", tags=["统计分析"]) + # 5. 根路径 @app.get("/") async def root(): diff --git a/scheme/statistics_scheme.py b/scheme/statistics_scheme.py new file mode 100644 index 0000000..79d950b --- /dev/null +++ b/scheme/statistics_scheme.py @@ -0,0 +1,22 @@ +# scheme/statistics_scheme.py +from pydantic import BaseModel, Field, EmailStr +from datetime import datetime +from typing import Optional + +# ---------- 请求模型 ---------- +# class UserCreate(BaseModel): +# username: str = Field(..., min_length=3, max_length=50) +# email: EmailStr +# full_name: Optional[str] = Field(None, max_length=100) +# +# class UserUpdate(BaseModel): +# username: Optional[str] = Field(None, min_length=3, max_length=50) +# email: Optional[EmailStr] = None +# full_name: Optional[str] = Field(None, max_length=100) + +# ---------- 响应模型 ---------- +# 多维度班级统计 +class StatsResponse(BaseModel): + total_count: int + man_count: int + female_count: int \ No newline at end of file