文档+开题报告+项目源码及数据库文件
【摘要】随着信息化技术的不断发展,教育领域的信息化建设正强有力推进教育教学改革的进程。网络课堂作为一种基于信息技术和互联网的新型教学模式,为越来越多的教育机构所采用,其增长速度超过面授课堂网络。教育异军突起,呈爆炸式增长。我国网络教育呈现逐年增长趋势,中国海外大部分教育机构无一不设有网络课堂,尤其在云计算时代,依托于成熟的云平台,无疑更加有利于网络课堂的搭建与开设。

本系统基于LAMP环境(即Linux /Apache / MySQL / PHP)对EduSoho开源框架的二次开发,应用层基于Symfony2 Web Framework自主研发的一套高可用性、高可伸缩性的开发框架,平台基于此框架构建,具备在云中部署、Scale Out的能力,完成基于B/S模式的网络课堂系统开发的基本流程。详细阐述了基于云平台的网络课堂的分析、设计、实现及测试过程,系统包括:个人信息显示、课程管理模块、在线学习模块、在线题库考试模块、在线视频点播模块、讨论区管理模块、用户管理模块。系统的研发完全依据软件工程技术的要求,经测试验证该系统运行稳定,基本能满足学生与教师基于网络平台开展网络课堂开展的需要。

关键词】PHP语言;网络课堂;B/S模式;云平台;二次开发

[Abstract] With the continuous development of information technology, information technology education sector is strong advance the process of educational reform. As a new network classroom teaching mode based on information technology and the Internet, more and more educational institutions adopted by the growth rate of more than face to face classroom network. Education sprung exploding. Network Education in China year by year growth trend, the majority of overseas Chinese institutions and both have internet classroom, especially in the cloud computing era, relying on proven cloud platform, is undoubtedly more conducive to build and set up the network classroom.

The system is based on LAMP environment (ie Linux / Apache / MySQL / PHP) EduSoho secondary development of open-source framework, Symfony2 Web Framework-based application-layer self-developed set of high availability, high scalability development framework, based on this platform framework Construction, with deployment in the cloud, the ability to Scale Out to complete the basic process based on B / S mode network classroom system development. Elaborate network-based classroom cloud platform analysis, design, implementation and testing process, the system comprising: a display personal information, course management module, online learning modules, online examination module exam, the online video-on-demand module, discussion management module, users management module. R & D system based solely on technical requirements for engineering software has been tested to verify that the system is stable, to meet the basic needs of students and teachers in the classroom to carry out a web-based network platform.

[Keywords] PHP language Online Class B / S Mode Cloud Platform Secondary development

目 录

1 绪论 1

1.1 选题的目的和意义 1

1.1.1选题目的 1

1.1.2研究意义 2

1.2 国内外现状和发展趋势 2

2 研究内容 3

2.1 设计内容 3

2.1.1 系统主要功能: 3

2.1.2 系统主要模块: 4

2.2 系统可行性分析 4

2.2.1 业务流程上的可行性 4

2.2.2 开发技术上的可行性 4

2.2.3 资源与环境上的可行性 6

2.3 系统基础和条件 6

2.4系统的主要特点 6

3系统分析 7

3.1 系统整体架构 7

3.2 系统用例 7

3.2.1 管理员用例图 8

3.2.2 教师用例图 9

3.2.3 学生用例图 9

3.1 系统功能 10

3.1.1学生信息管理 11

3.1.2课程管理 11

3.1.3在线考试 12

3.1.4讨论组管理 13

3.1.5 直播信息管理 14

3.1.6成绩管理 15

4 数据库设计 16

4.1 数据库设计分析 17

4.2 系统E-R图 18

4.3 系统数据库数据字典 18

4.4 表间关系图: 27

5 系统设计 27

5.1 登录模块 28

5.1.1 教师端登录模块 28

5.1.2 学生端登录模块 28

5.2 学生信息管理模块 28

5.3 课程管理模块 28

5.4 在线考试模块 28

5.5 讨论组管理 29

5.6直播信息管理 29

5.7查看成绩情况模块 29

5.7.1教师查看学生成绩情况模块 30

5.7.2学生查看个人成绩情况模块 30

