更改文件导入路径和部分功能更新

This commit is contained in:
2026-09-22 12:31:52 +08:00
parent fee9e14768
commit 23e29d7f1a
6 changed files with 113 additions and 102 deletions
+36 -30
View File
@@ -1,15 +1,12 @@
from datetime import date from datetime import date
from fastapi import APIRouter,Depends,HTTPException,Query 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 class_management.dao.class_management_dao import add_class_dao, update_class_dao, get_class_dao, delete_class_dao
from database import get_db from class_management.database import get_db
from schema.class_management_request import ClassCreate, ClassResponse, ClassUpdate from class_management.schema.class_management_request import ClassCreate, ClassResponse, ClassUpdate
class_api = APIRouter(tags=['班级管理模块']) class_api = APIRouter(prefix='/classes',tags=['班级管理模块'])
@class_api.post("",summary='新增班级')
@class_api.post("/classes",summary='新增班级')
def add_class(cla:ClassCreate,db=Depends(get_db)): def add_class(cla:ClassCreate,db=Depends(get_db)):
c_dict = cla.model_dump() c_dict = cla.model_dump()
r = add_class_dao(c=c_dict,db=db) r = add_class_dao(c=c_dict,db=db)
@@ -18,29 +15,36 @@ def add_class(cla:ClassCreate,db=Depends(get_db)):
return ClassResponse(totals=1,data=c_dict) return ClassResponse(totals=1,data=c_dict)
@class_api.get('/classes/{class_id}',summary='根据id查询班级') @class_api.get('/{id}',summary='根据id查询班级')
def get_one_class(class_id:int,db=Depends(get_db)): def get_one_class(id:int,db=Depends(get_db)):
res = get_class_dao(c={'class_id':class_id},db=db) res = get_class_dao(c={'id':id},db=db)
if not res: if not res:
raise HTTPException(status_code=404, detail="该班级不存在或已删除") raise HTTPException(status_code=404, detail="该班级不存在或已删除")
return ClassResponse(data=res) return ClassResponse(total=1,data=res[0])
@class_api.get('/classes',summary='多字段查询班级') @class_api.get('',summary='多字段查询班级')
def get_some_classes(class_name:str|None = Query(None,description='班级名称') def get_some_classes( num:str|None = Query(None,description='班级编号')
,class_teacher:str|None = Query(None,description='班主任') ,name:str|None = Query(None,description='班级名称')
,class_lecturer:str|None = Query(None,description='授课老师') ,head_teacher_id:int|None = Query(None,description='班主任')
,coach_teacher_id:int|None = Query(None,description='授课老师')
,tutor_teacher_id:int|None = Query(None,description='助教老师')
,class_start_time:date|None = Query(None, description="开班日期,格式YYYY‑MM‑DD") ,class_start_time:date|None = Query(None, description="开班日期,格式YYYY‑MM‑DD")
,class_end_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:int = Query(1,ge=1,description='页码,从1开始')
,page_size:int = Query(5,ge=1,le=50,description='每页信息条数') ,page_size:int = Query(5,ge=1,le=50,description='每页信息条数')
,db=Depends(get_db) ,db=Depends(get_db)
): ):
c_dict={'class_name':class_name
,'class_teacher':class_teacher c_dict = {
,'class_lecturer':class_lecturer 'num': num,
,'class_start_time':class_start_time 'name': name,
,'class_end_time':class_end_time 'head_teacher_id': head_teacher_id,
'coach_teacher_id': coach_teacher_id,
'tutor_teacher_id': tutor_teacher_id,
'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 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) res = get_class_dao(c=c_dict,db=db)
@@ -50,26 +54,28 @@ def get_some_classes(class_name:str|None = Query(None,description='班级名称'
start_index = (page-1)*page_size start_index = (page-1)*page_size
page_data = res[start_index:start_index + page_size] page_data = res[start_index:start_index + page_size]
page_response = ClassResponse(data=page_data,totals=total) return ClassResponse(totals=total,data=page_data)
return page_response
@class_api.put("/classes/{class_id}",summary='修改班级信息') @class_api.put("/{class_id}",summary='修改班级信息')
def update_class(class_id,update_info:ClassUpdate,db=Depends(get_db)): def update_class(class_id:int
,update_info:ClassUpdate
,db=Depends(get_db)
):
update_dict=update_info.model_dump(exclude_unset=True) update_dict=update_info.model_dump(exclude_unset=True)
if not update_dict: if not update_dict:
raise HTTPException(status_code=400, detail="没有传入要修改的字段") raise HTTPException(status_code=400, detail="没有传入要修改的字段")
row_count = update_class_dao(cid=class_id, update_data=update_dict, db=db) row_count = update_class_dao(cid=class_id, update_data=update_dict, db=db)
if row_count <= 0: if row_count <= 0:
raise HTTPException(status_code=404, detail="班级不存在,修改失败") raise HTTPException(status_code=404, detail="班级不存在,修改失败")
return ClassResponse(detail="修改成功", data={"class_id": class_id}) return ClassResponse(detail="修改成功", data={"class_id": id})
@class_api.delete('/classes/{class_id}',summary='逻辑删除班级') @class_api.delete('/{id}',summary='逻辑删除班级')
def remove_class(class_id:int,db=Depends(get_db)): def remove_class(id:int,db=Depends(get_db)):
del_rows = delete_class_dao(class_id,db) del_rows = delete_class_dao(id,db)
if del_rows <= 0: if del_rows <= 0:
raise HTTPException(status_code=404, detail="班级不存在,删除失败") raise HTTPException(status_code=404, detail="班级不存在,删除失败")
return ClassResponse(detail='删除成功',data={'class_id':class_id}) return ClassResponse(detail='删除成功',data={'id':id})
+53 -38
View File
@@ -1,81 +1,96 @@
from model.class_management_model import ClassInfo from class_management.model.class_management_model import ClassInfo
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
#查询 #查询
def get_class_dao(c:dict,db:Session) : def get_class_dao(c:dict,db:Session) :
q = db.query(ClassInfo).filter(ClassInfo.is_delete == 0)#is_delete=0代表未删除 q = db.query(ClassInfo).filter(ClassInfo.is_delete == 0)#is_delete=0代表未删除
if c.get('class_id'): if c.get('id'):
q = q.filter(ClassInfo.class_id == c.get('class_id')) q = q.filter(ClassInfo.id == c.get('id'))
if c.get('class_name'): if c.get('num'):
q = q.filter(ClassInfo.class_name == c.get('class_name')) q = q.filter(ClassInfo.num == c.get('num'))
if c.get('class_teacher'): if c.get('name'):
q = q.filter(ClassInfo.class_teacher == c.get('class_teacher')) q = q.filter(ClassInfo.name == c.get('name'))
if c.get('class_lecturer'): if c.get('head_teacher_id'):
q = q.filter(ClassInfo.class_lecturer == c.get('class_lecturer')) q = q.filter(ClassInfo.head_teacher_id == c.get('head_teacher_id'))
if c.get('coach_teacher_id'):
q = q.filter(ClassInfo.coach_teacher_id == c.get('coach_teacher_id'))
if c.get('tutor_teacher_id'):
q = q.filter(ClassInfo.tutor_teacher_id == c.get('tutor_teacher_id'))
if c.get('class_start_time'): if c.get('class_start_time'):
q = q.filter(ClassInfo.class_start_time == c.get('class_start_time')) q = q.filter(ClassInfo.class_start_time == c.get('class_start_time'))
if c.get('class_end_time'): if c.get('class_end_time'):
q = q.filter(ClassInfo.class_end_time == c.get('class_end_time')) q = q.filter(ClassInfo.class_end_time == c.get('class_end_time'))
c1 = q.all() res = q.all()
if not c1: if not res:
return [] return []
return[ return[
{'班级编号':i.class_id {'id':i.id
,'班级名称':i.class_name ,'num':i.num
,'班主任':i.class_teacher ,'name':i.name
,'授课老师':i.class_lecturer ,'head_teacher_id':i.head_teacher_id
,'开课时间':i.class_start_time ,'coach_teacher_id':i.coach_teacher_id
,'结课时间':i.class_end_time ,'tutor_teacher_id':i.tutor_teacher_id
} for i in c1 ,'class_start_time':i.class_start_time
,'class_end_time':i.class_end_time
,"is_delete": i.is_delete
,"create_time": i.create_time
,"update_time": i.update_time
} for i in res
] ]
#新增 #新增班级
def add_class_dao(c:dict,db:Session): def add_class_dao(c:dict,db:Session):
try: try:
exist_class = db.query(ClassInfo)\ exist_class = db.query(ClassInfo)\
.filter(ClassInfo.class_name == c['class_name'] .filter(ClassInfo.name == c['name']
,ClassInfo.is_delete == 0)\ ,ClassInfo.is_delete == 0)\
.first() .first()
if exist_class: if exist_class:
msg = '班级名称已存在' msg = '班级名称已存在'
print(msg) print(msg)
return [False,msg] return (False,msg)
c1 = ClassInfo(**c) c1 = ClassInfo(**c)
db.add(c1) db.add(c1)
except:
db.rollback()
return False
else:
db.commit() db.commit()
return True db.refresh(c1)
return (True,None)
except Exception as e:
db.rollback()
err_msg = f'数据库异常:{str(e)}'
print(err_msg)
return (False,err_msg)
#修改 #修改
def update_class_dao(cid:int,update_data,db): def update_class_dao(cid:int,update_data,db):
try: try:
rows = db.query(ClassInfo)\ rows = db.query(ClassInfo)\
.filter(ClassInfo.class_id == cid .filter(ClassInfo.id == cid
,ClassInfo.is_delete==0)\ ,ClassInfo.is_delete==0)\
.update(update_data) .update(update_data)
except:
db.rollback()
return False
else:
db.commit() db.commit()
return rows return rows
except Exception as e:
db.rollback()
print(f"update_class_dao异常:{e}")
return 0
#删除
#删除(逻辑删除)
def delete_class_dao(cid,db): def delete_class_dao(cid,db):
try: try:
rows = db.query(ClassInfo)\ rows = db.query(ClassInfo)\
.filter(ClassInfo.class_id == cid,ClassInfo.is_delete==0)\ .filter(ClassInfo.id == cid,ClassInfo.is_delete==0)\
.update({'is_delete':1}) .update({'is_delete':1})
except:
db.rollback()
rows = 0
else:
db.commit() db.commit()
finally:
return rows return rows
except Exception as e:
db.rollback()
print(f"delete_class_dao异常:{e}")
rows = 0
+1 -1
View File
@@ -1,7 +1,7 @@
from sqlalchemy import create_engine from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker,declarative_base from sqlalchemy.orm import sessionmaker,declarative_base
class_management_rul = "mysql+pymysql://root:123456@localhost:3306/student_manage_system?charset=utf8mb4" class_management_url = "mysql+pymysql://root:123456@localhost:3306/student_manage_system?charset=utf8mb4"
engine = create_engine(class_management_rul) engine = create_engine(class_management_rul)
SessionLocal = sessionmaker(bind=engine,autocommit=False, autoflush=False) SessionLocal = sessionmaker(bind=engine,autocommit=False, autoflush=False)
+4 -4
View File
@@ -1,8 +1,8 @@
from fastapi import FastAPI,APIRouter from fastapi import FastAPI,APIRouter
from api.class_management_api import class_api from class_management.api.class_management_api import class_api
from model.class_management_model import ClassInfo from class_management.model.class_management_model import ClassInfo
from database import Base,engine from class_management.database import Base,engine
import model
app = FastAPI() app = FastAPI()
app.include_router(class_api) app.include_router(class_api)
@@ -1,10 +1,10 @@
from sqlalchemy import Column, Integer, String, Date, ForeignKey from sqlalchemy import Column, Integer, String, Date, ForeignKey
from sqlalchemy.dialects.mysql import DATETIME from sqlalchemy.dialects.mysql import DATETIME
from datetime import datetime from datetime import datetime
from database import Base from class_management.database import Base
class ClassInfo(Base): class ClassInfo(Base):
__tablename__ = 'class' __tablename__ = 'classes'
id = Column(Integer id = Column(Integer
,primary_key=True ,primary_key=True
@@ -20,16 +20,16 @@ class ClassInfo(Base):
,comment='班级名称' ,comment='班级名称'
) )
head_teacher_id = Column(Integer head_teacher_id = Column(Integer
,ForeignKey('teacher.id') # ,ForeignKey('teacher.id')
,comment='班主任编号' ,comment='班主任编号'
) )
coach_teacher_id = Column(Integer coach_teacher_id = Column(Integer
,ForeignKey('teacher.id') # ,ForeignKey('teacher.id')
,comment='授课老师编号' ,comment='授课老师编号'
) )
tutor_teacher_id = Column(Integer tutor_teacher_id = Column(Integer
,ForeignKey('teacher.id') # ,ForeignKey('teacher.id')
,comment='助教老师编号' ,comment='助教老师编号'
) )
# class_teacher = Column(String(50) # class_teacher = Column(String(50)
@@ -2,41 +2,31 @@ from pydantic import BaseModel,Field
from datetime import date,datetime from datetime import date,datetime
from typing import Optional,List from typing import Optional,List
#基础班级请求体 #班级基础信息请求体
class ClassBase(BaseModel): class ClassBase(BaseModel):
class_teacher:str|None = Field(None,description='班主任') num:str|None = Field(None,description='班级编号')
class_lecturer:str|None = Field(None,description='授课老师') name:str|None = Field(None,description='班级名称')
class_start_time:date|None = Field(None,description='开班日期') head_teacher_id:int|None = Field(None,description='班主任编号(teacher表id)')
class_end_time:date|None = Field(None,description='结课日期') coach_teacher_id:int|None = Field(None,description='授课老师编号(teacher表id)')
tutor_teacher_id:int|None = Field(None,description='助教老师编号(teacher表id)')
class_start_time:date|None = Field(None,description='开班日期 YYYY‑MM‑DD')
class_end_time:date|None = Field(None,description='结课日期 YYYY‑MM‑DD')
#新增班级请求体模型 #新增班级请求体:num,name必填,其余继承父类ClassBase
class ClassCreate(ClassBase): class ClassCreate(ClassBase):
class_name:str = Field(..., description='班级名称') num:str = Field(...,description='班级编号')
name:str = Field(...,description='班级名称')
#修改班级请求体模型 #修改班级请求体,继承ClassBase,全部字段可选,传哪个就更新哪个
class ClassUpdate(ClassBase): class ClassUpdate(ClassBase):
class_name:str = Field(None,description='班级名称') pass
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): class ClassResponse(BaseModel):
code:int = 200 code:int = 200
detail:str = 'OK' detail:str = 'OK'
totals:int = 0 totals:int = 0
data:str|dict|tuple|list data:str|dict|tuple|list
msg:str = 'OK'