diff --git a/.idea/misc.xml b/.idea/misc.xml
index 4f34e90..7b78622 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -3,5 +3,5 @@
-
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..35eb1dd
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/wl_student_manager_system.iml b/.idea/wl_student_manager_system.iml
index aa17bdb..7584dbd 100644
--- a/.idea/wl_student_manager_system.iml
+++ b/.idea/wl_student_manager_system.iml
@@ -4,7 +4,7 @@
-
+
\ No newline at end of file
diff --git a/__pycache__/database.cpython-310.pyc b/__pycache__/database.cpython-310.pyc
new file mode 100644
index 0000000..1fa6ffa
Binary files /dev/null and b/__pycache__/database.cpython-310.pyc differ
diff --git a/__pycache__/main.cpython-310.pyc b/__pycache__/main.cpython-310.pyc
new file mode 100644
index 0000000..abda025
Binary files /dev/null and b/__pycache__/main.cpython-310.pyc differ
diff --git a/api/__pycache__/__init__.cpython-310.pyc b/api/__pycache__/__init__.cpython-310.pyc
new file mode 100644
index 0000000..a82d7f0
Binary files /dev/null and b/api/__pycache__/__init__.cpython-310.pyc differ
diff --git a/api/__pycache__/wl_teacher_api.cpython-310.pyc b/api/__pycache__/wl_teacher_api.cpython-310.pyc
new file mode 100644
index 0000000..c112719
Binary files /dev/null and b/api/__pycache__/wl_teacher_api.cpython-310.pyc differ
diff --git a/api/wl_teacher_api.py b/api/wl_teacher_api.py
new file mode 100644
index 0000000..b571458
--- /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()
+
+
+# 查询自动生成的老师工号
+@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/__pycache__/__init__.cpython-310.pyc b/dao/__pycache__/__init__.cpython-310.pyc
new file mode 100644
index 0000000..901fdad
Binary files /dev/null and b/dao/__pycache__/__init__.cpython-310.pyc differ
diff --git a/dao/__pycache__/wl_teacher_dao.cpython-310.pyc b/dao/__pycache__/wl_teacher_dao.cpython-310.pyc
new file mode 100644
index 0000000..21da5bc
Binary files /dev/null and b/dao/__pycache__/wl_teacher_dao.cpython-310.pyc differ
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 f5dc53c..c2d859f 100644
--- a/main.py
+++ b/main.py
@@ -1 +1,14 @@
-#项目初始化入口
\ No newline at end of file
+import uvicorn
+from fastapi import FastAPI
+from api import wl_teacher_api
+
+
+app = FastAPI(title="沃林学生管理系统")
+
+# 统一分发子路由
+app.include_router(wl_teacher_api.router, prefix="/teacher",tags=["教师模块"])
+
+
+if __name__ == "__main__":
+ uvicorn.run("main:app",host='0.0.0.0', port=8003,reload=True)
+
diff --git a/model/__pycache__/__init__.cpython-310.pyc b/model/__pycache__/__init__.cpython-310.pyc
new file mode 100644
index 0000000..30bbb17
Binary files /dev/null and b/model/__pycache__/__init__.cpython-310.pyc differ
diff --git a/model/__pycache__/wl_teacher_model.cpython-310.pyc b/model/__pycache__/wl_teacher_model.cpython-310.pyc
new file mode 100644
index 0000000..2e8e496
Binary files /dev/null and b/model/__pycache__/wl_teacher_model.cpython-310.pyc differ
diff --git a/model/wl_teacher_model.py b/model/wl_teacher_model.py
new file mode 100644
index 0000000..3e5c909
--- /dev/null
+++ b/model/wl_teacher_model.py
@@ -0,0 +1,16 @@
+from sqlalchemy import create_engine, String, Column, ForeignKey, Integer
+from database import Base, engine
+
+class Teacher(Base):
+ __tablename__ = 'wl_teacher'
+ t_id = Column(Integer, primary_key=True, autoincrement=True)
+ t_no = Column(String(20), unique=True, nullable=False)
+ 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)
+ role = Column(String(50), nullable=False)
+ is_deleted = Column(Integer, default=0)
+
+
+
diff --git a/scheme/__pycache__/__init__.cpython-310.pyc b/scheme/__pycache__/__init__.cpython-310.pyc
new file mode 100644
index 0000000..0550549
Binary files /dev/null and b/scheme/__pycache__/__init__.cpython-310.pyc differ
diff --git a/scheme/__pycache__/wl_teacher_scheme.cpython-310.pyc b/scheme/__pycache__/wl_teacher_scheme.cpython-310.pyc
new file mode 100644
index 0000000..82e29eb
Binary files /dev/null and b/scheme/__pycache__/wl_teacher_scheme.cpython-310.pyc differ
diff --git a/scheme/wl_teacher_scheme.py b/scheme/wl_teacher_scheme.py
new file mode 100644
index 0000000..1301d2c
--- /dev/null
+++ b/scheme/wl_teacher_scheme.py
@@ -0,0 +1,34 @@
+from pydantic import BaseModel, Field, EmailStr, 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)
+
+
diff --git a/~$师框架梳理只言片语的收集.docx b/~$师框架梳理只言片语的收集.docx
new file mode 100644
index 0000000..a3c5e4d
Binary files /dev/null and b/~$师框架梳理只言片语的收集.docx differ
diff --git a/对老师框架梳理只言片语的收集.docx b/对老师框架梳理只言片语的收集.docx
new file mode 100644
index 0000000..59f1cdc
Binary files /dev/null and b/对老师框架梳理只言片语的收集.docx differ