视频学习|Springboot在线学习系统

news2024/11/17 3:45:47

作者主页:编程千纸鹤

作者简介:Java、前端、Pythone开发多年,做过高程,项目经理,架构师

主要内容:Java项目开发、毕业设计开发、面试技术整理、最新技术分享

收藏点赞不迷路  关注作者有好处

文末获得源码

项目编号:BS-PT-074

前言:

随着信息技术的发展,计算机已被广泛的用于社会的各个领域,成为推动社会发展的技术动力。而在计算机应用中,网络技术的作用十分突出,网络已经发展成为信息技术的核心,主导着信息产品的开发和信息技术市场的进一步的开拓。网络产业已成为社会信息化进程中的一个战略性产业。在网络技术的应用中,网络软件的开发技术尤其是在基础研究领域的开发技术成了重中之重。不断开发适应用户需求、市场需要的新型软件产品,提高工作效率成为网络软件发展的潮流。随着计算机网络技术在各行各业的延伸和发展,网络技术已经逐步拓展到了学生领域,并已经得到了广泛应用。当然,近年来,学生在人们学习和工作中的作用也日益明显,也逐渐成为人们平日学习、工作的研究对象。越来越多的人开始意识到研究学生可以提高人们的工作效率、为做出决策提供依据、还可以解决时间、减少资源的浪费,所以对学生越来越重视。

网上学习能够缩短教室与学生之间的距离,只要条件足够,学生能跨时间学习老师的课程,老师和学生之间能跨空间进行实时的交互,教师能够更及时的了解学生的学习进度与不足,学生能及时反馈自身的学习情况。贫困地区的学生更能接触到更加优质的教育资源,这对培育社会所需的人才有了更充足的来源,让学生得到了向上的机遇。

利用多媒体信息技术,可以将语文教学内容制作成教学课件,然后将文中描述的内容和意境更直观地展现给学生,从而有效地促进学生的形象和思维两方面能力有效的形成和发展。设想一下,在教学的过程中,教师如果利用多媒体的课件在学生面前以视频图像的形式播放文字表达,再加上在这种音与形同时出现的情况下,教师和视频的配合,音与音的配合,使学生更有效地掌握文字中的艺术形象。另一方面,通过合理利用教学课件的声像、动画功能,使学生更容易理解课文,如在向学生讲解优秀文学作品时,运用多媒体技术,结合文章内容制作教学课件,利用教学课件展示文中描述的主要场景,通过教学课件和教师讲解设备的共性,让学生更深刻地体验和理解文学作品。

为了进一步推动学生在网络上的运用,更好地为学习学生的朋友特别是学生老师服务,特用Spring体系制作出中学语文学习系统,以更好地为学生服务。

一,项目简介

本系统主要分为前台和后台管理,其中用户前台主要功能有账号管理功能、课程列表功能、课程详情功能、我的课程功能;后台的主要功能有学生用户管理功能、教师用户管理功能、课程信息管理功能、视频信息管理功能、课件信息管理功能、评论信息管理功能、测试信息管理等。

12个核心功能描述如下:

账号管理功能:用户注册、用户登录。

课程列表功能:课程列表。

课程详情功能:教学视频、课件信息、评论、测试、优秀作文。

我的课程功能:课程学习。

学生用户管理功能:新增学生信息、删除学生信息、编辑学生信息、修改学生密码。

教师用户管理功能:新增教师信息、删除教师信息、编辑教师信息、修改教师密码。

课程信息管理功能:新增课程信息、删除课程信息、编辑课程信息、审核课程信息。

视频信息管理功能:新增视频信息、删除视频信息、编辑视频信息、审核视频信息。

课件信息管理功能:新增课件、删除课件、编辑课件、审核课件。

评论信息管理功能:查看评论、回复评论、删除评论。

测试信息管理功能:新增测试题目、查看学生做题情况、审核测试题目、删除测试题目。

二,环境介绍

语言环境:Java:  jdk1.8

数据库:Mysql: mysql5.7

应用服务器:Tomcat:  tomcat8.5.31

开发工具:IDEA或eclipse

后台开发技术:Springboot+mybatis

前台开发技术:html+bootstrap

三,系统展示

5.1 账号管理模块实现

用户注册界面如图5-1所示,登录界面如图5-2所示,后台修改密码如图5-3所示。

账号管理包括用户的注册、用户的登录和登出,用户进入系统后,首先进行注册,输入姓名、密码、学号、性别和班级,然后使用学号和密码进行登录,如果用户想要修改密码需联系教师或者管理员进行修改。

 

