diff --git a/advisor.py b/advisor.py new file mode 100644 index 0000000..c31d2a6 --- /dev/null +++ b/advisor.py @@ -0,0 +1,17 @@ +from sqlalchemy import Column, Integer, String +from sqlalchemy.orm import declarative_base, relationship +from database import Base + +class Advisor(Base): + __tablename__ = 'advisor' + id = Column(Integer, primary_key=True, autoincrement=True) + advisor_no = Column(String(32), unique=True, nullable=False) + name = Column(String(50), nullable=False) + gender = Column(String(2), nullable=False) + phone = Column(String(20), nullable=False) + remark=Column(String(500), nullable=True) + statu = Column(Integer, default=1, nullable=False) + students=relationship("Student", back_populates="advisor") + + + diff --git a/classinfo.py b/classinfo.py new file mode 100644 index 0000000..ee5500f --- /dev/null +++ b/classinfo.py @@ -0,0 +1,15 @@ +from sqlalchemy import Column, Integer, String, Date +from sqlalchemy.orm import relationship +from database import Base +from model.teacher_class import teacher_class + + +# 班级信息表 +class ClassInfo(Base): + __tablename__="classinfo" + id=Column(Integer,primary_key=True,autoincrement=True) + class_name=Column(String(50),nullable=False,unique=True) + start_time=Column(Date) + statu=Column(Integer,default=1) # 逻辑删除表字段 1代表存在 + teachers=relationship("Teacher",secondary=teacher_class,back_populates="classinfo") + students= relationship("Student",back_populates="classinfo") \ No newline at end of file diff --git a/database.py b/database.py new file mode 100644 index 0000000..a099b7e --- /dev/null +++ b/database.py @@ -0,0 +1,24 @@ +# ============================================================ +# database.py —— 数据库连接与会话管理 +# 职责:创建 SQLAlchemy 引擎、会话工厂,并提供 FastAPI 依赖注入用的 get_db +# ============================================================ + +from sqlalchemy import create_engine # 创建数据库引擎 +from sqlalchemy.orm import sessionmaker # 创建会话工厂 + +from model import Base # 导入 ORM 基类(所有模型都继承它) + +# 数据库引擎:连接 MySQL(驱动 pymysql),目标库名为 fastapi0814 +# 连接串格式:mysql+pymysql://用户名:密码@主机/数据库名 +engine = create_engine("mysql+pymysql://root:123456@localhost/fastapi0814") +# 会话工厂:用于生成数据库会话对象 +# autocommit=False 表示手动提交事务;autoflush=False 表示查询前不自动刷写 +SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) + +# FastAPI 依赖函数:通过 Depends(get_db) 注入数据库会话 +def get_db(): + db = SessionLocal() # 创建新会话 + try: + yield db # 把会话交给业务代码使用 + finally: + db.close() # 请求结束后无论如何都要关闭会话,避免连接泄漏 diff --git a/main.py b/main.py new file mode 100644 index 0000000..2da288e --- /dev/null +++ b/main.py @@ -0,0 +1,34 @@ +# ============================================================ +# main.py —— 系统启动入口 +# 职责:创建 FastAPI 应用、注册各业务模块的路由,并启动服务 +# ============================================================ + +import uvicorn # ASGI 服务器,用于运行 FastAPI 应用 +from fastapi import FastAPI +# 导入各业务模块的路由器(api 包下每个文件对应一个业务模块) +from api import student_api,employment_api,advisor_api,teacher_api,score_api,classinfo_api,api_analysis + +# 创建 FastAPI 应用实例;title 会显示在 Swagger 接口文档中 +app = FastAPI(title="沃林学生管理系统", version="1.0.0") + +# 注册学生模块路由:所有接口挂载在 /students 前缀下 +app.include_router(student_api.router, prefix="/students", tags=["学生模块"]) +# 注册就业模块路由:所有接口挂载在 /employment 前缀下 +app.include_router(employment_api.router,prefix="/employment",tags=["就业模块"]) +# 注册顾问模块路由:所有接口挂载在 /advisor 前缀下 +app.include_router(advisor_api.router,prefix="/advisor",tags=["顾问模块"]) +# 注册教师模块路由:所有接口挂载在 /teacher 前缀下 +app.include_router(teacher_api.router,prefix="/teacher",tags=["教师模块"]) +# 注册成绩模块路由:所有接口挂载在 /score 前缀下 +app.include_router(score_api.router,prefix="/score",tags=["成绩模块"]) +# 注册班级模块路由:所有接口挂载在 /classinfo 前缀下 +app.include_router(classinfo_api.router,prefix="/classinfo",tags=["班级模块"]) +# 注册统计分析模块路由:所有接口挂载在 /analysis 前缀下 +app.include_router(api_analysis.router,prefix="/analysis",tags=["统计分析模块"]) + +# 仅在直接运行本文件时执行(python main.py) +if __name__=="__main__": + # 如需在启动时自动建表,可取消下行注释(需要提前建好数据库) + # Base.metadata.create_all(bind=engine) + # 启动开发服务器:监听 localhost:8051,reload=True 开启代码热重载 + uvicorn.run("main:app",host="localhost",port=8051,reload=True) diff --git a/score.py b/score.py new file mode 100644 index 0000000..863556c --- /dev/null +++ b/score.py @@ -0,0 +1,17 @@ +# model/score.py +from sqlalchemy import Column, Integer, Float, ForeignKey, DateTime +from sqlalchemy.orm import relationship +from datetime import datetime +from database import Base + + +class Score(Base): + __tablename__ = "score" + id = Column(Integer, primary_key=True, autoincrement=True) # 主键 + student_id = Column(Integer, ForeignKey("student.id"), nullable=False) #外键 + exam_seq = Column(Integer, nullable=False) + score = Column(Float, nullable=False) + is_warning = Column(Integer, default=0) #低分预警 0正常 1不及格 + is_deleted = Column(Integer, default=0) #是否被逻辑删除 + create_time = Column(DateTime, default=datetime.now) + student = relationship("Student", back_populates="scores") \ No newline at end of file