Merge remote-tracking branch 'origin/cyf_class_management' into lon_students_merge_code_test

# Conflicts:
#	class_management/database.py
#	class_management/main.py
This commit is contained in:
Orangeeee
2026-09-22 13:27:18 +08:00
3 changed files with 99 additions and 88 deletions
+34 -28
View File
@@ -1,15 +1,12 @@
from datetime import date
from fastapi import APIRouter,Depends,HTTPException,Query
from class_management.dao.class_management_dao import add_class_dao, update_class_dao, get_class_dao, delete_class_dao
from class_management.database import get_db
from class_management.schema.class_management_request import ClassCreate, ClassResponse, ClassUpdate
class_api = APIRouter(tags=['班级管理模块'])
class_api = APIRouter(prefix='/classes',tags=['班级管理模块'])
@class_api.post("/classes",summary='新增班级')
@class_api.post("",summary='新增班级')
def add_class(cla:ClassCreate,db=Depends(get_db)):
c_dict = cla.model_dump()
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)
@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)
@class_api.get('/{id}',summary='根据id查询班级')
def get_one_class(id:int,db=Depends(get_db)):
res = get_class_dao(c={'id':id},db=db)
if not res:
raise HTTPException(status_code=404, detail="该班级不存在或已删除")
return ClassResponse(data=res)
return ClassResponse(total=1,data=res[0])
@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_api.get('',summary='多字段查询班级')
def get_some_classes( num:str|None = Query(None,description='班级编号')
,name: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_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 = {
'num': num,
'name': name,
'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
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
page_data = res[start_index:start_index + page_size]
page_response = ClassResponse(data=page_data,totals=total)
return page_response
return ClassResponse(totals=total,data=page_data)
@class_api.put("/classes/{class_id}",summary='修改班级信息')
def update_class(class_id,update_info:ClassUpdate,db=Depends(get_db)):
@class_api.put("/{class_id}",summary='修改班级信息')
def update_class(class_id:int
,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})
return ClassResponse(detail="修改成功", data={"class_id": 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)
@class_api.delete('/{id}',summary='逻辑删除班级')
def remove_class(id:int,db=Depends(get_db)):
del_rows = delete_class_dao(id,db)
if del_rows <= 0:
raise HTTPException(status_code=404, detail="班级不存在,删除失败")
return ClassResponse(detail='删除成功',data={'class_id':class_id})
return ClassResponse(detail='删除成功',data={'id':id})
+52 -37
View File
@@ -5,77 +5,92 @@ 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('id'):
q = q.filter(ClassInfo.id == c.get('id'))
if c.get('num'):
q = q.filter(ClassInfo.num == c.get('num'))
if c.get('name'):
q = q.filter(ClassInfo.name == c.get('name'))
if c.get('head_teacher_id'):
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'):
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:
res = q.all()
if not res:
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
{'id':i.id
,'num':i.num
,'name':i.name
,'head_teacher_id':i.head_teacher_id
,'coach_teacher_id':i.coach_teacher_id
,'tutor_teacher_id':i.tutor_teacher_id
,'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):
try:
exist_class = db.query(ClassInfo)\
.filter(ClassInfo.class_name == c['class_name']
.filter(ClassInfo.name == c['name']
,ClassInfo.is_delete == 0)\
.first()
if exist_class:
msg = '班级名称已存在'
print(msg)
return [False,msg]
return (False,msg)
c1 = ClassInfo(**c)
db.add(c1)
except:
db.rollback()
return False
else:
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):
try:
rows = db.query(ClassInfo)\
.filter(ClassInfo.class_id == cid
.filter(ClassInfo.id == cid
,ClassInfo.is_delete==0)\
.update(update_data)
except:
db.rollback()
return False
else:
db.commit()
return rows
except Exception as e:
db.rollback()
print(f"update_class_dao异常:{e}")
return 0
#删除
#删除(逻辑删除)
def delete_class_dao(cid,db):
try:
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})
except:
db.rollback()
rows = 0
else:
db.commit()
finally:
return rows
except Exception as e:
db.rollback()
print(f"delete_class_dao异常:{e}")
rows = 0
@@ -2,41 +2,31 @@ 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='结课日期')
num:str|None = Field(None,description='班级编号')
name:str|None = Field(None,description='班级名称')
head_teacher_id:int|None = Field(None,description='班主任编号(teacher表id)')
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_name:str = Field(..., description='班级名称')
num:str = Field(...,description='班级编号')
name:str = Field(...,description='班级名称')
#修改班级请求体模型
#修改班级请求体,继承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):
code:int = 200
detail:str = 'OK'
totals:int = 0
data:str|dict|tuple|list
msg:str = 'OK'