diff --git a/app-dm/src/pages/Home/Home.jsx b/app-dm/src/pages/Home/Home.jsx index bb83281..3368983 100644 --- a/app-dm/src/pages/Home/Home.jsx +++ b/app-dm/src/pages/Home/Home.jsx @@ -11,11 +11,10 @@ import { max, min } from 'lodash'; // 首页 function Home(){ - const [isChecked,setisChecked]=useState(false) const student_ID=localStorage.getItem('islogin') if(student_ID==null){ + window.location.href='http://localhost:3000/signin' alert('未登录,请先前往登录') - window.location.href='http://36.138.114.105:30294/' } //课表数据 const [lesson, setLesson] = useState([]); diff --git a/app-dm/src/pages/ListPages/Subject/Exam.css b/app-dm/src/pages/ListPages/Subject/Exam.css index 247fb2f..5751808 100644 --- a/app-dm/src/pages/ListPages/Subject/Exam.css +++ b/app-dm/src/pages/ListPages/Subject/Exam.css @@ -119,4 +119,13 @@ margin-left: 5px; margin-top: 5px; cursor: pointer; +} +.body-right1-exam{ + width: 1414px; + height: 1540px; + position: absolute; + top: 64px; + left: 230px; + border-radius: 10px; + background-color: #f7f8fa; } \ No newline at end of file diff --git a/app-dm/src/pages/ListPages/Subject/Exam.jsx b/app-dm/src/pages/ListPages/Subject/Exam.jsx index 17f52a8..8058205 100644 --- a/app-dm/src/pages/ListPages/Subject/Exam.jsx +++ b/app-dm/src/pages/ListPages/Subject/Exam.jsx @@ -10,10 +10,66 @@ import top from '../img/top.jpg' import axios from 'axios'; function Exam() { - - //倒计时 const [countdown, setCountdown] = useState(null); + const {examId}=useParams() + const student_ID=localStorage.getItem('islogin') + const [score,setscore]=useState(0) + const [isEntry,setisEntry]=useState(false) + + //获取题目 + const [TestData,setTestData]=useState() + const TestFunc=async ()=>{ + try{ + const TestSrc=await axios.post('/api/student/TestData',{ + examId + }) + const data=TestSrc.data + setTestData(data) + }catch{ + alert('TestSrc出错') + } + } + + useEffect(()=>{ + TestFunc() + },[]) + + + //添加成绩 + const scoreEntry=async()=>{ + try{ + const scoreEntrySrc=await axios.post('/api/student/score_entry',{ + student_ID, + examId, + score + }) + }catch{ + alert('scoreEntry出错') + } + } + + useEffect(()=>{ + if(isEntry){ + scoreEntry() + } + },[score]) + + function daojishi(){ + if(localStorage.getItem('time')){ + setCountdown(localStorage.getItem('time')) + }else{ + if(TestData){ + setCountdown(60 * parseInt(TestData['examID'][3])) + } + } + } + + useEffect(()=>{ + daojishi() + console.log('a'); + },[TestData]) + // 倒计时更新 useEffect(() => { @@ -24,19 +80,22 @@ function Exam() { } else { clearInterval(interval); alert('考试时间到!'); + correct() + window.location.href='http://localhost:3000/subject' } }, 1000); return () => clearInterval(interval); }, [countdown]); - // useEffect(()=>{ - // if(countdown<0){ - // console.log('c'); - // setCountdown(60 * parseInt(TrainData['operateID'][4])) - // localStorage.removeItem('time') - // } - // },[TrainData]) + useEffect(()=>{ + if(countdown<0){ + localStorage.removeItem('time') + setCountdown(60 * parseInt(TestData['examID'][3])) + } + },[TestData]) + + // 转换秒数为时分秒格式 const formatTime = (seconds) => { const hours = Math.floor(seconds / 3600); @@ -48,6 +107,109 @@ function Exam() { // 下拉菜单 const [isSubjectDropdownOpen, setIsSubjectDropdownOpen] = useState(false); + //创建答案字典,将用户填入的答案添加到答案字典 + const [choice_answer,setchoice_answer]=useState({}) + const [completion_answer,setcompletion_answer]=useState({}) + const [judge_answer,setjudge_answer]=useState({}) + //选中反馈 + const [answeredChoice, setAnsweredChoice] = useState([]); + const [answeredComple, setAnsweredComple] = useState([]); + const [answeredJudge, setAnsweredJudge] = useState([]); + + //给选择题添加事件监听器 + const handleOptionChange = (event) => { + const selectedValue = event.target.value; + const key = parseInt(event.target.name.replace('group', '')); + const updatedChoiceAnswer = { ...choice_answer, [key]: selectedValue }; + setchoice_answer(updatedChoiceAnswer); + // 更新已做题目的状态 + if (!answeredChoice.includes(key)) { + setAnsweredChoice([...answeredChoice, key]); + } + }; + //填空题 + const handleInputChange = (event) => { + const { name, value } = event.target; + setcompletion_answer({ + ...completion_answer, + [name]: value + }); + if (!answeredComple.includes(parseInt(name))) { + setAnsweredComple([...answeredComple, parseInt(name)]); + } + + }; + + //判断题 + const handleJudgeOption=(event)=>{ + const judgeoption=event.target.value; + const key=parseInt(event.target.name.replace('judge','')) + const updatedJudgeAnswer={ ...judge_answer,[key]:judgeoption} + setjudge_answer(updatedJudgeAnswer) + if (!answeredJudge.includes(key)) { + setAnsweredJudge([...answeredJudge, key]); + } + } + + //批改 + const correct=()=>{ + let CHO_sum=0; + let COM_sum=0; + let JUD_sum=0; + for(let item of TestData['examID'][0]){ + if(item[0][6]===choice_answer[CHO_sum]){ + setscore(prevscore=>prevscore+5) + } + CHO_sum++ + } + for(let item of TestData['examID'][1]){ + if (item[0][2]===completion_answer[COM_sum]) { + setscore(prevscore=>prevscore+5) + } + COM_sum++ + } + for(let item of TestData['examID'][2]){ + if (item[0][2]===judge_answer[JUD_sum]) { + setscore(prevscore=>prevscore+5) + } + JUD_sum++ + } + setisEntry(true) + } + + + const submit=()=>{ + correct() + setCountdown(0) + localStorage.removeItem('time') + alert('提交成功') + window.location.href='http://localhost:3000/subject' + + } + + + // 题目预览框 + const [isFixed,setIsFixed]=useState(false) + // 创建一个函数来处理滚动逻辑 + const handleScroll = () => { + const scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0; + const fixedThreshold = 100; // 滚动到100px后固定 + + if (scrollTop > fixedThreshold) { + setIsFixed(true); + } else { + setIsFixed(false); + } + }; + // 在组件挂载后添加滚动事件监听器,并在卸载时移除 + useEffect(() => { + window.addEventListener('scroll', handleScroll); + + return () => { + window.removeEventListener('scroll', handleScroll); + }; + }, []); + return (
@@ -78,32 +240,99 @@ function Exam() { {/* 题目预览框 */} {/* 根据isFixed状态来设置countBox的类 */} - {/*
- {TrainData&& +
{/* 根据isFixed状态来设置countBox的类 */} + {TestData&&
选择题:
- {Object.keys(TrainData['operateID'][0]).map((key,index)=>( + {Object.keys(TestData['examID'][0]).map((key,index)=>(
))} 填空题:
- {Object.keys(TrainData['operateID'][1]).map((key,index)=>( + {Object.keys(TestData['examID'][1]).map((key,index)=>(
))} 判断题:
- {Object.keys(TrainData['operateID'][2]).map((key,index)=>( + {Object.keys(TestData['examID'][2]).map((key,index)=>(
))}
{index+1}
{index+1}
{index+1}
} -
*/} +
+ +
+
+ {TestData&& +

选择题

+ + {Object.keys(TestData['examID'][0]).map((key,index) => ( + + {index+1}.{TestData['examID'][0][key][0][1]} +
+ +
+ +
+ +
+ +
+ + ))} + +
} + + {TestData&&( + + +

填空题

+ {Object.keys(TestData['examID'][1]).map((key,index)=>( + + {index+1}.{TestData['examID'][1][key][0][1]} + {/*
*/} +
+ 请填入你的答案: + +
+ + ))} + +
+ )} + + {TestData&&( + + +

判断题

+ {Object.keys(TestData['examID'][2]).map((key,index)=>( + + {index+1}.{TestData['examID'][2][key][0][1]} + + + + + + ))} + +
+ )} +
- {/*
- -
*/} ) diff --git a/app-dm/src/pages/ListPages/Subject/SubjectPage.jsx b/app-dm/src/pages/ListPages/Subject/SubjectPage.jsx index 89a99ef..6544e5f 100644 --- a/app-dm/src/pages/ListPages/Subject/SubjectPage.jsx +++ b/app-dm/src/pages/ListPages/Subject/SubjectPage.jsx @@ -57,19 +57,18 @@ function SubjectPage(){ ))} }

已结束或完成的试卷与练习

- { testdata&& result&&
- {Object.keys(testdata).map((key)=>{ - return( -
-

试卷ID:{testdata[key][0][3]}

- 发布者:{'小陈老师'} -
发布时间:{testdata[key][1][0][5]}
-
截至时间:{testdata[key][1][0][6]}
-
{testdata[key][0][5]}
+
+ { Object.keys(testdata).slice(-3).reverse().map((key) => ( +
+

试卷ID:{testdata[key][0][3]}

+ 发布者:{'小陈老师'} +
发布时间:{testdata[key][1][0][5]}
+
截至时间:{testdata[key][1][0][6]}
+
{testdata[key][0][5]}
- ) - })} -
} + ))} +
+ { NotFalse&& result&&
{Object.keys(NotFalse).map((key)=>{ return( diff --git a/app-dm/src/pages/ListPages/Training/Operation1.jsx b/app-dm/src/pages/ListPages/Training/Operation1.jsx index 688f01c..d88685b 100644 --- a/app-dm/src/pages/ListPages/Training/Operation1.jsx +++ b/app-dm/src/pages/ListPages/Training/Operation1.jsx @@ -16,19 +16,9 @@ function Operation1() { console.log(60 * parseInt(TrainData['operateID'][4])); } const clear=()=>{ - localStorage.removeItem('choice_answers'); - setchoice_answer({}) - localStorage.removeItem('completion_answer') - setcompletion_answer({}) - localStorage.removeItem('judge_answer') - setjudge_answer({}) - localStorage.removeItem('answeredChoice') - setAnsweredChoice([]) - localStorage.removeItem('answeredComple') - setAnsweredComple([]) - localStorage.removeItem('answeredJudge') - setAnsweredJudge([]) - localStorage.removeItem('RemainingTime') + ['time', 'choice_answers', 'completion_answer', 'judge_answer', + 'answeredChoice', 'answeredComple', 'answeredJudge', 'RemainingTime', 'TrainData'] + .forEach(item => localStorage.removeItem(item)); } const { operateID } = useParams(); @@ -85,7 +75,6 @@ function Operation1() { useEffect(()=>{ if(countdown<0){ - console.log('c'); setCountdown(60 * parseInt(TrainData['operateID'][4])) localStorage.removeItem('time') } diff --git a/app-dm/src/pages/ListPages/Training/Operation2.jsx b/app-dm/src/pages/ListPages/Training/Operation2.jsx index 95e3699..bee25e5 100644 --- a/app-dm/src/pages/ListPages/Training/Operation2.jsx +++ b/app-dm/src/pages/ListPages/Training/Operation2.jsx @@ -146,8 +146,16 @@ function Operation2() { const tijiao = ()=>{ setCountdown(0) localStorage.removeItem('time') + localStorage.removeItem('choice_answers'); + localStorage.removeItem('completion_answer') + localStorage.removeItem('judge_answer') + localStorage.removeItem('answeredChoice') + localStorage.removeItem('answeredComple') + localStorage.removeItem('answeredJudge') + localStorage.removeItem('RemainingTime') alert('提交成功') window.location.href='http://localhost:3000/train' + localStorage.removeItem('TrainData') } return ( @@ -184,7 +192,7 @@ function Operation2() { {/* 前端连接数据库⬇ */} - { !isTrue&&
+ { !isTrue&&TrainData&&
{TrainData['operateID'][3][0]}
点击以上链接前往实训 @@ -192,7 +200,7 @@ function Operation2() { {/* 前端连接数据库 ⬆*/} {/* 达梦数据库连接 ⬇*/} - { isTrue&& + { isTrue&&TrainData&&

{TrainData['operateID'][3][0]}

diff --git a/app-dm/src/router/index.jsx b/app-dm/src/router/index.jsx index a2c4596..b5e2aa3 100755 --- a/app-dm/src/router/index.jsx +++ b/app-dm/src/router/index.jsx @@ -23,8 +23,8 @@ import ClassID from '../TeacherPages/classlistpages/classId'; import ManageTest from '../TeacherPages/TestManage/ManageTest'; import SendTest from '../TeacherPages/TestManage/SendTest'; import Marking from '../TeacherPages/MarkingPages/Marking'; -import SendTrain from '../TeacherPages/TrainManage/SendTrain' -import TrainManage from '../TeacherPages/TrainManage/Trainmanage' +import SendTrain from '../TeacherPages/Trainmanage/SendTrain' +import TrainManage from '../TeacherPages/Trainmanage/Trainmanage' import StudentLink from '../TeacherPages/MarkingPages/StudentLink'; diff --git a/python/app.py b/python/app.py index f8825ef..26960f9 100644 --- a/python/app.py +++ b/python/app.py @@ -103,10 +103,11 @@ def get_test(): # 获取试卷以及历史试卷 result2=falseTest_func(ID) return jsonify({"True":result1,'FalseTest':result2}) -@app.route('/api/student/get_testID',methods=['POST']) -def get_testID(): # 获取试卷ID - ID=request.json['student_ID'] - return jsonify({'data': 'a'}) +@app.route('/api/student/TestData',methods=['POST']) +def TestData(): # 获取试卷ID + examID=request.json['examId'] + result=TestDataFunc(examID) + return result @app.route('/api/student/fetch_result', methods=['POST']) # 查找成绩 @@ -115,11 +116,7 @@ def fetch_result(): ID = data['student_ID'] return jsonify({'result': fetch_result_func(ID)}) -@app.route('/api/student/get_end_student', methods=['POST']) -def get_end_student(): - data = request.json - ID = data['student_ID'] - return jsonify({'result': find_end_test(ID)}) + @app.route('/api/student/score_entry', methods=['POST']) diff --git a/python/student_func.py b/python/student_func.py index e1f72d0..beab01e 100644 --- a/python/student_func.py +++ b/python/student_func.py @@ -120,7 +120,6 @@ def student_succeed_func(ID): cursor.execute(f'SELECT * FROM STUDENT WHERE ID={ID}') student_succeed = cursor.fetchall()[0] student_succeeds = student_succeed[0], student_succeed[1], student_succeed[3], student_succeed[4] - print(student_succeeds) cursor.close() return student_succeeds @@ -128,17 +127,27 @@ def student_succeed_func(ID): # fetch_testID('20240101') def fetch_test_func(ID):#获取试卷 cursor = db.cursor() + correct=[] TrueTestDic={} TruetestID=[] cursor.execute(f"SELECT * FROM STUDENT_TEST WHERE STUDENT_ID=? AND TF='true'",(ID)) for i in cursor.fetchall(): + correct.append(i) + + correct=correct[::-1][:3] + + for i in correct: TruetestID.append(i[3]) TrueTestDic[i[3]]=i + TruetestID=TruetestID[::-1][:3] + for index in TruetestID: cursor.execute(f"SELECT * FROM TEST_BANK WHERE ID=?",(index)) TrueTestDic[index]=TrueTestDic[index],cursor.fetchall() + # print(TrueTestDic) + return TrueTestDic # fetch_test_func('20240101') @@ -166,6 +175,53 @@ def falseTest_func(ID): # falseTest_func('20240101') + +def TestDataFunc(examID): + cursor = db.cursor() + cursor.execute(f"SELECT * FROM TEST_BANK WHERE ID=?",(examID,)) + TestID=cursor.fetchall()[0] + ChoiceList=json.loads(TestID[0]) + CompleList=json.loads(TestID[1]) + JudgeList=json.loads(TestID[2]) + + Choice=[] + Comple=[] + Judge=[] + + CHOICE=[str(x) for x in ChoiceList] + COMPLE=[str(x) for x in CompleList] + JUDGE=[str(x) for x in JudgeList] + + for i in CHOICE: + cursor.execute(f"SELECT * FROM CHOICE_QUESTION_BANK WHERE ID=?",(i)) + Choice.append(cursor.fetchall()) + + for i in COMPLE: + cursor.execute(f"SELECT * FROM COMPLETION_QUESTION_BANK WHERE ID=?",(i)) + Comple.append(cursor.fetchall()) + + for i in JUDGE: + cursor.execute(f"SELECT * FROM T_OR_F_QUESTION_BANK WHERE ID=?",(i)) + Judge.append(cursor.fetchall()) + + + HOUR=TestID[3] + MIN=TestID[4] + if int(HOUR)==0: + time=int(MIN) + elif int(MIN)==0: + time=int(HOUR)*60 + else: + time=int(HOUR)*60+int(MIN) + + dic={'examID':[Choice,Comple,Judge,time]} + + # print(dic) + + return dic + +# TestDataFunc('35') + # 查找学生已经完成的记录 def find_end_test(ID): cursor = db.cursor()