From d0dbf696afae9f42738acb53582ffec5e7b0c9ee Mon Sep 17 00:00:00 2001 From: yb <739325183@qq.com> Date: Sat, 19 Sep 2026 18:24:55 +0800 Subject: [PATCH 01/11] =?UTF-8?q?=E7=AC=AC=E4=B8=80=E6=AC=A1=E6=8F=90?= =?UTF-8?q?=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- stu_jiuye/CURD.py | 0 stu_jiuye/main.py | 0 stu_jiuye/models.py | 0 stu_jiuye/services.py | 0 4 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 stu_jiuye/CURD.py create mode 100644 stu_jiuye/main.py create mode 100644 stu_jiuye/models.py create mode 100644 stu_jiuye/services.py diff --git a/stu_jiuye/CURD.py b/stu_jiuye/CURD.py new file mode 100644 index 0000000..e69de29 diff --git a/stu_jiuye/main.py b/stu_jiuye/main.py new file mode 100644 index 0000000..e69de29 diff --git a/stu_jiuye/models.py b/stu_jiuye/models.py new file mode 100644 index 0000000..e69de29 diff --git a/stu_jiuye/services.py b/stu_jiuye/services.py new file mode 100644 index 0000000..e69de29 From 868f100b84968bfcb211ae71355a394f11c1ce10 Mon Sep 17 00:00:00 2001 From: yb <739325183@qq.com> Date: Sat, 19 Sep 2026 18:56:18 +0800 Subject: [PATCH 02/11] =?UTF-8?q?=E7=AC=AC=E4=B8=80=E6=AC=A1=E6=8F=90?= =?UTF-8?q?=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- stu_jiuye/{CURD.py => CURD_api.py} | 0 stu_jiuye/database.py | 0 stu_jiuye/models.py | 6 ++++++ stu_jiuye/request.py | 0 4 files changed, 6 insertions(+) rename stu_jiuye/{CURD.py => CURD_api.py} (100%) create mode 100644 stu_jiuye/database.py create mode 100644 stu_jiuye/request.py diff --git a/stu_jiuye/CURD.py b/stu_jiuye/CURD_api.py similarity index 100% rename from stu_jiuye/CURD.py rename to stu_jiuye/CURD_api.py diff --git a/stu_jiuye/database.py b/stu_jiuye/database.py new file mode 100644 index 0000000..e69de29 diff --git a/stu_jiuye/models.py b/stu_jiuye/models.py index e69de29..0984197 100644 --- a/stu_jiuye/models.py +++ b/stu_jiuye/models.py @@ -0,0 +1,6 @@ + + + +class + + diff --git a/stu_jiuye/request.py b/stu_jiuye/request.py new file mode 100644 index 0000000..e69de29 From 53a48e0b215b718b5ee9461bed9ad86343f90356 Mon Sep 17 00:00:00 2001 From: yb <739325183@qq.com> Date: Sun, 20 Sep 2026 21:20:12 +0800 Subject: [PATCH 03/11] =?UTF-8?q?=E7=AC=AC=E4=BA=8C=E6=AC=A1=E6=8F=90?= =?UTF-8?q?=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- stu_jiuye/CURD_api.py | 59 +++++++++++++++++++++++++++++++ stu_jiuye/dao.py | 74 +++++++++++++++++++++++++++++++++++++++ stu_jiuye/database.py | 21 +++++++++++ stu_jiuye/main.py | 15 ++++++++ stu_jiuye/model.py | 81 +++++++++++++++++++++++++++++++++++++++++++ stu_jiuye/request.py | 27 +++++++++++++++ stu_jiuye/services.py | 0 7 files changed, 277 insertions(+) create mode 100644 stu_jiuye/dao.py create mode 100644 stu_jiuye/model.py delete mode 100644 stu_jiuye/services.py diff --git a/stu_jiuye/CURD_api.py b/stu_jiuye/CURD_api.py index e69de29..622a370 100644 --- a/stu_jiuye/CURD_api.py +++ b/stu_jiuye/CURD_api.py @@ -0,0 +1,59 @@ +import datetime + +from fastapi import APIRouter,Depends,HTTPException +from dao import * +from stu_jiuye.request import PostRequest,EmpResponse +from database import get_db +CURD=APIRouter() + + +@CURD.get('/emp') +def get_stuinfo( + # stuid:int|None=None, + comname:str|None=None + ,min_salary:int=0 + ,max_salary:int|None=None + ,db=Depends(get_db) + ): + r=get_orders_dao( + # stuid, + comname, + db, + min_salary, + max_salary) + if r: + return r + raise HTTPException(status_code=404, detail='名单不存在!') + +@CURD.post('/emp',response_model=EmpResponse) +def add_stuinfo( + p:PostRequest,db=Depends(get_db) + ): + d=p.model_dump() + r=add_employment_dao(o=d,db=db) + if not r: + raise HTTPException(status_code=500, detail='服务器繁忙,请稍后添加!') + return EmpResponse(totals=1, data=d) + +@CURD.put('/emp') +def updata_stuinfo(company:PostRequest + ,id:int + ,db=Depends(get_db) + ): + d = company.model_dump(exclude_unset=True) + r = update_orders_dao(id=id, update_data=d, db=db) + if not r: + raise HTTPException(status_code=500, detail='没有更新!') + return {'code': 200, 'totals': r, 'detail': '更新成功'} + +@CURD.delete('/emp') +def delete_stuinfo(id:int + ,db=Depends(get_db)): + rows = delete_orders_dao(id, db) + if not rows: + raise HTTPException(status_code=500, detail='没有删除!') + return {'code': 200, 'totals': rows, 'detail': '删除成功'} + + + + diff --git a/stu_jiuye/dao.py b/stu_jiuye/dao.py new file mode 100644 index 0000000..8887229 --- /dev/null +++ b/stu_jiuye/dao.py @@ -0,0 +1,74 @@ +from model import Employments,Address + + +def add_employment_dao(o,db): + try: + # r = db.query(Employments).filter(Employments.id == o['id'] ).all() + o.pop('id', None) + o1 = Employments( **o) + db.add(o1) + + except Exception as e: + print(f'添加失败,{e}') + db.rollback() + return False + else: + db.commit() + return True + + + +def update_orders_dao(id,update_data,db): + try: # 数据更新是有返回值的,返回的是影响的行数 + rows = db.query( Employments ).filter( Employments.id == id ).update( update_data ) + except: + db.rollback() + return False + else: + db.commit() + return rows + +def get_orders_dao( + # stuid, + name + ,db + , min_salary: int = 0 + , max_salary: int | None = None + # ,page + # ,page_size + ): + q = db.query(Employments) + # if stuid: + # q = q.filter( Employments.id == stuid ) + if name: + q = q.filter( Employments.stuname == name ) + # r = q.offset( (page-1)*page_size ).limit( page_size ).all() + if min_salary is not None: + q = q.filter(Employments.salary >= min_salary) + if max_salary is not None: + q = q.filter(Employments.salary <= max_salary) + r= q.all() + if r: + return [ {"id": i.id, + 'stuname':i.stuname, + 'stuclass':i.stuclass, + "company_name": i.compname, + "salary":i.salary, + "address_id": i.address_id, + "employment_open_date":i.employment_open_date, + "offer_date":i.offer_date, + "created_date": i.created_date, + "updated_date": i.updated_date, + "is_deleted":i.is_deleted } for i in r ] + + +def delete_orders_dao(id,db): + try: # 删除有返回值,删除的行数 + rows = db.query(Employments).filter(Employments.id == id).delete() + except Exception as e: + print(f'删除失败,{e}') + db.rollback() + rows = 0 + else: + db.commit() + return rows \ No newline at end of file diff --git a/stu_jiuye/database.py b/stu_jiuye/database.py index e69de29..33a1ef6 100644 --- a/stu_jiuye/database.py +++ b/stu_jiuye/database.py @@ -0,0 +1,21 @@ +from sqlalchemy import * +from sqlalchemy.orm import declarative_base,sessionmaker + +db_url = "mysql+pymysql://root:123456@127.0.0.1:3306/ai0824?charset=utf8mb4" +engine = create_engine(db_url) + +Base = declarative_base() +Session = sessionmaker(bind=engine + ,autoflush=False + ,autocommit = False + ) + + +def get_db(): + db = Session() + try: + yield db + finally: + db.close() + + diff --git a/stu_jiuye/main.py b/stu_jiuye/main.py index e69de29..d4be968 100644 --- a/stu_jiuye/main.py +++ b/stu_jiuye/main.py @@ -0,0 +1,15 @@ +from fastapi import FastAPI +from CURD_api import CURD +from database import Base,engine +import model +app=FastAPI() +Base.metadata.create_all(engine) +app.include_router(CURD,tags=['就业管理系统'],prefix='/employment') + + + +if __name__=='__main__': + import uvicorn + uvicorn.run('main:app', host='127.0.0.1', port=12395) + + diff --git a/stu_jiuye/model.py b/stu_jiuye/model.py new file mode 100644 index 0000000..05dca71 --- /dev/null +++ b/stu_jiuye/model.py @@ -0,0 +1,81 @@ +from sqlalchemy import ForeignKey + +from database import DATETIME,Base,Column,Integer,String,engine +from datetime import datetime + + + +# class Student(Base): +# __tablename__ = 'Student' +# id = Column(Integer +# , primary_key=True +# , autoincrement=True +# # 外键 +# ,comment='自增主键' +# ) +# +# stuname = Column(String(50) +# ,nullable=False +# ) +# +# stuid=Column(Integer +# ,nullable=False +# ) +# stuclass=Column(String(50) +# ,nullable=False +# ) +# +# +# created_date = Column(DATETIME +# ,default=datetime.now +# ) +# updated_date = Column(DATETIME +# ,default=datetime.now +# ,onupdate=datetime.now +# ) + + +class Employments(Base): + __tablename__ = 'Employments' + id = Column(Integer + , primary_key=True + , autoincrement=True + # , ForeignKey='student.id' + , comment='自增主键' + ) + stuname = Column(String(50)) + stuclass = Column(String(50)) + + compname=Column(String(50) + ,nullable=False + ) + address_id=Column(Integer + ,nullable=False + ) + + salary = Column(Integer) + + employment_open_date = Column(DATETIME) + + offer_date = Column(DATETIME) + + created_date = Column(DATETIME + , default=datetime.now + ) + updated_date = Column(DATETIME + , default=datetime.now + , onupdate=datetime.now + ) + is_deleted = Column(Integer, default=0) +class Address(Base): + __tablename__ = 'address' + id = Column(Integer + , primary_key=True + , autoincrement=True + # , ForeignKey='company.id' + , comment='自增主键' + ) + somewhere=Column(String(50) + , nullable=False + ) + diff --git a/stu_jiuye/request.py b/stu_jiuye/request.py index e69de29..9b02955 100644 --- a/stu_jiuye/request.py +++ b/stu_jiuye/request.py @@ -0,0 +1,27 @@ +from datetime import * +from pydantic import BaseModel, Field + + + +class PostRequest(BaseModel): + compname: str|None=None + stuname: str|None=None + stuclass: str|None=None + address_id: int|None=None + salary: int|None=None + employment_open_date:date|None=None + offer_date:date|None=None + created_date: datetime=Field(default_factory=datetime.now) + updated_date: datetime=Field(default_factory=datetime.now) + is_deleted: bool = False + +class EmpResponse(BaseModel): + code: int = 200 + detail: str = 'OK' + totals: int = 0 + data: str | dict | tuple | list + + + + + diff --git a/stu_jiuye/services.py b/stu_jiuye/services.py deleted file mode 100644 index e69de29..0000000 From 72434a78bce63f7236433daf0a5b19138689768a Mon Sep 17 00:00:00 2001 From: yb <739325183@qq.com> Date: Mon, 21 Sep 2026 11:44:09 +0800 Subject: [PATCH 04/11] =?UTF-8?q?=E7=AC=AC=E4=B8=89=E6=AC=A1=E6=8F=90?= =?UTF-8?q?=E4=BA=A4=EF=BC=8C=E6=9B=B4=E6=96=B0=E5=AE=8C=E5=96=84=E8=A1=A8?= =?UTF-8?q?=E8=BF=9E=E6=8E=A5=EF=BC=8C=E6=96=B0=E5=A2=9E=E5=85=AC=E5=8F=B8?= =?UTF-8?q?=E8=A1=A8=E5=92=8C=E5=9C=B0=E5=9D=80=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- stu_jiuye/CURD_api.py | 30 ++++++++++++++++++++++----- stu_jiuye/dao.py | 32 +++++++++++++++++++++++++++-- stu_jiuye/database.py | 5 ++++- stu_jiuye/model.py | 48 ++++++++++++++++++++++++++++++++----------- stu_jiuye/request.py | 25 ++++++++++++++++++++-- 5 files changed, 118 insertions(+), 22 deletions(-) diff --git a/stu_jiuye/CURD_api.py b/stu_jiuye/CURD_api.py index 622a370..2ec7efc 100644 --- a/stu_jiuye/CURD_api.py +++ b/stu_jiuye/CURD_api.py @@ -2,12 +2,12 @@ import datetime from fastapi import APIRouter,Depends,HTTPException from dao import * -from stu_jiuye.request import PostRequest,EmpResponse +from stu_jiuye.request import PostRequest, EmpResponse, AddRequest,AddResponse,CompRequest,CompResponse from database import get_db CURD=APIRouter() -@CURD.get('/emp') +@CURD.get('/emp',tags=['查询就业信息']) def get_stuinfo( # stuid:int|None=None, comname:str|None=None @@ -25,7 +25,7 @@ def get_stuinfo( return r raise HTTPException(status_code=404, detail='名单不存在!') -@CURD.post('/emp',response_model=EmpResponse) +@CURD.post('/emp',response_model=EmpResponse,tags=['新增就业信息']) def add_stuinfo( p:PostRequest,db=Depends(get_db) ): @@ -35,7 +35,27 @@ def add_stuinfo( raise HTTPException(status_code=500, detail='服务器繁忙,请稍后添加!') return EmpResponse(totals=1, data=d) -@CURD.put('/emp') +@CURD.post('/emp/company',response_model=CompResponse,tags=['新增公司信息']) +def add_company(c:CompRequest,db=Depends(get_db)): + d = c.model_dump() + r = add_company_dao(o=d, db=db) + if not r: + raise HTTPException(status_code=500, detail='服务器繁忙,请稍后添加!') + return EmpResponse(totals=1, data=d) + + +@CURD.post('/emp/company/address',response_model=AddResponse,tags=['新增公司所在区域']) +def add_address( + add:AddRequest,db=Depends(get_db) + ): + d = add.model_dump() + r = add_employment_dao(o=d, db=db) + if not r: + raise HTTPException(status_code=500, detail='服务器繁忙,请稍后添加!') + return EmpResponse(totals=1, data=d) + + +@CURD.put('/emp',tags=['更改就业信息']) def updata_stuinfo(company:PostRequest ,id:int ,db=Depends(get_db) @@ -46,7 +66,7 @@ def updata_stuinfo(company:PostRequest raise HTTPException(status_code=500, detail='没有更新!') return {'code': 200, 'totals': r, 'detail': '更新成功'} -@CURD.delete('/emp') +@CURD.delete('/emp',tags=['删除就业信息']) def delete_stuinfo(id:int ,db=Depends(get_db)): rows = delete_orders_dao(id, db) diff --git a/stu_jiuye/dao.py b/stu_jiuye/dao.py index 8887229..a1b1dc0 100644 --- a/stu_jiuye/dao.py +++ b/stu_jiuye/dao.py @@ -1,4 +1,4 @@ -from model import Employments,Address +from model import Employments,Address,Company def add_employment_dao(o,db): @@ -16,6 +16,30 @@ def add_employment_dao(o,db): db.commit() return True +def add_company_dao(o,db): + try: + o.pop('id', None) + o1 = Company( **o) + db.add(o1) + except Exception as e: + print(f'添加失败,{e}') + db.rollback() + return False + else: + db.commit() + return True +def add_address_dao(o,db): + try: + o.pop('id', None) + o1 = Address( **o) + db.add(o1) + except Exception as e: + print(f'添加失败,{e}') + db.rollback() + return False + else: + db.commit() + return True def update_orders_dao(id,update_data,db): @@ -37,9 +61,12 @@ def get_orders_dao( # ,page # ,page_size ): - q = db.query(Employments) + q = db.query(Employments)\ + .join(Company,Employments.company_id==Company.id)\ + .join(Address,Company.address_id==Address.id) # if stuid: # q = q.filter( Employments.id == stuid ) + if name: q = q.filter( Employments.stuname == name ) # r = q.offset( (page-1)*page_size ).limit( page_size ).all() @@ -53,6 +80,7 @@ def get_orders_dao( 'stuname':i.stuname, 'stuclass':i.stuclass, "company_name": i.compname, + "company_id": i.company_id, "salary":i.salary, "address_id": i.address_id, "employment_open_date":i.employment_open_date, diff --git a/stu_jiuye/database.py b/stu_jiuye/database.py index 33a1ef6..be5bf58 100644 --- a/stu_jiuye/database.py +++ b/stu_jiuye/database.py @@ -2,7 +2,10 @@ from sqlalchemy import * from sqlalchemy.orm import declarative_base,sessionmaker db_url = "mysql+pymysql://root:123456@127.0.0.1:3306/ai0824?charset=utf8mb4" -engine = create_engine(db_url) +engine = create_engine(db_url + , pool_size=50 + , echo=True + ) Base = declarative_base() Session = sessionmaker(bind=engine diff --git a/stu_jiuye/model.py b/stu_jiuye/model.py index 05dca71..7ba811b 100644 --- a/stu_jiuye/model.py +++ b/stu_jiuye/model.py @@ -4,7 +4,6 @@ from database import DATETIME,Base,Column,Integer,String,engine from datetime import datetime - # class Student(Base): # __tablename__ = 'Student' # id = Column(Integer @@ -13,19 +12,15 @@ from datetime import datetime # # 外键 # ,comment='自增主键' # ) -# # stuname = Column(String(50) # ,nullable=False # ) -# # stuid=Column(Integer # ,nullable=False # ) # stuclass=Column(String(50) # ,nullable=False # ) -# -# # created_date = Column(DATETIME # ,default=datetime.now # ) @@ -47,11 +42,12 @@ class Employments(Base): stuclass = Column(String(50)) compname=Column(String(50) - ,nullable=False + ,nullable=False ) - address_id=Column(Integer - ,nullable=False - ) + company_id = Column(Integer + , nullable=False + + ) salary = Column(Integer) @@ -67,15 +63,43 @@ class Employments(Base): , onupdate=datetime.now ) is_deleted = Column(Integer, default=0) + +class Company(Base): + __tablename__ = 'Company' + id = Column(Integer + , ForeignKey('Employments.company_id') + , primary_key=True + + ) + compname = Column(String(50), nullable=False) + address_id = Column(Integer + , nullable=False + ) + created_date = Column(DATETIME + , default=datetime.now + ) + updated_date = Column(DATETIME + , default=datetime.now + , onupdate=datetime.now + ) + is_deleted = Column(Integer, default=0) + class Address(Base): __tablename__ = 'address' id = Column(Integer + , ForeignKey('Company.address_id') , primary_key=True - , autoincrement=True - # , ForeignKey='company.id' - , comment='自增主键' + ) somewhere=Column(String(50) , nullable=False ) + created_date = Column(DATETIME + , default=datetime.now + ) + updated_date = Column(DATETIME + , default=datetime.now + , onupdate=datetime.now + ) + is_deleted = Column(Integer, default=0) diff --git a/stu_jiuye/request.py b/stu_jiuye/request.py index 9b02955..77f8415 100644 --- a/stu_jiuye/request.py +++ b/stu_jiuye/request.py @@ -14,7 +14,6 @@ class PostRequest(BaseModel): created_date: datetime=Field(default_factory=datetime.now) updated_date: datetime=Field(default_factory=datetime.now) is_deleted: bool = False - class EmpResponse(BaseModel): code: int = 200 detail: str = 'OK' @@ -22,6 +21,28 @@ class EmpResponse(BaseModel): data: str | dict | tuple | list +class CompRequest(BaseModel): + compname:str|None=None + created_date: datetime = Field(default_factory=datetime.now) + updated_date: datetime = Field(default_factory=datetime.now) + is_deleted: bool = False +class CompResponse(BaseModel): + code: int = 200 + detail: str = 'OK' + totals: int = 0 + data: str | dict | tuple | list + +class AddRequest(BaseModel): + somewhere:str|None=None + created_date: datetime = Field(default_factory=datetime.now) + updated_date: datetime = Field(default_factory=datetime.now) + is_deleted: bool = False +class AddResponse(BaseModel): + code: int = 200 + detail: str = 'OK' + totals: int = 0 + data: str | dict | tuple | list + + - From c45cae80c77c40e75bc4773ceeb11fbf598f0b75 Mon Sep 17 00:00:00 2001 From: yb <739325183@qq.com> Date: Mon, 21 Sep 2026 12:22:26 +0800 Subject: [PATCH 05/11] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=A4=96=E9=94=AE?= =?UTF-8?q?=E8=BF=9E=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pyproject.toml | 1 + stu_jiuye/CURD_api.py | 2 +- stu_jiuye/dao.py | 5 +++-- stu_jiuye/main.py | 2 +- stu_jiuye/model.py | 13 +++++++++---- stu_jiuye/models.py | 6 ------ stu_jiuye/request.py | 17 ++++++----------- uv.lock | 2 ++ 8 files changed, 23 insertions(+), 25 deletions(-) delete mode 100644 stu_jiuye/models.py diff --git a/pyproject.toml b/pyproject.toml index ade1bd4..0d5aebe 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,4 +9,5 @@ dependencies = [ "pip>=26.2.1", "pymysql>=1.2.3", "sqlalchemy>=2.0.54", + "uvicorn>=0.53.0", ] diff --git a/stu_jiuye/CURD_api.py b/stu_jiuye/CURD_api.py index 2ec7efc..c15176d 100644 --- a/stu_jiuye/CURD_api.py +++ b/stu_jiuye/CURD_api.py @@ -49,7 +49,7 @@ def add_address( add:AddRequest,db=Depends(get_db) ): d = add.model_dump() - r = add_employment_dao(o=d, db=db) + r = add_address_dao(o=d, db=db) if not r: raise HTTPException(status_code=500, detail='服务器繁忙,请稍后添加!') return EmpResponse(totals=1, data=d) diff --git a/stu_jiuye/dao.py b/stu_jiuye/dao.py index a1b1dc0..2be42c0 100644 --- a/stu_jiuye/dao.py +++ b/stu_jiuye/dao.py @@ -52,7 +52,7 @@ def update_orders_dao(id,update_data,db): db.commit() return rows -def get_orders_dao( +def get_emp_dao( # stuid, name ,db @@ -92,7 +92,8 @@ def get_orders_dao( def delete_orders_dao(id,db): try: # 删除有返回值,删除的行数 - rows = db.query(Employments).filter(Employments.id == id).delete() + rows = db.query(Employments).filter(Employments.id == id).update( is_deleted=1 ) + except Exception as e: print(f'删除失败,{e}') db.rollback() diff --git a/stu_jiuye/main.py b/stu_jiuye/main.py index d4be968..f1a1b49 100644 --- a/stu_jiuye/main.py +++ b/stu_jiuye/main.py @@ -4,7 +4,7 @@ from database import Base,engine import model app=FastAPI() Base.metadata.create_all(engine) -app.include_router(CURD,tags=['就业管理系统'],prefix='/employment') +app.include_router(CURD,tags=['就业管理系统']) diff --git a/stu_jiuye/model.py b/stu_jiuye/model.py index 7ba811b..8f0bdad 100644 --- a/stu_jiuye/model.py +++ b/stu_jiuye/model.py @@ -45,10 +45,14 @@ class Employments(Base): ,nullable=False ) company_id = Column(Integer + , ForeignKey('Company.id') , nullable=False ) - + address_id = Column(Integer + , ForeignKey('Address.id') + , nullable=False + ) salary = Column(Integer) employment_open_date = Column(DATETIME) @@ -67,12 +71,13 @@ class Employments(Base): class Company(Base): __tablename__ = 'Company' id = Column(Integer - , ForeignKey('Employments.company_id') + , primary_key=True ) compname = Column(String(50), nullable=False) address_id = Column(Integer + # , ForeignKey('Address.id') , nullable=False ) created_date = Column(DATETIME @@ -85,9 +90,9 @@ class Company(Base): is_deleted = Column(Integer, default=0) class Address(Base): - __tablename__ = 'address' + __tablename__ = 'Address' id = Column(Integer - , ForeignKey('Company.address_id') + , primary_key=True ) diff --git a/stu_jiuye/models.py b/stu_jiuye/models.py deleted file mode 100644 index 0984197..0000000 --- a/stu_jiuye/models.py +++ /dev/null @@ -1,6 +0,0 @@ - - - -class - - diff --git a/stu_jiuye/request.py b/stu_jiuye/request.py index 77f8415..2d3fe6d 100644 --- a/stu_jiuye/request.py +++ b/stu_jiuye/request.py @@ -7,13 +7,11 @@ class PostRequest(BaseModel): compname: str|None=None stuname: str|None=None stuclass: str|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 - created_date: datetime=Field(default_factory=datetime.now) - updated_date: datetime=Field(default_factory=datetime.now) - is_deleted: bool = False class EmpResponse(BaseModel): code: int = 200 detail: str = 'OK' @@ -22,10 +20,9 @@ class EmpResponse(BaseModel): class CompRequest(BaseModel): - compname:str|None=None - created_date: datetime = Field(default_factory=datetime.now) - updated_date: datetime = Field(default_factory=datetime.now) - is_deleted: bool = False + compname:str + address_id: int | None = None + class CompResponse(BaseModel): code: int = 200 detail: str = 'OK' @@ -33,10 +30,8 @@ class CompResponse(BaseModel): data: str | dict | tuple | list class AddRequest(BaseModel): - somewhere:str|None=None - created_date: datetime = Field(default_factory=datetime.now) - updated_date: datetime = Field(default_factory=datetime.now) - is_deleted: bool = False + somewhere:str + class AddResponse(BaseModel): code: int = 200 detail: str = 'OK' diff --git a/uv.lock b/uv.lock index 70a005f..48d6f35 100644 --- a/uv.lock +++ b/uv.lock @@ -845,6 +845,7 @@ dependencies = [ { name = "pip" }, { name = "pymysql" }, { name = "sqlalchemy" }, + { name = "uvicorn" }, ] [package.metadata] @@ -853,6 +854,7 @@ requires-dist = [ { name = "pip", specifier = ">=26.2.1" }, { name = "pymysql", specifier = ">=1.2.3" }, { name = "sqlalchemy", specifier = ">=2.0.54" }, + { name = "uvicorn", specifier = ">=0.53.0" }, ] [[package]] From 3976d8c20e1029ab0816848773acd1186ffa9afd Mon Sep 17 00:00:00 2001 From: yb <739325183@qq.com> Date: Mon, 21 Sep 2026 15:07:50 +0800 Subject: [PATCH 06/11] =?UTF-8?q?=E6=9B=B4=E6=96=B0debug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pyproject.toml | 1 + stu_jiuye/CURD_api.py | 14 +++++++------- stu_jiuye/dao.py | 28 ++++++++++++++++++---------- stu_jiuye/database.py | 2 +- stu_jiuye/model.py | 20 +++++++++----------- stu_jiuye/request.py | 4 ++-- uv.lock | 8 ++++++++ 7 files changed, 46 insertions(+), 31 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 0d5aebe..760670a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -6,6 +6,7 @@ readme = "README.md" requires-python = ">=3.13" dependencies = [ "fastapi[standard]>=0.141.1", + "like>=1.7.1", "pip>=26.2.1", "pymysql>=1.2.3", "sqlalchemy>=2.0.54", diff --git a/stu_jiuye/CURD_api.py b/stu_jiuye/CURD_api.py index c15176d..78c9f48 100644 --- a/stu_jiuye/CURD_api.py +++ b/stu_jiuye/CURD_api.py @@ -9,15 +9,15 @@ CURD=APIRouter() @CURD.get('/emp',tags=['查询就业信息']) def get_stuinfo( - # stuid:int|None=None, - comname:str|None=None + stuname:str| None = None + ,compname:str|None=None ,min_salary:int=0 ,max_salary:int|None=None ,db=Depends(get_db) ): - r=get_orders_dao( - # stuid, - comname, + r=get_emp_dao( + stuname, + compname, db, min_salary, max_salary) @@ -41,7 +41,7 @@ def add_company(c:CompRequest,db=Depends(get_db)): r = add_company_dao(o=d, db=db) if not r: raise HTTPException(status_code=500, detail='服务器繁忙,请稍后添加!') - return EmpResponse(totals=1, data=d) + return CompResponse(totals=1, data=d) @CURD.post('/emp/company/address',response_model=AddResponse,tags=['新增公司所在区域']) @@ -52,7 +52,7 @@ def add_address( r = add_address_dao(o=d, db=db) if not r: raise HTTPException(status_code=500, detail='服务器繁忙,请稍后添加!') - return EmpResponse(totals=1, data=d) + return AddResponse(totals=1, data=d) @CURD.put('/emp',tags=['更改就业信息']) diff --git a/stu_jiuye/dao.py b/stu_jiuye/dao.py index 2be42c0..79b42dd 100644 --- a/stu_jiuye/dao.py +++ b/stu_jiuye/dao.py @@ -1,3 +1,5 @@ +import like + from model import Employments,Address,Company @@ -45,7 +47,8 @@ def add_address_dao(o,db): def update_orders_dao(id,update_data,db): try: # 数据更新是有返回值的,返回的是影响的行数 rows = db.query( Employments ).filter( Employments.id == id ).update( update_data ) - except: + except Exception as e: + print(f'更新失败,{e}') db.rollback() return False else: @@ -54,21 +57,25 @@ def update_orders_dao(id,update_data,db): def get_emp_dao( # stuid, - name + stuname + ,compname ,db , min_salary: int = 0 , max_salary: int | None = None # ,page # ,page_size ): - q = db.query(Employments)\ + q = db.query(Employments,Company.compname,Address.somewhere)\ .join(Company,Employments.company_id==Company.id)\ - .join(Address,Company.address_id==Address.id) + .join(Address,Company.address_id==Address.id)\ + .filter(Employments.is_deleted == 0) # if stuid: # q = q.filter( Employments.id == stuid ) - if name: - q = q.filter( Employments.stuname == name ) + if stuname: + q = q.filter( Employments.stuname == stuname ) + if compname: + q=q.filter(Company.compname.like(f'%{compname}%')) # r = q.offset( (page-1)*page_size ).limit( page_size ).all() if min_salary is not None: q = q.filter(Employments.salary >= min_salary) @@ -79,15 +86,16 @@ def get_emp_dao( return [ {"id": i.id, 'stuname':i.stuname, 'stuclass':i.stuclass, - "company_name": i.compname, - "company_id": i.company_id, + "company_name": compname, + "address":somewhere, + # "company_id": i.company_id, "salary":i.salary, - "address_id": i.address_id, + # "address_id": i.address_id, "employment_open_date":i.employment_open_date, "offer_date":i.offer_date, "created_date": i.created_date, "updated_date": i.updated_date, - "is_deleted":i.is_deleted } for i in r ] + "is_deleted":i.is_deleted } for i,compname,somewhere in r ] def delete_orders_dao(id,db): diff --git a/stu_jiuye/database.py b/stu_jiuye/database.py index be5bf58..230d3a7 100644 --- a/stu_jiuye/database.py +++ b/stu_jiuye/database.py @@ -1,7 +1,7 @@ from sqlalchemy import * from sqlalchemy.orm import declarative_base,sessionmaker -db_url = "mysql+pymysql://root:123456@127.0.0.1:3306/ai0824?charset=utf8mb4" +db_url = "mysql+pymysql://root:123456@127.0.0.1:3306/ai0824_001?charset=utf8mb4" engine = create_engine(db_url , pool_size=50 , echo=True diff --git a/stu_jiuye/model.py b/stu_jiuye/model.py index 8f0bdad..466273e 100644 --- a/stu_jiuye/model.py +++ b/stu_jiuye/model.py @@ -41,18 +41,18 @@ class Employments(Base): stuname = Column(String(50)) stuclass = Column(String(50)) - compname=Column(String(50) - ,nullable=False - ) + # compname=Column(String(50) + # ,nullable=False + # ) company_id = Column(Integer , ForeignKey('Company.id') , nullable=False ) - address_id = Column(Integer - , ForeignKey('Address.id') - , nullable=False - ) + # address_id = Column(Integer + # , ForeignKey('Address.id') + # , nullable=False + # ) salary = Column(Integer) employment_open_date = Column(DATETIME) @@ -71,9 +71,8 @@ class Employments(Base): class Company(Base): __tablename__ = 'Company' id = Column(Integer - , primary_key=True - + ,autoincrement=True ) compname = Column(String(50), nullable=False) address_id = Column(Integer @@ -92,9 +91,8 @@ class Company(Base): class Address(Base): __tablename__ = 'Address' id = Column(Integer - , primary_key=True - + ,autoincrement=True ) somewhere=Column(String(50) , nullable=False diff --git a/stu_jiuye/request.py b/stu_jiuye/request.py index 2d3fe6d..d67f9e6 100644 --- a/stu_jiuye/request.py +++ b/stu_jiuye/request.py @@ -4,11 +4,11 @@ from pydantic import BaseModel, Field class PostRequest(BaseModel): - compname: str|None=None + # compname: str|None=None stuname: str|None=None stuclass: str|None=None company_id:int|None=None - address_id: int|None=None + # address_id: int|None=None salary: int|None=None employment_open_date:date|None=None offer_date:date|None=None diff --git a/uv.lock b/uv.lock index 48d6f35..9fc0636 100644 --- a/uv.lock +++ b/uv.lock @@ -396,6 +396,12 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, ] +[[package]] +name = "like" +version = "1.7.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0d/d1/5284ae5ae97876808622090d858098e11787469c601b679274e17bcb7b34/like-1.7.1.zip", hash = "sha256:2614e24923fb934955b6abeeda6d13db567d7901da44bc01480e14838618ded2", size = 925, upload-time = "2016-12-19T04:01:13.729Z" } + [[package]] name = "markdown-it-py" version = "4.2.0" @@ -842,6 +848,7 @@ version = "0.1.0" source = { virtual = "." } dependencies = [ { name = "fastapi", extra = ["standard"] }, + { name = "like" }, { name = "pip" }, { name = "pymysql" }, { name = "sqlalchemy" }, @@ -851,6 +858,7 @@ dependencies = [ [package.metadata] requires-dist = [ { name = "fastapi", extras = ["standard"], specifier = ">=0.141.1" }, + { name = "like", specifier = ">=1.7.1" }, { name = "pip", specifier = ">=26.2.1" }, { name = "pymysql", specifier = ">=1.2.3" }, { name = "sqlalchemy", specifier = ">=2.0.54" }, From def4b1d2c3de1da1bab2373ab58f5df020d7ccbd Mon Sep 17 00:00:00 2001 From: yb <739325183@qq.com> Date: Mon, 21 Sep 2026 15:35:45 +0800 Subject: [PATCH 07/11] =?UTF-8?q?=E6=9B=B4=E6=96=B0debug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- stu_jiuye/CURD_api.py | 8 ++++---- stu_jiuye/dao.py | 4 ++-- stu_jiuye/request.py | 2 ++ 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/stu_jiuye/CURD_api.py b/stu_jiuye/CURD_api.py index 78c9f48..3a1764d 100644 --- a/stu_jiuye/CURD_api.py +++ b/stu_jiuye/CURD_api.py @@ -56,12 +56,12 @@ def add_address( @CURD.put('/emp',tags=['更改就业信息']) -def updata_stuinfo(company:PostRequest +def updata_stuinfo(up:PostRequest ,id:int ,db=Depends(get_db) ): - d = company.model_dump(exclude_unset=True) - r = update_orders_dao(id=id, update_data=d, db=db) + d = up.model_dump(exclude_unset=True) + r = update_emp_dao(id=id, update_data=d, db=db) if not r: raise HTTPException(status_code=500, detail='没有更新!') return {'code': 200, 'totals': r, 'detail': '更新成功'} @@ -69,7 +69,7 @@ def updata_stuinfo(company:PostRequest @CURD.delete('/emp',tags=['删除就业信息']) def delete_stuinfo(id:int ,db=Depends(get_db)): - rows = delete_orders_dao(id, db) + rows = delete_emp_dao(id, db) if not rows: raise HTTPException(status_code=500, detail='没有删除!') return {'code': 200, 'totals': rows, 'detail': '删除成功'} diff --git a/stu_jiuye/dao.py b/stu_jiuye/dao.py index 79b42dd..e9691c7 100644 --- a/stu_jiuye/dao.py +++ b/stu_jiuye/dao.py @@ -44,7 +44,7 @@ def add_address_dao(o,db): return True -def update_orders_dao(id,update_data,db): +def update_emp_dao(id,update_data,db): try: # 数据更新是有返回值的,返回的是影响的行数 rows = db.query( Employments ).filter( Employments.id == id ).update( update_data ) except Exception as e: @@ -98,7 +98,7 @@ def get_emp_dao( "is_deleted":i.is_deleted } for i,compname,somewhere in r ] -def delete_orders_dao(id,db): +def delete_emp_dao(id,db): try: # 删除有返回值,删除的行数 rows = db.query(Employments).filter(Employments.id == id).update( is_deleted=1 ) diff --git a/stu_jiuye/request.py b/stu_jiuye/request.py index d67f9e6..c760806 100644 --- a/stu_jiuye/request.py +++ b/stu_jiuye/request.py @@ -12,6 +12,8 @@ class PostRequest(BaseModel): salary: int|None=None employment_open_date:date|None=None offer_date:date|None=None + updated_date:date|None=None + is_deleted:int=0 class EmpResponse(BaseModel): code: int = 200 detail: str = 'OK' From 2bc1e580478a2e5c53c553be85f5cb526fa18e40 Mon Sep 17 00:00:00 2001 From: yb <739325183@qq.com> Date: Mon, 21 Sep 2026 16:18:59 +0800 Subject: [PATCH 08/11] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E6=A8=A1=E5=9D=97debug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- stu_jiuye/CURD_api.py | 2 +- stu_jiuye/dao.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/stu_jiuye/CURD_api.py b/stu_jiuye/CURD_api.py index 3a1764d..f895d9a 100644 --- a/stu_jiuye/CURD_api.py +++ b/stu_jiuye/CURD_api.py @@ -66,7 +66,7 @@ def updata_stuinfo(up:PostRequest raise HTTPException(status_code=500, detail='没有更新!') return {'code': 200, 'totals': r, 'detail': '更新成功'} -@CURD.delete('/emp',tags=['删除就业信息']) +@CURD.delete('/emp/{id}',tags=['删除就业信息']) def delete_stuinfo(id:int ,db=Depends(get_db)): rows = delete_emp_dao(id, db) diff --git a/stu_jiuye/dao.py b/stu_jiuye/dao.py index e9691c7..adf4d80 100644 --- a/stu_jiuye/dao.py +++ b/stu_jiuye/dao.py @@ -100,7 +100,7 @@ def get_emp_dao( def delete_emp_dao(id,db): try: # 删除有返回值,删除的行数 - rows = db.query(Employments).filter(Employments.id == id).update( is_deleted=1 ) + rows = db.query(Employments).filter(Employments.id == id).update( {'is_deleted':1} ) except Exception as e: print(f'删除失败,{e}') From acf5eb14414285ca9843af07ba228d93e9f5acda Mon Sep 17 00:00:00 2001 From: yb <739325183@qq.com> Date: Mon, 21 Sep 2026 17:05:10 +0800 Subject: [PATCH 09/11] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- stu_jiuye/CURD_api.py | 72 ++++++++++++++++++---------------- stu_jiuye/dao.py | 91 ++++++++++++++++++++++--------------------- stu_jiuye/model.py | 44 +++++++++++---------- stu_jiuye/request.py | 13 +++---- 4 files changed, 115 insertions(+), 105 deletions(-) diff --git a/stu_jiuye/CURD_api.py b/stu_jiuye/CURD_api.py index f895d9a..2698fb6 100644 --- a/stu_jiuye/CURD_api.py +++ b/stu_jiuye/CURD_api.py @@ -8,71 +8,77 @@ CURD=APIRouter() @CURD.get('/emp',tags=['查询就业信息']) -def get_stuinfo( +def get_stuinfo( #查询学生就业信息 stuname:str| None = None ,compname:str|None=None ,min_salary:int=0 ,max_salary:int|None=None ,db=Depends(get_db) - ): - r=get_emp_dao( + ): #查询条件 + r=get_emp_dao( #调用函数 stuname, compname, db, min_salary, - max_salary) + max_salary + ) if r: - return r - raise HTTPException(status_code=404, detail='名单不存在!') + return r #成功返回 + raise HTTPException(status_code=404, detail='名单不存在!') #失败返回错误信息 @CURD.post('/emp',response_model=EmpResponse,tags=['新增就业信息']) -def add_stuinfo( +def add_stuinfo( #新增学生就业信息 p:PostRequest,db=Depends(get_db) - ): - d=p.model_dump() - r=add_employment_dao(o=d,db=db) + ): #调用请求体 + d=p.model_dump() #解析成字典 + r=add_employment_dao(o=d,db=db) #调用函数 if not r: - raise HTTPException(status_code=500, detail='服务器繁忙,请稍后添加!') - return EmpResponse(totals=1, data=d) + raise HTTPException(status_code=500, detail='服务器繁忙,请稍后添加!') #失败返回错误 + return EmpResponse(totals=1, data=d) #成功返回响应体 @CURD.post('/emp/company',response_model=CompResponse,tags=['新增公司信息']) -def add_company(c:CompRequest,db=Depends(get_db)): - d = c.model_dump() - r = add_company_dao(o=d, db=db) +def add_company( #新增公司表信息 + c:CompRequest,db=Depends(get_db) + ): + d = c.model_dump() #解析 + r = add_company_dao(o=d, db=db) #调用添加公司函数 if not r: - raise HTTPException(status_code=500, detail='服务器繁忙,请稍后添加!') - return CompResponse(totals=1, data=d) + raise HTTPException(status_code=500, detail='服务器繁忙,请稍后添加!') #失败返回错误信息 + return CompResponse(totals=1, data=d) #成功返回响应体 @CURD.post('/emp/company/address',response_model=AddResponse,tags=['新增公司所在区域']) -def add_address( +def add_address( #新增公司地址区域信息 add:AddRequest,db=Depends(get_db) ): - d = add.model_dump() - r = add_address_dao(o=d, db=db) + d = add.model_dump() #解析 + r = add_address_dao(o=d, db=db) #调用添加地址函数 if not r: - raise HTTPException(status_code=500, detail='服务器繁忙,请稍后添加!') - return AddResponse(totals=1, data=d) + raise HTTPException(status_code=500, detail='服务器繁忙,请稍后添加!') #失败返回错误信息 + return AddResponse(totals=1, data=d) #成功返回响应体 @CURD.put('/emp',tags=['更改就业信息']) -def updata_stuinfo(up:PostRequest +def updata_stuinfo( #更新数据模块 + up:PostRequest ,id:int ,db=Depends(get_db) - ): - d = up.model_dump(exclude_unset=True) - r = update_emp_dao(id=id, update_data=d, db=db) + ): #根据id选择对象 + d = up.model_dump(exclude_unset=True) #解析 + r = update_emp_dao(id=id, update_data=d, db=db) #调用更新函数 if not r: - raise HTTPException(status_code=500, detail='没有更新!') - return {'code': 200, 'totals': r, 'detail': '更新成功'} + raise HTTPException(status_code=500, detail='没有更新!') #失败返回错误信息 + return {'code': 200, 'totals': r, 'detail': '更新成功'} #成功返回信息 @CURD.delete('/emp/{id}',tags=['删除就业信息']) -def delete_stuinfo(id:int - ,db=Depends(get_db)): - rows = delete_emp_dao(id, db) +def delete_stuinfo( #删除模块 + id:int + ,db=Depends(get_db) + ): #根据id选择对象 + rows = delete_emp_dao(id, db) #调用删除函数 if not rows: - raise HTTPException(status_code=500, detail='没有删除!') - return {'code': 200, 'totals': rows, 'detail': '删除成功'} + raise HTTPException(status_code=500, detail='没有删除!') #失败返回错误信息 + return {'code': 200, 'totals': rows, 'detail': '删除成功'} #成功返回信息 diff --git a/stu_jiuye/dao.py b/stu_jiuye/dao.py index adf4d80..e70b3e6 100644 --- a/stu_jiuye/dao.py +++ b/stu_jiuye/dao.py @@ -1,61 +1,62 @@ -import like from model import Employments,Address,Company -def add_employment_dao(o,db): +def add_employment_dao(o,db): #新增就业信息函数 try: - # r = db.query(Employments).filter(Employments.id == o['id'] ).all() - o.pop('id', None) - o1 = Employments( **o) - db.add(o1) + # r = db.query(Employments).filter(Employments.id == o['id'] ).all() # + o.pop('id', None) #摘除id字段,自增字段无需手动添加 + o1 = Employments( **o) #实例化参数 + db.add(o1) #添加数据进入表 - except Exception as e: + except Exception as e: #失败返回 print(f'添加失败,{e}') - db.rollback() + db.rollback() #回滚数据 return False else: - db.commit() + db.commit() #提交事务,永久保存 return True -def add_company_dao(o,db): +def add_company_dao(o,db): #添加公司信息函数 try: - o.pop('id', None) - o1 = Company( **o) - db.add(o1) - except Exception as e: + o.pop('id', None) #摘除id字段,自增字段无需手动添加 + o1 = Company( **o) #实例化参数 + db.add(o1) #添加数据进入表 + except Exception as e: #失败返回 print(f'添加失败,{e}') - db.rollback() + db.rollback() #回滚数据 return False else: - db.commit() + db.commit() #提交事务,永久保存 return True -def add_address_dao(o,db): +def add_address_dao(o,db): #添加地址区域信息函数 try: - o.pop('id', None) - o1 = Address( **o) - db.add(o1) - except Exception as e: + o.pop('id', None) #摘除id字段,自增字段无需手动添加 + o1 = Address( **o) #实例化参数 + db.add(o1) #添加数据进入表 + except Exception as e: #失败返回 print(f'添加失败,{e}') - db.rollback() + db.rollback() #回滚数据 return False else: - db.commit() + db.commit() #提交事务,永久保存 return True -def update_emp_dao(id,update_data,db): - try: # 数据更新是有返回值的,返回的是影响的行数 - rows = db.query( Employments ).filter( Employments.id == id ).update( update_data ) +def update_emp_dao(id,update_data,db): #更新数据函数 + try: + rows = db.query( Employments )\ + .filter( Employments.id == id )\ + .update( update_data ) #更新条件匹配id except Exception as e: - print(f'更新失败,{e}') - db.rollback() + print(f'更新失败,{e}') #返回失败信息 + db.rollback() #数据回滚 return False else: - db.commit() + db.commit() #提交事务,永久保存 return rows -def get_emp_dao( +def get_emp_dao( #获取学生就业信息函数 # stuid, stuname ,compname @@ -64,22 +65,22 @@ def get_emp_dao( , max_salary: int | None = None # ,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)\ - .filter(Employments.is_deleted == 0) + .filter(Employments.is_deleted == 0) #连接公司表和地址表,筛选未被删除信息 # if stuid: # q = q.filter( Employments.id == stuid ) - if stuname: + if stuname: #根据学生姓名筛选 q = q.filter( Employments.stuname == stuname ) - if compname: + if compname: #根据公司姓名筛选 q=q.filter(Company.compname.like(f'%{compname}%')) # 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) - if max_salary is not None: + if max_salary is not None: ##根据最大薪资筛选 q = q.filter(Employments.salary <= max_salary) r= q.all() if r: @@ -95,17 +96,19 @@ def get_emp_dao( "offer_date":i.offer_date, "created_date": i.created_date, "updated_date": i.updated_date, - "is_deleted":i.is_deleted } for i,compname,somewhere in r ] + "is_deleted":i.is_deleted } for i,compname,somewhere in r ] #返回信息列表 -def delete_emp_dao(id,db): - try: # 删除有返回值,删除的行数 - rows = db.query(Employments).filter(Employments.id == id).update( {'is_deleted':1} ) +def delete_emp_dao(id,db): #删除函数 + try: + rows = db.query(Employments)\ + .filter(Employments.id == id)\ + .update( {'is_deleted':1} ) #软删除,is_deleted返回1 - except Exception as e: + except Exception as e: #失败返回信息 print(f'删除失败,{e}') - db.rollback() - rows = 0 + db.rollback() #数据回滚 + rows = 0 #返回0 else: - db.commit() + db.commit() #提交事务,永久保存 return rows \ No newline at end of file diff --git a/stu_jiuye/model.py b/stu_jiuye/model.py index 466273e..0e0779d 100644 --- a/stu_jiuye/model.py +++ b/stu_jiuye/model.py @@ -30,21 +30,21 @@ from datetime import datetime # ) -class Employments(Base): - __tablename__ = 'Employments' - id = Column(Integer +class Employments(Base): #学生就业信息基类 + __tablename__ = 'Employments' #表名 + id = Column(Integer #主键,自增主键 , primary_key=True , autoincrement=True # , ForeignKey='student.id' , comment='自增主键' ) - stuname = Column(String(50)) - stuclass = Column(String(50)) + stuname = Column(String(50)) #学生姓名,冗余字段 + stuclass = Column(String(50)) #学生班级,冗余字段 # compname=Column(String(50) # ,nullable=False # ) - company_id = Column(Integer + company_id = Column(Integer #公司id,外键匹配公司表 , ForeignKey('Company.id') , nullable=False @@ -53,31 +53,33 @@ class Employments(Base): # , ForeignKey('Address.id') # , nullable=False # ) - salary = Column(Integer) + salary = Column(Integer) #薪资 - employment_open_date = Column(DATETIME) + employment_open_date = Column(DATETIME) #就业开放时间 - offer_date = Column(DATETIME) + offer_date = Column(DATETIME) #offer下发时间 - created_date = Column(DATETIME + created_date = Column(DATETIME #创建数据时间 , default=datetime.now ) - updated_date = Column(DATETIME + updated_date = Column(DATETIME #更新数据时间 , default=datetime.now , onupdate=datetime.now ) - is_deleted = Column(Integer, default=0) + is_deleted = Column(Integer, default=0) #是否为删除信息,默认为0 -class Company(Base): - __tablename__ = 'Company' +class Company(Base): #公司信息基类 + __tablename__ = 'Company' #表名 id = Column(Integer , primary_key=True ,autoincrement=True - ) - compname = Column(String(50), nullable=False) - address_id = Column(Integer - # , ForeignKey('Address.id') - , nullable=False + ) #主键id,自增主键 + compname = Column(String(50) #公司姓名 + , nullable=False #非空约束 + ) + address_id = Column(Integer #地址id,匹配地址表 + , ForeignKey('Address.id') #外键地址表id + , nullable=False #非空约束 ) created_date = Column(DATETIME , default=datetime.now @@ -90,11 +92,11 @@ class Company(Base): class Address(Base): __tablename__ = 'Address' - id = Column(Integer + id = Column(Integer #地址id,自增主键 , primary_key=True ,autoincrement=True ) - somewhere=Column(String(50) + somewhere=Column(String(50) #地址区域 , nullable=False ) created_date = Column(DATETIME diff --git a/stu_jiuye/request.py b/stu_jiuye/request.py index c760806..89acbbc 100644 --- a/stu_jiuye/request.py +++ b/stu_jiuye/request.py @@ -2,8 +2,7 @@ from datetime import * from pydantic import BaseModel, Field - -class PostRequest(BaseModel): +class PostRequest(BaseModel): #学生就业信息请求体模型 # compname: str|None=None stuname: str|None=None stuclass: str|None=None @@ -14,27 +13,27 @@ class PostRequest(BaseModel): offer_date:date|None=None updated_date:date|None=None is_deleted:int=0 -class EmpResponse(BaseModel): +class EmpResponse(BaseModel): #学生就业信息响应体 code: int = 200 detail: str = 'OK' totals: int = 0 data: str | dict | tuple | list -class CompRequest(BaseModel): +class CompRequest(BaseModel): #公司信息请求体模型 compname:str address_id: int | None = None -class CompResponse(BaseModel): +class CompResponse(BaseModel): #公司信息响应体 code: int = 200 detail: str = 'OK' totals: int = 0 data: str | dict | tuple | list -class AddRequest(BaseModel): +class AddRequest(BaseModel): #地址请求体 somewhere:str -class AddResponse(BaseModel): +class AddResponse(BaseModel): #地址响应体 code: int = 200 detail: str = 'OK' totals: int = 0 From 71c7a3db2f8e84efc5f0539df5a5235a80908cf7 Mon Sep 17 00:00:00 2001 From: yb <739325183@qq.com> Date: Mon, 21 Sep 2026 17:24:14 +0800 Subject: [PATCH 10/11] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- stu_jiuye/CURD_api.py | 12 ++++++++++-- stu_jiuye/dao.py | 37 +++++++++++++++++++++++++------------ 2 files changed, 35 insertions(+), 14 deletions(-) diff --git a/stu_jiuye/CURD_api.py b/stu_jiuye/CURD_api.py index 2698fb6..c03410e 100644 --- a/stu_jiuye/CURD_api.py +++ b/stu_jiuye/CURD_api.py @@ -10,17 +10,25 @@ CURD=APIRouter() @CURD.get('/emp',tags=['查询就业信息']) def get_stuinfo( #查询学生就业信息 stuname:str| None = None + ,stuclass:str| None = None ,compname: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 ,db=Depends(get_db) ): #查询条件 r=get_emp_dao( #调用函数 stuname, + stuclass, compname, - db, min_salary, - max_salary + max_salary, + somewhere, + employment_open_date, + offer_date, + db ) if r: return r #成功返回 diff --git a/stu_jiuye/dao.py b/stu_jiuye/dao.py index e70b3e6..34e0245 100644 --- a/stu_jiuye/dao.py +++ b/stu_jiuye/dao.py @@ -58,11 +58,16 @@ def update_emp_dao(id,update_data,db): #更新数据函数 def get_emp_dao( #获取学生就业信息函数 # stuid, - stuname - ,compname - ,db - , min_salary: int = 0 - , max_salary: int | None = None + stuname + ,stuclass + ,compname + ,min_salary + ,max_salary + ,somewhere + ,employment_open_date + ,offer_date + ,db + # ,page # ,page_size ): #根据选择条件获取信息 @@ -75,6 +80,10 @@ def get_emp_dao( #获取学生 if stuname: #根据学生姓名筛选 q = q.filter( Employments.stuname == stuname ) + if stuclass: + q = q.filter(Employments.stuclass == stuclass) + if somewhere: + q = q.filter(Address.somewhere.like(f'%{somewhere}%')) if compname: #根据公司姓名筛选 q=q.filter(Company.compname.like(f'%{compname}%')) # r = q.offset( (page-1)*page_size ).limit( page_size ).all() @@ -82,18 +91,22 @@ def get_emp_dao( #获取学生 q = q.filter(Employments.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) r= q.all() if r: return [ {"id": i.id, - 'stuname':i.stuname, - 'stuclass':i.stuclass, - "company_name": compname, - "address":somewhere, + '学生姓名':i.stuname, + '学生班级':i.stuclass, + "公司": compname, + "公司区域":somewhere, # "company_id": i.company_id, - "salary":i.salary, + "薪资":i.salary, # "address_id": i.address_id, - "employment_open_date":i.employment_open_date, - "offer_date":i.offer_date, + "就业开放时间":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 ] #返回信息列表 From 77de3234128fae4a6bcf58b26699698213701efc Mon Sep 17 00:00:00 2001 From: yb <739325183@qq.com> Date: Mon, 21 Sep 2026 18:39:33 +0800 Subject: [PATCH 11/11] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- stu_jiuye/CURD_api.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/stu_jiuye/CURD_api.py b/stu_jiuye/CURD_api.py index c03410e..eb02158 100644 --- a/stu_jiuye/CURD_api.py +++ b/stu_jiuye/CURD_api.py @@ -89,5 +89,25 @@ def delete_stuinfo( #删除模块 return {'code': 200, 'totals': rows, 'detail': '删除成功'} #成功返回信息 +@CURD.get('/Top5',tags=['就业薪资Top5']) +def salarytop5(db=Depends(get_db)): + q = db.query(Employments,Company.compname) \ + .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] + +@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=['学生平均就业时常']) +def worktime(db=Depends(get_db)): + q = db.query(Employments)\ + .filter(Employments.employment_open_date is not None)\ + .all() + return [{'学生姓名':i.stuname,'平均就业时常':f'{(i.offer_date-i.employment_open_date)/len(q)}'} for i in q] \ No newline at end of file