diff --git a/students/api/students_api.py b/students/api/students_api.py index d57a617..2f5268b 100644 --- a/students/api/students_api.py +++ b/students/api/students_api.py @@ -10,7 +10,8 @@ students_api = APIRouter() @students_api.get("/students" ,summary='学生资料查询' - ,description='筛选条件全为空即查询所有学生资料,输入薪资会查询大于输入薪资以上的学生' + ,description=f'筛选条件全为空即查询所有学生资料,输入薪资会查询大于输入薪资以上的学生。\n ' + f'时间格式:YYYY-MM-DD' ,response_model=list[StudentsQuery] ) def get_students( stu:StudentsQuery = Depends() @@ -25,7 +26,8 @@ def get_students( stu:StudentsQuery = Depends() @students_api.post("/students" ,summary='新增学生资料' - ,description='学生ID自动分配,学生姓名、学生手机号和班级是必填项,不能为空。' + ,description=f'学生ID自动分配,学生姓名、学生手机号和班级是必填项,不能为空。\n ' + f'时间格式:YYYY-MM-DD' ,response_model=StudentsResponse ) def add_student( stu:StudentsResponse = Depends() , db=Depends(get_db) @@ -38,7 +40,8 @@ def add_student( stu:StudentsResponse = Depends() @students_api.put("/students" ,summary='学生资料更新' - ,description='请输入需要更新信息的学生ID,学生手机号不可重复,填写即更新,为空即不更新。' + ,description=f'请输入需要更新信息的学生ID,学生手机号不可重复,填写即更新,为空即不更新。\n ' + f'时间格式:YYYY-MM-DD' ,response_model=StudentsUpdate ) def get_students( stu:StudentsUpdate = Depends() , db=Depends(get_db) @@ -51,11 +54,12 @@ def get_students( stu:StudentsUpdate = Depends() @students_api.delete("/students" ,summary='删除学生资料' - ,description='输入需要删除的学生信息,删除条件任选,但不可全为空,工资筛选能删除大于等于输入工资的所有人。' + ,description=f'输入需要删除的学生信息,删除条件任选,但不可全为空,工资筛选能删除大于等于输入工资的所有人。\n ' + f'时间格式:YYYY-MM-DD' ,response_model=list[StudentsDelete] ) # 逻辑删除/软删除 def delete_students( stu:StudentsDelete = Depends() , db=Depends(get_db) - ): + ): s_dict = stu.model_dump(exclude_unset=True) result = delete_student_dao(s=s_dict, db=db) return result diff --git a/students/dao/students_dao.py b/students/dao/students_dao.py index 474da49..4d1ac7e 100644 --- a/students/dao/students_dao.py +++ b/students/dao/students_dao.py @@ -31,8 +31,8 @@ def get_student_dao( s , db): q = q.filter( Students.education == s.get("education") ) if s.get('class_id'): q = q.filter(Students.class_id == s.get("class_id") ) - if s.get('adnisor_id'): - q = q.filter(Students.adnisor_id == s.get("adnisor_id") ) + if s.get('advisor_id'): + q = q.filter(Students.advisor_id == s.get("advisor_id") ) if s.get('phone'): q = q.filter(Students.phone == s.get("phone")) s1 = q.all() @@ -50,7 +50,7 @@ def get_student_dao( s , db): , 'education':i.education # 外键字段 , 'class_id':i.class_id - , 'adnisor_id':i.adnisor_id + , 'advisor_id':i.advisor_id # 额外字段 , 'phone':i.phone } for i in s1 @@ -77,7 +77,7 @@ def add_student_dao( s , db): s1_deleted.education = s.get("education") # 外键字段 s1_deleted.class_id = s.get("class_id") - s1_deleted.adnisor_id = s.get("adnisor_id") + s1_deleted.advisor_id = s.get("advisor_id") # 额外字段 s1_deleted.phone = s.get("phone") @@ -102,78 +102,112 @@ def add_student_dao( s , db): # 更新 def update_student_dao( s , db): try: - phone = s.get("student_phone") + phone = s.get("phone") if phone is not None and phone != '': s1_con = db.query( Students ).filter( Students.phone == phone ,Students.id != s.get("id") ,Students.is_deleted == False ).first() if s1_con: - return False + raise HTTPException(status_code=409, detail=f'手机号已被其他学生使用:{phone}') s1_id = db.query( Students ).filter( Students.id == s.get("id") ,Students.is_deleted == False ).first() if not s1_id: - return False + raise HTTPException(status_code=404, detail=f'学生不存在:id={s.get("id")}') + if s.get("num") is not None: + s1_id.name = s.get("num") if s.get("name") is not None: s1_id.name = s.get("name") + if s.get("age") is not None: + s1_id.age = s.get("age") + if s.get("sex") is not None: + s1_id.sex = s.get("sex") + if s.get("home_Place") is not None: + s1_id.home_Place = s.get("home_Place") + if s.get("college") is not None: + s1_id.college = s.get("college") + if s.get("specialty") is not None: + s1_id.specialty = s.get("specialty") + if s.get("enrollment_time") is not None: + s1_id.enrollment_time = s.get("enrollment_time") + if s.get("graduate_time") is not None: + s1_id.graduate_time = s.get("graduate_time") + if s.get("education") is not None: + s1_id.education = s.get("education") + # 外键字段 + if s.get("class_id") is not None: + s1_id.class_id = s.get("class_id") + if s.get("advisor_id") is not None: + s1_id.advisor_id = s.get("advisor_id") + # 额外字段 if s.get("phone") is not None: s1_id.student_phone = s.get("phone") - if s.get("class_name") is not None: - s1_id.class_name = s.get("class_name") - if s.get("job_open_time") is not None: - s1_id.job_open_time = s.get("job_open_time") - if s.get("offer_issue_time") is not None: - s1_id.offer_issue_time = s.get("offer_issue_time") - if s.get("company_name") is not None: - s1_id.company_name = s.get("company_name") - if s.get("salary") is not None: - s1_id.salary = s.get("salary") + except HTTPException: + raise except Exception: db.rollback() - return False + raise else: - s1_sid.update_date = datetime.now() + s1_id.update_date = datetime.now() db.commit() - db.refresh(s1_sid) # 从数据库再拉一次数据 - return s1_sid + db.refresh(s1_id) # 从数据库再拉一次数据 + return s1_id # 逻辑删除/软删除 def delete_student_dao( s , db): try: - if not any([s.get('sid') - ,s.get("student_name") - ,s.get("student_phone") - ,s.get("class_name") - ,s.get("job_open_time") - ,s.get("offer_issue_time") - ,s.get("company_name") - ,s.get("salary") + if not any([ s.get("id") + ,s.get("num") + ,s.get("name") + ,s.get("age") + ,s.get("sex") + ,s.get("home_Place") + ,s.get("college") + ,s.get("specialty") + ,s.get("enrollment_time") + ,s.get("graduate_time") + ,s.get("education") + ,s.get("class_id") + ,s.get("advisor_id") + ,s.get("phone") ]): raise HTTPException(status_code=400, detail="输入需要删除的学生信息,删除条件任选,但不可全为空。") q = db.query(Students).filter(Students.is_deleted == False) - if s.get('sid'): - q = q.filter(Students.sid == s.get("sid") ) - if s.get('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.get("class_name") ) - if s.get('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.get("offer_issue_time") ) - if s.get('company_name'): - q = q.filter(Students.company_name == s.get("company_name") ) - if s.get('salary'): - q = q.filter(Students.salary >= s.get("salary") ) + if s.get('id'): + q = q.filter(Students.id == s.get("id") ) + if s.get('num'): + q = q.filter(Students.num == s.get("num")) + if s.get('name'): + q = q.filter(Students.name == s.get("name") ) + if s.get('age'): + q = q.filter(Students.age == s.get("age") ) + if s.get('sex'): + q = q.filter(Students.sex == s.get("sex")) + if s.get('home_Place'): + q = q.filter(Students.home_Place == s.get("home_Place") ) + if s.get('college'): + q = q.filter(Students.college == s.get("college") ) + if s.get('specialty'): + q = q.filter(Students.specialty == s.get("specialty")) + if s.get('enrollment_time'): + q = q.filter(Students.enrollment_time == s.get("enrollment_time") ) + if s.get('graduate_time'): + q = q.filter(Students.graduate_time == s.get("graduate_time")) + if s.get('education'): + q = q.filter(Students.education == s.get("education") ) + if s.get('class_id'): + q = q.filter(Students.class_id == s.get("class_id") ) + if s.get('advisor_id'): + q = q.filter(Students.advisor_id == s.get("v") ) + if s.get("phone"): + q = q.filter(Students.phone == s.get("phone") ) s1_delete = q.all() if not s1_delete: raise HTTPException(status_code=404, detail="没有找到该学生。") for i in s1_delete: i.is_deleted = True i.deleted_date = datetime.now() - s2_deleted =[{"sid":i.sid,"student_name":i.student_name,"student_phone":i.student_phone}for i in s1_delete] + # s2_deleted =[{"id":i.id,"name":i.name,"phone":i.phone}for i in s1_delete] except HTTPException: raise except Exception: @@ -181,4 +215,4 @@ def delete_student_dao( s , db): raise HTTPException(status_code=500, detail="Internal server error") else: db.commit() - return s2_deleted + return s1_delete diff --git a/students/model/students_model.py b/students/model/students_model.py index 47b76b5..bf25289 100644 --- a/students/model/students_model.py +++ b/students/model/students_model.py @@ -4,7 +4,8 @@ import datetime from students.databases import * from datetime import datetime from sqlalchemy.dialects.mysql import DATETIME -from students.schema.students_request import SexEnum +from students.schema.students_request import SexEnum , EducationEnum +from sqlalchemy import Enum class Students(Base): __tablename__ = 'students' @@ -27,7 +28,7 @@ class Students(Base): , comment='年龄' , nullable=False) - sex = Column(Enum(SexEnum) + sex = Column(Enum(SexEnum, values_callable=lambda e: [i.value for i in e]) , comment='性别' , nullable=False) @@ -46,15 +47,16 @@ class Students(Base): graduate_time = Column(DATETIME , comment='毕业时间') - education = Column(String(50) - , comment='学历') + education = Column(Enum(EducationEnum, values_callable=lambda e: [i.value for i in e]) + , comment='学历' + , nullable=True) # 外键字段 class_id = Column(Integer , comment='学生班级' , nullable=False ) - adnisor_id = Column(Integer + advisor_id = Column(Integer , comment='顾问ID') # 额外字段 diff --git a/students/schema/students_request.py b/students/schema/students_request.py index 6f65fd7..baf6066 100644 --- a/students/schema/students_request.py +++ b/students/schema/students_request.py @@ -8,7 +8,6 @@ class SexEnum(enum.Enum): m = '男' f = '女' - # 查询 class StudentsQuery(BaseModel): id:int | None = None @@ -24,15 +23,15 @@ class StudentsQuery(BaseModel): education:str | None = None # 外键字段 class_id:int | None = None - adnisor_id:int | None = None + advisor_id:int | None = None # 额外字段 phone:str | None = None class EducationEnum(enum.Enum): - zhuanke = '专科' - benke = '本科' - shuoshi = '硕士' - boshi = '博士' + z = '专科' + ben = '本科' + s = '硕士' + bo = '博士' # 新建 class StudentsResponse(BaseModel): @@ -48,16 +47,16 @@ class StudentsResponse(BaseModel): education:EducationEnum # 外键字段 class_id:int = Field(..., gt=0, description='班级ID') - adnisor_id:int | None = None + advisor_id:int | None = None # 额外字段 phone:str = Field(...,min_length=11,max_length=11,description='学生手机号') # 更新 class StudentsUpdate(BaseModel): id:int = Field(..., gt=0 , description='学生ID' ) - num:str = Field(..., min_length=1, max_length=50, description='学生编号' ) - name:str = Field(..., min_length=1, max_length=50, description='学生姓名' ) - age:int = Field(..., gt=0, lt=200, description='学生年龄') + num:str | None = None + name:str | None = None + age:int | None = None sex:SexEnum | None = None home_Place:str | None = None college:str | None = None @@ -66,18 +65,26 @@ class StudentsUpdate(BaseModel): graduate_time:datetime | None = None education:str | None = None # 外键字段 - class_id:int = Field(..., gt=0, description='班级ID') - adnisor_id:int | None = None + class_id:int | None = None + advisor_id:int | None = None # 额外字段 - phone:str = Field(...,min_length=11,max_length=11,description='学生手机号') + phone:str | None = None # 删除 class StudentsDelete(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 + id:int | None = None + num:str | None = None + name:str | None = None + age:int | None = None + sex:SexEnum | None = None + home_Place:str | None = None + college:str | None = None + specialty:str | None = None + enrollment_time:datetime | None = None + graduate_time:datetime | None = None + education:str | None = None + # 外键字段 + class_id:int | None = None + advisor_id:int | None = None + # 额外字段 + phone:str | None = None