图5-1 注册界面

图5-2 登录界面

 

5.2 课程列表模块实现

主页课程列表界面如图5-4所示。

课程列表功能包括了展示初中三年每个学期的语文课程,用户可以在前台页查看课程。

 

图5-4 课程列表界面

5.3 课程详情功能模块实现

课程详情学习界面教学视频界面如图5-5所示;课件(教材资料)界面如图5-6、5-7所示;评论界面如图5-8所示;测试界面如图5-9所示。
用户点击开始学习可进入课程详情界面,课程详情功能包括教学视频、课件信息、评论、测试、优秀作文等;

 

图5-5 教学视频界面

图5-6 课件界面

 

5.4 我的课程模块实现

我的课程界面如图5-10所示。
用户进入主页点击我的课程进入我的课程界面

                                  图5-10 我的课程界面

 

5.5 学生用户管理模块实现

学生用户管理界面如图5-11示。
学生用户管理功能包括新增学生信息、编辑学生信息、删除学生信息和修改学生密码等功能

图5-11 学生用户管理界面

 

5.6 教师用户管理模块实现

教师用户管理界面如图5-12所示。

教师用户管理功能包括新增教师信息、编辑教师信息、删除教师信息和修改教师密码

图5-12 教师用户管理界面

 

5.7 课程信息管理模块实现

教师后台课程信息管理界面如图5-13所示,管理员后台课程信息管理界面如图5-14所示。

课程信息管理是由教师发布课程和管理员审核课程的一项功能,用户可以浏览到课程信息

图5-13 教师后台课程信息管理界面

 

图5-14 管理员后台课程信息管理界面

5.8 视频信息管理模块实现

教师后台视频信息管理界面如图5-15所示,管理员后台视频信息管理界面如图5-16所示。

视频信息管理是由教师发布视频和管理员审核视频的一项功能,用户可以浏览到教学视频信息。

 

图5-13 教师后台视频信息管理界面

 

四,核心代码展示

package com.onlineeducation.onlineeducation.controller;

import com.onlineeducation.onlineeducation.common.Constants;
import com.onlineeducation.onlineeducation.common.Result;
import com.onlineeducation.onlineeducation.common.ResultGenerator;
import com.onlineeducation.onlineeducation.config.annotation.TokenToAdmin;
import com.onlineeducation.onlineeducation.entity.Admin;
import com.onlineeducation.onlineeducation.entity.Announcement;
import com.onlineeducation.onlineeducation.entity.Student;
import com.onlineeducation.onlineeducation.service.AdminService;
import com.onlineeducation.onlineeducation.utils.PageResult;
import com.onlineeducation.onlineeducation.utils.PageUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.util.Map;

@RestController
public class AdminController {

    @Autowired
    private AdminService adminService;

    @RequestMapping(value = "/admins/login", method = RequestMethod.POST)
    public Result loginAdmin(@RequestBody Admin admin) {
        Result result = ResultGenerator.genFailResult("登录失败");
        if (StringUtils.isEmpty(admin.getAdminName()) || StringUtils.isEmpty(admin.getAdminPassword())) {
            result.setMessage("请填写登录信息!");
            return result;
        }
        Admin loginUser = adminService.login(admin.getAdminName(), admin.getAdminPassword());
        if (loginUser != null) {
            result = ResultGenerator.genSuccessResult(loginUser);
            return result;
        }
        return result;
    }







}
package com.onlineeducation.onlineeducation.controller;


import com.onlineeducation.onlineeducation.common.Constants;
import com.onlineeducation.onlineeducation.common.Result;
import com.onlineeducation.onlineeducation.common.ResultGenerator;
import com.onlineeducation.onlineeducation.config.annotation.TokenToAdmin;
import com.onlineeducation.onlineeducation.entity.Admin;
import com.onlineeducation.onlineeducation.entity.Announcement;
import com.onlineeducation.onlineeducation.entity.Student;
import com.onlineeducation.onlineeducation.entity.Test;
import com.onlineeducation.onlineeducation.service.AnnouncementService;
import com.onlineeducation.onlineeducation.service.TestService;
import com.onlineeducation.onlineeducation.utils.PageResult;
import com.onlineeducation.onlineeducation.utils.PageUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

import java.util.Map;

@RestController
public class AnnouncementController {

    @Autowired
    private AnnouncementService announcementService;