6 系统实现 30

6.1 登录页面 30

6.2 个人中心页面 31

6.3 课程管理页面 32

6.3.1 课时管理 33

6.3.2 文件管理 34

6.3.3 课程基本信息页面 35

6.4 在线考试模块页面 35

6.4.1 题目管理页面 36

6.4.2 试卷管理页面 36

6.4.3 在线考试页面 36

6.5 讨论组模块页面 38

6.5.1 讨论组管理页面 39

6.5.2 话题页面 39

6.6 学生管理页面 40

6.7首页 41

6.7.1 前台首页 42

6.7.2 教师后台管理页面 42

7 系统测试 43

7.1测试目标 43

7.2项目测试说明 43

7.2.1 步骤及操作 44

7.2.2 主要测试结果 44

7.3测试评价 46

8 结论 46

参考文献 47

致 谢 48

附录 48

1、登录页面 49

1.1 View层代码 49

1.2 Control层代码 51

2、前台首页代码 54

2.1 View层代码 54

2.2 Controller层代码 61

3、课程管理页面 70

3.1 View层代码 71

3.2 Controller层代码 74

4、在线考试代码 81

4.1 View层代码 82

4.2 controller层代码 82

5、讨论组页面 105

5.1 view层代码 106

5.2 controller层代码 109

