|

楼主 |
发表于 2024-11-15 10:24:23
|
显示全部楼层
本帖最后由 08060402宋子怡 于 2024-11-15 10:31 编辑
本周我实现教师端的功能设计和实现
1.教师模块需求分析
教师可以录入学生成绩信息,录入方式可以是单个录入和批量录入。教师端还需要为教师提供课程管理,教师在课程管理中可以为专业绑定课程,在绑定课程之后,教师可以特定的学年,为相关专业创建指定的课堂, 该课堂课会在选课发布之后可以供给学生选课,同时对于学生提交的成绩复核申请还需要做出审核,同意的话就需要上传试卷材料,并设置更改分数。
2.教师模块功能概述
(1)绑定专业课程:教师可以将自己的课程与专业绑定,以便于教师后续创建课堂。
(2)审核成绩复核申请:教师可以审核学生提出的成绩复核申请,上传试卷材料,成绩更改信息以及添加备注,提交给管理员进行最终审核。
(3)课堂管理:教师可以创建对应专业的课堂并生成课堂码,课堂信息包括所属学年、所属专业、班级描述、所属课程、课程图片等。
教师还可以设定课程的上课时间表,包括现在开课、定时开课以及结束课程。
在特殊情况下,教师可以对学生进行强制退课处理。
在课堂管理中教师可以单个录入和修改学生的成绩,也可以通过Excel学生成绩模版批量录入和修改学生的成绩。
3.教师端功能实现
3.1 绑定专业课程
教师可以将自己的课程与专业绑定如图5.7所示,以便于教师后续创建课堂,教师在选项卡中选择不同的专业,触发 changeMajor 方法,该方法更新当前选择的专业并重新获取该专业的课程列表。教师在 el-transfer组件中可以选择要绑定的课程(从“可选课程”中转移到“已绑课程”)。教师点击“保存”按钮,触发 saveData 方法。在该方法中,向后端发送 POST 请求 (/cou/bindCourse)以提交绑定的课程信息。请求体包含当前选择的课程 ID 列表(couIds)和专业名称(major)后端接收到请求后,更新数据库中相应的课程绑定状态,并返回操作结果。前端根据后端返回的结果,更新界面显示或提示用户操作成功与否,完成整个用户交互流程。