    @RequestMapping(value = "/announcements/list", method = RequestMethod.GET)
    public Result listAnnouncement(@RequestParam Map<String, Object> params ) {
        if (StringUtils.isEmpty(params.get("page")) || StringUtils.isEmpty(params.get("limit"))) {
            return ResultGenerator.genErrorResult(Constants.RESULT_CODE_PARAM_ERROR, "参数异常!");
        }
        PageUtil pageUtil = new PageUtil(params);
        //查询列表数据
        PageResult announcementPage = announcementService.getAnnouncementPage(pageUtil);
        return ResultGenerator.genSuccessResult(announcementPage);
    }

    @RequestMapping(value = "/announcements/save", method = RequestMethod.POST)
    public Result saveAnnouncement(@RequestBody Announcement announcement, @TokenToAdmin Admin loginUser) {
        if (loginUser == null) {
            return ResultGenerator.genErrorResult(Constants.RESULT_CODE_NOT_LOGIN, "未登录!");
        }
        //验证参数
        if (StringUtils.isEmpty(announcement.getContent()) || StringUtils.isEmpty(announcement.getTitle())) {
            return ResultGenerator.genErrorResult(Constants.RESULT_CODE_PARAM_ERROR, "参数异常!");
        }
        //查询数据库 排除同名的可能
        Announcement tempAnnouncement = announcementService.selectByAnnouncementTitle(announcement.getTitle());
        if (tempAnnouncement != null) {
            return ResultGenerator.genErrorResult(Constants.RESULT_CODE_PARAM_ERROR, "该公告已存在勿重复添加!");
        }
        //向数据库中新增公告
        if (announcementService.saveAnnouncement(announcement,loginUser) > 0) {
            return ResultGenerator.genSuccessResult();
        } else {
            return ResultGenerator.genFailResult("添加失败");
        }
    }

    //数据回显
    @RequestMapping(value = "/announcements/info/{id}", method = RequestMethod.GET)
    public Result info(@PathVariable("id") Long id) {
        Announcement announcement = announcementService.selectByAnnouncementId(id);
        return ResultGenerator.genSuccessResult(announcement);
    }

    @RequestMapping(value = "/announcements/updateAnnouncement", method = RequestMethod.POST)
    public Result updateStudentPassword(@RequestBody Announcement announcement,@TokenToAdmin Admin loginUser) {
        //验证参数
        if (announcement.getId() == null || StringUtils.isEmpty(announcement.getTitle()) || StringUtils.isEmpty(announcement.getContent())) {
            return ResultGenerator.genErrorResult(Constants.RESULT_CODE_PARAM_ERROR, "参数异常!");
        }
        if (loginUser == null) {
            return ResultGenerator.genErrorResult(Constants.RESULT_CODE_NOT_LOGIN, "未登录!");
        }
        //查询数据库 排除无此公告的问题
        Announcement temp = announcementService.selectByAnnouncementId(announcement.getId());
        if (temp == null) {
            return ResultGenerator.genErrorResult(Constants.RESULT_CODE_PARAM_ERROR, "无此公告!");
        }
        //修改记录
        if (announcementService.updateAnnouncement(announcement,loginUser) > 0) {
            return ResultGenerator.genSuccessResult();
        } else {
            return ResultGenerator.genFailResult("修改失败");
        }
    }

    @RequestMapping(value = "announcements/delete", method = RequestMethod.DELETE)
    public Result deleteAnnouncement(@RequestBody Integer[] ids) {
        if (ids.length < 1 ) {
            return ResultGenerator.genErrorResult(Constants.RESULT_CODE_PARAM_ERROR, "参数异常!");
        }
        if (announcementService.deleteAnnouncementBatch(ids) > 0) {
            return ResultGenerator.genSuccessResult();
        } else {
            return ResultGenerator.genFailResult("删除失败");
        }
    }
}

package com.onlineeducation.onlineeducation.controller;


import com.onlineeducation.onlineeducation.common.Constants;
import com.onlineeducation.onlineeducation.common.Result;
import com.onlineeducation.onlineeducation.common.ResultGenerator;
import com.onlineeducation.onlineeducation.config.annotation.TokenToTeacher;
import com.onlineeducation.onlineeducation.entity.*;
import com.onlineeducation.onlineeducation.service.*;
import com.onlineeducation.onlineeducation.utils.PageResult;
import com.onlineeducation.onlineeducation.utils.PageUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

