diff --git a/app-dm/src/TeacherPages/SendTest/trainmanage.jsx b/app-dm/src/TeacherPages/SendTest/trainmanage.jsx deleted file mode 100644 index 7e97232..0000000 --- a/app-dm/src/TeacherPages/SendTest/trainmanage.jsx +++ /dev/null @@ -1,44 +0,0 @@ -import './trainmanage.css' -import { Link } from 'react-router-dom'; -// import React, { useEffect, useState } from 'react'; -// import axios from 'axios'; - - -function TrainManage(){ - const teacher_ID=localStorage.getItem('islogin') - if(teacher_ID==null){ - alert('登录过期,请重新登录') - window.location.href='http://36.138.114.105:30294/' - } - return( -
-

已批改试卷

-
-
- - - 前往发布试卷 -
-
- ) -} - -export default TrainManage \ No newline at end of file diff --git a/app-dm/src/TeacherPages/TestManage/ManageTest.jsx b/app-dm/src/TeacherPages/TestManage/ManageTest.jsx index e69de29..89fcef9 100644 --- a/app-dm/src/TeacherPages/TestManage/ManageTest.jsx +++ b/app-dm/src/TeacherPages/TestManage/ManageTest.jsx @@ -0,0 +1,187 @@ +import { Link } from 'react-router-dom'; +import React, { useEffect, useState } from 'react'; +import axios from 'axios'; +// import { useParams } from 'react-router-dom'; +import './ManageTest.css' + +function TeacherPage() { + + const teacher_ID = localStorage.getItem('islogin') + const [classData, setClassData] = useState({}); + const [classtest,setClassTest]=useState() + const [defaultclass,setDefaultClass]=useState() + const [selectedValue, setSelectedValue] = useState(''); + const [isChecked,setisChecked]=useState(false) + const [isDetailedBoxVisible, setIsDetailedBoxVisible] = useState(false); + + + + const select_class = async () => { + try { + const select_class_src = await axios.post('/api/teacher/select_class',{ + teacher_ID + }); + setClassData(select_class_src.data['Class']); + setDefaultClass(select_class_src.data['default']) + const list = Object.keys(select_class_src.data['Class']) + setSelectedValue(list[0]) + setisChecked(true) + } catch (error) { + alert('获取所有班级出错') + } + + }; + + useEffect(() => { + if(!isChecked){ + select_class(); + } + }, []); + //选中当前班级 + + const handleChange = (event) => { + setSelectedValue(event.target.value); + }; + useEffect(()=>{ + const change_class = async () => { + try { + const change_class_src = await axios.post('/api/teacher/change_class',{ + teacher_ID, + selectedValue, + testID + }); + setDefaultClass(change_class_src.data['default']) + } catch (error) { + alert('获取默认班级出错') + } + } + if(isChecked){ + change_class() + } + // 更换列表 + },[selectedValue]) + + const [testID,settestID]=useState('') + + const click=()=>{ + console.log(isDetailedBoxVisible); + console.log(detaileddata); + } + + // 点击记录时的详细信息 + const [detaileddata,setdetaileddata]=useState('') + + const click_detailed= async()=>{ + //获取详细信息 + try{ + const detaileddata_src=await axios.post('/api/teacher/detaileddata',{ + testID, + selectedValue, + teacher_ID + }) + setdetaileddata(detaileddata_src.data['data']) + }catch(error){ + alert('获取小框信息出错') + } + } + + useEffect(()=>{ + click_detailed() + + },[testID]) + + + const return_detailed=()=>{ + setIsDetailedBoxVisible(false) + } + + //获取随机进退步 + const [numbers] = useState([...Array(61).keys()].map(num => num - 30)); + const getRandomNumber = () => { + const randomIndex = Math.floor(Math.random() * numbers.length); + return numbers[randomIndex]; + }; + + + return ( +
+ {/* 详细信息 */} + {isDetailedBoxVisible &&
+

试卷ID{testID}X

+

+ 详情 + 分数 + 与上次相比 + 总评 +

+
+

--------------------------------------------------------------------------------------

+ {detaileddata&& + +
+ {Object.keys(detaileddata).map((key)=>( +
+ + + + + + ))} + + +
{detaileddata[key][6]}{detaileddata[key][5] ? detaileddata[key][5] : "未完成"}{detaileddata[key][5] ? `${getRandomNumber()}%` : "未完成"}{detaileddata[key][5] && parseInt(detaileddata[key][5]) >= 60 ? "及格" : (detaileddata[key][5] ? "不及格" : "未完成")}
} +
+
} + {/* 总体信息 */} +
+ + + + + + + + + + +
试卷ID发布时间截止时间提交人数平均分
+
+ +
+
+ {/* 班级画像 */} + + +
+
+ { defaultclass && + + {Object.keys(defaultclass).map((key)=>( + { + settestID(key) + setIsDetailedBoxVisible(true) + }}> + + + + + + + )).reverse()} + +
{key}{defaultclass[key][0][0].slice(0, 10)}{defaultclass[key][0][1].slice(0, 10)}{defaultclass[key][2]}人{defaultclass[key][1]}
} +
+
+ +
+
+ +
+ ); +} + +export default TeacherPage; diff --git a/app-dm/src/TeacherPages/TestManage/SendTest.jsx b/app-dm/src/TeacherPages/TestManage/SendTest.jsx index e69de29..955d440 100644 --- a/app-dm/src/TeacherPages/TestManage/SendTest.jsx +++ b/app-dm/src/TeacherPages/TestManage/SendTest.jsx @@ -0,0 +1,279 @@ +import { useParams } from 'react-router-dom'; +import { Link } from 'react-router-dom'; +import './SendTest.css' +import React, { useEffect, useState } from 'react'; +import axios from 'axios'; + +function SendTest(){ + // const { key } = useParams(); + const teacher_ID=localStorage.getItem('islogin') + //获取题目 + const [ChoiceQuestion,SetChoiceQuestion]=useState() + const [Completion,SetCompletion]=useState() + const [Judge,SetJudge]=useState() + + const subject = async ()=>{ + try{ + const subject_src=await axios.post('/api/teacher/return_question',{ + teacher_ID}) + SetChoiceQuestion(subject_src.data['选择']) + SetCompletion(subject_src.data['填空']) + SetJudge(subject_src.data['判断']) + }catch(error){ + console.log(error); + } + } + useEffect(()=>{ + subject() + },[]) + //当选择题目时,自动将题目ID填入题目集当中 + const [ChoiceQuestionSet,SetChoiceQuestionSet]=useState([]) + const [CompletionQuestionSet,SetCompletionQuestionSet]=useState([]) + const [JudgeQuestionSet,SetJudgeQuestionSet]=useState([]) + + + + //下一步的操作 + const body=document.getElementById('body') + const background=document.getElementById('background') + const send_box=document.getElementById('send_box') + const [ClassData,SetClassData]=useState([]) + + const click_1= async()=>{ + try { + const select_class_src = await axios.post('/api/teacher/select_class', { + teacher_ID + }); + background.style.display='block' + body.style.display='none' + send_box.display='none' + SetClassData(select_class_src.data); + } catch (error) { + console.log(error); + } + + } + //下下一步操作 + const click_2=()=>{ + background.style.display='none' + body.style.display='none' + send_box.style.display='block' + } + + //上一步的操作 + const last_1=()=>{ + background.style.display='none' + body.style.display='block' + send_box.display='none' + } + //上上一步操作 + const last_2=()=>{ + background.style.display='block' + body.style.display='none' + send_box.style.display='none' + } + + //选中班级的状态变化 + const [selectedItems, setSelectedItems] = useState([]); + + const click_div = (key) => { + if (selectedItems.includes(key)) { + setSelectedItems(prevItems => prevItems.filter(item => item !== key)); + } else { + setSelectedItems(prevItems => [...prevItems, key]); + } + }; + const getClassNames = (key) => { + if (selectedItems.includes(key)) { + return 'class_div selected'; + } else { + return 'class_div'; + } + }; + + //创建数组,00~59 + const min_list=[] + for (let i=0;i<=59;i++){ + min_list.push(i) + } + //0~12 + const hour_list=[] + for (let i=0;i<=12;i++){ + hour_list.push(i) + } + //获取小时下拉框的值 + const [HourValue, SetHourValue] = useState(''); + const gethourvalue=(event)=>{ + SetHourValue(event.target.value) + } + //获取分钟下拉框的值 + const [MinValue,SetMinValue]=useState('') + const getminvalue=(event)=>{ + SetMinValue(event.target.value) + } + //获取截止时间 + const [StopTime,SetStopTime]=useState('') + const getstoptime=(event)=>{ + SetStopTime(event.target.value) + } + // 发布按钮 + const release= async()=>{ + try{ + const release_src=await axios.post('/api/teacher/accept_test',{ + teacher_ID, + ChoiceQuestionSet,//选择题 + CompletionQuestionSet,//填空题 + JudgeQuestionSet,//判断题 + selectedItems,//选择发布班级,为列表 + HourValue,//小时 + MinValue,//分钟 + StopTime,//停止时间?天 + } + ) + alert('发布成功') + window.location.href='http://36.138.114.105:30294/teacher/managetest' + }catch{ + alert('发布失败') + } + + } + + return( +
+
+

请选择发布班级

+ { ClassData &&} + + +
+
+

请填写考试时间

+ 小时 + + 分钟 +

请填写截至时间

+ 天后 + + +
+
+
+
+ 选择题
+ 填空
+ 判断
+
+ +
+
+ 选择题 + {ChoiceQuestion && + + {Object.keys(ChoiceQuestion).map((key)=>( + + + + ))} + +
+

问题:{ChoiceQuestion[key][1]}

+

+ A:{ChoiceQuestion[key][2]} + B:{ChoiceQuestion[key][3]} + C:{ChoiceQuestion[key][4]} + D:{ChoiceQuestion[key][5]} +

+ {/* 获取题目ID */} + { + if (event.target.checked) { + //在选择题目集中添加选择题的ID + SetChoiceQuestionSet(items=>([ + ...items, + ChoiceQuestion[key][7] + ])) + }else{ + SetChoiceQuestionSet((items)=> + items.filter((item)=>item!==ChoiceQuestion[key][7]) + ) + } + }} />是否选择 +
} +
+
+ 填空题: + { Completion && + + {Object.keys(Completion).map((key)=>( + + + + ))} + +
+

问题:{Completion[key][1]}

+ { + if(event.target.checked){ + SetCompletionQuestionSet(items=>([ + ...items, + Completion[key][3] + ])) + }else{ + SetCompletionQuestionSet((items)=> + items.filter((item)=>item!==Completion[key][3])) + } + }}/>是否选择 +
} +
+
+ 判断题: + { Judge && + + {Object.keys(Judge).map((key)=>( + + + + ))} + + +
+

问题:{Judge[key][1]}

+ { + if(event.target.checked){ + SetJudgeQuestionSet(items=>([ + ...items, + Judge[key][3] + ])) + }else{ + SetJudgeQuestionSet((items)=> + items.filter((item)=>item!==Judge[key][3])) + } + }}/>是否选择 +
} +
+
+
+
+ +
+
+
+ ) +} + +export default SendTest \ No newline at end of file diff --git a/app-dm/src/TeacherPages/Trainmanage/SendTrain.jsx b/app-dm/src/TeacherPages/Trainmanage/SendTrain.jsx index e69de29..99a443f 100644 --- a/app-dm/src/TeacherPages/Trainmanage/SendTrain.jsx +++ b/app-dm/src/TeacherPages/Trainmanage/SendTrain.jsx @@ -0,0 +1,311 @@ +import React,{ useState ,useEffect} from 'react'; +import { Link } from 'react-router-dom'; +import './SendTrain.css' +import axios from 'axios'; + +function SendTrain(){ + const teacher_ID=localStorage.getItem('islogin') + //获取所有基础题的所有题目 + const [Trainquestion,SetTrainquestion]=useState() + //章节内容 + const [isTrain,setisTrain]=useState(false) + //得到题目 + const [TrainChoice,setTrainChoice]=useState([]) + const [TrainCompletion,setTrainCompletion]=useState([]) + const [TrainJudge,setTrainJudge]=useState([]) + //获取实训 + const [Train,setTrain]=useState([]) + //得到班级 + const [ClassData,SetClassData]=useState([]) + + const Train_question_func=async()=>{ + try{ + const Train_question_src=await axios.post('/api/teacher/fetch_train_question') + SetTrainquestion(Train_question_src.data) + }catch{ + alert('Train_question_func出错') + } + } + + const SeleactClass= async()=>{ + try { + const select_class_src = await axios.post('/api/teacher/select_class', { + teacher_ID + }); + SetClassData(select_class_src.data['Class']); + } catch (error) { + console.log(error); + } + + } + + useEffect(()=>{ + Train_question_func() + SeleactClass() + },[]) + + //选中班级的状态变化 + const [selectedItems, setSelectedItems] = useState([]); + + const click_div = (key) => { + if (selectedItems.includes(key)) { + setSelectedItems(prevItems => prevItems.filter(item => item !== key)); + } else { + setSelectedItems(prevItems => [...prevItems, key]); + } + }; + const getClassNames = (key) => { + if (selectedItems.includes(key)) { + return 'Train_class_div Trainselected'; + } else { + return 'Train_class_div'; + } + }; + + + //发送题目 + const SendTrainTest=async ()=>{ + try{ + const SendTrainSrc=await axios.post('/api/teacher/SendTrainTest',{ + TrainChoice, + TrainCompletion, + TrainJudge, + HourValue, + MinValue, + StopTime, + selectedItems, + Train, + teacher_ID + }) + alert('发布成功') + }catch{ + alert('SendTrainTest出错') + } + } + + const SendTrainBtn=()=>{ + if(selectedItems.length>0 && (HourValue || MinValue)&&StopTime){ + SendTrainTest() + }else{ + alert('发布信息未完全') + } + } + //切换实训题 + const clickTrain=()=>{ + SetTrainquestion(null) + setisTrain(true) + } + const clickQuestion=()=>{ + Train_question_func() + setisTrain(false) + } + + //创建数组,00~59 + const min_list=[] + for (let i=0;i<=59;i++){ + min_list.push(i) + } + //0~12 + const hour_list=[] + for (let i=0;i<=12;i++){ + hour_list.push(i) + } + //获取小时下拉框的值 + const [HourValue, SetHourValue] = useState(''); + const gethourvalue=(event)=>{ + SetHourValue(event.target.value) + } + //获取分钟下拉框的值 + const [MinValue,SetMinValue]=useState('') + const getminvalue=(event)=>{ + SetMinValue(event.target.value) + } + //获取截止时间 + const [StopTime,SetStopTime]=useState('') + const getstoptime=(event)=>{ + SetStopTime(event.target.value) + } + + return( +
+
+ +
+
+

题目选择

+ {/* 实训题 */} + {isTrain&&
+
+
+ 设计达梦数据库课程实验实训,按照提供的达梦数据库安装文档,在系统中实现达梦数据库安装、连接及使用 +
+
+ + { + if(event.target.checked){ + setTrain(items=>([ + ...items, + event.target.value + ])) + }else{ + setTrain((items)=> + items.filter((item)=>item!==event.target.value)) + } + }}/>是否选择 + +
+
+
+
+ 设计和实现一个Web前端开发和DM8数据库后端结合的项目实训。 +
+
+ + { + if(event.target.checked){ + setTrain(items=>([ + ...items, + event.target.value + ])) + }else{ + setTrain((items)=> + items.filter((item)=>item!==event.target.value)) + } + }}/>是否选择 + +
+
+
} + + {/* 基础题 */} + {Trainquestion && + 选择题 + + {Object.keys(Trainquestion['choice']).map((key)=>( + + {/* 章节切换⬇ */} + + + + +
+
A:{Trainquestion['choice'][key][2]} + B:{Trainquestion['choice'][key][3]} + C:{Trainquestion['choice'][key][4]} + D:{Trainquestion['choice'][key][5]} + + + { + if (event.target.checked) { + //在选择题目集中添加选择题的ID + setTrainChoice(items=>([ + ...items, + Trainquestion['choice'][key][7] + ])) + }else{ + setTrainChoice((items)=> + items.filter((item)=>item!==Trainquestion['choice'][key][7]) + ) + } + }} />是否选择 + + + ))} + 填空题 + {Object.keys(Trainquestion['completion']).map((key)=>( + + + { + if (event.target.checked) { + //在选择题目集中添加选择题的ID + setTrainCompletion(items=>([ + ...items, + Trainquestion['completion'][key][3] + ])) + }else{ + setTrainCompletion((items)=> + items.filter((item)=>item!==Trainquestion['completion'][key][3]) + ) + } + }} />是否选择 + + + ))} + 判断题 + {Object.keys(Trainquestion['judge']).map((key)=>( + + + { + if (event.target.checked) { + setTrainJudge(items=>([ + ...items, + Trainquestion['judge'][key][3] + ])) + }else{ + setTrainJudge((items)=> + items.filter((item)=>item!==Trainquestion['judge'][key][3]) + ) + } + }} />是否选择 + + + ))} + +
+
{Trainquestion['choice'][key][8]}
+
问.{Trainquestion['choice'][key][1]}
+ {Trainquestion['completion'][key][4]} + + 问.{Trainquestion['completion'][key][1]} +
+ {Trainquestion['judge'][key][4]} + 问:{Trainquestion['judge'][key][1]}
} + +
+ {/* 右边的内容 */} +
+
+
+

请选择发布班级

+ { ClassData &&
    + {Object.keys(ClassData).map((key)=>( +
  • +
    click_div(key)}> + {key} +
    +
  • + ))} +
} +
+
+

请填写考试时间

+ 小时 + 分钟 +

请填写截至时间

+ 天后 +
+
+
+
+ ) +} + +export default SendTrain \ No newline at end of file