0922.18:35employment接口合并

This commit is contained in:
2026-09-22 18:33:50 +08:00
parent 02492719c4
commit d0c3abbebb
4 changed files with 92 additions and 37 deletions
+7 -9
View File
@@ -12,7 +12,7 @@ from schemas.employment import (EmploymentCreate,
EmploymentUpdate,
EmploymentResponse)
employment_router = APIRouter(prefix="/employments", tags=["就业管理模块"])
employment_router = APIRouter( tags=["就业管理模块"])
@employment_router.post("/", response_model=EmploymentResponse, summary="新增就业信息")
@@ -38,14 +38,12 @@ def query_student_employment(student_id: int, db: Session = Depends(get_db)):
@employment_router.get("/", summary="就业信息列表,支持筛选")
def query_employment_list(
company_name: str | None = Query(None, description="公司名称模糊查询"),
salary_min: float | None = Query(None, description="最低薪资"),
salary_max: float | None = Query(None, description="最高薪资"),
skip: int = Query(0, ge=0, description="偏移量"),
limit: int = Query(20, ge=1, le=100, description="每页条数"),
db: Session = Depends(get_db)
):
def query_employment_list(company_name: str | None = Query(None, description="公司名称模糊查询"),
salary_min: float | None = Query(None, description="最低薪资"),
salary_max: float | None = Query(None, description="最高薪资"),
skip: int = Query(0, ge=0, description="偏移量"),
limit: int = Query(20, ge=1, le=100, description="每页条数"),
db: Session = Depends(get_db)):
# 调用dao列表查询,拿到数据字典列表和总条数
data_list, total = get_employment_list(db, company_name, salary_min, salary_max, skip, limit)
return {"total": total, "data": data_list}
+76 -18
View File
@@ -4,14 +4,26 @@ from schemas.employment import EmploymentCreate, EmploymentUpdate, EmploymentRes
def create_employment(db, obj_in):
# obj_in是Pydantic对象(EmploymentCreate)
"""新增就业信息:一个学生只能存在一条就业记录"""
try:
db_obj = Employment(**obj_in.model_dump())
db.add(db_obj) # add:把对象加入数据库会话,此时还没写入数据库
db.commit() # commit:提交事务,真正写入mysql数据库
db.refresh(db_obj) # refresh:从数据库刷新对象,拿到数据库自动生成的id、默认时间等字段
return EmploymentResponse.model_validate(db_obj).model_dump()
# model_validate:把sqlalchemy ORM对象解析进pydantic响应模型
db.add(db_obj)
db.commit()
db.refresh(db_obj)
resp = EmploymentResponse(id=db_obj.id
,student_id=db_obj.student_id
,employment_status=db_obj.employment_status
,employment_open_date=db_obj.employment_open_date
,offer_date=db_obj.offer_date
,company_name=db_obj.company_name
,salary=db_obj.salary
,remark=db_obj.remark
,created_at=db_obj.created_at
,updated_at=db_obj.updated_at)
return resp.model_dump()
except Exception:
db.rollback()
return None
@@ -24,7 +36,18 @@ def get_employment_by_id(db, eid):
,Employment.is_deleted == 0).first()
if not db_obj:
return None
return EmploymentResponse.model_validate(db_obj).model_dump()
resp = EmploymentResponse(id=db_obj.id
,student_id=db_obj.student_id
,employment_status=db_obj.employment_status
,employment_open_date=db_obj.employment_open_date
,offer_date=db_obj.offer_date
,company_name=db_obj.company_name
,salary=db_obj.salary
,remark=db_obj.remark
,created_at=db_obj.created_at
,updated_at=db_obj.updated_at)
return resp.model_dump()
except Exception:
return None
@@ -36,7 +59,18 @@ def get_employment_by_student_id(db, student_id):
,Employment.is_deleted == 0).first()
if not db_obj:
return None
return EmploymentResponse.model_validate(db_obj).model_dump()
resp = EmploymentResponse(id=db_obj.id
,student_id=db_obj.student_id
,employment_status=db_obj.employment_status
,employment_open_date=db_obj.employment_open_date
,offer_date=db_obj.offer_date
,company_name=db_obj.company_name
,salary=db_obj.salary
,remark=db_obj.remark
,created_at=db_obj.created_at
,updated_at=db_obj.updated_at)
return resp.model_dump()
except Exception:
return None
@@ -51,16 +85,26 @@ def get_employment_list(db, company_name=None, salary_min=None, salary_max=None,
query = query.filter(Employment.salary >= salary_min)
if salary_max is not None:
query = query.filter(Employment.salary <= salary_max)
# count()统计满足条件总条数,用于分页total
total = query.count()
# offset偏移量(跳过多少条),limit每页多少条,执行查询拿到结果列表
records = query.offset(skip).limit(limit).all()
# 列表推导式:循环每一条ORM记录,全部转为字典,得到字典列表
dict_list = [EmploymentResponse.model_validate(item).model_dump() for item in records]
# 返回字典列表 + 总条数
dict_list = []
for item in records:
resp = EmploymentResponse(id=item.id
,student_id=item.student_id
,employment_status=item.employment_status
,employment_open_date=item.employment_open_date
,offer_date=item.offer_date
,company_name=item.company_name
,salary=item.salary
,remark=item.remark
,created_at=item.created_at
,updated_at=item.updated_at)
dict_list.append(resp.model_dump())
return dict_list, total
except Exception:
# 异常返回空列表,总条数0
return [], 0
@@ -68,15 +112,29 @@ def update_employment(db, eid, obj_in):
"""修改就业信息,只更新传入的字段"""
try:
db_obj_raw = db.query(Employment).filter(Employment.id == eid
,Employment.is_deleted == 0).first()
,Employment.is_deleted == 0).first()
if db_obj_raw is None:
return None
update_dict = obj_in.model_dump(exclude_unset=True)# exclude_unset=True:只取出前端实际传过来的字段,不会带上没传的None字段
for key, value in update_dict.items():
setattr(db_obj_raw, key, value)
update_dict = obj_in.model_dump(exclude_unset=True)
db.query(Employment).filter(Employment.id == eid
,Employment.is_deleted == 0).update(update_dict)
db.commit()
db.refresh(db_obj_raw)
return EmploymentResponse.model_validate(db_obj_raw).model_dump()
resp = EmploymentResponse(id=db_obj_raw.id
,student_id=db_obj_raw.student_id
,employment_status=db_obj_raw.employment_status
,employment_open_date=db_obj_raw.employment_open_date
,offer_date=db_obj_raw.offer_date
,company_name=db_obj_raw.company_name
,salary=db_obj_raw.salary
,remark=db_obj_raw.remark
,created_at=db_obj_raw.created_at
,updated_at=db_obj_raw.updated_at)
return resp.model_dump()
except Exception:
db.rollback()
return None
+6 -6
View File
@@ -1,17 +1,17 @@
from sqlalchemy import *
from sqlalchemy.orm import declarative_base,sessionmaker
from sqlalchemy import * #导入sqlalchemy全部常用类
from sqlalchemy.orm import declarative_base,sessionmaker #造会话工厂 SessionLocal,管数据库增删改查会话
from datetime import datetime
from core.database import Base
from core.database import Base #保证所有模型共用同一个Base,表才能正常生成
# 为了符合三范式,就业表只保存 student_id,不保存学生姓名和班级名称。查询返回时通过关联 students 和 classes 带出学生姓名、班级名称。
class Employment(Base):
__tablename__ = "employment_info_detail" # 实际数据库的表名字
__tablename__ = "employment_info_detail" # 映射的真实MySQL数据库表名
id = Column(Integer, primary_key=True # 主键
, autoincrement=True # 声明是自增主键
, autoincrement=True # 开启自增,插入数据不需要手动传id,数据库自动生成id
,comment="就业信息主键id")
student_id = Column(Integer, ForeignKey("student_info_detail.id") # 外键 -> students.id
, nullable=False # 不允许为null
, nullable=False # 不允许为null,每一条就业记录必须绑定一个学生
,comment="关联学生id")
employment_status = Column(String(50)
, default="not_started"
+3 -4
View File
@@ -1,12 +1,12 @@
from pydantic import BaseModel, Field,ConfigDict
from pydantic import BaseModel, Field,ConfigDict#专门存放模型配置参数的字典类。把各种开关配置放里面。
from datetime import date, datetime
from decimal import Decimal
class EmploymentCreate(BaseModel):
"""新增就业信息 请求体 Schema"""
student_id: int = Field(..., description="关联学生ID,必填")
employment_status: str | None = Field(None, description="就业状态:not_started/job_hunting/offered/employed")
student_id: int = Field(..., description="关联学生ID,必填")# description:在Swagger页面展示字段说明文字
employment_status: str | None = Field(None, description="就业状态,选填")
employment_open_date: date | None = Field(None, description="就业开放时间,选填")
offer_date: date | None = Field(None, description="offer下发时间,选填")
company_name: str | None = Field(None, max_length=100, description="就业公司名称,选填")
@@ -36,4 +36,3 @@ class EmploymentResponse(BaseModel):
remark: str | None
created_at: datetime | None
updated_at: datetime | None
model_config = ConfigDict(from_attributes=True) #允许pydantic从对象属性里取值