前台首页代码
2.1 View层代码
{% extends 'TopxiaWebBundle::layout.html.twig' %}{% block keywords %}{{ setting('site.seo_keywords') }}{% endblock %}
{% block description %}{{ setting('site.seo_description') }}{% endblock %}{% set siteNav = "/" %}
{% set bodyClass = 'homepage' %}
{% set script_controller = 'index' %}{% block full_content %}<!-- 轮播 -->{{ block_show('jianmo:home_top_banner') }}<!-- 课程列表 --><section class="course-list-section" id="course-list">
{% include 'TopxiaWebBundle:Default:course-grid-with-condition.html.twig' %}</section>{% set RecentLiveCourses = data('RecentLiveCourses',{ 'count':4}) %}{% if RecentLiveCourses %}<section class="live-course-section"><div class="container"><div class="text-line gray"><h5><span>近期直播</span><div class="line"></div></h5><!-- <div class="subtitle">实时跟踪直播课程,避免课程遗漏。</div> --></div><div class="course-list"><div class="row">{% for course in RecentLiveCourses %}<div class="col-lg-3 col-md-4 col-sm-6">{%   include 'TopxiaWebBundle:Course:Widget/course-grid.html.twig' with {course:course} %}{% set lesson = course['lesson']|default(null) %}{% if lesson and "now"|date("U") >= lesson.startTime and "now"|date("U") <= lesson.endTime %}<div class="course-date visible-lg"><div class="btn-circle btn-live  btn-circle-md"><i class="es-icon es-icon-videocam"></i></div><div class="date">正在直播</div></div>{% else %}<div class="course-date visible-lg"><div class="btn-circle btn-circle-md"><i class="es-icon es-icon-videocam"></i></div><div class="date">{{ lesson.startTime|date('n月j日 H:i') }}</div></div>{% endif %}</div>{% endfor %}{% set emptyCourseNum = 4 - RecentLiveCourses|length %}{% if emptyCourseNum > 0 %}{% for i in range(1, emptyCourseNum) %}<div class="col-lg-3 col-md-4 col-sm-6 visible-lg"><div class="course-item course-default"><i class="es-icon es-icon-videocam"></i><br>敬请期待</div><div class="course-date"><div class="btn-circle btn-circle-md"><i class="es-icon es-icon-accesstime"></i></div></div> </div>{% endfor %}{% endif %}</div></div><div class="text-center mvl"><a href="{{ path('live_course_explore') }}" class="btn btn-default btn-lg">更多直播1 <i class="mrs-o es-icon es-icon-chevronright"></i></a></div></div></section>{% endif %}<!-- 推荐班级 -->{%set RecommendClassrooms = data('RecommendClassrooms',{'count':4})%}{% if RecommendClassrooms %}<section class="class-section"><div class="container"><div class="text-line"><h5><span>推荐{{ setting('classroom.name')|default("班级") }}</span><div class="line"></div></h5><!-- <div class="subtitle">班级化学习体系,给你更多的课程相关服务。</div> --></div><div class="recommend-class-list row">{% for classroom in RecommendClassrooms %}<div class="col-md-3 col-sm-6">{% include 'ClassroomBundle:Classroom:class-grid.html.twig' %} </div>{% endfor %}</div><div class="text-center mvl"><a href="{{ path('classroom_explore') }}" class="btn btn-default btn-lg">更多{{ setting('classroom.name')|default("班级") }} <i class="mrs-o es-icon es-icon-chevronright"></i></a></div></div></section>{% endif %}<!-- 小组动态 -->{% set groups = data('HotGroup',{'count':6}) %}{% if groups %}<section class="group-dynamic"><div class="container"><div class="text-line gray"><h5><span>小组动态</span><div class="line"></div></h5><!-- <div class="subtitle">参与小组,结交更多同学,关注课程动态。</div> --></div><div class="group-dynamic-body row"><div class="col-md-6"><div class="panel panel-default index-group"><div class="panel-heading"><a href="{{ path('group') }}" class="more"><i class="es-icon es-icon-morehoriz"></i></a><h3 class="panel-title"><i class="es-icon es-icon-whatshot pull-left"></i>热门小组</h3></div><div class="panel-body row">{% for group in groups %}<div class="media media-group col-md-6 col-sm-4"><div class="media-left"><a href="{{ path('group_show',{id:group.id}) }}">{% if group.logo %}<img class="avatar-square-md" src="{{file_path(group.logo)}}" alt="{{ group.title }}">{% else %}<img class="avatar-square-md" src="{{asset('assets/img/default/group.png')}}"  alt="{{ group.title }}">{% endif %}</a></div><div class="media-body"><div class="title"><a class="link-light" href="{{ path('group_show',{id:group.id}) }}">{{ group.title }}</a></div><div class="metas"><span><i class="es-icon es-icon-people"></i>{{ group.memberNum }}</span><span><i class="es-icon es-icon-textsms"></i>{{ group.threadNum }}</span></div></div></div>{% endfor %}</div></div></div><div class="col-md-6"><div class="panel panel-default index-dynamic"><div class="panel-heading"><h3 class="panel-title"><i class="es-icon es-icon-recentactors pull-left"></i>学员动态</h3></div><div class="panel-body">{% set statuses = data('LatestStatuses', {mode:'simple', count: 4,private:0}) %}{% for status in statuses %}<div class="media media-dynamic"><div class="media-left">{{ web_macro.user_avatar(status.user, '', 'avatar-sm') }}</div><div class="media-body"><div class="title">{{ web_macro.user_link(status.user) }}</div><div class="content">{{ status.message|raw }}</div><span class="date">{{status.createdTime | smart_time}}</span></div></div>{% endfor %}</div></div></div></div></div></section>{% endif %}<!-- 推荐教师 -->{% set teachers = data('RecommendTeachers',{'count':4}) %}{% if teachers %}<section class="recommend-teacher"><div class="container"><div class="text-line"><h5><span>推荐教师</span><div class="line"></div></h5><!-- <div class="subtitle">名师汇集,保证教学质量与学习效果。</div> --></div><div class="row">{% for teacher in teachers %}{% set profile = teacher.profile %}{% set isFollowed = teacher.isFollowed %}<div class="col-md-3 col-sm-6">{% include 'TopxiaWebBundle:Teacher:teacher-item.html.twig' %}</div>{% endfor %}</div><div class="text-center mvl"><a href="{{ path('teacher') }}" class="btn btn-default btn-lg">更多教师 <i class="mrs-o es-icon es-icon-chevronright"></i></a></div></div></section>{% endif %}{% endblock %}
2.2 Controller层代码
<?phpnamespace Topxia\WebBundle\Controller;use Topxia\Common\ArrayToolkit;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
use Topxia\System;
use Topxia\Common\Paginator;class DefaultController extends BaseController
{public function indexAction (){$conditions = array('status' => 'published', 'parentId' => 0, 'recommended' => 1);$courses = $this->getCourseService()->searchCourses($conditions, 'recommendedSeq', 0, 12);$orderBy = 'recommendedSeq';if (empty($courses)) {$orderBy = 'latest';unset($conditions['recommended']);$courses = $this->getCourseService()->searchCourses($conditions, 'latest', 0, 12);}$coinSetting=$this->getSettingService()->get('coin',array());if(isset($coinSetting['cash_rate'])){$cashRate=$coinSetting['cash_rate'];}else{$cashRate=1;}$courseSetting = $this->getSettingService()->get('course', array());if (!empty($courseSetting['live_course_enabled']) && $courseSetting['live_course_enabled']) {$recentLiveCourses = $this->getRecentLiveCourses();} else {$recentLiveCourses = array();}$categories = $this->getCategoryService()->findGroupRootCategories('course');$blocks = $this->getBlockService()->getContentsByCodes(array('home_top_banner'));$user = $this->getCurrentUser();if(!empty($user['id'])){$this->getBatchNotificationService()->checkoutBatchNotification($user['id']);}return $this->render('TopxiaWebBundle:Default:index.html.twig', array('courses' => $courses,'categories' => $categories,'blocks' => $blocks,'recentLiveCourses' => $recentLiveCourses,'consultDisplay' => true,'cashRate' => $cashRate,'orderBy' => $orderBy));}public function userlearningAction(){$user = $this->getCurrentUser();$courses = $this->getCourseService()->findUserLearnCourses($user->id, 0, 1);if (!empty($courses)) {foreach ($courses as $course) {$member = $this->getCourseService()->getCourseMember($course['id'], $user->id);$teachers = $this->getUserService()->findUsersByIds($course['teacherIds']);}$nextLearnLesson = $this->getCourseService()->getUserNextLearnLesson($user->id, $course['id']);$progress = $this->calculateUserLearnProgress($course, $member);} else {$course = array();$nextLearnLesson = array();$progress = array();$teachers = array();}return $this->render('TopxiaWebBundle:Default:user-learning.html.twig', array('user' => $user,'course' => $course,'nextLearnLesson' => $nextLearnLesson,'progress'  => $progress,'teachers' => $teachers));}protected function getRecentLiveCourses(){$recenntLessonsCondition = array('status' => 'published','endTimeGreaterThan' => time(),);$recentlessons = $this->getCourseService()->searchLessons($recenntLessonsCondition,  array('startTime', 'ASC'),0,20);$courses = $this->getCourseService()->findCoursesByIds(ArrayToolkit::column($recentlessons, 'courseId'));$liveCourses = array();foreach ($recentlessons as $lesson) {$course = $courses[$lesson['courseId']];if ($course['status'] != 'published') {continue;}if($course['parentId'] != 0){continue;   }$course['lesson'] = $lesson;$course['teachers'] = $this->getUserService()->findUsersByIds($course['teacherIds']);if (count($liveCourses) >= 8) {break;}$liveCourses[] = $course;}return  $liveCourses;}public function promotedTeacherBlockAction(){$teacher = $this->getUserService()->findLatestPromotedTeacher(0, 1);if ($teacher) {$teacher = $teacher[0];$teacher = array_merge($teacher,$this->getUserService()->getUserProfile($teacher['id']));}if(isset($teacher['locked']) && $teacher['locked'] !== '0'){$teacher = null;}return $this->render('TopxiaWebBundle:Default:promoted-teacher-block.html.twig', array('teacher' => $teacher,));}public function latestReviewsBlockAction($number){$reviews = $this->getReviewService()->searchReviews(array('private' => 0), 'latest', 0, $number);$users = $this->getUserService()->findUsersByIds(ArrayToolkit::column($reviews, 'userId'));$courses = $this->getCourseService()->findCoursesByIds(ArrayToolkit::column($reviews, 'courseId'));return $this->render('TopxiaWebBundle:Default:latest-reviews-block.html.twig', array('reviews' => $reviews,'users' => $users,'courses' => $courses,));}public function topNavigationAction($siteNav = null,$isMobile= false){$navigations = $this->getNavigationService()->getOpenedNavigationsTreeByType('top');return $this->render('TopxiaWebBundle:Default:top-navigation.html.twig', array('navigations' => $navigations,'siteNav' => $siteNav,'isMobile' => $isMobile));}public function footNavigationAction(){$navigations = $this->getNavigationService()->findNavigationsByType('foot', 0, 100);return $this->render('TopxiaWebBundle:Default:foot-navigation.html.twig', array('navigations' => $navigations,));}public function customerServiceAction(){$customerServiceSetting = $this->getSettingService()->get('customerService', array());return $this->render('TopxiaWebBundle:Default:customer-service-online.html.twig', array('customerServiceSetting' => $customerServiceSetting,));}public function jumpAction(Request $request){$courseId = intval($request->query->get('id'));if($this->getCourseService()->isCourseTeacher($courseId, $this->getCurrentUser()->id)){$url = $this->generateUrl('live_course_manage_replay', array('id' => $courseId));}else{$url = $this->generateUrl('course_show', array('id' => $courseId));}$jumpScript = "<script type=\"text/javascript\"> if (top.location !== self.location) {top.location = \"{$url}\";}</script>";return new Response($jumpScript);}public function CoursesCategoryAction(Request $request){$conditions = $request->query->all();$conditions['status'] = 'published';$conditions['parentId'] = 0;$categoryId = $conditions['categoryId'];if ($conditions['categoryId']  != 'all') {$conditions['categoryId'] = intval($conditions['categoryId']);}else{unset($conditions['categoryId']);}$orderBy = $conditions['orderBy'];if ($orderBy == 'recommendedSeq') {  $conditions['recommended'] = 1; }unset($conditions['orderBy']);$courses = $this->getCourseService()->searchCourses($conditions,$orderBy, 0, 12);return $this->render('TopxiaWebBundle:Default:course-grid-with-condition.html.twig',array('orderBy' => $orderBy,'categoryId' => $categoryId,'courses' => $courses));}protected function calculateUserLearnProgress($course, $member){if ($course['lessonNum'] == 0) {return array('percent' => '0%', 'number' => 0, 'total' => 0);}$percent = intval($member['learnedNum'] / $course['lessonNum'] * 100) . '%';return array ('percent' => $percent,'number' => $member['learnedNum'],'total' => $course['lessonNum']);}protected function getSettingService(){return $this->getServiceKernel()->createService('System.SettingService');}protected function getNavigationService(){return $this->getServiceKernel()->createService('Content.NavigationService');}protected function getBlockService(){return $this->getServiceKernel()->createService('Content.BlockService');}protected function getCourseService(){return $this->getServiceKernel()->createService('Course.CourseService');}protected function getReviewService(){return $this->getServiceKernel()->createService('Course.ReviewService');}protected function getCategoryService(){return $this->getServiceKernel()->createService('Taxonomy.CategoryService');}protected function getAppService(){return $this->getServiceKernel()->createService('CloudPlatform.AppService');}protected function getClassroomService() {return $this->getServiceKernel()->createService('Classroom:Classroom.ClassroomService');}protected function getBatchNotificationService(){return $this->getServiceKernel()->createService('User.BatchNotificationService');}private function getBlacklistService() {return $this->getServiceKernel()->createService('User.BlacklistService');}
}



































