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