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