更新所有模块框架,建表已写好,学生查询模块已经写好,正在写新增模块。
This commit is contained in:
@@ -0,0 +1,11 @@
|
|||||||
|
show databases;
|
||||||
|
|
||||||
|
create database student_manage_system;
|
||||||
|
|
||||||
|
use student_manage_system;
|
||||||
|
|
||||||
|
show tables;
|
||||||
|
|
||||||
|
drop table students;
|
||||||
|
|
||||||
|
|
||||||
@@ -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():
|
def main():
|
||||||
print("Hello from student-manage-system!")
|
print("Hello from student-manage-system!")
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
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
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -42,6 +42,6 @@ typing-inspection==0.4.4
|
|||||||
typing_extensions==4.16.0
|
typing_extensions==4.16.0
|
||||||
urllib3==2.8.0
|
urllib3==2.8.0
|
||||||
uvicorn==0.53.0
|
uvicorn==0.53.0
|
||||||
uvloop==0.22.1
|
uvloop==0.22.1; sys_platform != 'win32'
|
||||||
watchfiles==1.2.0
|
watchfiles==1.2.0
|
||||||
websockets==17.1
|
websockets==17.1
|
||||||
|
|||||||
@@ -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 '学生已删除'
|
||||||
@@ -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}条学生资料。"
|
||||||
@@ -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()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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='删除时间' )
|
||||||
|
|
||||||
@@ -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
|
||||||
Reference in New Issue
Block a user