From 1f4fa614e5bb2ce976df9461f17141efb282e574 Mon Sep 17 00:00:00 2001 From: Orangeeee Date: Mon, 21 Sep 2026 08:41:49 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=89=80=E6=9C=89=E6=A8=A1?= =?UTF-8?q?=E5=9D=97=E6=A1=86=E6=9E=B6=EF=BC=8C=E5=BB=BA=E8=A1=A8=E5=B7=B2?= =?UTF-8?q?=E5=86=99=E5=A5=BD=EF=BC=8C=E5=AD=A6=E7=94=9F=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E6=A8=A1=E5=9D=97=E5=B7=B2=E7=BB=8F=E5=86=99=E5=A5=BD=EF=BC=8C?= =?UTF-8?q?=E6=AD=A3=E5=9C=A8=E5=86=99=E6=96=B0=E5=A2=9E=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- StudentsQuery.sql | 11 +++++ main.py | 29 ++++++++++- requirements.txt | 2 +- students/api/students_api.py | 59 ++++++++++++++++++++++ students/dao/students_dao.py | 76 +++++++++++++++++++++++++++++ students/databases.py | 25 ++++++++++ students/model/students_model.py | 37 ++++++++++++++ students/schema/students_request.py | 39 +++++++++++++++ 8 files changed, 276 insertions(+), 2 deletions(-) create mode 100644 StudentsQuery.sql create mode 100644 students/api/students_api.py create mode 100644 students/dao/students_dao.py create mode 100644 students/model/students_model.py create mode 100644 students/schema/students_request.py diff --git a/StudentsQuery.sql b/StudentsQuery.sql new file mode 100644 index 0000000..641022a --- /dev/null +++ b/StudentsQuery.sql @@ -0,0 +1,11 @@ +show databases; + +create database student_manage_system; + +use student_manage_system; + +show tables; + +drop table students; + + diff --git a/main.py b/main.py index 7a9d32a..1d00a40 100644 --- a/main.py +++ b/main.py @@ -1,6 +1,33 @@ +from fastapi import FastAPI +from students.api.students_api import students_api +from students.databases import * +from students.model import students_model +from contextlib import asynccontextmanager + +@asynccontextmanager +async def lifespan(app: FastAPI): + print("Base from databases:", Base) + print("Tables:", Base.metadata.tables.keys()) + Base.metadata.create_all(engine1) + yield + engine1.dispose() + +app = FastAPI(title="学生管理系统",lifespan=lifespan) # 这里必须把上面写的加上 + +app.include_router(students_api,tags=["students"]) + + def main(): print("Hello from student-manage-system!") if __name__ == "__main__": - main() + import uvicorn + uvicorn.run("main:app", host="0.0.0.0", port=52000) + + """students api + IPv4 地址 . . . . . . . . . . . . : 192.168.6.40 + 默认网关. . . . . . . . . . . . . : 192.168.6.1 + """ + + diff --git a/requirements.txt b/requirements.txt index 9d61773..33608b0 100644 --- a/requirements.txt +++ b/requirements.txt @@ -42,6 +42,6 @@ typing-inspection==0.4.4 typing_extensions==4.16.0 urllib3==2.8.0 uvicorn==0.53.0 -uvloop==0.22.1 +uvloop==0.22.1; sys_platform != 'win32' watchfiles==1.2.0 websockets==17.1 diff --git a/students/api/students_api.py b/students/api/students_api.py new file mode 100644 index 0000000..263bffe --- /dev/null +++ b/students/api/students_api.py @@ -0,0 +1,59 @@ +# students_api所有students的api路由、接口 + +from fastapi import APIRouter , Depends , HTTPException +from students.dao.students_dao import * +from students.model.students_model import * +from students.schema.students_request import * +from students.databases import * + +students_api = APIRouter() + +@students_api.get("/students/" + ,summary='学生资料查询' + ,description='筛选条件全为空即查询所有学生资料,输入薪资会查询大于输入薪资以上的学生' + ,response_model=StudentsQuery + ) +def get_students( stu:StudentsQuery = Depends() + , db=Depends(get_db) + ): + s_dick = stu.model_dump(exclude_unset=True) + result = get_student_dao( s=s_dick , db=db ) + if result: + return result + raise HTTPException(status_code=404, detail="没有找到符合条件的学生") + + +@students_api.post("/students/" + ,summary='新增学生资料' + ,description='学生ID自动分配,学生姓名和班级是必填项' + ,response_model=StudentsResponse ) +def add_student( stu:StudentsResponse = Depends() + , db=Depends(get_db) + ): + s_dick = stu.model_dump() + result = add_student_dao( s=s_dick , db=db ) + if not result: + raise HTTPException(status_code=500, detail='服务器繁忙或用户不存在!') + return result + +@students_api.put("/students/" + ,summary='学生资料更新' + ,description='填写即更新,全为空即不更新,学生ID无法修改' + ,response_model=StudentsUpdate ) +def get_students( stu:StudentsUpdate = Depends() + , db=Depends(get_db) + ): + s_dick = stu.model_dump() + + return '学生资料已更新' + +@students_api.delete("/students/" + ,summary='删除学生资料' + ,description='输入需要删除的学生ID' + ,response_model=StudentsDelete ) # 逻辑删除/软删除 +def delete_students( stu:StudentsDelete = Depends() + , db=Depends(get_db) + ): + s_dick = stu.model_dump() + + return '学生已删除' \ No newline at end of file diff --git a/students/dao/students_dao.py b/students/dao/students_dao.py new file mode 100644 index 0000000..894aca5 --- /dev/null +++ b/students/dao/students_dao.py @@ -0,0 +1,76 @@ +# student_dao:所有数据库的逻辑 + +from students.model.students_model import Students +from students.schema.students_request import * + +# 记得加校验 + +# 查询 +def get_student_dao( s , db): + q = db.query(Students) + if s.get('sid'): + q = q.filter( Students.sid == s.sid ) + if s.get('student_name'): + q = q.filter( Students.student_name == s.student_name ) + if s.get('class_name'): + q = q.filter(Students.class_name == s.class_name) + if s.get('job_open_time'): + q = q.filter(Students.job_open_time == s.job_open_time) + if s.get('offer_issue_time'): + q = q.filter(Students.offer_issue_time == s.offer_issue_time) + if s.get('company_name'): + q = q.filter(Students.company_name == s.company_name) + if s.get('salary'): + q = q.filter(Students.salary >= s.salary) + s1 = q.all() + if s1: + return [{ "学生编号": i.sid + , "学生姓名": i.student_name + , "学生班级": i.class_name + , "就业开放时间": i.job_open_time + , "offer下发时间": i.offer_issue_time + , "就业公司名称": i.company_name + , "就业薪资": i.salary + } for i in s1 + ] + +# 新增 +def add_student_dao( s , db): + try: + phone = s.get("student_phone") + if not phone: + return None + else: + s1 = Students( **s ) + db.add(s1) + except Exception: + # 这里可以加日志 + db.rollback() + return False + else: + db.commit() + db.refresh(s1) # 从数据库再拉一次数据 + return s1 + +# 更新 +def update_student_dao( id , update_data , db): + try: + rows = db.query( Students ).filter( Students.sid == id ).update( update_data ) + except Exception: + db.rollback() + return False + else: + db.commit() + return f"更新了{rows}条学生资料。" + +# 逻辑删除/软删除 +def delete_student_dao(sid, db): + try: + rows = db.query( Students ).filter( Students.sid == sid ).delete() + except Exception: + db.rollback() + rows = 0 + else: + db.commit() + finally: + return f"删除了{rows}条学生资料。" diff --git a/students/databases.py b/students/databases.py index e69de29..071ba3e 100644 --- a/students/databases.py +++ b/students/databases.py @@ -0,0 +1,25 @@ +# databases链接数据库 + +from sqlalchemy import * +from sqlalchemy.orm import sessionmaker,declarative_base + +db_url = "mysql+pymysql://root:420821@localhost:3306/student_manage_system?charset=utf8mb4" + +engine1 = create_engine(db_url) + +Base = declarative_base() + +Session = sessionmaker(bind=engine1 + ,autoflush=False + ,autocommit=False) + +def get_db(): + db = Session() + try: + yield db + finally: + db.close() + + + + diff --git a/students/model/students_model.py b/students/model/students_model.py new file mode 100644 index 0000000..7110361 --- /dev/null +++ b/students/model/students_model.py @@ -0,0 +1,37 @@ +# students_model处理数据库模型 +import datetime + +from students.databases import * +from datetime import datetime + + +class Students(Base): + __tablename__ = 'students' + sid = Column(Integer + , primary_key=True + , autoincrement=True + , comment='学生编号,自增主键' + ) + + student_name = Column(String(20) , comment='学生姓名' , nullable=False ) + + student_phone = Column(String(11) , comment='学生手机号' , nullable=False , unique=True ) + + class_name = Column(String(20) , comment='学生班级' , nullable=False ) + + job_open_time = Column(DATETIME , comment='就业开放时间') + + offer_issue_time = Column(DATETIME , comment='offer下发时间') + + company_name = Column(String(100) , comment='就业公司名称') + + salary = Column(Integer , comment='就业薪资') + + create_date = Column(DATETIME , default=datetime.now , comment='创建时间' ) + + update_date = Column(DATETIME , default=datetime.now , comment='更新时间' ) + + is_deleted = Column(INTEGER , default=False , comment='是否删除:0-正常,1-已删除' ) + + deleted_date = Column(DATETIME , default=datetime.now , comment='删除时间' ) + diff --git a/students/schema/students_request.py b/students/schema/students_request.py new file mode 100644 index 0000000..30dafdc --- /dev/null +++ b/students/schema/students_request.py @@ -0,0 +1,39 @@ +# students_schema:请求、响应的模型框架 + +from pydantic import BaseModel +from datetime import datetime + +# 查询 +class StudentsQuery(BaseModel): + sid:int | None = None + student_name:str | None = None + student_phone: str | None = None + class_name:str | None = None + job_open_time:datetime | None = None + offer_issue_time:datetime | None = None + company_name:str | None = None + salary:int | None = None + +# 新建 +class StudentsResponse(BaseModel): + student_name:str + class_name:str + student_phone:str + job_open_time:datetime | None = None + offer_issue_time:datetime | None = None + company_name:str | None = None + salary:int | None = None + +# 更新 +class StudentsUpdate(BaseModel): + student_name:str | None = None + class_name:str | None = None + student_phone: str | None = None + job_open_time:datetime | None = None + offer_issue_time:datetime | None = None + company_name:str | None = None + salary:int | None = None + +# 删除 +class StudentsDelete(BaseModel): + sid:int