基于PHP开发的云平台网络课堂教学学习互动平台设计相关推荐

  1. CVPR 2022 | GeoTransformer:基于Transformer的点云配准网络

    ©作者 | 秦政 单位 | 国防科技大学 研究方向 | 三维视觉 本文提出了一种基于 Transformer 的点云配准网络.通过引入点云中的全局结构信息,GeoTransformer 能够显著提高 ...

  2. java毕业设计——基于Java+Java ME的无线网络移动端的俄罗斯方块游戏设计与实现(毕业论文+程序源码)——俄罗斯方块游戏

    基于Java+Java ME的无线网络移动端的俄罗斯方块游戏设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于Java+Java ME的无线网络移动端的俄罗斯方块游戏设计与实现,文章末尾附有 ...

  3. python开发实训平台_一体化教学实训平台解决方案

    泰迪科技根据高校实践教学中的痛点,首次提出"鱼骨教学法"的概念.以企业真实需求为导向,学生学习技能紧紧围绕企业实际应用需求,将学生掌握的理论知识,通过企业案例的形式进行衔接,达到知 ...

  4. node.js云学堂微信小程序学习系统的设计与实现毕业设计源码011735

    Node.js云学堂微信小程序 摘要 信息化社会内需要与之针对性的信息获取途径,但是途径的扩展基本上为人们所努力的方向,由于站在的角度存在偏差,人们经常能够获得不同类型信息,这也是技术最为难以攻克的课 ...

  5. 学习《小学数学课堂教学中“核心问题”设计的策略探究》心得体会

    学习<小学数学课堂教学中"核心问题"设计的策略探究>心得体会 延安市新区第一小学  张婷婷 提问在教学过程中教师最常用的教学手段之一.优秀的数学教师都善于把握问题的力量 ...

  6. 凯云科技——嵌入式系统测试教学实训平台ETest_TP

    1)产品简介 嵌入式系统测试教学实训平台(ETest Training Platform,简称:ETest_TP )适用于各类高等院校与培训机构在嵌入式系统测试方面的科研与教学以及军工研究所.各研发型 ...

  7. javaweb基于SSM开发民宿预定系统(前台+后台)+ 课程设计 +源码

    基于SSM开发民宿预定系统(前台+后台)+视频讲解:(毕业设计/课程设计) 开发工具: MyEclipse(eclipse/idea)+Jdk+Tomcat+MySQL数据库 演示视频: javawe ...

  8. 云计算机教室课堂教学设计方案,专题十 多媒体教室环境下的课堂教学设计

    专题十 多媒体教室环境下的课堂教学设计 多媒体教室是一种典型的信息化教学环境,由于其集成了多种媒体设备,丰富了教学手段,因此有效地应用多媒体教室,可以使教学内容以多种方式呈现,既能将抽象的事物具体化, ...

  9. 基于Rainbond开发Python云原生应用

    组件开发 这里使用 基于源码中的 Dockerfile 创建组件,因为这种方式能兼容所有类型的项目. 识别为 Dockerfile 类型的源码将使用类似于 docker build -t xxx/xx ...

