diff --git a/StudentsQuery.sql b/StudentsQuery.sql index 641022a..16b6e74 100644 --- a/StudentsQuery.sql +++ b/StudentsQuery.sql @@ -8,4 +8,5 @@ show tables; drop table students; +select * from students limit 50; diff --git a/students/api/students_api.py b/students/api/students_api.py index 263bffe..ffc29ed 100644 --- a/students/api/students_api.py +++ b/students/api/students_api.py @@ -8,52 +8,56 @@ from students.databases import * students_api = APIRouter() -@students_api.get("/students/" +@students_api.get("/students" ,summary='学生资料查询' ,description='筛选条件全为空即查询所有学生资料,输入薪资会查询大于输入薪资以上的学生' - ,response_model=StudentsQuery + ,response_model=list[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 ) + s_dict = stu.model_dump(exclude_unset=True) # 没值的不要 + result = get_student_dao( s=s_dict , db=db ) if result: return result raise HTTPException(status_code=404, detail="没有找到符合条件的学生") -@students_api.post("/students/" +@students_api.post("/students" ,summary='新增学生资料' - ,description='学生ID自动分配,学生姓名和班级是必填项' + ,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 ) + s_dict = stu.model_dump(exclude_unset=True) + result = add_student_dao( s=s_dict , db=db ) if not result: - raise HTTPException(status_code=500, detail='服务器繁忙或用户不存在!') + raise HTTPException(status_code=500, detail='手机号已有学生使用或必填项为空。') return result -@students_api.put("/students/" +@students_api.put("/students" ,summary='学生资料更新' - ,description='填写即更新,全为空即不更新,学生ID无法修改' + ,description='请输入需要更新信息的学生ID,学生手机号不可重复,填写即更新,为空即不更新。' ,response_model=StudentsUpdate ) def get_students( stu:StudentsUpdate = Depends() , db=Depends(get_db) ): - s_dick = stu.model_dump() + s_dict = stu.model_dump(exclude_unset=True) + result = update_student_dao( s=s_dict , db=db ) + if not result: + raise HTTPException(status_code=500, detail='手机号已有学生使用。') + return result - return '学生资料已更新' - -@students_api.delete("/students/" +@students_api.delete("/students" ,summary='删除学生资料' - ,description='输入需要删除的学生ID' - ,response_model=StudentsDelete ) # 逻辑删除/软删除 + ,description='输入需要删除的学生信息,工资筛选能删除大于等于输入工资的所有人。' + ,response_model=list[StudentsDelete] ) # 逻辑删除/软删除 def delete_students( stu:StudentsDelete = Depends() , db=Depends(get_db) ): - s_dick = stu.model_dump() - - return '学生已删除' \ No newline at end of file + s_dict = stu.model_dump(exclude_unset=True) + result = add_student_dao(s=s_dict, db=db) + if not result: + raise HTTPException(status_code=500, detail='手机号已有学生使用。') + return result \ No newline at end of file diff --git a/students/dao/students_dao.py b/students/dao/students_dao.py index 894aca5..97d9e38 100644 --- a/students/dao/students_dao.py +++ b/students/dao/students_dao.py @@ -2,35 +2,37 @@ from students.model.students_model import Students from students.schema.students_request import * - -# 记得加校验 +from fastapi import HTTPException # 查询 def get_student_dao( s , db): - q = db.query(Students) + q = db.query(Students).filter(Students.is_deleted == False) if s.get('sid'): - q = q.filter( Students.sid == s.sid ) + q = q.filter( Students.sid == s.get("sid") ) if s.get('student_name'): - q = q.filter( Students.student_name == s.student_name ) + q = q.filter( Students.student_name == s.get("student_name") ) + if s.get('student_phone'): + q = q.filter(Students.student_phone == s.get("student_phone")) if s.get('class_name'): - q = q.filter(Students.class_name == s.class_name) + q = q.filter(Students.class_name == s.get("class_name") ) if s.get('job_open_time'): - q = q.filter(Students.job_open_time == s.job_open_time) + q = q.filter(Students.job_open_time == s.get("job_open_time") ) if s.get('offer_issue_time'): - q = q.filter(Students.offer_issue_time == s.offer_issue_time) + q = q.filter(Students.offer_issue_time == s.get("offer_issue_time") ) if s.get('company_name'): - q = q.filter(Students.company_name == s.company_name) + q = q.filter(Students.company_name == s.get("company_name") ) if s.get('salary'): - q = q.filter(Students.salary >= s.salary) + q = q.filter(Students.salary >= s.get("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 + return [{ "sid": i.sid + , "student_name": i.student_name + , "student_phone":i.student_phone + , "class_name": i.class_name + , "job_open_time": i.job_open_time + , "offer_issue_time": i.offer_issue_time + , "company_name": i.company_name + , "salary": i.salary } for i in s1 ] @@ -38,39 +40,105 @@ def get_student_dao( s , db): def add_student_dao( s , db): try: phone = s.get("student_phone") + s1_deleted = db.query( Students ).filter( Students.student_phone == phone ).first() + if s1_deleted and s1_deleted.is_deleted == False: + return False if not phone: - return None - else: - s1 = Students( **s ) - db.add(s1) + return False + if s1_deleted and s1_deleted.is_deleted == True: + s1_deleted.student_name = s.get("student_name") + s1_deleted.student_phone = s.get("student_phone") + s1_deleted.class_name = s.get("class_name") + s1_deleted.job_open_time = s.get("job_open_time") + s1_deleted.offer_issue_time = s.get("offer_issue_time") + s1_deleted.company_name = s.get("company_name") + s1_deleted.salary = s.get("salary") + s1_deleted.create_date = datetime.now() + s1_deleted.update_date = datetime.now() + s1_deleted.is_deleted = False + s1_deleted.deleted_date = None + db.commit() + db.refresh(s1_deleted) # 从数据库再拉一次数据 + return s1_deleted + s1 = Students( **s ) + db.add(s1) except Exception: # 这里可以加日志 db.rollback() return False else: db.commit() - db.refresh(s1) # 从数据库再拉一次数据 + db.refresh(s1) return s1 # 更新 -def update_student_dao( id , update_data , db): +def update_student_dao( s , db): try: - rows = db.query( Students ).filter( Students.sid == id ).update( update_data ) + phone = s.get("student_phone") + if phone is not None and phone != '': + s1_con = db.query( Students ).filter( Students.student_phone == phone + ,Students.sid != s.get("sid") + ,Students.is_deleted == False ).first() + if s1_con: + return False + s1_sid = db.query( Students ).filter( Students.sid == s.get("sid") + ,Students.is_deleted == False ).first() + if not s1_sid: + return False + if s.get("student_name") is not None: + s1_sid.student_name = s.get("student_name") + if s.get("student_phone") is not None: + s1_sid.student_phone = s.get("student_phone") + if s.get("class_name") is not None: + s1_sid.class_name = s.get("class_name") + if s.get("job_open_time") is not None: + s1_sid.job_open_time = s.get("job_open_time") + if s.get("offer_issue_time") is not None: + s1_sid.offer_issue_time = s.get("offer_issue_time") + if s.get("company_name") is not None: + s1_sid.company_name = s.get("company_name") + if s.get("salary") is not None: + s1_sid.salary = s.get("salary") + except Exception: + db.rollback() + return False + else: + s1_sid.update_date = datetime.now() + db.commit() + db.refresh(s1_sid) # 从数据库再拉一次数据 + return s1_sid + + +# 逻辑删除/软删除 +def delete_student_dao( s , db): + try: + q = db.query(Students).filter(Students.is_deleted == False) + 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("student_phone"): + q = q.filter(Students.student_phone == s.student_phone) + 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_delete = q.all() + if not s1_delete: + raise HTTPException(status_code=404, detail="Student not found") + for i in s1_delete: + i.is_deleted = True + i.deleted_date = datetime.now() + s2_deleted =[{"删除的学生ID":i.sid,"删除的学生姓名":i.student_name,"删除的学生电话":i.student_phone}for i in s1_delete] 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}条学生资料。" + return s2_deleted diff --git a/students/schema/students_request.py b/students/schema/students_request.py index 30dafdc..8159141 100644 --- a/students/schema/students_request.py +++ b/students/schema/students_request.py @@ -1,6 +1,6 @@ # students_schema:请求、响应的模型框架 -from pydantic import BaseModel +from pydantic import BaseModel , Field , field_validator from datetime import datetime # 查询 @@ -16,9 +16,9 @@ class StudentsQuery(BaseModel): # 新建 class StudentsResponse(BaseModel): - student_name:str - class_name:str - student_phone:str + student_name:str = Field(...,min_length=1) + student_phone:str = Field(...,min_length=11,max_length=11) + class_name:str = Field(...,min_length=1) job_open_time:datetime | None = None offer_issue_time:datetime | None = None company_name:str | None = None @@ -26,9 +26,10 @@ class StudentsResponse(BaseModel): # 更新 class StudentsUpdate(BaseModel): + sid:int = Field(...,gt=0) student_name:str | None = None - class_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 @@ -36,4 +37,11 @@ class StudentsUpdate(BaseModel): # 删除 class StudentsDelete(BaseModel): - sid:int + 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