From 9a97c7d2a8c627b10d0fafcdd33b80eeaf258d6b Mon Sep 17 00:00:00 2001 From: cyf <15271199537@163.com> Date: Mon, 21 Sep 2026 22:06:10 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=96=B0=E6=96=B0=E5=A2=9E=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=E6=9E=B6=E6=9E=84=E6=96=87=E4=BB=B6=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- class_management/api/__init__.py | 0 class_management/api/class_management_api.py | 75 +++++++++++++++++ class_management/dao/__init__.py | 0 class_management/dao/class_management_dao.py | 81 +++++++++++++++++++ class_management/database.py | 17 ++++ class_management/main.py | 14 ++++ class_management/middleware.py | 0 class_management/model/__init__.py | 0 .../model/class_management_model.py | 70 ++++++++++++++++ class_management/schema/__init__.py | 0 .../schema/class_management_request.py | 42 ++++++++++ 11 files changed, 299 insertions(+) create mode 100644 class_management/api/__init__.py create mode 100644 class_management/api/class_management_api.py create mode 100644 class_management/dao/__init__.py create mode 100644 class_management/dao/class_management_dao.py create mode 100644 class_management/database.py create mode 100644 class_management/main.py create mode 100644 class_management/middleware.py create mode 100644 class_management/model/__init__.py create mode 100644 class_management/model/class_management_model.py create mode 100644 class_management/schema/__init__.py create mode 100644 class_management/schema/class_management_request.py diff --git a/class_management/api/__init__.py b/class_management/api/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/class_management/api/class_management_api.py b/class_management/api/class_management_api.py new file mode 100644 index 0000000..53099de --- /dev/null +++ b/class_management/api/class_management_api.py @@ -0,0 +1,75 @@ +from datetime import date + +from fastapi import APIRouter,Depends,HTTPException,Query +from dao.class_management_dao import add_class_dao, update_class_dao, get_class_dao, delete_class_dao +from database import get_db +from schema.class_management_request import ClassCreate, ClassResponse, ClassUpdate + +class_api = APIRouter(tags=['班级管理模块']) + + + +@class_api.post("/classes",summary='新增班级') +def add_class(cla:ClassCreate,db=Depends(get_db)): + c_dict = cla.model_dump() + r = add_class_dao(c=c_dict,db=db) + if not r: + raise HTTPException(status_code=500,detail='服务器繁忙,请稍后添加!') + return ClassResponse(totals=1,data=c_dict) + + +@class_api.get('/classes/{class_id}',summary='根据id查询班级') +def get_one_class(class_id:int,db=Depends(get_db)): + res = get_class_dao(c={'class_id':class_id},db=db) + if not res: + raise HTTPException(status_code=404, detail="该班级不存在或已删除") + return ClassResponse(data=res) + +@class_api.get('/classes',summary='多字段查询班级') +def get_some_classes(class_name:str|None = Query(None,description='班级名称') + ,class_teacher:str|None = Query(None,description='班主任') + ,class_lecturer:str|None = Query(None,description='授课老师') + ,class_start_time:date|None = Query(None, description="开班日期,格式YYYY‑MM‑DD") + ,class_end_time: date|None = Query(None, description="结课日期,格式YYYY‑MM‑DD") + ,page:int = Query(1,ge=1,description='页码,从1开始') + ,page_size:int = Query(5,ge=1,le=50,description='每页信息条数') + ,db=Depends(get_db) + ): + c_dict={'class_name':class_name + ,'class_teacher':class_teacher + ,'class_lecturer':class_lecturer + ,'class_start_time':class_start_time + ,'class_end_time':class_end_time + } + c_dict={k:v for k,v in c_dict.items() if v is not None}#过滤掉值为None的key + + res = get_class_dao(c=c_dict,db=db) + total = len(res) + + #内存分页 + start_index = (page-1)*page_size + page_data = res[start_index:start_index + page_size] + + page_response = ClassResponse(data=page_data,totals=total) + return page_response + + + + +@class_api.put("/classes/{class_id}",summary='修改班级信息') +def update_class(class_id,update_info:ClassUpdate,db=Depends(get_db)): + update_dict=update_info.model_dump(exclude_unset=True) + if not update_dict: + raise HTTPException(status_code=400, detail="没有传入要修改的字段") + row_count = update_class_dao(cid=class_id, update_data=update_dict, db=db) + if row_count <= 0: + raise HTTPException(status_code=404, detail="班级不存在,修改失败") + return ClassResponse(detail="修改成功", data={"class_id": class_id}) + + +@class_api.delete('/classes/{class_id}',summary='逻辑删除班级') +def remove_class(class_id:int,db=Depends(get_db)): + del_rows = delete_class_dao(class_id,db) + if del_rows <= 0: + raise HTTPException(status_code=404, detail="班级不存在,删除失败") + return ClassResponse(detail='删除成功',data={'class_id':class_id}) diff --git a/class_management/dao/__init__.py b/class_management/dao/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/class_management/dao/class_management_dao.py b/class_management/dao/class_management_dao.py new file mode 100644 index 0000000..2a38835 --- /dev/null +++ b/class_management/dao/class_management_dao.py @@ -0,0 +1,81 @@ +from model.class_management_model import ClassInfo +from sqlalchemy.orm import Session + + +#查询 +def get_class_dao(c:dict,db:Session) : + q = db.query(ClassInfo).filter(ClassInfo.is_delete == 0)#is_delete=0代表未删除 + if c.get('class_id'): + q = q.filter(ClassInfo.class_id == c.get('class_id')) + if c.get('class_name'): + q = q.filter(ClassInfo.class_name == c.get('class_name')) + if c.get('class_teacher'): + q = q.filter(ClassInfo.class_teacher == c.get('class_teacher')) + if c.get('class_lecturer'): + q = q.filter(ClassInfo.class_lecturer == c.get('class_lecturer')) + if c.get('class_start_time'): + q = q.filter(ClassInfo.class_start_time == c.get('class_start_time')) + if c.get('class_end_time'): + q = q.filter(ClassInfo.class_end_time == c.get('class_end_time')) + c1 = q.all() + if not c1: + return [] + return[ + {'班级编号':i.class_id + ,'班级名称':i.class_name + ,'班主任':i.class_teacher + ,'授课老师':i.class_lecturer + ,'开课时间':i.class_start_time + ,'结课时间':i.class_end_time + } for i in c1 + ] + + +#新增 +def add_class_dao(c:dict,db:Session): + try: + exist_class = db.query(ClassInfo)\ + .filter(ClassInfo.class_name == c['class_name'] + ,ClassInfo.is_delete == 0)\ + .first() + if exist_class: + msg = '班级名称已存在' + print(msg) + return [False,msg] + c1 = ClassInfo(**c) + db.add(c1) + except: + db.rollback() + return False + else: + db.commit() + return True + +#修改 +def update_class_dao(cid:int,update_data,db): + try: + rows = db.query(ClassInfo)\ + .filter(ClassInfo.class_id == cid + ,ClassInfo.is_delete==0)\ + .update(update_data) + except: + db.rollback() + return False + else: + db.commit() + return rows + + +#删除 +def delete_class_dao(cid,db): + try: + rows = db.query(ClassInfo)\ + .filter(ClassInfo.class_id == cid,ClassInfo.is_delete==0)\ + .update({'is_delete':1}) + except: + db.rollback() + rows = 0 + else: + db.commit() + finally: + return rows diff --git a/class_management/database.py b/class_management/database.py new file mode 100644 index 0000000..259aba1 --- /dev/null +++ b/class_management/database.py @@ -0,0 +1,17 @@ +from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker,declarative_base + +class_management_rul = "mysql+pymysql://root:123456@localhost:3306/student_manage_system?charset=utf8mb4" + +engine = create_engine(class_management_rul) +SessionLocal = sessionmaker(bind=engine,autocommit=False, autoflush=False) +Base = declarative_base() + +# 获取数据库会话依赖 + +def get_db(): + db = SessionLocal() + try : + yield db + finally: + db.close() diff --git a/class_management/main.py b/class_management/main.py new file mode 100644 index 0000000..a44634f --- /dev/null +++ b/class_management/main.py @@ -0,0 +1,14 @@ +from fastapi import FastAPI,APIRouter +from api.class_management_api import class_api +from model.class_management_model import ClassInfo +from database import Base,engine +import model +app = FastAPI() + +app.include_router(class_api) + +Base.metadata.create_all(engine) + +if __name__ =='__main__': + import uvicorn + uvicorn.run('main:app',host='127.0.0.1',port=12345) \ No newline at end of file diff --git a/class_management/middleware.py b/class_management/middleware.py new file mode 100644 index 0000000..e69de29 diff --git a/class_management/model/__init__.py b/class_management/model/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/class_management/model/class_management_model.py b/class_management/model/class_management_model.py new file mode 100644 index 0000000..b4f1567 --- /dev/null +++ b/class_management/model/class_management_model.py @@ -0,0 +1,70 @@ + +from sqlalchemy import Column, Integer, String, Date, ForeignKey +from sqlalchemy.dialects.mysql import DATETIME +from datetime import datetime +from database import Base + + + + +class ClassInfo(Base): + __tablename__ = 'classes_management' + + id = Column(Integer + ,primary_key=True + ,autoincrement=True + ,comment='班级id主键' + ) + num = Column(String(50) + ,nullable=False + ,comment='班级编号' + ) + name = Column(String(50) + ,nullable=False + ,comment='班级名称' + ) + head_teacher_id = Column(Integer + ,ForeignKey('teacher.id') + ,nullable=False + ,comment='班主任编号' + ) + + coach_teacher_id = Column(Integer + ,ForeignKey('teacher.id') + ,nullable=False + ,comment='授课老师编号' + ) + tutor_teacher_id = Column(Integer + ,ForeignKey('teacher.id') + ,nullable=False + ,comment='助教老师编号' + ) + # class_teacher = Column(String(50) + # ,nullable=False + # ,comment='班主任' + # ) + # class_lecturer = Column(String(50) + # ,nullable=False + # ,comment='授课老师' + # ) + class_start_time = Column(Date + ,nullable=False + ,comment='开班日期' + ) + class_end_time = Column(Date + ,nullable=False + ,comment='结课日期' + ) + is_delete = Column(Integer + ,default=0 + ,comment='逻辑删除 0未删除 1已删除' + ) + create_time = Column(DATETIME + ,default=datetime.now + ,comment='记录创建时间' + ) + update_time = Column(DATETIME + ,default=datetime.now + ,onupdate=datetime.now + ,comment='记录更新时间' + ) diff --git a/class_management/schema/__init__.py b/class_management/schema/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/class_management/schema/class_management_request.py b/class_management/schema/class_management_request.py new file mode 100644 index 0000000..b5fe019 --- /dev/null +++ b/class_management/schema/class_management_request.py @@ -0,0 +1,42 @@ +from pydantic import BaseModel,Field +from datetime import date,datetime +from typing import Optional,List + +#基础班级请求体 +class ClassBase(BaseModel): + class_teacher:str|None = Field(None,description='班主任') + class_lecturer:str|None = Field(None,description='授课老师') + class_start_time:date|None = Field(None,description='开班日期') + class_end_time:date|None = Field(None,description='结课日期') + +#新增班级请求体模型 +class ClassCreate(ClassBase): + class_name:str = Field(..., description='班级名称') + +#修改班级请求体模型 +class ClassUpdate(ClassBase): + class_name:str = Field(None,description='班级名称') + + +class ClassInfoResp(BaseModel): + class_id:int + class_name:str + class_teacher:str + class_lecturer:str + class_start_time:date + class_end_time:date + create_time:datetime + update_time:datetime + + class Config: + from_attributes = True + + +class ClassResponse(BaseModel): + code:int = 200 + detail:str = 'OK' + totals:int = 0 + data:str|dict|tuple|list + msg:str = 'OK' + +