Merge remote-tracking branch 'origin/coffee_jiuye' into lon_students_merge_code_test

# Conflicts:
#	.idea/.gitignore
#	stu_jiuye/database.py
#	stu_jiuye/main.py
This commit is contained in:
Orangeeee
2026-09-22 13:22:52 +08:00
5 changed files with 113 additions and 88 deletions
+4 -2
View File
@@ -1,10 +1,12 @@
# 默认忽略的文件 # 默认忽略的文件
/shelf/ /shelf/
/workspace.xml /workspace.xml
# 基于编辑器的 HTTP 客户端请求
/httpRequests/
# 已忽略包含查询文件的默认文件夹 # 已忽略包含查询文件的默认文件夹
/queries/ /queries/
# Datasource local storage ignored files # Datasource local storage ignored files
/dataSources/ /dataSources/
/dataSources.local.xml /dataSources.local.xml
# 基于编辑器的 HTTP 客户端请求 *.xml
/httpRequests/ *.iml
+47 -32
View File
@@ -7,34 +7,34 @@ from stu_jiuye.database import get_db
CURD=APIRouter() CURD=APIRouter()
@CURD.get('/emp',tags=['查询就业信息']) @CURD.get('/emp',summary='查询就业信息')
def get_stuinfo( #查询学生就业信息 def get_stuinfo( #查询学生就业信息
stuname:str| None = None sname:str| None = None
,stuclass:str| None = None ,class_num:int| None = None
,compname:str|None=None ,employment_company:str|None=None
,min_salary:int=0 ,min_salary:int=0
,max_salary:int|None=None ,max_salary:int|None=None
,somewhere:str|None=None ,somewhere:str|None=None
,employment_open_date:datetime.date|None=None ,employment_open_time:datetime.date|None=None
,offer_date:datetime.date|None=None ,offer_recived_time:datetime.date|None=None
,db=Depends(get_db) ,db=Depends(get_db)
): #查询条件 ): #查询条件
r=get_emp_dao( #调用函数 r=get_emp_dao( #调用函数
stuname, sname,
stuclass, class_num,
compname, employment_company,
min_salary, min_salary,
max_salary, max_salary,
somewhere, somewhere,
employment_open_date, employment_open_time,
offer_date, offer_recived_time,
db db
) )
if r: if r:
return r #成功返回 return r #成功返回
raise HTTPException(status_code=404, detail='名单不存在!') #失败返回错误信息 raise HTTPException(status_code=404, detail='名单不存在!') #失败返回错误信息
@CURD.post('/emp',response_model=EmpResponse,tags=['新增就业信息']) @CURD.post('/emp',response_model=EmpResponse,summary='新增就业信息')
def add_stuinfo( #新增学生就业信息 def add_stuinfo( #新增学生就业信息
p:PostRequest,db=Depends(get_db) p:PostRequest,db=Depends(get_db)
): #调用请求体 ): #调用请求体
@@ -44,7 +44,7 @@ def add_stuinfo( #新增学生就业信
raise HTTPException(status_code=500, detail='服务器繁忙,请稍后添加!') #失败返回错误 raise HTTPException(status_code=500, detail='服务器繁忙,请稍后添加!') #失败返回错误
return EmpResponse(totals=1, data=d) #成功返回响应体 return EmpResponse(totals=1, data=d) #成功返回响应体
@CURD.post('/emp/company',response_model=CompResponse,tags=['新增公司信息']) @CURD.post('/emp/company',response_model=CompResponse,summary='新增公司信息')
def add_company( #新增公司表信息 def add_company( #新增公司表信息
c:CompRequest,db=Depends(get_db) c:CompRequest,db=Depends(get_db)
): ):
@@ -55,7 +55,7 @@ def add_company( #新增公司表信息
return CompResponse(totals=1, data=d) #成功返回响应体 return CompResponse(totals=1, data=d) #成功返回响应体
@CURD.post('/emp/company/address',response_model=AddResponse,tags=['新增公司所在区域']) @CURD.post('/emp/company/address',response_model=AddResponse,summary='新增公司所在区域')
def add_address( #新增公司地址区域信息 def add_address( #新增公司地址区域信息
add:AddRequest,db=Depends(get_db) add:AddRequest,db=Depends(get_db)
): ):
@@ -66,19 +66,23 @@ def add_address( #新增公司地址区
return AddResponse(totals=1, data=d) #成功返回响应体 return AddResponse(totals=1, data=d) #成功返回响应体
@CURD.put('/emp',tags=['更改就业信息']) @CURD.put('/emp',summary='更改就业信息')
def updata_stuinfo( #更新数据模块 def updata_stuinfo( #更新数据模块
up:PostRequest up:PostRequest
,id:int ,id:int
,db=Depends(get_db) ,db=Depends(get_db)
): #根据id选择对象 ): #根据id选择对象
d = up.model_dump(exclude_unset=True) #解析 d = up.model_dump(exclude_unset=True) #解析
d.pop('create_time', None)
d.pop('is_deleted', None)
r = update_emp_dao(id=id, update_data=d, db=db) #调用更新函数 r = update_emp_dao(id=id, update_data=d, db=db) #调用更新函数
if not d:
raise HTTPException(status_code=400, detail='没有需要更新的字段')
if not r: if not r:
raise HTTPException(status_code=500, detail='没有更新!') #失败返回错误信息 raise HTTPException(status_code=404, detail='未找到对应记录') #失败返回错误信息
return {'code': 200, 'totals': r, 'detail': '更新成功'} #成功返回信息 return {'code': 200, 'totals': r, 'detail': '更新成功'} #成功返回信息
@CURD.delete('/emp/{id}',tags=['删除就业信息']) @CURD.delete('/emp/{id}',summary='删除就业信息')
def delete_stuinfo( #删除模块 def delete_stuinfo( #删除模块
id:int id:int
,db=Depends(get_db) ,db=Depends(get_db)
@@ -89,25 +93,36 @@ def delete_stuinfo( #删除模块
return {'code': 200, 'totals': rows, 'detail': '删除成功'} #成功返回信息 return {'code': 200, 'totals': rows, 'detail': '删除成功'} #成功返回信息
@CURD.get('/Top5',tags=['就业薪资Top5']) @CURD.get('/Top5',summary='就业薪资Top5')
def salarytop5(db=Depends(get_db)): def salarytop5(db=Depends(get_db)):
q = db.query(Employments,Company.compname) \ q = db.query(Employments,Company.employment_company) \
.join(Company, Employments.company_id == Company.id) \ .join(Company, Employments.company_id == Company.id) \
.filter(Employments.is_deleted == 0)\ .filter(Employments.is_deleted == 0)\
.order_by(Employments.salary.desc())\ .order_by(Employments.employment_salary.desc())\
.offset(0).limit(5) .all() .limit(5) .all()
return [{'学生姓名':i.stuname,'学生班级':i.stuclass,'就业时间':i.offer_date,'公司':compname} for i,compname in q] return [{'学生姓名':i.sname,'学生班级编号':i.class_num,'就业时间':i.offer_recived_time,'公司':employment_company} for i,employment_company in q]
@CURD.get('/worktime',tags=['学生就业时常']) @CURD.get('/worktime',summary='学生就业时常')
def worktime(db=Depends(get_db)):
q = db.query(Employments).all()
return [{'学生姓名':i.stuname,'就业时常':f'{i.offer_date-i.employment_open_date}'} for i in q]
@CURD.get('/avgworktime',tags=['学生平均就业时常'])
def worktime(db=Depends(get_db)): def worktime(db=Depends(get_db)):
q = db.query(Employments)\ q = db.query(Employments)\
.filter(Employments.employment_open_date is not None)\ .filter(Employments.is_deleted==0)\
.all() .all()
return [{'学生姓名':i.stuname,'平均就业时常':f'{(i.offer_date-i.employment_open_date)/len(q)}'} for i in q]
return [{'学生姓名':i.sname,'就业时常':f'{i.offer_recived_time-i.employment_open_time}' if i.offer_recived_time and i.employment_open_time else '暂无数据'} for i in q]
@CURD.get('/avgworktime',summary='学生平均就业时常')
def avgworktime(db=Depends(get_db)):
q = db.query(Employments)\
.filter(Employments.employment_open_time.isnot(None)
,Employments.offer_recived_time.isnot(None)
,Employments.is_deleted==0)\
.all()
if not q:
return {'平均就业时常': '暂无数据'}
total = sum((i.offer_recived_time - i.employment_open_time).total_seconds() for i in q)
avg_days=total /len(q)/86400 #一天86400秒
return {
'人数': len(q),
'平均就业时常(天)': round(avg_days, 2)
}
+42 -33
View File
@@ -1,11 +1,14 @@
from model import Employments,Address,Company from stu_jiuye.model import Employments,Address,Company
def add_employment_dao(o,db): #新增就业信息函数 def add_employment_dao(o,db): #新增就业信息函数
try: try:
# r = db.query(Employments).filter(Employments.id == o['id'] ).all() # # r = db.query(Employments).filter(Employments.id == o['id'] ).all() #
o.pop('id', None) #摘除id字段,自增字段无需手动添加 o.pop('id', None) #摘除id字段,自增字段无需手动添加
o.pop('create_time', None)
o.pop('update_time', None)
o.pop('is_deleted', None)
o1 = Employments( **o) #实例化参数 o1 = Employments( **o) #实例化参数
db.add(o1) #添加数据进入表 db.add(o1) #添加数据进入表
@@ -20,6 +23,9 @@ def add_employment_dao(o,db): #新增就业信息函数
def add_company_dao(o,db): #添加公司信息函数 def add_company_dao(o,db): #添加公司信息函数
try: try:
o.pop('id', None) #摘除id字段,自增字段无需手动添加 o.pop('id', None) #摘除id字段,自增字段无需手动添加
o.pop('create_time', None)
o.pop('update_time', None)
o.pop('is_deleted', None)
o1 = Company( **o) #实例化参数 o1 = Company( **o) #实例化参数
db.add(o1) #添加数据进入表 db.add(o1) #添加数据进入表
except Exception as e: #失败返回 except Exception as e: #失败返回
@@ -32,6 +38,9 @@ def add_company_dao(o,db): #添加公司信息函数
def add_address_dao(o,db): #添加地址区域信息函数 def add_address_dao(o,db): #添加地址区域信息函数
try: try:
o.pop('id', None) #摘除id字段,自增字段无需手动添加 o.pop('id', None) #摘除id字段,自增字段无需手动添加
o.pop('create_time', None)
o.pop('update_time', None)
o.pop('is_deleted', None)
o1 = Address( **o) #实例化参数 o1 = Address( **o) #实例化参数
db.add(o1) #添加数据进入表 db.add(o1) #添加数据进入表
except Exception as e: #失败返回 except Exception as e: #失败返回
@@ -51,71 +60,71 @@ def update_emp_dao(id,update_data,db): #更新数据函数
except Exception as e: except Exception as e:
print(f'更新失败,{e}') #返回失败信息 print(f'更新失败,{e}') #返回失败信息
db.rollback() #数据回滚 db.rollback() #数据回滚
return False return 0
else: else:
db.commit() #提交事务,永久保存 db.commit() #提交事务,永久保存
return rows return rows
def get_emp_dao( #获取学生就业信息函数 def get_emp_dao( #获取学生就业信息函数
# stuid, # stuid,
stuname sname
,stuclass ,class_num
,compname ,employment_company
,min_salary ,min_salary
,max_salary ,max_salary
,somewhere ,somewhere
,employment_open_date ,employment_open_time
,offer_date ,offer_recived_time
,db ,db
# ,page # ,page
# ,page_size # ,page_size
): #根据选择条件获取信息 ): #根据选择条件获取信息
q = db.query(Employments,Company.compname,Address.somewhere)\ q = db.query(Employments,Company.employment_company,Address.somewhere)\
.join(Company,Employments.company_id==Company.id)\ .outerjoin(Company,Employments.company_id==Company.id)\
.join(Address,Company.address_id==Address.id)\ .outerjoin(Address,Company.address_id==Address.id)\
.filter(Employments.is_deleted == 0) #连接公司表和地址表,筛选未被删除信息 .filter(Employments.is_deleted == 0) #连接公司表和地址表,筛选未被删除信息
# if stuid: # if stuid:
# q = q.filter( Employments.id == stuid ) # q = q.filter( Employments.id == stuid )
if stuname: #根据学生姓名筛选 if sname: #根据学生姓名筛选
q = q.filter( Employments.stuname == stuname ) q = q.filter( Employments.sname == sname )
if stuclass: if class_num:
q = q.filter(Employments.stuclass == stuclass) q = q.filter(Employments.class_num == class_num)
if somewhere: if somewhere:
q = q.filter(Address.somewhere.like(f'%{somewhere}%')) q = q.filter(Address.somewhere.like(f'%{somewhere}%'))
if compname: #根据公司姓名筛选 if employment_company: #根据公司姓名筛选
q=q.filter(Company.compname.like(f'%{compname}%')) q=q.filter(Company.employment_company.like(f'%{employment_company}%'))
# r = q.offset( (page-1)*page_size ).limit( page_size ).all() # r = q.offset( (page-1)*page_size ).limit( page_size ).all()
if min_salary is not None: #根据最小薪资筛选 if min_salary is not None: #根据最小薪资筛选
q = q.filter(Employments.salary >= min_salary) q = q.filter(Employments.employment_salary >= min_salary)
if max_salary is not None: ##根据最大薪资筛选 if max_salary is not None: ##根据最大薪资筛选
q = q.filter(Employments.salary <= max_salary) q = q.filter(Employments.employment_salary <= max_salary)
if employment_open_date: if employment_open_time:
q = q.filter(Employments.employment_open_date == employment_open_date) q = q.filter(Employments.employment_open_time == employment_open_time)
if offer_date: if offer_recived_time:
q = q.filter(Employments.offer_date == offer_date) q = q.filter(Employments.offer_recived_time == offer_recived_time)
r= q.all() r= q.all()
if r: if r:
return [ {"id": i.id, return [ {"id": i.id,
'学生姓名':i.stuname, '学生姓名':i.sname,
'学生班级':i.stuclass, '学生班级编号':i.class_num,
"公司": compname, "公司": employment_company or '未就业',
"公司区域":somewhere, "公司区域":somewhere or '-',
# "company_id": i.company_id, # "company_id": i.company_id,
"薪资":i.salary, "薪资":i.employment_salary or '-',
# "address_id": i.address_id, # "address_id": i.address_id,
"就业开放时间":i.employment_open_date, "就业开放时间":i.employment_open_time,
"offer下发时间":i.offer_date, "offer下发时间":i.offer_recived_time or '-',
"created_date": i.created_date, "创建时间": i.create_time,
"updated_date": i.updated_date, "更新时间": i.update_time,
"is_deleted":i.is_deleted } for i,compname,somewhere in r ] #返回信息列表 "是否删除":i.is_deleted } for i,employment_company,somewhere in r ] #返回信息列表
def delete_emp_dao(id,db): #删除函数 def delete_emp_dao(id,db): #删除函数
try: try:
rows = db.query(Employments)\ rows = db.query(Employments)\
.filter(Employments.id == id)\ .filter(Employments.id == id,Employments.is_deleted == 0)\
.update( {'is_deleted':1} ) #软删除,is_deleted返回1 .update( {'is_deleted':1} ) #软删除,is_deleted返回1
except Exception as e: #失败返回信息 except Exception as e: #失败返回信息
+10 -10
View File
@@ -1,6 +1,6 @@
from sqlalchemy import ForeignKey from sqlalchemy import ForeignKey
from database import DATETIME,Base,Column,Integer,String,engine from stu_jiuye.database import DATETIME,Base,Column,Integer,String,DATE
from datetime import datetime from datetime import datetime
@@ -38,31 +38,31 @@ class Employments(Base): #学生就
# , ForeignKey='student.id' # , ForeignKey='student.id'
, comment='自增主键' , comment='自增主键'
) )
stuname = Column(String(50)) #学生姓名,冗余字段 sname = Column(String(50)) #学生姓名,冗余字段
stuclass = Column(String(50)) #学生班级,冗余字段 class_num = Column(Integer) #学生班级,冗余字段
# compname=Column(String(50) # compname=Column(String(50)
# ,nullable=False # ,nullable=False
# ) # )
company_id = Column(Integer #公司id,外键匹配公司表 company_id = Column(Integer #公司id,外键匹配公司表
, ForeignKey('Company.id') , ForeignKey('Company.id')
, nullable=False , nullable=True
) )
# address_id = Column(Integer # address_id = Column(Integer
# , ForeignKey('Address.id') # , ForeignKey('Address.id')
# , nullable=False # , nullable=False
# ) # )
salary = Column(Integer) #薪资 employment_salary = Column(Integer, nullable=True) #薪资
employment_open_date = Column(DATETIME) #就业开放时间 employment_open_time = Column(DATE, nullable=True) #就业开放时间
offer_date = Column(DATETIME) #offer下发时间 offer_recived_time = Column(DATE, nullable=True) #offer下发时间
created_date = Column(DATETIME #创建数据时间 create_time = Column(DATETIME #创建数据时间
, default=datetime.now , default=datetime.now
) )
updated_date = Column(DATETIME #更新数据时间 update_time = Column(DATETIME #更新数据时间
, default=datetime.now , default=datetime.now
, onupdate=datetime.now , onupdate=datetime.now
) )
@@ -74,7 +74,7 @@ class Company(Base): #公司信
, primary_key=True , primary_key=True
,autoincrement=True ,autoincrement=True
) #主键id,自增主键 ) #主键id,自增主键
compname = Column(String(50) #公司姓名 employment_company = Column(String(50) #公司姓名
, nullable=False #非空约束 , nullable=False #非空约束
) )
address_id = Column(Integer #地址id,匹配地址表 address_id = Column(Integer #地址id,匹配地址表
+9 -10
View File
@@ -1,18 +1,17 @@
from datetime import * from datetime import *
from pydantic import BaseModel, Field from pydantic import BaseModel
class PostRequest(BaseModel): #学生就业信息请求体模型 class PostRequest(BaseModel): #学生就业信息请求体模型
# compname: str|None=None # compname: str|None=None
stuname: str|None=None sname: str|None=None
stuclass: str|None=None class_num: int|None=None
company_id:int|None=None company_id:int|None=None
# address_id: int|None=None # address_id: int|None=None
salary: int|None=None employment_salary: int|None=None
employment_open_date:date|None=None employment_open_time:date|None=None
offer_date:date|None=None offer_recived_time:date|None=None
updated_date:date|None=None
is_deleted:int=0
class EmpResponse(BaseModel): #学生就业信息响应体 class EmpResponse(BaseModel): #学生就业信息响应体
code: int = 200 code: int = 200
detail: str = 'OK' detail: str = 'OK'
@@ -21,8 +20,8 @@ class EmpResponse(BaseModel): #学生就
class CompRequest(BaseModel): #公司信息请求体模型 class CompRequest(BaseModel): #公司信息请求体模型
compname:str employment_company:str
address_id: int | None = None address_id: int
class CompResponse(BaseModel): #公司信息响应体 class CompResponse(BaseModel): #公司信息响应体
code: int = 200 code: int = 200