@Controller
public class CourseController {

    @Autowired
    private CourseService courseService;

    @Autowired
    private VideoService videoService;

    @Autowired
    private CoursewareService coursewareService;

    @Autowired
    private MessageService messageService;

    @Autowired
    private TestService testService;

    @Autowired
    private StudentService studentService;

    @Autowired
    private TeacherService teacherService;


    @GetMapping("/courses/list")
    @ResponseBody
    public Result listCourse(@RequestParam Map<String, Object> params, @TokenToTeacher Teacher loginUser) {
        if (StringUtils.isEmpty(params.get("page")) || StringUtils.isEmpty(params.get("limit"))) {
            return ResultGenerator.genErrorResult(Constants.RESULT_CODE_PARAM_ERROR, "参数异常!");
        }

        PageUtil pageUtil = new PageUtil(params);
        if(loginUser != null)
        {
            pageUtil.put("teacherID",loginUser.getId());
        }
        //查询列表数据
        PageResult coursePage = courseService.getCoursePage(pageUtil);
        return ResultGenerator.genSuccessResult(coursePage);
    }

    @PostMapping("/courses/save")
    @ResponseBody
    public Result saveCourse(@RequestBody Course course, @TokenToTeacher Teacher loginUser) {
        if(loginUser == null){
            return ResultGenerator.genErrorResult(Constants.RESULT_CODE_NOT_LOGIN, "未登录!");
        }
        //验证参数
        if(StringUtils.isEmpty(course.getCourseName()) || StringUtils.isEmpty(course.getDescription())
                || StringUtils.isEmpty(course.getImageURL())){
            return ResultGenerator.genErrorResult(Constants.RESULT_CODE_PARAM_ERROR,"参数异常!");
        }
        //向数据库中新增课程
        if(courseService.saveCourse(course,loginUser) > 0){
            return ResultGenerator.genSuccessResult();
        }else {
            return ResultGenerator.genFailResult("添加失败");
        }
    }

    @GetMapping("/courses/info/{id}")
    @ResponseBody
    public Result detail(@PathVariable("id") Integer id) {
        if (id < 1) {
            return ResultGenerator.genErrorResult(Constants.RESULT_CODE_PARAM_ERROR, "参数异常!");
        }
        Course course = courseService.queryById(id);
        if (course == null) {
            return ResultGenerator.genErrorResult(Constants.RESULT_CODE_PARAM_ERROR, "暂无数据!");
        } else {
            return ResultGenerator.genSuccessResult(course);
        }
    }

    @PostMapping( "/courses/update")
    @ResponseBody
    public Result updateCourse(@RequestBody Course course) {
        if (course.getId()==null || course.getId() < 1 || StringUtils.isEmpty(course.getImageURL())
                || StringUtils.isEmpty(course.getCourseName()) || StringUtils.isEmpty(course.getDescription())) {
            return ResultGenerator.genErrorResult(Constants.RESULT_CODE_PARAM_ERROR, "参数异常!");
        }
//        Course tempCourse = courseService.queryById(course.getId());
//        if (tempCourse == null) {
//            return ResultGenerator.genErrorResult(Constants.RESULT_CODE_PARAM_ERROR, "无此记录!");
//        }
        if (courseService.updateCourse(course) > 0) {
            return ResultGenerator.genSuccessResult();
        } else {
            return ResultGenerator.genFailResult("修改失败");
        }
    }

    @PostMapping("courses/checked")
    @ResponseBody
    public Result checkCourse(@RequestBody Course course) {
        if (StringUtils.isEmpty(course.getIsChecked())) {
            return ResultGenerator.genErrorResult(Constants.RESULT_CODE_PARAM_ERROR, "参数异常!");
        }
        if (courseService.checkCourse(course) > 0) {
            return ResultGenerator.genSuccessResult();
        } else {
            return ResultGenerator.genFailResult("操作失败");
        }
    }

    @DeleteMapping("courses/delete")
    @ResponseBody
    public Result deleteCourse(@RequestBody Integer[] ids) {
        if (ids.length < 1) {
            return ResultGenerator.genErrorResult(Constants.RESULT_CODE_PARAM_ERROR, "参数异常!");
        }
        if (courseService.deleteBatch(ids) > 0) {
            return ResultGenerator.genSuccessResult();
        } else {
            return ResultGenerator.genFailResult("删除失败");
        }
    }