图5.7 绑定课程
3.2 课堂管理
(1)创建课堂:教师可以创建对应专业的课堂并生成课堂码,创建课堂时,需要确定的课堂信息couFormData包括所属学年、所属专业、班级描述、所属课程、课程图片等如图5.8所示,点击“确定”按钮,前端调用 createRoom 方法,将 couFormData 数据通过 POST 请求发送到后端 /cou/createRoom 接口,后端通过VoRoom对象接受课堂信息,(StUser) SecurityUtils.getSubject().getPrincipal()获取当前用户的身份信息,使用RandomUtil.randomString(5).toUpperCase()生成课堂码,创建一个课堂信息存储到数据库,处理后返回相应的信息,前端获得成功响应后,显示创建成功消息,并调用 getTeaRoom 方法刷新课堂列表,确保界面显示最新的课堂信息。
图5.8 创建课堂表单
(2)设置课堂开课时间:教师还可以设定课程的上课时间表,包括现在开课、定时开课以及结束课程,教师选择好时间后如图5.9所示,点击“确定”按钮,前端会调用timingStart方法,将选择的时间通过POST请求发送到后端的/cou/timingStart接口,后端创建一个Job对象,设置其延迟时间为开课时间与当前系统时间的差值。设置Job的ID为roomId,主题为"test"。调用jobService.addDefJob(job)将这个定时任务添加到任务队列中。并调用classRoomService.updateById(classRoom)更新数据库中的课堂信息,包括设置开课时间为time。如果更新成功,返回成功的Result对象。如果更新失败,返回失败的Result对象,并附带错误信息“定时失败”。
图5.9 定时开课
(4)强制退课:教师可以在学生列表中选择某个学生,点击“强制退课”按钮。点击按钮后,前端调用exitRoomByTea方法,将roomId和stuId通过POST请求发送到后端的/cou/exitRoomByTea接口。端接收到请求后,根据提供的roomId和stuId参数,更新数据库中对应学生的课堂状态,将其从课堂中移除。操作成功后,后端返回成功响应,前端根据响应结果更新学生列表,并提示教师操作成功。
(3)赋予学生成绩:教师可以点击学生列表中某个学生的“给予成绩”按钮,打开一个弹出框,在其中输入学生的平时成绩和考试成绩。前端根据输入的成绩和课程设置的成绩占比,计算总成绩,并显示给教师。教师确认成绩无误后,点击“确定”按钮,前端调用updateGrade方法,将总成绩、roomId和stuId通过POST请求发送到后端的/cou/updateGrade接口。后端接收到请求后,根据提供的roomId、stuId和grade参数,更新数据库中对应学生的成绩。操作成功后,后端返回成功响应,前端根据响应结果更新学生的成绩,并提示教师操作成功。
图5.10 赋予学生成绩
4.部分实现代码如下:
public class TeaRoomController {
@Autowired
private CourseService courseService;
@Autowired
private CouTeaService couTeaService;
@GetMapping("/labelInit")
public Result getLabelInit(){
return courseService.labelInit();
}
@GetMapping("/getTeaRoom")
public Result getTeaRoom(String stuYear,String major){
return courseService.getTeaRoom(stuYear,major);
}
@GetMapping("/getCourse")
public Result getCourse(String major){
return courseService.getCourse(major);
}
@GetMapping("/getMajor")
public Result getMajor(){
return courseService.getMajor();
}
@PostMapping("/bindCourse")
public Result bindCourse(@RequestBody JSONObject couIds){
return courseService.bindCourse(couIds.getJSONArray("couIds"),couIds.getString("major"));
}
@PostMapping("/upBcImg")
public Result upBcImg(MultipartFile file,Long roomId){
return courseService.upBcImg(file,roomId);
}
@PostMapping("/createRoom")
public Result createRoom(@RequestBody VoRoom room){
return courseService.createRoom(room);
}
@PostMapping("/changeState")
public Result changeState(@RequestBody JSONObject jsonObject){
return courseService.changeState(jsonObject.getIntValue("state"), jsonObject.getLong("roomId"));
}
@PostMapping("/timingStart")
public Result timingStart(@RequestBody JSONObject jsonObject) throws ParseException {
return courseService.timingStart(jsonObject.getString("time"), jsonObject.getLong("roomId"));
}
@PostMapping("/updateGrade")
public Result updateGrade(@RequestBody JSONObject jsonObject){
return couTeaService.updateGrade(jsonObject.getIntValue("grade"),
jsonObject.getLong("roomId"),
jsonObject.getLong("stuId"));
}
@PostMapping("/exitRoomByTea")
public Result exitRoom(@RequestBody JSONObject jsonObject){
return couTeaService.exitRoom(jsonObject.getLong("roomId"),jsonObject.getLong("stuId"),jsonObject.getIntValue("couType"));
}
@PostMapping("/upGrade")
public Result upGrade(MultipartFile file,Long roomId) throws IOException {
return couTeaService.upGrade(file,roomId);
}
}//教师独有 { path: '/courseBind', component: Layout, meta: { title: '课程管理', icon: '#icon-kechengxinxi', roles: ['teacher'] }, children: [ { path: 'couAdd', name: 'couAdd', component: () => import('@/views/course/couAdd'), meta: { title: '绑定课程', icon: '#icon-zizhuxuanke', roles: ['teacher'] } } ] }, //成绩复核 { path: '/reviewGrade', component: Layout, children: [ { path: 'reviewList', name: 'reviewList', component: () => import('@/views/reviewGrade/reviewList'), meta: { title: '成绩复核列表', icon: '#icon-zhuangxiangfuhe', roles: ['teacher','admin'] } }, { hidden: true, path: 'reviewDetail', name: 'reviewDetail', component: () => import('@/views/reviewGrade/reviewDetail'), meta: { title: '成绩复核详情', roles: ['teacher','admin','student'] } } ] }, //课堂管理 { path: '/classRoom', component: Layout, meta: { title: '课堂管理', icon: '#icon-ketang2', roles: ['student','teacher'] }, children: [ { path: 'roomListTea', name: 'roomListTea', component: () => import('@/views/classRoom/roomListTea'), meta: { title: '我的课堂', icon: '#icon-ketang1', roles: ['teacher'] } }, { path: 'roomListStu', name: 'roomListStu', component: () => import('@/views/classRoom/roomListStu'), meta: { title: '我的课堂', icon: '#icon-ketang1', roles: ['student'] } }, { hidden:true, path: 'roomDetail', name: 'roomDetail', component: () => import('@/views/classRoom/roomDetail'), meta: { roles: ['teacher','student'] } }, { path: 'roomAdd', name: 'roomAdd', component: () => import('@/views/course/bingCourse'), meta: { title: '加入课堂', icon: '#icon-ketang', roles: ['student'] } } ] }, // 404 page must be placed at the end !!! { path: '*', redirect: '/404', hidden: true }]
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|