test四轮完成的版本,并入了刘盼的老师模块

This commit is contained in:
2026-09-13 19:50:22 +08:00
parent 24b0ad46ec
commit 1e59419dc7
5 changed files with 186 additions and 13 deletions
+78
View File
@@ -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)
+65
View File
@@ -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
+4 -3
View File
@@ -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
+5 -10
View File
@@ -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}"
+34
View File
@@ -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)