1
This commit is contained in:
Generated
+1
-1
@@ -3,5 +3,5 @@
|
||||
<component name="Black">
|
||||
<option name="sdkName" value="Python 3.14 (wl_student_manager_system)" />
|
||||
</component>
|
||||
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.14 (wl_student_manager_system)" project-jdk-type="Python SDK" />
|
||||
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.10" project-jdk-type="Python SDK" />
|
||||
</project>
|
||||
Generated
+6
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="" vcs="Git" />
|
||||
</component>
|
||||
</project>
|
||||
Generated
+1
-1
@@ -4,7 +4,7 @@
|
||||
<content url="file://$MODULE_DIR$">
|
||||
<excludeFolder url="file://$MODULE_DIR$/.venv" />
|
||||
</content>
|
||||
<orderEntry type="jdk" jdkName="Python 3.14 (wl_student_manager_system)" jdkType="Python SDK" />
|
||||
<orderEntry type="jdk" jdkName="Python 3.10" jdkType="Python SDK" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
</component>
|
||||
</module>
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -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)
|
||||
Binary file not shown.
Binary file not shown.
@@ -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
|
||||
@@ -1 +1,14 @@
|
||||
#项目初始化入口
|
||||
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)
|
||||
|
||||
|
||||
Binary file not shown.
Binary file not shown.
@@ -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)
|
||||
|
||||
|
||||
|
||||
Binary file not shown.
Binary file not shown.
@@ -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)
|
||||
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user