Compare commits
4
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
334bb237b2 | ||
|
|
737d48babc | ||
|
|
17c739760f | ||
|
|
748b9f751c |
@@ -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.请求体:新增科目时调用
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
+11
-2
@@ -3,14 +3,15 @@ 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,NewTeaRequest1
|
||||
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=Depends(),db=Depends(get_db)):
|
||||
r = add_tea_dao(tea.model_dump(),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())
|
||||
@@ -43,4 +44,12 @@ def delete_other_tea_dao1(t:TeaRequest=Depends(),db=Depends(get_db)):
|
||||
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)
|
||||
|
||||
|
||||
|
||||
+21
-1
@@ -1,4 +1,6 @@
|
||||
from Teachers.model.tea_model import Tea
|
||||
from sys import excepthook
|
||||
|
||||
from Teachers.model.tea_model import Tea,Sub
|
||||
from datetime import datetime
|
||||
|
||||
#增加
|
||||
@@ -122,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}'
|
||||
|
||||
|
||||
|
||||
@@ -24,4 +24,5 @@ def get_db():
|
||||
yield db
|
||||
finally:
|
||||
db.close()
|
||||
#建表
|
||||
Base.metadata.create_all(engine1)
|
||||
+1
-1
@@ -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
|
||||
|
||||
@@ -16,17 +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')
|
||||
phone = Column(String(50))
|
||||
subject_id = Column(Integer
|
||||
, ForeignKey('subject.id')
|
||||
,nullable=False
|
||||
,comment='教学科目')
|
||||
home_place = Column(String(50)
|
||||
,comment='家乡')
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
from pydantic import BaseModel
|
||||
from pydantic import BaseModel,Field
|
||||
from Teachers.model.tea_model import *
|
||||
|
||||
#查询使用请求体,都可以为空
|
||||
@@ -7,8 +7,8 @@ class TeaRequest(BaseModel):
|
||||
name: str|None = None
|
||||
sex: Gender|None = None
|
||||
class_id: int | None = None
|
||||
sub: str|None = None
|
||||
phone: str|None = None
|
||||
subject_id: str|None = None
|
||||
phone: str | None
|
||||
home_place: str|None = None
|
||||
collage: str|None = None
|
||||
education: str|None = None
|
||||
@@ -22,9 +22,9 @@ class NewTeaRequest(BaseModel):
|
||||
name: str | None = None
|
||||
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
|
||||
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
|
||||
@@ -35,11 +35,14 @@ class NewTeaRequest1(BaseModel):
|
||||
name: str | None = None
|
||||
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 = 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
|
||||
@@ -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,61 +0,0 @@
|
||||
#scores模块解释
|
||||
|
||||
##项目层
|
||||
|
||||
web框架:FastAPI(生成接口)
|
||||
|
||||
ORM:sqlalchemy
|
||||
|
||||
校验:MYSQL(通过PyMysql驱动)
|
||||
|
||||
运行:uvicorn,端口12346
|
||||
|
||||
用FastAPI显露HTTP接口 ,对MysQL的scores表进行一个增,删,改,查的动作,删除是软删除,
|
||||
|
||||
api是接口层,成绩信息的增加,删除,更新,查询
|
||||
|
||||
dao是数据操作层,查询get_scores_dao
|
||||
|
||||
更新add_scores_dao
|
||||
|
||||
增加update_scores_dao
|
||||
|
||||
删除delete_scores_dao
|
||||
|
||||
统计查询80分以上的get_top_students_dao
|
||||
|
||||
查询连续两次不及格的get_failing_students_dao
|
||||
|
||||
班级平均分get_class_avg_dao
|
||||
|
||||
model是数据库表模型层,字段信息 id *pk*
|
||||
|
||||
sid 链接学生表的学生ID
|
||||
|
||||
cid 链接班级表的班级ID
|
||||
|
||||
num 考试序次
|
||||
|
||||
score 考试成绩
|
||||
|
||||
t_subject 链接科目表的科目ID
|
||||
|
||||
create_date 创建数据的时间
|
||||
|
||||
update_date 更新数据的是时间
|
||||
|
||||
is_deleted 逻辑删除
|
||||
|
||||
deleted_date 删除的时间
|
||||
|
||||
schema是请求体和响应体模型层, 查询的ScoreQuery
|
||||
|
||||
更新,增加,删除的ScoreRequest
|
||||
|
||||
databases是数据库定义配置文件, 链接引擎对象db_url,链接地址engine,
|
||||
|
||||
建表的基类Base,数据库会话管理Session
|
||||
|
||||
会话实例def get_db()
|
||||
|
||||
main是主程序文件,将配置文件的接口导入,创建接口运行
|
||||
@@ -37,7 +37,7 @@ def update_scores(score:ScoreRequest,sid:int,cid:int,num:int,t_subject:int,db=De
|
||||
@score_api.delete('/Score',summary='成绩删除',description=f'查询条件为学号,班级号,考试科目,然后进行删除')
|
||||
def delete_scores(sid:int,cid:int,t_subject:int,db=Depends(get_db)):
|
||||
aaa = delete_scores_dao(sid,cid,t_subject,db)
|
||||
if aaa==-1:
|
||||
if aaa==1:
|
||||
raise HTTPException(status_code=500,detail='删除失败')
|
||||
if aaa==0:
|
||||
raise HTTPException(status_code=404,detail='记录不存在')
|
||||
|
||||
@@ -1,26 +0,0 @@
|
||||
from fastapi import APIRouter, Depends, HTTPException
|
||||
from scores.database import get_db
|
||||
from scores.dao.statistic_dao import get_top_students_dao,get_failing_students_dao,get_class_avg_dao
|
||||
|
||||
statistic_api = APIRouter()
|
||||
|
||||
@statistic_api.get('/statistic', summary='查询每次考试都在80分以上的学生')
|
||||
def get_top_students(db=Depends(get_db)):
|
||||
q = get_top_students_dao(db)
|
||||
if not q:
|
||||
return []
|
||||
return q
|
||||
|
||||
@statistic_api.get('/Score/failing', summary='查询两次以上不及格的学生')
|
||||
def get_failing_students(db=Depends(get_db)):
|
||||
result = get_failing_students_dao(db)
|
||||
if not result:
|
||||
return []
|
||||
return result
|
||||
|
||||
@statistic_api.get('/Score/class-avg', summary='统计每次考试每个班级的平均分')
|
||||
def get_class_avg(db=Depends(get_db)):
|
||||
result = get_class_avg_dao(db)
|
||||
if not result:
|
||||
return []
|
||||
return result
|
||||
@@ -19,7 +19,7 @@ def get_scores_dao(s,db):
|
||||
if aa:
|
||||
return [{'id':i.id,'sid':i.sid
|
||||
,'cid':i.cid,'num':i.num
|
||||
,'score': i.score,'t_subject':i.t_subject
|
||||
,'score': i.score,'t_subject':i.tsub
|
||||
,'create_date':i.create_date,'update_date':i.update_date
|
||||
,'is_deleted': i.is_deleted,'deleted_date': i.deleted_date
|
||||
}for i in aa]
|
||||
@@ -28,7 +28,8 @@ def get_scores_dao(s,db):
|
||||
|
||||
def add_scores_dao(b,db):
|
||||
try:
|
||||
aa = db.query(Score).filter(Score.t_subject==b['t_subject']).all()
|
||||
aa = db.query(Score).filter(Score.sid==b['sid']
|
||||
,Score.t_subject==b['t_subject']).all()
|
||||
if aa:
|
||||
raise ValueError
|
||||
else:
|
||||
|
||||
@@ -1,78 +0,0 @@
|
||||
from sqlalchemy import func
|
||||
from scores.model.score_model import Score
|
||||
from students.model.students_model import Students
|
||||
from class_management.model.class_management_model import ClassInfo
|
||||
|
||||
def get_top_students_dao(db):
|
||||
top_sids = (db.query(Score.sid)
|
||||
.filter(Score.is_deleted == 0)
|
||||
.group_by(Score.sid, Score.num)
|
||||
.having(func.min(Score.score) >= 80)
|
||||
.subquery() )
|
||||
|
||||
results = (db.query(Students.id,
|
||||
Students.name,
|
||||
Score.num,
|
||||
Score.t_subject,
|
||||
Score.score,)
|
||||
.join(Score, Students.id == Score.sid)
|
||||
.filter( Score.sid.in_(top_sids),
|
||||
Score.is_deleted == 0,)
|
||||
.order_by(Students.id, Score.num)
|
||||
.all())
|
||||
|
||||
return [{"sid": r.sid,
|
||||
"name": r.name,
|
||||
"score": r.score,}
|
||||
for r in results]
|
||||
|
||||
|
||||
def get_failing_students_dao(db):
|
||||
failing_sids = (db.query(Score.sid)
|
||||
.filter(Score.score < 60,
|
||||
Score.is_deleted == 0,)
|
||||
.group_by(Score.sid)
|
||||
.having(func.count() >= 2)
|
||||
.subquery())
|
||||
|
||||
results = (db.query(
|
||||
Students.id,
|
||||
Students.name,
|
||||
ClassInfo.name.label("class_name"),
|
||||
Score.num,
|
||||
Score.t_subject,
|
||||
Score.score,)
|
||||
.join(Score, Students.id == Score.sid)
|
||||
.join(ClassInfo, Score.cid == ClassInfo.id)
|
||||
.filter(Score.sid.in_(failing_sids),
|
||||
Score.score < 60,
|
||||
Score.is_deleted == 0,)
|
||||
.order_by(ClassInfo.id, Score.num)
|
||||
.all())
|
||||
|
||||
return [{"sid": r.sid,
|
||||
"name": r.name,
|
||||
"class_name": r.class_name,
|
||||
"num": r.num,
|
||||
"t_subject": r.tsub,
|
||||
"score": r.score,}
|
||||
for r in results]
|
||||
|
||||
|
||||
|
||||
def get_class_avg_dao(db):
|
||||
results = (db.query(Score.num,
|
||||
Score.cid,
|
||||
ClassInfo.name.label("class_name"),
|
||||
func.avg(Score.score).label("avg_score"))
|
||||
.join(ClassInfo, Score.cid == ClassInfo.id)
|
||||
.filter(Score.is_deleted == 0)
|
||||
.group_by(Score.num, Score.cid, ClassInfo.name)
|
||||
.order_by(func.avg(Score.score).desc())
|
||||
.all())
|
||||
|
||||
return [ {"num": r.num,
|
||||
"cid": r.cid,
|
||||
"class_name": r.class_name,
|
||||
"avg_score": round(float(r.avg_score), 2),}
|
||||
for r in results]
|
||||
+3
-7
@@ -1,21 +1,17 @@
|
||||
from fastapi import FastAPI,APIRouter
|
||||
from scores.api.score_api import score_api
|
||||
from scores.database import engine,Base
|
||||
from scores.api.statistic_api import statistic_api
|
||||
|
||||
# 合并接口
|
||||
Scores_API = APIRouter()
|
||||
Scores_API.include_router(score_api)
|
||||
|
||||
# 自测接口
|
||||
app = FastAPI(tags=['成绩'], title='成绩管理系统')
|
||||
app = FastAPI(tags=['成绩'],title='成绩管理系统')
|
||||
app.include_router(score_api)
|
||||
app.include_router(statistic_api)
|
||||
|
||||
Base.metadata.create_all(engine)
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
Base.metadata.create_all(engine)
|
||||
|
||||
import uvicorn
|
||||
uvicorn.run('scores.main:app',host='127.0.0.1',port=12346)
|
||||
uvicorn.run('main:app',host='127.0.0.1',port=12346)
|
||||
Reference in New Issue
Block a user