摘 要
信息化社会内需要与之针对性的信息获取途径,但是途径的扩展基本上为人们所努力的方向,由于站在的角度存在偏差,人们经常能够获得不同类型信息,这也是技术最为难以攻克的课题。针对网络在线学习等问题,对网络在线学习网站进行研究分析。
在线学习网站主要功能模块包括首页、用户管理、课程信息、学习资源、教师公告管理、学习进度管理,采取面对对象的开发模式进行软件的开发和硬体的架设,能很好的满足实际使用的需求,完善了对应的软体架设以及程序编码的工作,采取MySQL作为后台数据的主要存储单元,采用ssm框架、Java技术、Ajax技术进行业务系统的编码及其开发,实现了本系统的全部功能。本次报告,首先分析了研究的背景、作用、意义,为研究工作的合理性打下了基础。针对在线学习网站的各项需求以及技术问题进行分析,证明了系统的必要性和技术可行性,然后对设计系统需要使用的技术软件以及设计思想做了基本的介绍,最后来实现在线学习网站和部署运行使用它。
【java|SSM在线学习网站的设计与实现毕业设计源码011451】关键词:在线学习;ssm框架;学习交流
Design and implementation of SSM online learning system
Abstract
In the information society, there is a need for targeted information access, but the expansion of access is basically the direction of people's efforts. Due to the deviation of the perspective, people can often obtain different types of information, which is also the most difficult subject for technology to overcome. Aiming at the problems of online learning, this paper studies and analyzes the online learning system.
The main functional modules of the online learning system include home page, user management, course information, learning resources, classroom announcement management and learning progress management. The object-oriented development mode is adopted for software development and hardware erection, which can well meet the needs of actual use, improve the corresponding software erection and program coding, take MySQL as the main storage unit of background data, adopt SSM framework, Java technology Ajax technology encodes and develops the business system, and realizes all the functions of the system. This report first analyzes the background, function and significance of the research, which lays a foundation for the rationality of the research work. This paper analyzes the various requirements and technical problems of the online learning system, proves the necessity and technical feasibility of the system, then makes a basic introduction to the technical software and design idea needed to design the system, and finally realizes the online learning system and deploys it.
Key words: Online learning;
SSM framework;
exchange of learning
目录
第1章 绪论
1.1 研究背景
1.2 国内外研究现状
1.3 论文组成结构
第2章 开发工具及相关技术介绍
2.1 HTTP协议
2.2 Java语言与JDK开发环境
2.3 SSM框架
2.4 Mysql数据库
第3章 系统分析
3.1 可行性分析
3.1.1 经济可行性
3.1.2 技术可行性
3.1.3 操作可行性
3.2 性能分析
3.3 系统操作流程
3.3.1用户登录流程 9
3.3.2信息添加流程 10
3.3.3信息删除流程 10
第4章 系统设计
4.1系统架构设计
4.2开发流程设计
4.3数据库设计 12
4.3.1实体ER图
4.3.2数据表 13
第5章 系统实现 17
5.1数据库访问层的实现 17
5.2注册模块的实现 20
5.3用户登录模块的实现 23
5.4 用户资料修改模块的实现 24
5.5学习资源模块的实现 28
5.6课程信息模块的实现 29
5.7用户管理模块的实现 31
5.8学习资源管理模块 33
5.9 教师公告管理模块的实现 34
第6章 系统测试 35
6.1测试目的 35
6.2 测试方案设计 35
6.2.1 测试策略 35
6.2.2 测试分析 35
6.3 测试结果 36
第7章 总结与展望 37
参考文献 38
致谢 40
- 绪论
- 研究背景
-
- 国内外研究现状
-
- 论文组成结构
本文共有七章,如下所示。
第一章概述了在线学习网站的研究目的和意义;精炼地总结了国内外在内的领域研究情况和未来的研究趋势,最后给出了论文的组成结构。
第二章简要概述了本文所用的开发技术和工具。
第三章简要对系统各业务流程进行需求分析、可行性分析。
第四章对在线学习网站进行设计。
第五章对在线学习网站进行实现,并贴出相关页面截图,语言描述出具体功能实现的操作方法。
第六章对在线学习网站采用测试用例的方式来对一些主要功能模块测试,最后得出测试结果。
第七章总结全文并对未来的研究做出展望。
- 开发工具及相关技术介绍
- HTTP协议
-
- Java语言与JDK开发环境
JDK为美国sun公司为java开发员所推出的一款全新产品,要是没有JDK的情况下,所安装的java程序也就无法运行。
-
- SSM框架
1.1 Spring
Spring就像是整个项目中装配bean的大工厂,在配置文件中可以指定使用特定的参数去调用实体类的构造方法来实例化对象。也可以称之为项目中的粘合剂。
Spring的核心思想是IoC(控制反转),即不再需要程序员去显式地`new`一个对象,而是让Spring框架帮你来完成这一切。
1.2 SpringMVC
SpringMVC在项目中拦截用户请求,它的核心Servlet即DispatcherServlet承担中介或是前台这样的职责,将用户请求通过HandlerMapping去匹配Controller,Controller就是具体对应请求所执行的操作。SpringMVC相当于SSH框架中struts。
1.3 mybatis
mybatis是对jdbc的封装,它让数据库底层操作变的透明。mybatis的操作都是围绕一个sqlSessionFactory实例展开的。mybatis通过配置文件关联到各实体类的Mapper文件,Mapper文件中配置了每个类对数据库所需进行的sql语句映射。在每次与数据库交互时,通过sqlSessionFactory拿到一个sqlSession,再执行sql命令。
页面发送请求给控制器,控制器调用业务层处理逻辑,逻辑层向持久层发送请求,持久层与数据库交互,后将结果返回给业务层,业务层将处理逻辑发送给控制器,控制器再调用视图展现数据。
-
- Mysql数据库
在WEB应用技术中, Mysql数据库支持不同的操作系统平台,虽然在不同平台下的安装和配置都不相同,但是差别也不是很大,Mysql在Windows平台下两种安装方式,二进制版和免安装版。安装完Mysql数据库之后,需要启动服务进程,相应的客户端就可以连接数据库,客户端可通过命令行或者图形界面工具登录数据库。
- 系统分析
- 可行性分析
-
-
- 经济可行性
-
-
-
- 技术可行性
-
-
-
- 操作可行性
-
3.2性能分析 在线学习网站的开发设计时一个独立的系统,以流行数据库进行数据的存储开发,主要是为了实现在线学习网站的用户角色及相对应的功能模块,让在线学习网站的管理不会存在管理差异、低效率,而是跟传统的学习方式恰好相反,在线学习网站的实现可以节约资源,并且对于业务的处理速度也提高,速度快、效率高,功能性强大。
3.3系统操作流程 3.3.1用户登录流程
对于系统的安全性的第一关,就是用户想要进入系统,必须通过登录窗口,输入自己的登录信息才可以进行登录,用户输入的信息准确无误后才可以进入到操作系统界面,进行功能模块的相对应操作,如果用户输入的信息不正确,则窗口出现提示框,用户登录失败,返回到第一步进行重新输入,如图3-1所示。
文章图片
图3-1登录操作流程图
3.3.2信息添加流程
对于在线学习网站,需要随时添加所需要的数据信息,对于用户添加信息,需要根据添加界面,根据选框的内容进行填写所要添加的数据信息,信息输入完成后判断数据信息是否符合要求,符合要求则添加完成,用户所添加的信息不符合要求,则需要返回到第一步,重新输入数据信息,再进行判断操作,如图3-2所示。
文章图片
图3-2 信息添加流程图
3.3.3信息删除流程
不管是哪个用户角色进入到不通的系统操作界面,都可以进行不同的信息内容的操作功能,对用系统数据信息的删除,用户一旦将信息删除,那么该删除的数据信息将无法恢复,所以用户在对数据删除事,一定判断删除的内容是否是确定要删除的,确定无误后选择确定删除操作,如图3-3所示。
文章图片
图3-3 信息删除流程图
- 系统设计
基于在线学习网站的设计基于现有的网络,可以实现管理员:用户管理、在线交流管理、课程分类管理、学习资源管理、教师公告管理、学习进度管理等详细的了解及统计分析。根据系统功能需求建立的模块关系图如下图:
文章图片
图4-1管理员功能模块图
4.2开发流程设计 在线学习网站的开发对学习模块和系统使用的数据库进行分析,编写代码开发,规划和操作是构建系统应用程序的必要三步曲,它决定了系统是否能够真正实现预设功能以及是否可以在成功设计后实施。在开发过程中,每个阶段必须严格按照线性顺序进行开发,并且在相应阶段生成的每个工作都可以通过技术进行验证和检查。确保一个阶段完成后是正确的,不会造成下一阶段拖拽现象,使系统完成设计功能后得到保证。
从在线学习网站的成功开发经验来看,上述方法效果最为明显,最大程度地降低了系统开发的复杂性。如图4-2所示。
文章图片
图4-2开发系统流程图
4.3数据库设计 数据库是信息系统的基础和核心。数据库设计的好坏直接影响到信息系统开发的成败。创建数据库表首先确定实体的属性和实体之间的关系。根据关系创建一个数据表。4.3.1实体ER图
数据库是整个软件编程中最重要的一个步骤,对于数据库问题主要是判定数据库的数量和结构公式的创建。展示系统使用的是Mysql进行对数据库进行管理,进行保证数据的安全性、稳定性等。
概念模型的设计是为了抽象真实世界的信息,并对信息世界进行建模。它是数据库设计的强大工具。数据库概念模型设计可以通过E-R图描述现实世界的概念模型。系统的E-R图显示了系统中实体之间的链接。而且Mysql数据库是自我保护能力比较强的数据库,下图主要是对数据库实体的E-R图:
(1) 课程信息实体图,如图4-3所示:
文章图片
图4-3 课程信息实体属性图
(2)学习资源实体图如图4-4所示:
文章图片
图4-4学习资源实体图
这些功能可以充分满足在线学习网站的需求。此系统功能较为全面如下图系统功能结构如图4-5所示。
文章图片
图4-5系统功能结构图
4.3.2数据表
我们可以根据数据结构的详细分析要求,我们根据输入和输出数据量的要求进行分析,确定什么表,结构之间的关系,我们可以验证,调整和完善,查询和浏览过程,可以实现数据库,以使用户对数据和功能有更多要求。
基于系统使用的数据库管理系统的特点,对数据库的概念模型进行了转换和构建。但是,这个系统只需要充分考虑在线学习网站的功能,而且组织比较清晰。
student表:
名称 |
类型 |
长度 |
不是null |
主键 |
注释 |
student_id |
int |
11 |
是 |
是 |
学生ID |
student_number |
varchar |
64 |
是 |
否 |
学号 |
gender |
varchar |
64 |
否 |
否 |
性别 |
examine_state |
varchar |
16 |
是 |
否 |
审核状态 |
recommend |
int |
11 |
是 |
否 |
智能推荐 |
user_id |
int |
11 |
是 |
否 |
用户ID |
create_time |
datetime |
0 |
是 |
否 |
创建时间 |
update_time |
timestamp |
0 |
是 |
否 |
更新时间 |
名称 |
类型 |
长度 |
不是null |
主键 |
注释 |
course_classification_id |
int |
11 |
是 |
是 |
课程分类ID |
type |
varchar |
64 |
否 |
否 |
类型 |
recommend |
int |
11 |
是 |
否 |
智能推荐 |
create_time |
datetime |
0 |
是 |
否 |
创建时间 |
update_time |
timestamp |
0 |
是 |
否 |
更新时间 |
名称 |
类型 |
长度 |
不是null |
主键 |
注释 |
course_information_id |
int |
11 |
是 |
是 |
课程信息ID |
course_number |
varchar |
64 |
是 |
否 |
课程编号 |
course_name |
varchar |
64 |
否 |
否 |
课程名称 |
type |
varchar |
64 |
否 |
否 |
类型 |
teacher |
int |
11 |
否 |
否 |
任课教师 |
course_cover |
varchar |
255 |
否 |
否 |
课程封面 |
course_announcement |
text |
0 |
否 |
否 |
课程公告 |
course_details_ |
longtext |
0 |
否 |
否 |
课程详情 |
hits |
int |
11 |
是 |
否 |
点击数 |
recommend |
int |
11 |
是 |
否 |
智能推荐 |
create_time |
datetime |
0 |
是 |
否 |
创建时间 |
update_time |
timestamp |
0 |
是 |
否 |
更新时间 |
名称 |
类型 |
长度 |
不是null |
主键 |
注释 |
learning_resource_id |
int |
11 |
是 |
是 |
学习资源ID |
resource_name |
varchar |
64 |
否 |
否 |
资源名称 |
type |
varchar |
64 |
否 |
否 |
类型 |
resource_cover |
varchar |
255 |
否 |
否 |
资源封面 |
upload_teacher |
int |
11 |
否 |
否 |
上传教师 |
learning_resource_ |
varchar |
255 |
否 |
否 |
学习资源 |
resource_supplement |
text |
0 |
否 |
否 |
资源补充 |
hits |
int |
11 |
是 |
否 |
点击数 |
praise_len |
int |
11 |
是 |
否 |
点赞数 |
recommend |
int |
11 |
是 |
否 |
智能推荐 |
create_time |
datetime |
0 |
是 |
否 |
创建时间 |
update_time |
timestamp |
0 |
是 |
否 |
更新时间 |
名称 |
类型 |
长度 |
不是null |
主键 |
注释 |
rate_of_learning_id |
int |
11 |
是 |
是 |
学习进度ID |
announcement_title |
varchar |
64 |
否 |
否 |
公告标题 |
publisher |
int |
11 |
否 |
否 |
发布人 |
student |
int |
11 |
否 |
否 |
学生 |
learning_attachment |
varchar |
255 |
否 |
否 |
学习附件 |
reporting_time |
date |
0 |
否 |
否 |
汇报时间 |
teacher_comments |
varchar |
64 |
否 |
否 |
教师评语 |
learning_progress_report |
text |
0 |
否 |
否 |
学习进度汇报 |
recommend |
int |
11 |
是 |
否 |
智能推荐 |
create_time |
datetime |
0 |
是 |
否 |
创建时间 |
update_time |
timestamp |
0 |
是 |
否 |
更新时间 |
名称 |
类型 |
长度 |
不是null |
主键 |
注释 |
teacher_id |
int |
11 |
是 |
是 |
教师ID |
teacher_job_number |
varchar |
64 |
是 |
否 |
教师工号 |
gender |
varchar |
64 |
否 |
否 |
性别 |
examine_state |
varchar |
16 |
是 |
否 |
审核状态 |
recommend |
int |
11 |
是 |
否 |
智能推荐 |
user_id |
int |
11 |
是 |
否 |
用户ID |
create_time |
datetime |
0 |
是 |
否 |
创建时间 |
update_time |
timestamp |
0 |
是 |
否 |
更新时间 |
名称 |
类型 |
长度 |
不是null |
主键 |
注释 |
teacher_announcement_id |
int |
11 |
是 |
是 |
教师公告ID |
announcement_title |
varchar |
64 |
否 |
否 |
公告标题 |
release_time |
date |
0 |
否 |
否 |
发布时间 |
release_type |
varchar |
64 |
否 |
否 |
发布类型 |
publisher |
int |
11 |
否 |
否 |
发布人 |
enclosure |
varchar |
255 |
否 |
否 |
附件 |
announcement_content |
text |
0 |
否 |
否 |
公告内容 |
hits |
int |
11 |
是 |
否 |
点击数 |
recommend |
int |
11 |
是 |
否 |
智能推荐 |
create_time |
datetime |
0 |
是 |
否 |
创建时间 |
update_time |
timestamp |
0 |
是 |
否 |
更新时间 |
- 系统实现
- 数据库访问层的实现
jdbc.driverClass=com.MySQL.jdbc.Driver
jdbc.url=jdbc:MySQL://localhost:3306/tsi
jdbc.username=root
jdbc.password=123
第一个参数代表MySQL数据库的驱动,第二个参数代表要连接的数据库,第三个和第四个参数代表数据库连接名和密码。
后台与数据库访问主要是通过HQL语句来进行查询的,查询语句中的表名是表格的实体类名,在这种查询语句中*是不允许使用的,除非适合聚合函数一起使用才可以。
-
- 注册模块的实现
用户注册流程图如下图所示。
文章图片
图5-1用户注册流程图
用户注册界面如下图所示。
图5-1用户注册界面图
用户注册代码如下:
/**
* 注册
* @return
*/
@PostMapping("register")
public Map signUp(HttpServletRequest request) throws IOException {
// 查询用户
Map query = new HashMap<>();
Map map = service.readBody(request.getReader());
query.put("username",String.valueOf(map.get("username")));
List list = service.selectBaseList(service.select(query, new HashMap<>()));
if (list.size()>0){
return error(30000, "用户已存在");
}
map.put("password",service.encryption(String.valueOf(map.get("password"))));
service.insert(map);
return success(1);
}
public Map readBody(BufferedReader reader){
BufferedReader br = null;
StringBuilder sb = new StringBuilder("");
try{
br = reader;
String str;
while ((str = br.readLine()) != null){
sb.append(str);
}
br.close();
String json = sb.toString();
return JSONObject.parseObject(json, Map.class);
}catch (IOException e){
e.printStackTrace();
}finally{
if (null != br){
try{
br.close();
}catch (IOException e){
e.printStackTrace();
}
}
}
return null;
}
public void insert(Map body){
E entity = JSON.parseObject(JSON.toJSONString(body),eClass);
baseMapper.insert(entity);
log.info("[{}] - 插入操作:{}",entity);
}
-
- 用户登录模块的实现
登录流程图如下图所示。
文章图片
图5-1登录流程图
用户登录界面如下图所示。
图5-1登录界面图
登录代码如下:
/**
* 登录
* @param data
* @param httpServletRequest
* @return
*/
@PostMapping("login")
public Map login(@RequestBody Map data, HttpServletRequest httpServletRequest) {
log.info("[执行登录接口]");
String username = data.get("username");
String email = data.get("email");
String phone = data.get("phone");
String password = data.get("password");
List resultList = null;
QueryWrapper wrapper = new QueryWrapper
Map map = new HashMap<>();
if(username != null && "".equals(username) == false){
map.put("username", username);
resultList = service.selectBaseList(service.select(map, new HashMap<>()));
}
else if(email != null && "".equals(email) == false){
map.put("email", email);
resultList = service.selectBaseList(service.select(map, new HashMap<>()));
}
else if(phone != null && "".equals(phone) == false){
map.put("phone", phone);
resultList = service.selectBaseList(service.select(map, new HashMap<>()));
}else{
return error(30000, "账号或密码不能为空");
}
if (resultList == null || password == null) {
return error(30000, "账号或密码不能为空");
}
//判断是否有这个用户
if (resultList.size()<=0){
return error(30000,"用户不存在");
}
User byUsername = (User) resultList.get(0);
Map groupMap = new HashMap<>();
groupMap.put("name",byUsername.getUserGroup());
List groupList = userGroupService.selectBaseList(userGroupService.select(groupMap, new HashMap<>()));
if (groupList.size()<1){
return error(30000,"用户组不存在");
}
UserGroup userGroup = (UserGroup) groupList.get(0);
//查询用户审核状态
if (!StringUtils.isEmpty(userGroup.getSourceTable())){
String res = service.selectExamineState(userGroup.getSourceTable(),byUsername.getUserId());
if (res==null){
return error(30000,"用户不存在");
}
if (!res.equals("已通过")){
return error(30000,"该用户审核未通过");
}
}
//查询用户状态
if (byUsername.getState()!=1){
return error(30000,"用户非可用状态,不能登录");
}
String md5password = service.encryption(password);
if (byUsername.getPassword().equals(md5password)) {
// 存储Token到数据库
AccessToken accessToken = new AccessToken();
accessToken.setToken(UUID.randomUUID().toString().replaceAll("-", ""));
accessToken.setUser_id(byUsername.getUserId());
tokenService.save(accessToken);
// 返回用户信息
JSONObject user = JSONObject.parseObject(JSONObject.toJSONString(byUsername));
user.put("token", accessToken.getToken());
JSONObject ret = new JSONObject();
ret.put("obj",user);
return success(ret);
} else {
return error(30000, "账号或密码不正确");
}
}
public String select(Map query,Map config){
StringBuffer sql = new StringBuffer("select ");
sql.append(config.get(FindConfig.FIELD) == null || "".equals(config.get(FindConfig.FIELD)) ? "*" : config.get(FindConfig.FIELD)).append(" ");
sql.append("from ").append("`").append(table).append("`").append(toWhereSql(query, "0".equals(config.get(FindConfig.LIKE))));
if (config.get(FindConfig.GROUP_BY) != null && !"".equals(config.get(FindConfig.GROUP_BY))){
sql.append("group by ").append(config.get(FindConfig.GROUP_BY)).append(" ");
}
if (config.get(FindConfig.ORDER_BY) != null && !"".equals(config.get(FindConfig.ORDER_BY))){
sql.append("order by ").append(config.get(FindConfig.ORDER_BY)).append(" ");
}
if (config.get(FindConfig.PAGE) != null && !"".equals(config.get(FindConfig.PAGE))){
int page = config.get(FindConfig.PAGE) != null && !"".equals(config.get(FindConfig.PAGE)) ? Integer.parseInt(config.get(FindConfig.PAGE)) : 1;
int limit = config.get(FindConfig.SIZE) != null && !"".equals(config.get(FindConfig.SIZE)) ? Integer.parseInt(config.get(FindConfig.SIZE)) : 10;
sql.append(" limit ").append( (page-1)*limit ).append(" , ").append(limit);
}
log.info("[{}] - 查询操作,sql: {}",table,sql);
return sql.toString();
}
public List selectBaseList(String select) {
List