最新文章

  1. 网易2019实习生Java编程题
  2. Docker中Maven私服的搭建
  3. 异常捕获,返回错误码code给前端
  4. python爬取网页内容_Python爬虫原理解析
  5. Spring MVC异常处理详解 ExceptionHandler good
  6. Java 嵌入 SPL 轻松实现数据分组
  7. 计算某天是星期几数字或文本形式的JAVA工具方法
  8. Flink kafka source sink 源码解析
  9. pybaobabdt 推荐一款超高颜值的模型可视化库
  10. [ArcGIS] 空间分析(三)栅格数据
  11. 登录samba后提示“你可能没有权限访问网络资源”的解决方法
  12. PowerDesigner16.5 逆向生成物理模型
  13. 计算机小学数学辅助教学缺点及对策 论文,小学数学第二学段图形与几何领域的作业设计研究...
  14. Linux非交互式修改用户密码
  15. 【JavaLearn】#(23)JSP相关语法、HTTP协议、Servlet介绍、Servlet生命周期、请求和响应、相对路径、转发和重定向
  16. 路由dns劫持,路由器DNS劫持简单实现和防范分析
  17. JSP空间网站上传后发生404解决思路
  18. 面试加试c语言_经典面试题目C语言
  19. Android是个什么东西?
  20. 创意大会与当地学校持续游戏

热门文章

  1. Java生成四种格式的二维码
  2. 学Python兼职赚钱是真的吗
  3. 刘涛代言的美丽田园冲刺港股:年内盈利2亿 突击分红1.2亿
  4. 【iOS-Cocos2d游戏开发之十】添加粒子系统特效并解决粒子特效与Layer之间的坐标问题;
  5. 小米-测试工程师面试20190418
  6. shamir秘密共享方案_Shamir秘密分享的初学者指南
  7. 深度学习基础:机器学习中的基函数与函数空间
  8. 有道云怎么换行_『42』怎样令为知笔记中的长网址换行?
  9. 常见的几种html转pdf方法
  10. 一种基于加密域的数字图像水印算法的设计与实现(附Matlab源码)