Compare commits

11 Commits
17 changed files with 179 additions and 67 deletions
+18 -6
View File
@@ -10,23 +10,35 @@
2.教师信息的新增\
3.教师信息的更新\
4.教师信息的逻辑删除\
4.1输入id查\
4.2输入任意信息查\
5.学科信息的新增\
**dao数据筛选文件**\
1.查询 get_tea_dao:\
2.新增 add_tea_dao:\
3.更新 update_tea_dao:\
4.逻辑删除 delete_tea_dao:\
4.根据教师id逻辑删除 delete_tea_dao:\
5.任意信息逻辑删除\
6.科目信息的新增\
**tea_model数据库建表文件**\
1.教师表\
2.科目表\
字段名:id、name、sex、class_id、sub(学科)\
home_place specialty(专业)、start_time(入职时间)\
work_experience、collage、creat_date、update_date\
is_delete、delete_time\
is_delete、delete_time、phone\
2.学科表\
字段名:id,name(科目名字)
字段名:id,name(科目名字)\
**schema 请求体、响应体**\
请求体:设置了两个,一个带自增组件用于查询\
一个不带自增组件,新增用;\
响应体:用于返回给前端
教师表\
请求体:\
1.查询、任意逻辑删除调用
2.新增、更改时调用
响应体:用于返回给前端\
科目表:\
1.请求体:新增科目时调用
+6 -8
View File
@@ -22,9 +22,10 @@ def get_students(db=Depends(get_db)):
,summary='人数统计'
,description=f'统计每个班级的人数以及男生女生的人数。'
)
def get_students(db=Depends(get_db)):
s_dict = stu.model_dump(exclude_unset=True) # 没值的不要
result = get_student_dao( s=s_dict , db=db )
def get_students(g:get_student_dao = Depends()
,db=Depends(get_db)
):
result = get_class_count( g=g , db=db )
if result:
return result
raise HTTPException(status_code=404, detail="没有找到符合条件的学生")
@@ -33,11 +34,8 @@ def get_students(db=Depends(get_db)):
,summary='80分以上成绩学生信息查询'
,description=f'查询每次考试成绩都在80分以上的学生的编号,姓名和成绩。'
)
def get_students( stu:StudentsQuery = Depends()
, db=Depends(get_db)
):
s_dict = stu.model_dump(exclude_unset=True) # 没值的不要
result = get_student_dao( s=s_dict , db=db )
def get_students(db=Depends(get_db)):
result = get_student_dao( db=db )
if result:
return result
raise HTTPException(status_code=404, detail="没有找到符合条件的学生")
+36 -6
View File
@@ -1,5 +1,10 @@
from pygments.lexers import sql
from sentry_sdk.integrations import sqlalchemy
from StatCalc.schema.statcalc_request import *
from fastapi import HTTPException
from sqlalchemy import *
from students.model.students_model import Students
@@ -7,12 +12,37 @@ def get_age_30(db):
q = db.query(Students).filter(Students.age>=30).all()
return q
from class_management.model.class_management_model import ClassInfo
def get_class_count(db):
q = (db.query(ClassInfo.id)
.join(Students,Students.class_id==ClassInfo.id)
.filter()
.group_by(ClassInfo.id,Students.sex,)
def get_class_count(g , db):
if g == "班级人数":
q = (db.query(ClassInfo.id,ClassInfo.name,func.count(ClassInfo.id) )
.join(Students,Students.class_id==ClassInfo.id)
.group_by(ClassInfo.id,ClassInfo.name,Students.sex)
.all())
elif g == "男女人数":
q = (db.query(Students.sex,func.count(ClassInfo.id) )
.join(Students,Students.class_id==ClassInfo.id)
.group_by(Students.sex)
.all())
elif g == "班级中男女人数":
q = (db.query(ClassInfo.id,ClassInfo.name,Students.sex,func.count(ClassInfo.id) )
.join(Students,Students.class_id==ClassInfo.id)
.group_by(ClassInfo.id,ClassInfo.name,Students.sex)
.all())
else:
return False
return q
from scores.model.score_model import Score
def get_score_80(db):
q = (db.query(Score)
.filter(Score.score>=80)
.all())
return q
return q
+4 -1
View File
@@ -4,6 +4,9 @@ from pydantic import BaseModel , Field , field_validator
from datetime import datetime
import enum
class get_student_dao(enum.Enum):
get_class = "班级人数"
get_sex = "男女人数"
get_class_sex = "班级中男女人数"
+14 -5
View File
@@ -3,19 +3,20 @@ from Teachers.schema import *
from Teachers.database import *
from Teachers.model.tea_model import *
from Teachers.dao.tea_dao import *
from Teachers.schema.tea_request import TeaRequest,NewTeaRequest
from Teachers.schema.tea_request import TeaRequest,NewTeaRequest,NewTeaRequest1,SubRequest
from Teachers.schema.tea_response import TeaResponse
tea_api = APIRouter()
@tea_api.post('/tea',response_model=TeaResponse,summary='新增老师',description='输入新增的老师信息,除去姓名外可以为空')
def add_tea(tea: NewTeaRequest,db=Depends(get_db)):
r = add_tea_dao(tea.model_dump(),db)
def add_tea(tea: NewTeaRequest=Depends(),db=Depends(get_db)):
r = add_tea_dao(tea.model_dump(exclude_unset=True),db)
if not r:
raise HTTPException(status_code=500,detail='添加失败!')
return TeaResponse(totals=1,data=tea.model_dump())
@tea_api.get('/tea',response_model=TeaResponse,summary='查询老师',description='任意选择输入的信息数量,不输入则查询全部老师')
def get_tea(t:TeaRequest=Depends(),db=Depends(get_db)): #开启会话窗口
def get_tea(t:NewTeaRequest1=Depends(),db=Depends(get_db)): #开启会话窗口
r = get_tea_dao(t.model_dump(),db=db)
if not r:
raise HTTPException(status_code=404,detail='老师不存在')
@@ -37,10 +38,18 @@ def update_tea(id:int,tea:NewTeaRequest,db=Depends(get_db)):
#根据任意信息删除
@tea_api.delete('/tea',summary='根据任意信息逻辑删除',description='输入任意信息删除')
def delete_other_tea_dao1(t:TeaRequest,db=Depends(get_db)):
def delete_other_tea_dao1(t:TeaRequest=Depends(),db=Depends(get_db)):
row1 = delete_other_tea_dao(t.model_dump(exclude_unset=True),db)
if not row1:
raise HTTPException(status_code=404,detail='没有找到符合条件的老师')
return{'code':200,'data':row1}
#新增科目
@tea_api.post('/subject',summary='新增科目',description='输入新增的科目')
def add_sub(t:SubRequest=Depends(),db=Depends(get_db)): #开启会话窗口
r = add_subject_dao(t.model_dump(),db=db)
if r=='已存在':
raise HTTPException(status_code=500,detail='科目已存在')
return TeaResponse(totals=len(r), data=r)
+44 -6
View File
@@ -1,17 +1,32 @@
from Teachers.model.tea_model import Tea
from sys import excepthook
from Teachers.model.tea_model import Tea,Sub
from datetime import datetime
#增加
def add_tea_dao(t,db):
try:
not_delete = db.query(Tea).filter(Tea.phone ==t.get('phone'),Tea.is_delete == False).first()
if not_delete:
print('该老师已存在')
raise Exception('老师已存在')
existing = db.query(Tea).filter(Tea.phone == t.get('phone'),Tea.is_delete == True).first()
if existing:
for key,value in t.items():
if hasattr(existing,key) and value is not None and value != '':
setattr(existing,key,value)
existing.is_delete = False
db.commit()
return '恢复修改成功'
t1 = Tea(**t)
db.add(t1)
except:
db.rollback()
return False
else:
db.commit()
return True
except Exception as e:
db.rollback()
print('新增失败原因',e)
return '新增失败'
#更新
def update_tea_dao(id,t, db):
@@ -49,9 +64,12 @@ def get_tea_dao(t,db):
query = query.filter(Tea.education == t.get('education') )
if t.get('collage'):
query = query.filter(Tea.collage == t.get('collage') )
if t.get('phone'):
query = query.filter(Tea.phone == t.get('phone') )
r = query.all()
return [{'id':i.id,'name':i.name,'class_id':i.class_id,'sub':i.sub,'sex':i.sex,'home_place':i.home_place
,'specialty':i.specialty,'start_time':i.start_time,'work_experience':i.work_experience,'collage':i.collage} for i in r]
,'specialty':i.specialty,'start_time':i.start_time,'work_experience':i.work_experience
,'collage':i.collage,'phone':i.phone} for i in r]
#删除
def delete_tea_dao(id,db):
@@ -94,6 +112,8 @@ def delete_other_tea_dao(t,db):
query1 = query1.filter(Tea.start_time == t.get('start_time'))
if t.get('specialty'):
query1 = query1.filter(Tea.specialty == t.get('specialty'))
if t.get('phone'):
query1 = query1.filter(Tea.phone == t.get('phone'))
row = query1.update({'is_delete':True,'delete_time':datetime.now()})
db.commit()
return row
@@ -104,3 +124,21 @@ def delete_other_tea_dao(t,db):
def add_subject_dao(t,db):
try:
t1 = db.query(Sub).filter(Sub.name == t.get('name')).first()
if t1:
return'已存在'
s1 = Sub(**t)
db.add(s1)
db.commit()
return '[s1]'
except InterruptedError as e:
db.rollback()
print('失败的原因',e)
return False
except Exception as e:
db.rollback()
return f'{e}'
+1
View File
@@ -24,4 +24,5 @@ def get_db():
yield db
finally:
db.close()
#建表
Base.metadata.create_all(engine1)
+1 -1
View File
@@ -15,7 +15,7 @@ Base.metadata.create_all(engine1)
if __name__ == "__main__":
import uvicorn
uvicorn.run('main:app', host='0.0.0.0', port=55000)
uvicorn.run('main:app', host='0.0.0.0', port=57000)
"""
IPv4 地址 . . . . . . . . . . . . : 192.168.1.51
子网掩码 . . . . . . . . . . . . : 255.255.255.0
+3 -4
View File
@@ -16,15 +16,14 @@ class Tea(Base_all):
,autoincrement=True
,comment='id')
name = Column(String(50)
,nullable=False
,comment='姓名')
sex = Column(Enum(Gender),default='未知'
,comment='性别')
class_id = Column(Integer
,nullable=False
,comment='班级id')
sub = Column(String(50)
,nullable=False
phone = Column(String(50))
subject_id = Column(Integer
, ForeignKey('subject.id')
,comment='教学科目')
home_place = Column(String(50)
,comment='家乡')
+24 -7
View File
@@ -1,31 +1,48 @@
from pydantic import BaseModel
from pydantic import BaseModel,Field
from Teachers.model.tea_model import *
#查询使用请求体
#查询使用请求体,都可以为空
class TeaRequest(BaseModel):
id: int|None = None
name: str|None = None
sex: Gender|None = None
class_id: int | None = None
sub: str|None = None
subject_id: str|None = None
phone: str | None
home_place: str|None = None
collage: str|None = None
education: str|None = None
work_experience: str|None = None
start_time: str|None = None
start_time: datetime|None = None
specialty: str|None = None
#更新、任意逻辑删除、新增使用请求体,没有自增键
#更新、任意逻辑删除、新增使用请求体,没有自增键,电话号码不能为空
class NewTeaRequest(BaseModel):
name: str | None = None
sex: Gender
sex: Gender|None = None
class_id: int | None = None
sub: str | None = None
subject_id: int | None = None
home_place: str | None = None
phone: str | None = Field(default=None, min_length=11, max_length=11)
collage: str | None = None
education: str | None = None
work_experience: str | None = None
start_time: datetime | None = None
specialty: str | None = None
class NewTeaRequest1(BaseModel):
name: str | None = None
sex: Gender|None = None
class_id: int | None = None
subject_id: int | None = None
home_place: str | None = None
phone: str | None = Field(default=None, min_length=11, max_length=11)
collage: str | None = None
education: str | None = None
work_experience: str | None = None
start_time: datetime | None = None
specialty: str | None = None
class SubRequest(BaseModel):
name: str
+3 -1
View File
@@ -12,8 +12,10 @@ app = FastAPI()
app.include_router(class_api)
Base.metadata.create_all(engine)
if __name__ =='__main__':
Base.metadata.create_all(engine)
import uvicorn
uvicorn.run('main:app',host='127.0.0.1',port=12345)
+1 -1
View File
@@ -4,7 +4,7 @@ from scores.dao.score_dao import get_scores_dao,add_scores_dao,update_scores_dao
from scores.model.score_model import Score
from scores.schema.score_request import ScoreRequest, ScoreResponse,ScoreQuery
score_api = APIRouter(tags=['成绩'])
score_api = APIRouter()
@score_api.get('/Score',summary='成绩查询',description=f'查询条件为空即查询所有成绩')
def get_scores(score:ScoreQuery=Depends(),db=Depends(get_db)):
+1 -1
View File
@@ -7,7 +7,7 @@ Scores_API = APIRouter()
Scores_API.include_router(score_api)
# 自测接口
app = FastAPI(title='成绩管理系统')
app = FastAPI(tags=['成绩'],title='成绩管理系统')
app.include_router(score_api)
Base.metadata.create_all(engine)
+7 -7
View File
@@ -1,4 +1,4 @@
import datetime
from datetime import date
from fastapi import APIRouter,Depends,HTTPException,Query
from stu_jiuye.dao import *
@@ -10,20 +10,20 @@ CURD=APIRouter()
@CURD.get('/emp',summary='查询就业信息')
def get_stuinfo( #查询学生就业信息
sname:str| None = Query(None,description='学生姓名')
,class_num:int| None = Query(None,description='班级编号')
,class_id:int| None = Query(None,description='班级编号')
,employment_company:str|None=Query(None,description='公司名称')
,min_salary:int|None=Query(None,description='最小薪资范围')
,max_salary:int|None=Query(None,description='最大薪资范围')
,somewhere:str|None=Query(None,description='公司地区')
,employment_open_start: datetime.date | None = Query(None,description='就业开放起始时间')
,employment_open_end: datetime.date | None = Query(None,description='就业开放结束时间')
,offer_recived_start: datetime.date | None = Query(None,description='offer下发起始时间')
,offer_recived_end: datetime.date | None = Query(None,description='offer下发结束时间')
,employment_open_start: date | None = Query(None,description='就业开放起始时间')
,employment_open_end: date | None = Query(None,description='就业开放结束时间')
,offer_recived_start: date | None = Query(None,description='offer下发起始时间')
,offer_recived_end: date | None = Query(None,description='offer下发结束时间')
,db=Depends(get_db)
): #查询条件
r=get_emp_dao( #调用函数
sname,
class_num,
class_id,
employment_company,
min_salary,
max_salary,
+11 -9
View File
@@ -1,7 +1,7 @@
from stu_jiuye.model import Employments,Address,Company
from students.model.students_model import *
from class_management.model.class_management_model import *
def add_employment_dao(o,db): #新增就业信息函数
try:
# r = db.query(Employments).filter(Employments.id == o['id'] ).all() #
@@ -68,7 +68,7 @@ def update_emp_dao(id,update_data,db): #更新数据函数
def get_emp_dao( #获取学生就业信息函数
# stuid,
sname
,class_num
,class_id
,employment_company
,min_salary
,max_salary
@@ -82,7 +82,9 @@ def get_emp_dao( #获取学生
# ,page
# ,page_size
): #根据选择条件获取信息
q = db.query(Employments,Company.employment_company,Address.somewhere)\
q = db.query(Employments,Company.employment_company,Address.somewhere) \
.outerjoin(Company, Students.id == Employments.stuid) \
.outerjoin(Company, ClassInfo.id == Employments.class_id)\
.outerjoin(Company,Employments.company_id==Company.id)\
.outerjoin(Address,Company.address_id==Address.id)\
.filter(Employments.is_deleted == 0) #连接公司表和地址表,筛选未被删除信息
@@ -90,9 +92,9 @@ def get_emp_dao( #获取学生
# q = q.filter( Employments.id == stuid )
if sname: #根据学生姓名筛选
q = q.filter( Employments.sname == sname )
if class_num:
q = q.filter(Employments.class_num == class_num)
q = q.filter( Students.name == sname )
if class_id:
q = q.filter(ClassInfo.id == class_id)
if somewhere:
q = q.filter(Address.somewhere.like(f'%{somewhere}%'))
if employment_company: #根据公司姓名筛选
@@ -115,7 +117,7 @@ def get_emp_dao( #获取学生
if r:
return [ {"id": i.id,
'学生姓名':i.sname,
'学生班级编号':i.class_num,
'学生班级编号':i.class_id,
"公司": employment_company or '未就业',
"公司区域":somewhere or '-',
# "company_id": i.company_id,
@@ -126,7 +128,7 @@ def get_emp_dao( #获取学生
# , "创建时间": i.create_time,
# "更新时间": i.update_time,
# "是否删除":i.is_deleted
} for i,employment_company,somewhere in r ] #返回信息列表
} for i,sname,class_id,employment_company,somewhere in r ] #返回信息列表
def delete_emp_dao(id,db): #删除函数
+4 -3
View File
@@ -1,5 +1,6 @@
from databases import engine_all,Base_all,Session
from sqlalchemy import ForeignKey
from stu_jiuye.database import DATETIME,Base,Column,Integer,String,DATE
from datetime import datetime
@@ -12,10 +13,10 @@ class Employments(Base_all): #学生
, comment='自增主键'
)
num = Column(Integer
, ForeignKey('students.num')
stuid = Column(Integer
, ForeignKey('students.id')
) #学生姓名,冗余字段
class_num = Column(Integer
class_id = Column(Integer
, ForeignKey('classes.id')
) #学生班级,冗余字段
company_id = Column(Integer #公司id,外键匹配公司表
+1 -1
View File
@@ -5,7 +5,7 @@ from pydantic import BaseModel
class PostRequest(BaseModel): #学生就业信息请求体模型
# compname: str|None=None
sname: str|None=None
class_num: int|None=None
class_id: int|None=None
company_id:int|None=None
# address_id: int|None=None
employment_salary: int|None=None