项目编号: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和公式。然而,在今天这个知识爆炸的时代,能用粉笔写出来的知识实在有限,无法实现互联网中音乐、视频、链接等丰富的文字内容。
第三条:时间利用率低;显然,在线下的教育过程中,总会有一些学生因为各种原因不来上课,教师也不会因为一个学生缺席而不上课。这样,未到的学生的学习内容就跟不上了。
在线学习系统解决了上述所有问题,所以研究并开发一个中学语文学习系统是很有必要的.