    @GetMapping("teacher/courses/getTeacherCourses")
    @ResponseBody
    public Result getTeacherCourses(HttpServletRequest request,@TokenToTeacher Teacher loginTeacher){
        if (loginTeacher == null) {
            return ResultGenerator.genErrorResult(Constants.RESULT_CODE_PARAM_ERROR, "未登录!");
        }
        List<Course> teacherCourses = courseService.getTeacherCourseList(loginTeacher.getId());
        request.setAttribute("teacherCourses",teacherCourses);
        return ResultGenerator.genSuccessResult(teacherCourses);
    }

    @GetMapping("teacher/teacherStudent.html")
    public String getTeacherCoursesInThymeleaf(HttpServletRequest request){
        Cookie[] cookies = request.getCookies();
        for (Cookie cookie : cookies) {
            if ("token".equals(cookie.getName())) {
                String token = cookie.getValue();
                Teacher loginTeacher = teacherService.getTeacherUserByToken(token);
                Long tid = loginTeacher.getId();
                List<Course> teacherCourses = courseService.getTeacherCourseList(tid);
                request.setAttribute("teacherCourses",teacherCourses);
                break;
            }
        }
        return "teacher/teacherStudent";
    }


//    学生端
    @GetMapping("/index-login.html")
    public String listStudentCourse(HttpServletRequest request) {
        List<Course> courses = courseService.getCourseList();
        request.setAttribute("courses",courses);
        Cookie[] cookies = request.getCookies();
        for (Cookie cookie : cookies) {
            if ("token".equals(cookie.getName())) {
                String token = cookie.getValue();
                Student loginStudent = studentService.getStudentUserByToken(token);
                Long sid = loginStudent.getId();
                request.setAttribute("sid",sid);
                break;
            }else{
                request.setAttribute("sid",null);
            }
        }
        return "index-login";
    }

    @GetMapping("/index.html")
    public String listStudentCourseWithoutLogin(HttpServletRequest request) {
        List<Course> courses = courseService.getCourseList();
        request.setAttribute("courses",courses);

        return "index";
    }


    @GetMapping("/myCourses/{sid}.html")
    public String listMyCourse(@PathVariable("sid")Integer sid,HttpServletRequest request){

        List<Course> myCourses = courseService.getMyCourseList(sid);
        if(myCourses.size() > 0){
            request.setAttribute("myCourses",myCourses);
        }else{
            request.setAttribute("myCourses",null);
        }

        return "myCourse";
    }

    @GetMapping("/courses/detail/{id}.html")
    public String detailCourse(@PathVariable("id")Integer id,HttpServletRequest request){
        Cookie[] cookies = request.getCookies();
        for (Cookie cookie : cookies) {
            if ("token".equals(cookie.getName())) {
                String token = cookie.getValue();
                Student loginStudent = studentService.getStudentUserByToken(token);
                if(loginStudent != null){
                    Long sid = loginStudent.getId();
                    request.setAttribute("sid",sid);
                    break;
                }else{
                    break;
                }

            }else{
                request.setAttribute("sid",null);
            }
        }
        Course course = courseService.queryById(id);
        String courseName = course.getCourseName();
        List<Video> courseVideos = videoService.selectVideoByCourseName(courseName);
        List<Courseware> coursewares = coursewareService.selectCoursewareByCourseName(courseName);
        List<String> fileNames = new ArrayList<>();
        for(int i = 0; i < coursewares.size(); i++) {
            fileNames.add(coursewares.get(i).getCoursewareURL());
        }
        for(int j = 0; j < coursewares.size(); j++){
            coursewares.get(j).setExtensions((fileNames.get(j).substring(fileNames.get(j).lastIndexOf("."))));
        }
        List<Test> tests = testService.selectByCourseName(courseName);
        request.setAttribute("course",course);
        if(courseVideos.size() > 0){
            Video firstVideo = courseVideos.get(0);
            request.setAttribute("firstVideo",firstVideo);
            request.setAttribute("courseVideos",courseVideos);
        }else{
            request.setAttribute("firstVideo",null);
            request.setAttribute("courseVideos",null);
        }
        if(coursewares.size() > 0){
            request.setAttribute("coursewares",coursewares);
        }else{
            request.setAttribute("coursewares",null);
        }
        if(tests.size() > 0){
            request.setAttribute("tests",tests);
        }else{
            request.setAttribute("tests",null);
        }

        /**
         * 根据课程id查询该课程下的所有留言
         */
        List<Message> allMessages = messageService.queryByCourseID(id);
        if(allMessages == null || allMessages.size() == 0){
            request.setAttribute("messages",null);
//            return null;
        }else{
            List<Message> messages = new ArrayList<>();
            List<Message> parents = new ArrayList<>();
            for(Message message : allMessages){
                if (message.getParentID() == null){
                    messages.add(message);
                    parents.add(message);
                }else{
                    boolean foundParent = false;
                    for(Message parent : parents){
                        if (message.getParentID() == parent.getId()){
                            if(parent.getChild() == null){
                                parent.setChild(new ArrayList<>());
                            }
                            parent.getChild().add(message);
                            parents.add(message);
                            foundParent = true;
                            break;
                        }
                    }
                    if(!foundParent){
                        throw new RuntimeException("can not find the parent message");
                    }
                }
            }
            request.setAttribute("messages",messages);
        }
        return "detail";
    }

