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

简介: 视频学习|Springboot在线学习系统

项目编号: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和公式。然而,在今天这个知识爆炸的时代,能用粉笔写出来的知识实在有限,无法实现互联网中音乐、视频、链接等丰富的文字内容。

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

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

相关文章
|
1月前
|
前端开发 Java 开发者
Spring生态学习路径与源码深度探讨
【11月更文挑战第13天】Spring框架作为Java企业级开发中的核心框架,其丰富的生态系统和强大的功能吸引了无数开发者的关注。学习Spring生态不仅仅是掌握Spring Framework本身,更需要深入理解其周边组件和工具,以及源码的底层实现逻辑。本文将从Spring生态的学习路径入手,详细探讨如何系统地学习Spring,并深入解析各个重点的底层实现逻辑。
59 9
|
1月前
|
XML Java 数据库连接
SpringBoot集成Flowable:打造强大的工作流管理系统
在企业级应用开发中,工作流管理是一个核心组件,它能够帮助我们定义、执行和管理业务流程。Flowable是一个开源的工作流和业务流程管理(BPM)平台,它提供了强大的工作流引擎和建模工具。结合SpringBoot,我们可以快速构建一个高效、灵活的工作流管理系统。本文将探讨如何将Flowable集成到SpringBoot应用中,并展示其强大的功能。
141 1
|
1月前
|
JavaScript Java 项目管理
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。
|
2月前
|
前端开发 Java 数据库
SpringBoot学习
【10月更文挑战第7天】Spring学习
38 9
|
25天前
|
Java Kotlin 索引
学习Spring框架特性及jiar包下载
Spring 5作为最新版本,更新了JDK基线至8,修订了核心框架,增强了反射和接口功能,支持响应式编程及Kotlin语言,引入了函数式Web框架,并提升了测试功能。Spring框架可在其官网下载,包括文档、jar包和XML Schema文档,适用于Java SE和Java EE项目。
27 0
|
2月前
|
存储 安全 Java
打造智能合同管理系统:SpringBoot与电子签章的完美融合
【10月更文挑战第7天】 在数字化转型的浪潮中,电子合同管理系统因其高效、环保和安全的特点,正逐渐成为企业合同管理的新宠。本文将分享如何利用SpringBoot框架实现一个集电子文件签字与合同管理于一体的智能系统,探索技术如何助力合同管理的现代化。
104 4
|
2月前
|
前端开发 Java Apache
SpringBoot实现电子文件签字+合同系统!
【10月更文挑战第15天】 在现代企业运营中,合同管理和电子文件签字成为了日常活动中不可或缺的一部分。随着技术的发展,电子合同系统因其高效性、安全性和环保性,逐渐取代了传统的纸质合同。本文将详细介绍如何使用SpringBoot框架实现一个电子文件签字和合同管理系统。
95 1
|
2月前
|
XML Java 数据格式
Spring学习
【10月更文挑战第6天】Spring学习
22 1
|
1月前
|
JavaScript NoSQL Java
CC-ADMIN后台简介一个基于 Spring Boot 2.1.3 、SpringBootMybatis plus、JWT、Shiro、Redis、Vue quasar 的前后端分离的后台管理系统
CC-ADMIN后台简介一个基于 Spring Boot 2.1.3 、SpringBootMybatis plus、JWT、Shiro、Redis、Vue quasar 的前后端分离的后台管理系统
40 0
|
Java API Spring
Spring学习路径
Spring作为一个优秀的开源企业级框架有着一下特点 开源框架 简化企业级应用开发的流程 Spring是一个JavaSE/EE的一站式框架 优点在于 方便解耦 AOP的编程支持 声明式事务的支持 可以引入jUnit4,方便程序测试 对优秀开源框架的支持,方便集成 降低JavaEE API的使用难度.
2515 0