第一版_完整

This commit is contained in:
jianqi
2026-09-14 11:34:08 +08:00
parent e8646724b4
commit 414de4bad8
26 changed files with 1422 additions and 307 deletions
+146
View File
@@ -0,0 +1,146 @@
# dao/teacher_dao.py
# 本文件封装对 tes_info 表的所有数据库操作(增、删、改、查)
from http.client import HTTPException
from typing import List, Optional
from sqlalchemy import or_
from sqlalchemy.orm import Session
from model.cls_mgmt_model import ClsMgmt
from model.teacher_model import Teacher
from scheme.teacher_scheme import TeacherUpdate, TeacherAdd
import random
class TeacherDao:
"""教师数据访问对象,所有方法均为静态方法,方便调用"""
#获取所有教师基本信息
@staticmethod
def get_all(db: Session, skip: int = 0, limit: int = 100) :
"""
获取所有用户(支持分页)
:param db: 数据库会话
:param skip: 偏移量(跳过前 skip 条)
:param limit: 最大返回条数
:return: 教师对象列表
"""
return db.query(Teacher).filter(Teacher.is_deleted == 0).offset(skip).limit(limit).all()
#获取单个教师信息
@staticmethod
def get_by_id(db: Session, teacher_id: str) :
"""
根据主键 ID 获取单个教师信息
:return:教师对象或 None
"""
return db.query(Teacher).filter(Teacher.id == teacher_id,Teacher.is_deleted == 0).first()
@staticmethod
def get_by_name(db: Session, teacher_name: str) :
"""
根据教师姓名获取信息(用于唯一性检查)
"""
return db.query(Teacher).filter(Teacher.name == teacher_name,Teacher.is_deleted == 0).first()
# 根据教师id获取教师带教班级信息
@staticmethod
def get_clss_info(db: Session, teacher_id: str):
"""
根据主键 ID 获取单个教师信息
:return: 带教信息或 None
"""
return db.query(ClsMgmt).filter(or_(ClsMgmt.head_tea_id == teacher_id,ClsMgmt.lecturer_id == teacher_id), ClsMgmt.is_deleted == 0).all()
#添加教师
@staticmethod
def add(db: Session, teacher_data: TeacherAdd) :
"""
添加新教师
:param db: 数据库会话
:param teacher_data: 符合 TeacherAddUpdate 请求体模型的数据
:return: 创建后的 teacher 对象(含id )
"""
# 教师id自动生成 格式:T+随机四位数 并进行重复验证
while True:
new_id = f"T{random.randint(100, 999)}" # 确保是4位数,不会出现 0012 这种情况
# 查询数据库是否已存在这个 id
exists = db.query(Teacher).filter(Teacher.id == new_id).first()
if not exists:
break # 不存在,跳出循环,使用这个 id
# 把传入的参数变成字典
data_dict = teacher_data.model_dump()
# 把生成id加到字典里
data_dict["id"] = new_id
#软删除逻辑is_delete默认为0
data_dict["is_deleted"] = 0
# 将 Pydantic 模型转为字典,并解包构建 SQLAlchemy 模型实例
# 对字典进行拆包变成Teacher(id='',name='', phone='', type='',is_delete='0')
db_teacher = Teacher(**data_dict)
db.add(db_teacher) # 添加到会话
db.commit() # 提交事务,此时会执行 INSERT,并自动填充自增字段
db.refresh(db_teacher) # 刷新对象,获取数据库生成的默认值(如 created_at)
return db_teacher
#更新教师信息
@staticmethod
def update(db: Session, teacher_id: str, teacher_data: TeacherUpdate) :
"""
更新教师信息(只更新传入的非空字段)
:param db: 数据库会话
:param teacher_id: 要更新的教师 ID
:param teacher_data: 包含要更新字段的 Pydantic 模型
:return: 更新后的 Teacher 对象,如果没有此教师则返回None
"""
db_teacher = TeacherDao.get_by_id(db, teacher_id)
if not db_teacher:
return None
# 只更新客户端显式传入的字段(exclude_unset=True 排除未设置的字段)
# 不加 exclude_unset=True;teacher_data.model_dump() 会输出所有字段,没传的字段值是 None:
# 将传入参数转变成字典
update_data = teacher_data.model_dump(exclude_unset=True)
#如果不传数据,直接返回本id教师
if not update_data:
return db_teacher
#拆分遍历传入的数据
for key, value in update_data.items():
#滚动插入数据 动态赋值
setattr(db_teacher, key, value)
""""
不使用setattr的写法
if 'name' in update_data:
db_teacher.name = update_data['name']
if 'phone' in update_data:
db_teacher.phone = update_data['phone']
if 'type' in update_data:
db_teacher.type = update_data['type']
"""
db.commit() # 提交事务
db.refresh(db_teacher) # 刷新对象,获取 onupdate 时间等
return db_teacher
# 通过id删除教师
@staticmethod
def delete(db: Session, teacher_id: str):
db_teacher = TeacherDao.get_by_id(db, teacher_id)
#如果不存在返回None,供接口判断
if not db_teacher:
return None
#存在的情况下,只需把is_delete改成1
db_teacher.is_deleted = 1 #软删除,1代表已删除
# db.delete(db_teacher) # 正常删除
db.commit() # 提交事务
db.refresh(db_teacher)
return True