郑逸凡
(福州外语外贸学院理工学院,福建 福州 350202)
随着科技的发展与社会的变迁,仅依靠传统的课堂教学方式已无法帮助学生充分利用时间,保障高效学习.本研究基于Spring+SpringMVC+MyBatis框架开发一套在线教学系统.这一系统使得学生可以提前预习相应课程内容,课后及时地巩固和复习已经学过的知识,更好地与老师和其他同学交流和互动,具有很好的实用价值.
本系统为广大学生搭建一个在线学习交流的平台,分为后台管理和前台教学这两个子系统.后台管理系统的主要功能模块有:管理员用户管理、权限管理、角色管理、学科管理、班级管理、学习卡管理、篇章管理、段落管理;前台教学系统的主要功能模块有:用户注册登录、查看学习卡、学习课程、查看问题、提问问题、回答问题、系统消息通知.
根据系统的功能、业务、用途、规模等特点,在数据存储访问方面,在经典的MySQL关系数据库的基础上增加Redis缓存服务器,并且把文件的存储、访问交给专门的文件服务器,视频课程管理也交给专门的视频服务器[1].
系统使用maven管理项目结构,把整个项目拆分为7个工程模块:第一个是parent模块,该模块是pom工程,主要用来统一管理依赖jar的版本,其他模块都继承此模块;第二个是pojo模块,该模块是jar工程,包含了项目用到的pojo类;第三个是common模块,该模块是jar工程,主要包含工具类以及其他通用的类;第四个是mapper模块,该模块是jar工程,实现DAO层的功能;第五个是service模块,该模块是jar工程,实现service层的功能;第六个是admin模块,该模块是war工程,同时也是后台管理系统,包括controller层、jsp页面、前端组件等;第七个是front模块,该模块是war工程,同时也是前台系统,包括controller层、jsp页面、前端组件等.
系统整体采用Spring+SpringMVC+MyBatis开发框架,前端主要采用Bootstrap、UEditor、layer、laypage等框架和组件,另外系统还采用了pageHelper、云存储、云视频等技术.
在本系统中,数据库设计遵循统一的设计规范:每张表都有一个逻辑主键列id,即id bigint primary key auto_increment;使用中间表来表示两张表的多对多关联关系;对中间表的关联关系进行外键约束;对非中间表使用isDeleted列进行软删除[2].比如权限管理模块的相关表设计如下:
管理员用户表T_AdminUsers(id,account,passwordSalt,password,isDisabled,isDeleted);
角色表T_Roles(id,name,description,isDeleted);
权限表T_Permissions(id,path,description,isDeleted);
管理员用户和角色关联表T_AdminUserRoles(id,adminUserId,roleId);
角色和权限关联表T_RolePermissions(id,roleId,permissionId).
系统admin模块和front模块均为war工程,继承parent模块,依赖service模块,传递依赖common、mapper、pojo模块,主要包含controller层的类、jsp页面、前端组件、配置文件等.系统使用MyBatis作为持久层框架,配置文件为mybatis-config.xml;使用Spring作为bean容器,配置文件为beans.xml;使用SpringMVC作为前端MVC框架,配置文件为dispatcher-servlet.xml;在web.xml中初始化Spring和SpringMVC;使用log4j2作为日志实现.例如,在web.xml中配置Spring容器的代码如下:
整个项目采用统一的utf-8编码,服务器采用tomcat8,在整个系统开发之前统一设置编码过滤器,具体的操作是:在web.xml文件中配置Spring框架提供的CharacterEncodingFilter过滤器,对用户的post请求和响应进行统一的字符编码[3].
该模块是pom工程,是其他模块的父工程,主要用来管理依赖jar的版本,管理JDK编译器版本等,例如pom.xml文件中MyBatis和Spring整合的依赖配置如下:
该模块是jar工程,主要包含一些通用的工具类和工具方法,其他模块可以方便地共享这些工具类和方法,主要包括AjaxResult、ImageCodeUtils、EmailUtils、JsonUtils、JedisUtils、UploadUtils、CommonUtils等工具类.例如,JsonUtils类中的toJson方法可以把bean对象转换为json字符串,核心代码如下:
private staticObjectMapper objectMapper = new ObjectMapper();
public static StringtoJson(Object obj) {
objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
objectMapper.setSerializationInclusion(Include.NON_NULL);
try {
returnobjectMapper.writeValueAsString(obj);
} catch (JsonProcessingException e) {
throw newRuntimeException(e);
}
}
每张数据库表对应一个pojo类,表中的列和pojo类中的字段一一对应(isDeleted字段除外);pojo类中基本数据类型的字段使用包装类型进行声明;pojo类实现Serializable,并且使用id字段生成hashCode()和equals()方法;对于外键列对应的类的字段的类型,使用基本类型(包装类型);pojo类的字段类型不使用关联的pojo类,也不使用集合类型的字段[4].
首先声明一个通用的IMapper
select * fromT_Subjects where isDeleted=false
首先声明一个BaseService通用类,提供基本的增删改查分页排序功能;然后声明一个ManyToManyBaseService通用类,继承自BaseService,提供对中间表的其他功能;每个pojo类对应一个Service类.
BaseService类的成员变量mapper会自动根据泛型T的具体值注入对应的mapper对象,PageHelper是开源的分页组件,BaseService类的部分代码如下:
public classBaseService
@Autowired
privateIMapper
public List
PageHelper.orderBy(orderBy);
returnmapper.select(pojo);
}
}
该模块主要完成的是系统的后台管理,包括权限管理、学习卡管理、篇章和段落管理,总的设计思路是采用MVC的设计思想:首先利用前端框架制作页面的静态效果页,然后在控制器中编写相应的方法处理各种请求,当请求处理完成后将响应结果传递给视图页面进行渲染[5].
例如,当要进行学习卡的添加操作时,需要读取数据库中现有的所有学习卡,首先制作出学习卡的列表页面cardList.jsp,然后,在学习卡控制器CardController中编写addPage方法,从数据库中获取学习卡对象集合,最终传递给cardList.jsp视图页,addPage方法具体实现代码如下:
@RequestMapping(value = "/add.do", method = RequestMethod.GET)
publicModelAndView addPage() {
List
ModelAndView modelAndView = new ModelAndView("card/add");
modelAndView.addObject("subjectList", subjectList);
returnmodelAndView;
}
admin模块中学习卡管理的最终页面效果如图1所示:
图1 admin模块最终效果图
该模块主要完成的是系统的前台功能,包括个人信息的管理、学习进度的跟踪、学生和老师之间的互动等功能,该模块总的设计思想与admin模块相似,也是采用MVC设计思想.其中文件上传的功能采用的是云存储技术,目的是为了降低主应用服务器的处理压力.利用云存储进行文件上传的实现步骤是:首先获得云存储服务器的AccessKey和SecretKey,然后根据获取的存储空间所在区域创建相应的配置对象,接着根据配置信息创建文件上传管理对象,最后调用put方法把用户选择的文件上传到云服务器上.文件上传到云服务器的主要代码如下:
Setting bucket =settingService.selectOneByName("upload_bucket");
SettingaccessKey = settingService.selectOneByName("upload_accessKey");
SettingsecretKey = settingService.selectOneByName("upload_secretKey");
Authauth = Auth.create(accessKey, secretKey);
Zone z =Zone.autoZone();
Configuration c = new Configuration(z);
UploadManager uploadManager = new UploadManager(c);
Response res =uploadManager.put(file, file.getName(), auth.uploadToken(bucket));
front模块为学生提供了在线提问等功能,方便学生与老师实现互动交流,比如学生在线提问的最终页面效果如图2所示:
图2 front模块中学生在线提问页面效果图
基于Spring+SpringMVC+MyBatis技术极大地提高了web系统的开发效率,对系统进行分模块设计有利于系统的扩展性和可维护性.在线教学系统的最终呈现效果,页面简洁、风格统一,系统操作简单,能够提供在线的学习和交流的功能.在线学习平台不仅轻松解决了学习资料的共享问题,而且极大地方便了学生利用碎片化的时间进行学习和提高,师生之间的互动性也明显增强.