    @GetMapping("/courses/detail/videoPlay/{courseID}/{videoID}.html")
    public String videoPlay(@PathVariable("courseID")Integer courseID,@PathVariable("videoID")Integer videoID,HttpServletRequest request){
        Cookie[] cookies = request.getCookies();
        for (Cookie cookie : cookies) {
            if ("token".equals(cookie.getName())) {
                String token = cookie.getValue();
                Student loginStudent = studentService.getStudentUserByToken(token);
                Long sid = loginStudent.getId();
                request.setAttribute("sid",sid);
                break;
            }else{
                request.setAttribute("sid",null);
            }
        }
        Video video = videoService.getVideoById(videoID);
        request.setAttribute("video",video);
        Course course = courseService.queryById(courseID);
        String courseName = course.getCourseName();
        List<Video> courseVideos = videoService.selectVideoByCourseName(courseName);
        List<Courseware> coursewares = coursewareService.selectCoursewareByCourseName(courseName);
        List<String> fileNames = new ArrayList<>();
        for(int i = 0; i < coursewares.size(); i++) {
            fileNames.add(coursewares.get(i).getCoursewareURL());
        }
        for(int j = 0; j < coursewares.size(); j++){
            coursewares.get(j).setExtensions((fileNames.get(j).substring(fileNames.get(j).lastIndexOf("."))));
        }
        List<Test> tests = testService.selectByCourseName(courseName);
        request.setAttribute("course",course);
        if(courseVideos.size() > 0){
            Video firstVideo = courseVideos.get(0);
            request.setAttribute("firstVideo",firstVideo);
            request.setAttribute("courseVideos",courseVideos);
        }else{
            request.setAttribute("firstVideo",null);
            request.setAttribute("courseVideos",null);
        }
        if(coursewares.size() > 0){
            request.setAttribute("coursewares",coursewares);
        }else{
            request.setAttribute("coursewares",null);
        }
        if(tests.size() > 0){
            request.setAttribute("tests",tests);
        }else{
            request.setAttribute("tests",null);
        }

        /**
         * 根据课程id查询该课程下的所有留言
         */
        List<Message> allMessages = messageService.queryByCourseID(courseID);
        if(allMessages == null || allMessages.size() == 0){
            request.setAttribute("messages",null);
//            return null;
        }else{
            List<Message> messages = new ArrayList<>();
            List<Message> parents = new ArrayList<>();
            for(Message message : allMessages){
                if (message.getParentID() == null){
                    messages.add(message);
                    parents.add(message);
                }else{
                    boolean foundParent = false;
                    for(Message parent : parents){
                        if (message.getParentID() == parent.getId()){
                            if(parent.getChild() == null){
                                parent.setChild(new ArrayList<>());
                            }
                            parent.getChild().add(message);
                            parents.add(message);
                            foundParent = true;
                            break;
                        }
                    }
                    if(!foundParent){
                        throw new RuntimeException("can not find the parent message");
                    }
                }
            }
            request.setAttribute("messages",messages);
        }

        return "video";
    }
}

五,项目总结

突然爆发的流行病使大家措手不及。但在中央和国家领导下,新冠已经取得阶段性大胜利。然而,疫情还是存在,传染的风险依然有可能。学习系统已经成为能够确保广大学生顺利完成学业的有效途径。国家颁布的“不停课”指示,将在线学习系统推向了高潮。教育行业的红利已经来到,而且来得这么的突然。为了得到这波红利,迅速得到广大的市场,专注于企业办公的各大厂商已经开始了在线学习平台的搭建。腾讯课堂是一家知识教育公司,开通了在线直播的带有教学的功能。还有小通、云朵课堂等等在线学习平台。教育领域的平台多年来一直在发展,但现在迅速增长。的确,在当下的互联网时代,互联网速度非常快,这也是学习系统最大的技术保障。学习系统蓬勃发展的主要原因是为了解决一些线下学习无法得到解决的问题。

