# laboratory_system
我和一位全栈大佬的本科毕业设计-学院的实验课选课及实验室管理系统<br/>
**前端作者(其实全栈大佬)**:codingSSnail(1076841285@qq.com) <br/>
**后端作者**:jump-boy(hi_jumpboy@163.com)
## 项目简介
该项目设计是物电学院实验室选课系统的Web前后端设计,实现同学根据个人时间安排自主选课的功能,同时教师可以根据选课情况,进行
管理,如某个时间段的实验课选课学生人数过少可以另外更改开课时间或者做其他修改,这样为教师和学生都带来很大的便利,同时系统
还需要实现平台化打分,如为每个学生打总成绩时,平台会为教师提供参考成绩以及平时课堂情况,代替以往的手写填表式打分。另外平
台更加的自动化,如随堂打分,系统会自动的根据时间去进行判断,筛选出当前实验课信息以及学生信息。平台在为教师和学生带来便利
的同时,还为管理员提供了更大的权限,查看课程信息,成绩,学生选课情况等,使得管理员在第一时间可以清楚学院的课程管理情况,
同时系统还增加了实验室管理的功能,管理员在拥有更高权限的同时,可以起到更好的管理作用,为学院管理做出贡献。而课题设计正是
为实现这些功能以解决问题,同时保证系统可靠运行而进行的。<br/>
系统设计上采用了分层架构的思想,前后端之间的通信采用了 Http+JSON 的形式进行数据的交互。前端部分主要以 HTML 和 AngularJS
为核心进行开发,系统通过前端来控制页面间的路由。后端通过 Java 语言的代码编写,原生 Servlet 进行开发。 整个项目搭建在阿里
云上,服务器主机使用 ECS ,Tomcat 做服务器,数据库使用 RDS MySQL 。
* 项目还是挂在阿里云上,项目链接给各位观爷奉上(PS:因为项目的首页静态资源比较大,而贫穷又限制了我,云主机的带宽只有1M,
所以观爷们首次访问首页会比较慢,请耐心等待。。后续会考虑优化,进行静态文件压缩,或者依赖的一些静态包使用 CDN 加速)<br/>
[点击访问项目网站](http://humh.cn/laboratory_system) <br/>
账号:*123456* 密码:*123456* 请选择 *学生* 进行登录<br/>
*注意:该项目样式暂时只兼容适配火狐浏览器,其他浏览器可能存在显示问题*
* 项目部署<br/>
将项目war包clone到本地后,直接放入tomcat的webapp目录下,然后startup tomcat,最后通过localhost:8080/laboratory_system即可
访问,要想直接不加项目名访问,可配置虚拟映射,参考下文,另外,注意根据自己的情况,请修改scripts目录下的services.js文件中的配置:修改位置如下:<br/>
```$xslt
app.factory('netConnector', ['$http',function($http) {
var server = "http://127.0.0.1:8090";
var service = {};
service.get = function(api, params) {
return $http({
method: 'GET',
url: server + api,
params: params
});
};
```
修改var server值为自己的应用地址。
同时需要配置c3p0-config.xml中的数据库信息,修改为自己的数据库信息:<br/>
```$xslt
<property name="jdbcUrl">jdbc:mysql://localhost:3306/laboratory_system</property>
<property name="user">root</property>
<property name="password">root</property>
```
**项目设计以及实现上的几个点** :<br/>
1、后端功能的开发:利用 Session、 ServletContext、 Listener 以及 Filter 等特性来实现同一时刻的单客户端登录限制;通过定时
任务 Quartz 和多线程调用阿里云短信接口来完成定时短信提醒功能;通过 CROS 解决跨域请求问题;<br/>
2、基础服务组件工具类的设计:设计 C3P0Util 来完成数据库连接池的功能,通过注册 JSON 转换器来完成时间转换处理,设计
MD5Util 来完成用户密码的加密,设计 ThreadLocal 工具类通过同一线程获取同一连接的思路来保证事务操作的安全;<br/>
3、简易算法的设计:通过实现简单算法,来完成系统的自动化计算功能,如年级、当前上课周次的计算等;<br/>
4、数据库的设计与开发:分析数据结构来完成相应表的设计,同时设计触发器来完成相应功能的实现,如关联数据的清除;<br/>
5、我和前端大佬在接口的协作上是通过 RAP2 来制定接口文档。<br/>

## 项目展示
 <br/>
 <br/>
 <br/>
 <br/>
 <br/>
## 项目详述
### 总体架构设计
本文所研究的系统在设计开发上采用了前后端分离的设计模式,前端部分主要以 HTML 和 AngularJS 为核心进行开发,而后端部分主要以
Java 进行功能开发和 MySQl 做数据库管理。前后端数据交互则采用 Http 协议+ JSON,前后端在开发的同时通过共同维护的接口文档作为参
照规范,接口文档中定义了后端接口和前后端JSON数据格式。系统的总体架构图如下图所示:<br/>

* 后端架构设计<br/>
该课题研究的是系统后端设计,设计语言主要采用 Java 为主,使用 JDK 1.6,API 遵循 Java EE 规范,项目部署在阿里云上,服务器
使用 Tomcat 7.0,数据库使用 RDS MySQL ,负载均衡使用 Nginx+Tomcat 集群来应对高并发,前后端数据交互采用 Http协议+JSON。
为了保证功能逻辑清晰,代码的质量和可重用性,使用了 MVC(Model View Controller)的设计架构模式,M:Model 模型,JavaBean
实体类。V:JSON 数据和 View 视图渲染。C:Controller 控制器,这里指 Servlet 和接口 url。在代码组织结构上使用了分层思想,即
表现层(Web层)、业务层和数据访问层。这样分层可以达到强内聚和弱耦合,架构如下图所示:<br/>

* 模块设计<br/>
在进行系统的功能设计时,需要清楚系统的每个功能内容,需要进行模块化分析,将功能分成多个互相独立的模块。在设计过程中,避免
模块之间的冗余,提取出公共的部分进行了设计,包含一些工具类库文件的设计,如数据源连接池、线程池、 MD5 加密以及时间格式转换
器等。最后项目通过 Http 头字段进行控制,解决了资源跨域问题。以下为各模块设计:<br/>
1、登录模块<br/>
用户输入学号和密码,选择登录的角色类型(管理员,教师或学生),点击登录按钮,系统根据输入内容进行校验并进行友好提示。登录
界面中包含重置按钮,用于输入框内容的快速清空。<br/>
技术特点:服务器与数据库进行数据交互,完成信息校验。<br/>
2、主页模块<br/>
用户登录系统后,将显示主页内容。主页用于展示出近期的所有公告,显示公告的标题,用户可以点击查看具体某个公告的详情内容,并
且提供了附件下载,可以下载公告中含有的文件。<br/>
技术特点:服