diff --git a/api/wl_teacher_api.py b/api/wl_teacher_api.py new file mode 100644 index 0000000..8fa1286 --- /dev/null +++ b/api/wl_teacher_api.py @@ -0,0 +1,78 @@ +from fastapi import APIRouter, Depends, HTTPException +from sqlalchemy.orm import Session + +from dao.wl_teacher_dao import ( + create_teacher, + get_teacher_id, + get_teacher_no, + list_teachers, + update_teacher, + delete_teacher_logic, + generate_teacher_no, +) +from database import get_db +from scheme.wl_teacher_scheme import ( + TeacherCreate, + TeacherUpdate, + TeacherResponse, +) + +router = APIRouter(prefix="/teacher",tags=["老师管理"]) + + +# 查询自动生成的老师工号 +@router.get("/generate-no") +def get_new_teacher_no(): + """获取自动生成的教师工号""" + new_no = generate_teacher_no() + return {"t_no": new_no} + + +# 查询教师列表 +@router.get("/", response_model=list[TeacherResponse]) +def query_list(db: Session = Depends(get_db)): + return list_teachers(db) + + +# 根据工号查询单个教师 +@router.get("/no/{t_no}", response_model=TeacherResponse) +def query_one_by_no(t_no: str, db: Session = Depends(get_db)): + teacher = get_teacher_no(db, t_no) + if not teacher: + raise HTTPException(status_code=404, detail="老师不存在") + return teacher + + +# 根据 id 查询单个教师 +@router.get("/{t_id}", response_model=TeacherResponse) +def query_one_by_id(t_id: int, db: Session = Depends(get_db)): + teacher = get_teacher_id(db, t_id) + if not teacher: + raise HTTPException(status_code=404, detail="老师不存在") + return teacher + + +# 新增教师 +@router.post("/", response_model=TeacherResponse, status_code=201) +def add_teacher(body: TeacherCreate, db: Session = Depends(get_db)): + try: + return create_teacher(db, body) + except ValueError as e: + raise HTTPException(status_code=400, detail=str(e)) + +# 修改教师 +@router.put("/{t_id}", response_model=TeacherResponse) +def edit_teacher( + t_id: int, + body: TeacherUpdate, + db: Session = Depends(get_db), +): + teacher = update_teacher(db, t_id, body) + if not teacher: + raise HTTPException(status_code=404, detail="老师不存在") + return teacher + +# 逻辑删除教师 +@router.delete("/{t_id}") +def remove_teacher(t_id: int, db: Session = Depends(get_db)): + return delete_teacher_logic(db, t_id) \ No newline at end of file diff --git a/dao/wl_teacher_dao.py b/dao/wl_teacher_dao.py new file mode 100644 index 0000000..574bcc3 --- /dev/null +++ b/dao/wl_teacher_dao.py @@ -0,0 +1,65 @@ +import random +from datetime import datetime +from sqlalchemy.orm import Session +from model.wl_teacher_model import Teacher +from scheme.wl_teacher_scheme import TeacherCreate, TeacherUpdate + + +def generate_teacher_no(): + """生成老师工号:T + 年月日 + 3位随机数,例如 T20260912001""" + date_str = datetime.now().strftime("%Y%m%d") + seq = random.randint(1, 999) + return f"T{date_str}{seq:03d}" + +def list_teachers(db: Session): + """查询全部未删除教师列表""" + return db.query(Teacher).filter(Teacher.is_deleted == 0).order_by(Teacher.t_id.desc()).all() + +def get_teacher_id(db: Session, t_id: int): + return (db.query(Teacher).filter(Teacher.t_id == t_id, Teacher.is_deleted == 0) + .first() ) + +def get_teacher_no(db:Session, t_no: str): + return(db.query(Teacher).filter(Teacher.t_no == t_no,Teacher.is_deleted == 0) + .first()) + + +def create_teacher(db: Session, teacher_data: TeacherCreate): + """创建新老师""" + # 如果前端没传工号,自动生成 + t_no = teacher_data.t_no or generate_teacher_no() + + # 唯一性校验 + if get_teacher_no(db, t_no): + raise ValueError("老师编号已存在") + + data = teacher_data.model_dump() + data["t_no"] = t_no + + db_teacher = Teacher(**data) + db.add(db_teacher) + db.commit() + db.refresh(db_teacher) + return db_teacher + +def update_teacher(db: Session, t_id: int, update_data: TeacherUpdate): + """修改教师""" + db_obj = get_teacher_id(db, t_id) + if not db_obj: + return None + # model_dump(exclude_unset=True) 只取前端传过来的字段 + update_dict = update_data.model_dump(exclude_unset=True) + for k, v in update_dict.items(): + setattr(db_obj, k, v) + db.commit() + db.refresh(db_obj) + return db_obj + +def delete_teacher_logic(db: Session, t_id: int): + """逻辑删除,修改is_deleted=1""" + db_obj = get_teacher_id(db, t_id) + if not db_obj: + return None + db_obj.is_deleted = 1 + db.commit() + return db_obj \ No newline at end of file diff --git a/main.py b/main.py index 3a49195..60413ba 100644 --- a/main.py +++ b/main.py @@ -1,9 +1,10 @@ #项目初始化入口 from fastapi import FastAPI -from api import wl_student_api,wl_class_api,wl_score_api # 周学灵、熊浩钦、圣国伟的路由 +# 周学灵、熊浩钦、圣国伟、刘盼的路由 +from api import wl_student_api,wl_class_api,wl_score_api,wl_teacher_api from database import Base, engine from model import wl_student_model as student_model -from model import wl_class_model,wl_advisor_model,wl_score_model +from model import wl_class_model,wl_advisor_model,wl_score_model,wl_teacher_model Base.metadata.create_all(bind=engine) @@ -12,7 +13,7 @@ app = FastAPI(title="沃林学生管理系统") app.include_router(wl_student_api.router) app.include_router(wl_class_api.router) app.include_router(wl_score_api.router) - +app.include_router(wl_teacher_api.router) if __name__ == "__main__": import uvicorn diff --git a/model/wl_teacher_model.py b/model/wl_teacher_model.py index e65978b..59ce9c4 100644 --- a/model/wl_teacher_model.py +++ b/model/wl_teacher_model.py @@ -1,5 +1,5 @@ -from sqlalchemy import create_engine -from database import Base, engine +from sqlalchemy import String, Column, ForeignKey, Integer +from database import Base class Teacher(Base): __tablename__ = 'wl_teacher' @@ -8,15 +8,10 @@ class Teacher(Base): t_name = Column(String(50), nullable=False) t_phone = Column(String(20), unique=True, nullable=True) t_email = Column(String(20), unique=False) - class_id = Column(Integer, ForeignKey("wl_class.id"), nullable=False) + #创建老师时必须指定一个存在的班级 + class_id = Column(Integer, ForeignKey("class_info.class_id"), nullable=False) role = Column(String(50), nullable=False) is_deleted = Column(Integer, default=0) - def generate_teacher_no(db: Session, hire_date: date): - """ - 工号规则:T + 入职日期(YYYYMMDD) + 3位当天序号 - 例如:T20250912001、T20250912002 - """ - date_str = hire_date.strftime("%Y%m%d") - prefix = f"T{date_str}" + diff --git a/scheme/wl_teacher_scheme.py b/scheme/wl_teacher_scheme.py new file mode 100644 index 0000000..dda629e --- /dev/null +++ b/scheme/wl_teacher_scheme.py @@ -0,0 +1,34 @@ +from pydantic import BaseModel, Field, ConfigDict +from datetime import datetime +from typing import Optional + +# ---------- 请求模型 ---------- +class TeacherCreate(BaseModel): + t_no: Optional[str] = Field(None, max_length=20, description="老师编号,不传则自动生成") + t_name: str = Field(..., max_length=50, description="老师姓名") + t_phone: Optional[str] = Field(None, max_length=20, description="电话") + t_email: Optional[str] = Field(None, max_length=20, description="邮箱") + class_id: int = Field(..., description="班级ID") + role: str = Field(..., max_length=50, description="角色") + +class TeacherUpdate(BaseModel): + t_no: Optional[str] = Field(None, max_length=20) + t_name: Optional[str] = Field(None, max_length=50) + t_phone: Optional[str] = Field(None, max_length=20) + t_email: Optional[str] = Field(None, max_length=20) + class_id: Optional[int] = None + role: Optional[str] = Field(None, max_length=50) + +# ---------- 响应模型 ---------- +class TeacherResponse(BaseModel): + t_id: int + t_no: str + t_name: str + class_id: int + role: str + t_phone: Optional[str] + t_email: Optional[str] + + model_config = ConfigDict(from_attributes=True) + +