第一条:昂贵的教学成本;大家都知道,全球地价持续上涨,但民众的收入却没有跟上。因此,对于大家来说,当收入的单位价格没有多少调整空间时,支出就会继续增加,导致学习成本的增加。

第二条:内容不容易呈现;线下教学最常见的情况就是很多的学生和一块黑板的教室。教师用粉笔在黑板上画知识的速写、PPT和公式。然而,在今天这个知识爆炸的时代,能用粉笔写出来的知识实在有限,无法实现互联网中音乐、视频、链接等丰富的文字内容。

第三条:时间利用率低;显然,在线下的教育过程中,总会有一些学生因为各种原因不来上课,教师也不会因为一个学生缺席而不上课。这样,未到的学生的学习内容就跟不上了。

在线学习系统解决了上述所有问题,所以研究并开发一个中学语文学习系统是很有必要的.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/63652.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

对文本进行情感分析(分类)snownlp模块

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 对文本进行情感分析(分类) snownlp模块 选择题 对于以下python代码表述错误的一项是? from snownlp import SnowNLP myText我爱学python&#xff01; print("【显示】text"…

艾美捷ICT FLICA天冬氨酸蛋白酶(Caspase)活性检测试剂盒说明书

Caspases在细胞凋亡和炎症中发挥重要作用。艾美捷ICT FLICA天冬氨酸蛋白酶&#xff08;Caspase&#xff09;活性检测试剂盒被研究人员用于通过培养的细胞和组织中的胱天蛋白酶活性来定量凋亡。用FAM FLICA caspase-1测定试剂盒检测caspase-1活性。该体外试验使用荧光抑制剂探针…

[附源码]计算机毕业设计JAVA音乐网站

[附源码]计算机毕业设计JAVA音乐网站 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven…

一步登顶还是步步维艰?Java 资深架构师撰下的“阿里 P7 成神之路”

很多刚接触到 Java 开发的程序员都以为 Java 资深开发工程师就已经是 Java 开发的顶了&#xff0c;或者是不清楚架构师是干什么的。 举个例子说吧&#xff1a; 房屋建造。 架构师们根据房屋造型的需求设计出适合的构造&#xff0c;然后再反复测算这个框架搭建的可行性&#…

C++文件操作

文章目录计算机文件到底是什么&#xff08;通俗易懂&#xff09;&#xff1f;C文件类&#xff08;文件流类&#xff09;及用法详解C open 打开文件&#xff08;含打开模式一览表&#xff09;使用 open 函数打开文件使用流类的构造函数打开文件文本打开方式和二进制打开方式的区…

Jetson nano 系统安装

ContentsJetson Nano在 EMMC 上安装镜像U 盘启动和 TF 卡启动U 盘启动 (复制 eMMC 上系统)TF 卡启动设置远程登录系统SDK 安装使用 SDK Manager 安装使用指令安装Linux 操作基础文件传输、系统备份风扇配置IMX219-83 Stereo CameraAI 环境搭建PIP3 安装安装机器学习领域重要的安…

MOSFET 和 IGBT 栅极驱动器电路的基本原理学习笔记(二)栅极驱动参考

栅极驱动参考 1.PWM直接驱动 2.双极Totem-Pole驱动器 3.MOSFET Totem-Pole驱动器 4.速度增强电路 5.dv/dt保护 1.PWM直接驱动 在电源应用中&#xff0c;驱动主开关晶体管栅极的最简单方法是利用 PWM 控制其直接控制栅极&#xff0c;如 图 8 所示。 直接栅极驱动最艰巨的任务…

5‘-二磷酸鸟嘌呤核苷-岩藻糖二钠盐,GDP-Fucose,15839-70-0

中文名 5-二磷酸鸟嘌呤核苷-岩藻糖二钠盐 英文名 Guanosine 5′-diphospho-β-L-fucose sodium salt 英文别名 [(2R,3S,4R,5R)-5-(2-Amino-6-oxo-1,6-dihydro-9H-purin-9-yl)-3,4-dihydroxytetrahydro-2-furanyl]methyl (3S,4R,5S,6S)-3,4,5-trihydroxy-6-methyltetrahydro-2…

