班级模块

This commit is contained in:
2026-09-22 16:35:15 +08:00
parent a45d4046be
commit 3f3016d9ec
11 changed files with 417 additions and 1 deletions
View File
+164
View File
@@ -0,0 +1,164 @@
import uuid
from fastapi import APIRouter, Depends, HTTPException,Query
from dao.class_dao import update_class_dao, add_class_dao, get_class_dao
from database import get_db
from model.class_model import StudentClassIntermediate,Student_info
from schema.class_request import ClassRequest, ClassResponse, TransferRequest
from dao.class_dao import Student_delect_Dao
from datetime import datetime
from model.class_model import Class_info
from sqlalchemy import select, func
class_api = APIRouter()
@class_api.post('',response_model=ClassResponse,summary='班级信息新增接口')
def add_orders(cs:ClassRequest,db=Depends(get_db)):
d = cs.model_dump()
r = add_class_dao( o=d,db=db )
if not r:
raise HTTPException(status_code=500,detail='服务器繁忙或班级不存在!')
return ClassResponse(totals=1,data=d)
# @class_api.delete('/{class_name}/')
# def delete_orders(class_name:str,db=Depends(get_db)):
# rows= delect_class_dao( class_name=class_name,db=db )
# if rows:
# return {'code': 200, 'totals': rows, 'detail': '删除成功'}
# raise HTTPException(status_code=500,detail='删除异常,稍后操作!')
@class_api.delete("/class_id",summary='班级信息删除接口')
async def delete_student(class_id: str, db= Depends(get_db)):
target_student = Student_delect_Dao.soft_delete_student(db, class_id)
if not target_student:
raise HTTPException(status_code=404, detail="班级数据不存在或已删除")
# 直接更新软删除标记为1,完成逻辑删除
target_student.is_deleted = 1
r=datetime.now().isoformat()
db.commit()
return ClassResponse(totals=1,data=r)
@class_api.get('',summary='班级信息查询接口')
def get_orders(class_name:str,db=Depends(get_db)):
r=get_class_dao(class_name,db)
if r:
return [{"class_id": i.class_id, 'class_name': i.class_name, "class_code": i.class_code, "tags": i.tags,
"status":i.status,'create_time':i.create_time,"update_time": i.update_time} for i in r]
raise HTTPException(status_code=404,detail='班级不存在!')
@class_api.put('/{class_id}',summary='班级信息更新接口')
def get_orders(order:ClassRequest,class_id:str,db=Depends(get_db)):
d = order.model_dump(exclude_unset=True)
r = update_class_dao( class_id=class_id,update_data=d,db=db )
if not r:
raise HTTPException(status_code=500, detail='没有更新!')
return {'code':200,'totals':r,'detail':'更新成功'}
@class_api.get("/classes",summary='班级学生信息分页查询接口')
def get_all_classes_with_student_count(
page: int = Query(1, ge=1), #page:页码,默认值为1
size: int = Query(10, ge=1, le=100), #size:单页返回数据条数,默认值10,约束范围1~100,
db = Depends(get_db) #db:通过依赖注入的方式获取SQLAlchemy的数据库会话实例
):
total = db.scalar(select(func.count(Class_info.class_id)).where(Class_info.is_deleted == 0)) #班级表中所有符合条件的主键数量
offset = (page - 1) * size #计算分页偏移量
class_list = db.execute(
select(
Class_info.class_name,
# 直接统计当前班级的学生数量
(
select(func.count(StudentClassIntermediate.student_id))
.where(
StudentClassIntermediate.class_id == Class_info.class_id,
StudentClassIntermediate.is_deleted == 0
)
).label("student_count")
)
.where(Class_info.is_deleted == 0)
.order_by(Class_info.class_name)
.offset(offset).limit(size)
).mappings().all()
return {
"total_classes": total,
"page": page,
"size": size,
"class_list": class_list
}
# 同步转班接口
@class_api.patch("/students/{student_id}/transfer",summary='学生转班信息查询接口')
def transfer_student(
student_id: str,
request: TransferRequest,
db=Depends(get_db)
):
target_class_name = request.target_class_name
# 1. 【关键修改】根据班级名称查找班级ID
# 注意:这里假设班级名称是唯一的。如果名称不唯一,建议前端传ID或后端增加歧义处理
target_class_res = db.execute(
select(Class_info).where(
Class_info.class_name == target_class_name,
Class_info.is_deleted == 0
)
)
target_class = target_class_res.scalar_one_or_none()
if not target_class:
raise HTTPException(status_code=404, detail=f"未找到名为 '{target_class_name}' 的班级")
# 获取目标班级的ID,用于后续关联
target_class_id = target_class.class_id
# 2. 查询学生当前所在的有效班级关联
current_link_res = db.execute(
select(StudentClassIntermediate).where(
StudentClassIntermediate.student_id == student_id,
StudentClassIntermediate.is_deleted == 0
)
)
current_link = current_link_res.scalar_one_or_none()
now = datetime.now()
# 3. 逻辑处理:如果学生已经在目标班级,直接返回
if current_link and current_link.class_id == target_class_id:
return {"message": f"该学生已在 '{target_class_name}' 班级中,无需重复操作"}
# 4. 逻辑删除原班级关联 (如果存在)
if current_link:
current_link.is_deleted = 1 # 标记为已删除
current_link.update_time = now # 更新时间
# 注意:这里不需要 db.add(current_link),因为它是从 session查出来的对象,修改属性后 commit 即可生效
# 5. 新增新班级关联记录
new_link = StudentClassIntermediate(
id=str(uuid.uuid4())[:8], # 生成新的主键ID
class_id=target_class_id, # 使用刚才查到的目标班级ID
student_id=student_id,
is_deleted=0, # 标记为有效
create_time=now,
update_time=now
)
db.add(new_link)
# 6. 提交事务
db.commit()
return {
"message": f"学生 {student_id} 成功转入班级 '{target_class.class_name}'",
"new_class_id": target_class_id,
"old_class_id": current_link.class_id if current_link else None
}