This commit is contained in:
aiapple
2026-09-21 21:58:28 +08:00
parent b42f6353bb
commit db14db1076
20 changed files with 215 additions and 3 deletions
+1 -1
View File
@@ -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
View File
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" />
</component>
</project>
+1 -1
View File
@@ -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.
+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()
# 查询自动生成的老师工号
@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.
+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
+14 -1
View File
@@ -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.
+16
View File
@@ -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.
+34
View File
@@ -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.