Linux Podman安装DVWA靶场环境

一、DVWA靶场环境简介 1.DVWA一个用来进行安全脆弱性鉴定的PHP/MySQL Web应用&#xff0c;旨在为安全专业人员测试自己的专业技能和工具提供合法的环境&#xff0c;帮助web开发者更好的理解web应用安全防范的过程。 ​ 2.DVWA 一共包含了十个攻击模块&#xff0c;分别是&#…

Unity + Mirror实现原创卡牌游戏局域网联机

资源下载地址 局域网联机插件 Mirror&#xff1a;Mirror | 网络 | Unity Asset Store 本地客户端测试多人游戏&#xff08;不用打包&#xff09;插件 &#xff1a; ParrelSync Mirror官方文档&#xff1a;General - Mirror (gitbook.io) Mirror使用 前置准备 导入Mirror …

UNet 网络做图像分割DRIVE数据集

目录 1. 介绍 2. 搭建 UNet 网络 3. dataset 数据加载 4. train 训练网络 5. predict 分割图像 6. show 7. 完整代码 1. 介绍 项目的目录如下所示 DRIVE 存放的是数据集predict 是待分割的图像result 里面放分割predict 的结果dataset 是处理数据的文件、model存放une…

day5_redis学习

文章目录秒杀优化阻塞队列实现消息队列Redis实现消息队列List实现消息队列PubSub实现消息队列Stream实现消息队列发布以及查看探店笔记点赞以及点赞排行榜秒杀优化 上面的过程中&#xff0c;我们进行秒杀操作的基本步骤为: 所以这时候整个过程就耗费较长的时间&#xff0c;因…

【1687. 从仓库到码头运输箱子】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 你有一辆货运卡车&#xff0c;你需要用这一辆车把一些箱子从仓库运送到码头。这辆卡车每次运输有 箱子数目的限制 和 总重量的限制 。 给你一个箱子数组 boxes 和三个整数 portsCount, maxBoxes 和 m…

python大数据毕业设计选题题目大全

文章目录0 前言1 大数据相关题目2 开题指导2.1 起因2.2 如何避坑(重中之重)2.3 为什么这么说呢&#xff1f;2.4 难度把控2.5 题目名称3 最后0 前言 这是学长亲手整理的&#xff0c;大数据毕设选题系列第二篇&#xff0c;都是经过学长精心审核的题目&#xff0c;适合作为毕设&a…

CPP 核心编程6-多态

#include "iostream" using namespace std;//多态 class Animal { public:void speak(){cout << "动物在说话" << endl;} };class Cat : public Animal { public:void speak(){cout << "cat在说话" << endl;} };//地址早…

【C语言航路】第七站:结构体初阶

目录 一、结构体的声明 1.结构的基础知识 2.结构的声明 3.结构体成员的类型 4.结构体变量的定义和初始化 二、结构体成员的访问 三、结构体传参 总结 一、结构体的声明 1.结构的基础知识 结构是一些值的集合&#xff0c;这些值称为成员变量&#xff0c;结构的每个成员可…

《少有人走的路:心智成熟的旅程》笔记

几乎人人都有心理问题&#xff0c;只是程度不同而已。 几乎人人都有横渡不同的心里疾病&#xff0c;只是得病的时间不同而已。 ps : 许多人都没有付出足够的时间和精力&#xff0c;去解决知识、社交、心理方面的问题 作者序言&#xff1a; 目录 一、痛苦的价值 二、对待痛苦…

Linux操作系统粘滞位(解决上篇文章提出的问题)

前言 &#xff1a; 在上一篇Linux操作系统的博客中提出了&#xff0c;一个问题就是在一个公共目录里&#xff0c;假如我们有了对目录写的权限&#xff0c;我们就能进行创建属于我们自己的文件&#xff0c;并且给这个文件进行设置他的权限&#xff0c;我们发现虽然是我的文件&am…

抗疫行动题材网页设计 大学生最美逆行者感动人物网页代码 众志成城万众一心抗击疫情HTML网页设计

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

【GD32F427开发板试用】+DHT11温湿度监测

本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动&#xff0c;更多开发板试用活动请关注极术社区网站。作者&#xff1a;四季的温度 在完成所有项目后会开源&#xff0c;本次依旧是想做一个通过DHT11采集信息&#xff0c;OLED显示&#xff0c;ESP8266上传&#xff…