目录
1.系统的受众说明
1 在校学习的学生,可用于日常学习使用或是毕业设计使用
2 毕业一到两年的开发人员,用于锻炼自己的独立功能模块设计能力,增强代码编写能力。
3 亦可以部署为商化项目使用。
4 需要完整资料及源码,请在文末获取联系方式领取。
2.系统可行性分析
可行性分析是在开发系统之前对系统的开发是否有可行性的研究技术。通过对系统的分析了解和调查,分析此系统的开发是否具有可行性或者必要性。它是开发过程中很重要的一个步骤。本文试从经济可行性和技术可行性两个方面来进行分析与研究。
2.1 经济可行性
系统的开发成本较低,对开发设备要求不苛刻。在系统开发完成了以后,本系统对于实验室管理设备有着较高的经济效益,所以本次的系统设计开发在经济上来说是可行的。
2.2 技术可行性
本次的实验室管理系统是基于Java Web的一次设计开发,选择了当下主流的集成开发环境Eclipse来开发,在数据库的选择方面选择了MySQL数据库,框架是热门的SSM框架,技术上开发是可以实现的。
2.2.1 Java Web技术
Java Web是将Java技术应用于解决Web领域相关问题的技术总和。目前的主流项目开发框架有两种,一种是SSH框架,它由Struts2、Spring、Hibernate三部分组成,另一种是SSM框架,它是用于本次开发设计的,由 Spring、Spring MVC、MyBatis三部分组成。对比两个框架会发现SSH框架使用起来较为复杂,难度较高,而SSM框架的开发相对而言更容易上手。本文用了使用和掌握起来较为简单的SSM框架进行设计和实现。
2.2.2 Eclipse
Eclipse 是一个开放源代码的、功能强大的语言开发平台。Eclipse有强大的辅助功能,在代码出现问题时,Eclipse提供相关错误提示,并提供解决方案。这些功能的实现可以节省开发人员大量的时间,提高开发的效率。Eclipse最初由IBM在2001年11月创建开发。项目开发成功后被数百万开发人员所使用。Eclipse可以使用插件来提供它的附加功能。
2.2.3 Tomcat
Tomcat最初是由Sun的软件架构师詹姆斯·邓肯·戴维森开发。Tomcat的更新和完善,让很多开发人员喜欢上了这个软件,使用的人越来越多。加上它使用免费的特点,它已经在较多的中小型系统上得到了应用。Tomcat的使用让开发人员在JSP的调试变得方便起来,就算是初学者也可以得心应手。Tomcat除了可以处理Servlet和JSP之外,它还可以处理静态的HTML。目前其更新的最新版本为Tomcat 10。在本次系统设计中使用的是Tomcat 9.0。
2.2.4 数据库
在当前时代,多种技术飞速发展,数据存储的数量迅速加大,因此使用数据库来管理数据会更好,不仅能让数据存储起来更加准确,也可以让开发者的操作更方便。本次数据库使用的是关系型数据库MySQL,它是由瑞典的MySQLAB公司开发。MySQL有数据处理速度快、使用成本低等优点。MySQL同时具有存储引擎、索引、远程访问等功能。在安全性上也能保证数据的安全访问。Navicat Premium是本次使用的数据库管理工具,可以对很多类型的数据库进行管理,将数据库的数据直观显示,快速对数据库数据进行操作。
2.2.5 Layui框架
Layui框架是一款采用自身模块的前端UI框架,遵循原生的开发方式,开箱即用。其风格简约,组件较多,非常适合网页的开发。将layui.css和layui.js两个文件导入到项目之后,可以直接在项目中使用它的页面元素以及其内置模块。在页面元素中本次使用较多的是图标,按钮和导航菜单。用到的主要模块为表单,数据表格和弹出层。设计Layui框架主要是为了使服务端开发人员的开发变得容易和快速,而不必像以前那样过多的思考前端配置。
2.2.6 SSM框架
(1)Spring是目前最流行的轻量级开源Java EE框架。最初起源于Rod Johnson著作中的基本代码。在2004年发布第一个版本。Spring可以独立各种服务器,甚至可以不使用服务器。Spring出现的主要目的是简化Java开发。主要通过依赖注入和面向切面编程(AOP)等策略来实现其目的。
Spring一共有十多个组件,Core、Context和Beans是它的三个核心组件。组成Spring框架的每个组件都可以单独存在,也可以与其它组件联合实现。
(2)Spring MVC是基于Spring框架的Web应用框架。他可以很好的将数据、业务与视图进行分离。Struts和Webwork就是两个与其相似的框架。主要是围绕DispatcherServlet,它会负责将请求发给handle。
(3)Mybatis是一款基于Java并且支持普通SQL语句的常用持久层框架,它避免了JDBC的代码编写和结果集的检索情况。它可以使用xml配置来进行配置,也可以通过注解的方式。Mybatis使用SQLSessionFactory示例,支持SQL数据以及动态SQL,动态语句功能可以改变曾经用SQL语句进行拼接的痛苦,但是单独使用起来是有限制的,就例如它不能实现跨越多个事务,所以Mybatis一般与Spring集成使用。
3.系统需求分析
3.1 用户需求分析
系统用户分为员工和管理员两类用户。两类用户都可以进行系统的登录,虽然进入的系统主页结构相似,但是在功能上有不同。员工的密码可以自己进入系统后进行修改,也可以联系管理员进行修改。管理员可以对员工的基本信息进行更改,员工则不可以。员工主要需求为信息的录入,如采购信息录入,出入库信息录入等。管理员在需求上则不存在较多的录入问题,大部分都是对员工录入的信息进行修改,还有就是可以对员工的报废申请进行审核。
3.2 功能需求分析
系统功能需求如图3.1。
图3.1 系统功能需求图
系统分为员工和管理员两种身份,两种身份的功能有相同与不同之处。员工由管理员进行添加修改,不能进行注册。
系统登录功能:登录用户输入自己的账号和密码,验证成功后进入主页。
密码修改功能:在验证旧密码后可以进行密码修改,新输入的两次密码相同后就可以修改成功,之前的密码作废。
员工信息管理功能:此功能为管理员的功能,可以实现对员工的姓名,年龄,登录账号等基本信息进行修改,也可以删除员工。
设备管理功能:对企业的设备进行管理,包括查看现有设备,对现有的设备进行删除或者增加新的设备。
采购管理功能:本功能是员工对采购的设备进行登录,管理员可以对采购列表进行管理。
出入库管理功能:员工对出入库的设备进行登记记录,管理员可以进行查看与修改。出入库的记录可以导出为表格的格式以便打印。
设备维修与报废管理:员工记录设备的维修记录,可以对设备进行报废申请,由管理员进行审核后报废设备。
退出系统功能:退出系统首页,返回系统的登录界面。
3.3 其他需求分析
实用性:系统设计的功能要具有实用性,系统的功能应该满足企业设备管理的日常需要,切合实验室管理现状。
标准性:在系统的开发过程中,要严格的遵守开发标准,语言要求规范,命名也要标准,以此来提高整个系统开发的标准型。
易用性和简洁性:整个系统必须拥有一个良好的用户界面,对用户友好清晰。整个网页不易过于艳丽,应该简洁清晰明了,方便用户的日常使用。
安全性:系统有较高的安全性和保密性,在数据操作和权限等方面有着相应的控制,同时也可以保障用户的账号和密码,不让用户信息泄露。
准确性和实时性:整个系统展示出的所有信息应该具有准确性和实时性,保证用户看到的网页信息都是实时准确的,方便其操作。
4.系统设计
4.1 系统数据库设计
4.1.1 数据库逻辑结构设计
实验室管理系统的E-R图如图4.1所示。
图4.1 系统E-R图
4.1.2 数据库表设计
系统的数据库表共计八张,下面对表进行介绍。
1)员工信息表
该表是员工信息表,主要包含了员工的名字,性别,年龄,电话和登录信息等。表结构如表4.1所示。
表4.1 员工信息表
序号 |
字段名称 |
说明 |
类型 |
长度 |
备注 |
1 |
id |
员工id |
int |
5 |
主键,自增 |
2 |
username |
姓名 |
varchar |
20 |
|
3 |
sex |
性别 |
varchar |
20 |
|
4 |
age |
年龄 |
int |
10 |
|
5 |
tel |
电话 |
varchar |
30 |
|
6 |
loginname |
登录账号 |
varchar |
30 |
|
7 |
password |
登录密码 |
varchar |
30 |
|
8 |
del |
删除状态 |
int |
1 |
删除为1 |
2)管理员表,包括了登录账号,密码和用户名。表的结构如表4.2所示。
表4.2 系统管理员表
序号 |
字段名称 |
说明 |
类型 |
长度 |
备注 |
1 |
id |
管理员id |
int |
3 |
主键,自增 |
2 |
loginname |
登录账号 |
varchar |
20 |
|
3 |
password |
登录密码 |
varchar |
20 |
|
4 |
username |
用户名 |
varchar |
20 |
3)设备表,该表主要包含了设备的名称,设备大小,设备规格等。表结构如表4.3。
表4.3 设备表
序号 |
字段名称 |
说明 |
类型 |
长度 |
备注 |
1 |
id |
设备id |
int |
3 |
主键,自增 |
2 |
name |
设备名称 |
varchar |
20 |
|
3 |
changshang |
生产厂商 |
varchar |
50 |
|
4 |
daxiao |
设备大小 |
varchar |
20 |
长*宽*高 |
5 |
guige |
设备规格 |
varchar |
50 |
|
6 |
kucun |
库存 |
int |
5 |
|
7 |
del |
删除状态 |
int |
2 |
删除为1 |
4)采购信息表
该表主要包含了采购的设备名称,采购时间,数量等。表结构如表4.4。
表4.4 采购信息表
序号 |
字段名称 |
说明 |
类型 |
长度 |
备注 |
1 |
id |
设备id |
int |
3 |
主键,自增 |
2 |
equipmentname |
设备名称 |
varchar |
20 |
|
3 |
time |
采购时间 |
varchar |
20 |
|
4 |
shuliang |
数量 |
int |
20 |
|
5 |
price |
价格 |
int |
10 |
|
6 |
fuzeren |
责任人 |
varchar |
20 |
|
7 |
beizhu |
备注 |
varchar |
50 |
5)设备入库表
该表是入库表,主要包含了入库设备的名称,入库时间,入库数量和负责人等。表结构如表4.5所示。
表4.5 设备入库表
序号 |
字段名称 |
说明 |
类型 |
长度 |
备注 |
1 |
id |
唯一id |
int |
3 |
主键,自增 |
2 |
equipmentname |
设备名称 |
varchar |
20 |
|
3 |
time |
入库时间 |
varchar |
20 |
|
4 |
shuliang |
入库数量 |
int |
6 |
|
5 |
fuzeren |
负责人 |
varchar |
8 |
|
6 |
beizhu |
备注 |
varchar |
50 |
6)设备出库表
该表是出库表,主要包含了出库设备的名称,出库时间,出库数量和负责人等。表结构如表4.6所示。
表4.6 设备出库表
序号 |
字段名称 |
说明 |
类型 |
长度 |
备注 |
1 |
id |
唯一id |
int |
3 |
主键,自增 |
2 |
equipmentname |
设备名称 |
varchar |
20 |
|
3 |
time |
出库时间 |
varchar |
20 |
|
4 |
shuliang |
出库数量 |
int |
6 |
|
5 |
fuzeren |
负责人 |
varchar |
8 |
|
6 |
beizhu |
备注 |
varchar |
50 |
7)报修信息表
该表是报修信息表,主要包含了维修设备名称,维修时间,维修原因以及结构等。表结构如表4.7所示。
表4.7 设备报废表
序号 |
字段名称 |
说明 |
类型 |
长度 |
备注 |
1 |
id |
唯一id |
int |
3 |
主键,自增 |
2 |
equipmentname |
设备名称 |
varchar |
20 |
|
3 |
weixiushijian |
维修时间 |
varchar |
20 |
|
4 |
yuanyin |
原因 |
varchar |
50 |
|
5 |
jieguo |
结果 |
varchar |
50 |
|
6 |
weixiuren |
维修人 |
varchar |
50 |
8)设备报废表
该表是设备报废表,主要包含了员工的名字,性别,年龄,电话和登录信息等。表结构如表4.8所示。
表4.8 设备报废表
序号 |
字段名称 |
说明 |
类型 |
长度 |
备注 |
1 |
id |
唯一id |
int |
5 |
主键,自增 |
2 |
equipmentname |
设备名称 |
varchar |
20 |
|
3 |
yuanyin |
报废原因 |
varchar |
20 |
|
4 |
zhuangtai |
审核状态 |
int |
2 |
1:通过 0:未通过 |
4.2 系统功能设计
4.2.1 登陆功能模块
系统运行的开始页面为登录界面,登录用户需要在此页面输入自己的登录账号以及登录密码,然后选择登录的身份。提交之后由后台对其与数据库的数据进行对比,验证通过则成功登录进入系统主页,如果验证失败则返回登录界面并显示登录失败的信息,登录流程图如图4.2所示。
图4.2 登录流程图
4.2.2 员工管理功能模块
本模块为管理员特有模块,管理员可以对员工的基本信息进行修改,同时也可以删除用户。修改时会出现修改之前的数据,将数据更改后提交,若有不能为空的值为空,则会显示对应的提示,提交成功后将数据发给后台进行处理,弹出提示成功后则返回员工管理界面,并刷新数据库的数据。修改后可以看到修改的信息是否成功。点击删除时会弹出提示框对此次删除操作进行确认,点击确定之后进行员工的删除,否者取消本次的删除操作并返回员工管理界面。本功能模块提供了查询功能,管理员可以通过员工姓名进行查询,同时支持模糊查询,搜索功能的设计可以提高管理员的查询速度。本模块的功能图如图4.3所示。
图4.3 员工管理功能模块
4.2.3 设备管理功能模块
管理员和员工都可以使用本模块。员工在本模块可以对现有设备进行查看,同时有新的设备时可以在这里进行添加。设备的主要信息为设备名称,生产厂商,设备大小,规格型号等信息。管理员除了员工有的功能外,还可以进行对设备的信息进行修改,在必要时还可以对设备进行删除。删除设备后在列表就不能看见此设备了。但是在数据库中依然可以看到设备的信息,这样的设计是为了防止一些失误或者错误操作,在删除之后可以通过数据库的删除状态的值进行修改,修改之后可以重新出现在设备列表中。本模块的功能设计图如图4.4所示。
图4.4 设备管理功能模块
4.2.4 入库出库功能模块
员工在本模块只有一个功能就是对入库信息或者出库信息进行添加,没有查看和修改的权限,员工根据实际情况对设备的出入库进行记录,主要记录设备的名称,操作的具体时间,具体的设备数量以及相关的责任人,设备名称为下拉框,里面的数据来自于设备列表中的所有设备名称,由员工进行选择,以便信息的录入。管理员有对设备入库出库的信息进行修改和删除的权限,可以对员工的错误记录进行相应的操作。修改删除的流程与前面类似。本模块的功能设计图如图4.5所示。
图4.5 出入库功能模块
4.2.5 报修报废功能模块
报修功能主要针对设备出现问题后,由相关的专业人员进行维修。维修后由员工录入维修的设备名称,维修的原因和结果等。管理员可以通过员工每次录入的设备维修信息来了解设备的情况。
报废功能是由员工进行报废申请,写上申请报废的设备名称以及申请的原因,提交之后由管理员审核。管理员可以对员工提交的申请进行审核,员工也可以在报废管理模块实时关注审核情况。当报废申请同意之后,对应的设备将不会出现在设备管理的列表中。其流程图如图4.6。
图4.6 报废流程图
模块功能主要包括报废申请,查看审核情况,管理员审核和报废列表的查看等。模块功能图如图4.7所示。
图4.7 报废功能图
4.3 系统技术框架设计
系统采用SSM框架对系统进行设计,SSM由Spring、Spring MVC和Mybatis组成。Spring MVC对视图层进行处理,可以对用户的请求进行处理,调用相关的方法,把请求转给业务层操作。Spring主要负责数据源的配置,配置之后可以把结果返回前端页面。Mybatis是Dao层的实现者,它的使用可以提高系统的响应速度以及事务的处理能力。
5.系统实现
5.1 系统主页实现
系统主页分为三个部分:左侧为系统的垂直导航菜单,可以选择相应的功能进行操作;右侧为系统的主体,在左侧选择相应的功能后由右侧进行展示,根据自己的需要进行操作即可;上面部分则主要是显示登录的用户名称以及退出登录选项,点击退出登录之后会返回到系统运行时的登录界面,重新登录即可重新进入主页。主页效果图如图5.1所示。
图5.1 系统主页效果图
5.2 系统功能实现
5.2.1 登录功能
用户登录时,在页面中输入自己的登录账号和密码,选择自己的登录身份,然后由前端通过表单的形式将数据传到后端,后端获取后与数据库数据进行比对,比对成功后登录成功进入主页,将登录用户的信息存入到session对象中,否则失败并给出提示信息提示用户。登录界面如图5.2所示。
图5.2 系统登录界面
此功能的主要代码如下。
@RequestMapping(value="/login")//处理请求地址映射的注解
public ModelAndView login(@RequestParam("loginname") String loginname,//账号
@RequestParam("password") String password,//密码
@RequestParam("tip") String tip,//用户类型
HttpSession session,//seession对象
ModelAndView mv){
if("1".equals(tip)) { //用户类型为管理员
Root user = rainservice.login(loginname, password);
User user = rainservice.login2(loginname, password);//员工登录换上句代码为本句
if(user!=null){
session.setAttribute(Constants.USER_SESSION, user); //将用户保存到Session
session.setAttribute("tip", "1");//员工登录为2
mv.setViewName("redirect:/indexroot/");//客户端跳转到main页面
}else{ mv.addObject("message", "登录名或密码错误!请重新输入");
mv.setViewName("forward:/loginForm");//跳转到登录页面
5.2.2 修改密码功能
本功能界面共有三个输入框,各输入框前面有输入提示。只有当原密码正确,并且后两次的密码相同时才会进行密码的修改,否则会弹出修改失败的相应原因。修改密码界面如图5.3所示。
图5.3 修改密码界面
系统对三次输入进行判断的代码如下。
var userPwReal="${user.password}";//正确的原密码
if(document.getElementById('dataForm1').password1.value !=userPwReal)
{ layer.msg('原密码不正确',{icon:5,time:1000}); }//比对原密码是否正确
else if(
document.getElementById('dataForm1').password2.value !=document.getElementById('dataForm').password.value){//比对两次新密码是否相同
layer.msg('两次密码输入不同',{icon:5,time:1000});
}else{
layer.alert("修改成功", {icon: 6},function () {
document.getElementById('dataForm').submit();});//提交修改数据
5.2.4 设备管理功能
设备管理功能的页面实现如图5.5所示。功能的表格部分代码与上面的代码相似。数据列表在控制器的代码如下。
@RequestMapping(value="/equipment/list",method=RequestMethod.GET)
public String index(Model model,String content){
List<Equipment> equipment_list = rainservice.findAllEquipment();
if (content!=null){//查询输入框为空时查询整个列表
//查询输入框不为空时需要通过设备名称来进行查询
equipment_list = rainservice.findAllEquipment(content);
}
model.addAttribute("list",equipment_list);
return "equipment/list";}
图5.5 设备管理功能界面
5.2.5 入库管理功能
员工将入库的信息进行录入,系统将录入的数据保存到数据库。管理员可以对其查看与修改。录入的信息包含了设备名称,时间,数量,负责人等信息,页面展示如图5.6所示。
图5.6 入库信息录入界面
输入的设备名称由设备管理中的设备来进行选择,不能自由输入。时间的录入使用的是layui的时间日期选择器,之后的信息由员工进行手动输入。设备名称的选择是由el和jstl实现的。
<c:forEach items="${equipment_list}" var="list" varStatus="status">//循环打印设备的名称
<c:if test="${list.name != ruku.equipmentname}">
<option>${list.name}</option>//判断是录入还是修改,如果不加此语句,在进行修改时选择列表会出现两个相同的名称
</c:if>
</c:forEach>
时间选择器的代码如下所示。
layui.use('laydate',function(){
varlaydate=layui.laydate;
laydate.render({ //执行一个laydate实例
elem:'#test'//指定元素
,type:'datetime'
});});
当表单提交之后,由controller接受请求并且把数据发给后端进行处理。过程的主要代码如下。
@RequestMapping(value="/kucun/rukuadd",method=RequestMethod.POST)
public ModelAndViewadd(ModelAndViewmv,@ModelAttributeRukuruku,Integerid){
if(id!=null){
rainservice.update_RukuInfo(ruku);//id不为空表示是修改操作
}else{
rainservice.addRuku(ruku);//id为空是增加,调用接口的不同方法
}
mv.setViewName("redirect:/kucun/rukulist");
return mv;//返回前端页面
}
@SelectProvider(type=RukuDynaSqlProvider.class,method="insertRuku")
void save(Rukuruku);
public StringinsertRuku(Rukuruku){//动态插入
return newSQL(){
{
INSERT_INTO(RUKUTABLE);
if(ruku.getEquipmentname()!=null&&!ruku.getEquipmentname().equals("")){
VALUES("equipmentname","#{equipmentname}");//对值进行修改
}
if(ruku.getTime()!=null&&!ruku.getTime().equals("")){
VALUES("time","#{time}");}}//后面的和此类似
}.toString();}
5.2.6 报废管理功能
报废管理功能是由管理填写申请,将申请报废的设备名称以及报废的原因进行填写提交。提交之后等待管理员审核,员工可以在报废管理功能的申请列表中查看自己申请的审核情况,如图5.7。
图5.7 查看审核情况
对于申请成功的设备将会在设备列表中移除。管理员的审核通过直接点击即可,审核界面如图5.8。
图5.8 进行审核
审核状态主要是通过数据库的字段来判断,管理员审核后会对页面进行刷新,显示审核结果,以通过为例。下面是状态判断的部分代码。
<c:choose>
<c:when test="${baofei.zhuangtai==null}">
<td>审核中</td>
</c:when>
<c:when test="${baofei.zhuangtai==0}">
<td><fon tcolor="red">未通过</font></td>
</c:when>
<c:otherwise>
<td><font color="green">通过</font></td>
</c:otherwise>
</c:choose>
管理员的操作有通过和拒绝两个选项,代码如下。
//通过按钮
<a title="通过" οnclick="member_yes(this,'${baofei.id }')" href="javascript:;">
<i class="layui-icon"></i></a>
//通过的js代码
function member_yes(obj,id){
layer.confirm('确认要同意吗?',function(index){
$.get("${ctx}/baofei/yes?id="+id); //发异步删除数据
layer.msg('已同意!',{icon:1,time:1000},
function(){window.location.replace("${ctx}/baofei/list")});//刷新页面,显示结果
});}
//拒绝按钮
<a title="拒绝" οnclick="member_no(this,'${baofei.id }')" href="javascript:;">
<i class="layui-icon"></i></a>
//拒绝的js代码
function member_no(obj,id){
layer.confirm('确认要不同意吗?',function(index){
$.get("${ctx}/baofei/no?id="+id);
layer.msg('已拒绝!',{icon:1,time:1000},//发异步删除数据
function(){window.location.replace("${ctx}/baofei/list")});//刷新页面,显示结果
});}