基于java EE医疗机械设备采购管理系统设计与实现

目 录

摘 要 I

Abstract II

引 言 1

1 系统开发相关技术 3

1.1 J2EE技术简介 3

1.2 SSH框架技术 3

1.3 JQuery技术 3

1.4 CSS技术 3

1.5 XML技术 3

1.6 Ajax技术 4

1.7 MySQL数据库 4

1.8 本章小结 4

2 系统分析 5

2.1 概要分析 5

2.2 功能需求分析 6

2.3 功能初步设计 6

2.4 本章小结 8

3 系统总体设计 9

3.1 数据库设计 9

3.2 系统功能详细设计 14

3.2.1 登录模块的详细设计 14

3.2.2 用户模块的详细设计 15

3.2.3 客户模块的详细设计 15

3.2.4 设备模块的详细设计 16

3.2.5 库存模块的详细设计 16

3.3 项目搭建 18

3.4 本章小结 18

4 系统实现 19

4.1 用户环境 19

4.2 其他要求 19

4.3 用户登录功能 19

4.4 员工管理功能 20

4.5 客户管理功能 22

4.6 设备管理功能 23

4.7 库存管理功能 23

4.8 库房管理功能 26

4.9 系统管理功能 27

4.10 本章小结 28

5 系统测试 29

5.1 用户登录测试 29

5.2 员工管理测试 29

5.3 库存管理测试 31

5.4 本章小结 32

结 论 33

致 谢 34

参考文献 35

附录 源程序清单 37

摘 要

随着当今社会的快速发展,各行各业都逐渐走上了信息化发展的方向,医疗行业也不例外。近几年医院的发展也开始逐渐采用满足医疗要求的医院信息系统,但在医疗设备方面仍然采用手工记录的方式,这种方式不仅延长了工作人员的工作时间,加大了工作量,同时也增加了人工记录错误发生的概率,大大降低了医院人员的工作效率。因此,本文针对目前医院现象决定开发医疗机械设备采购管理系统。

项目的实现是以Java EE为核心开发技术,通过SSH框架的高效性和MySql数据语言的方便性进行高效的开发。本系统分为总库,二级库,医疗人员三大业务角色,每个角色拥有与自己角色相关的业务权限,系统共分为用户登录、员工管理、客户管理、设备管理、库存管理、库房管理六大业务模块,满足医院需求。

医疗机械设备采购管理系统经过测试,实现了预计功能,该系统能有效提高医院工作效率,降低错误率,可操作性强,易于维护。

关键词:医疗设备;管理系统;Java EE;SSH框架

Abstract

With the rapid development of modern society,all industries are gradually developing into information technology,and medicine is no exception.In recent years,the development of hospitals has gradually adopted hospital information systems that meet medical requirements,but manual recording is still used in medical equipment.This method not only extends the working hours of staff,but also increases the workload.Increased the probability of manual recording errors,greatly reducing the efficiency of hospital staff.Therefore,this article decided to develop a medical machinery equipment procurement management system in view of the current hospital phenomenon.

The project uses Java EE as the main development technology and develops effectively through the effectiveness of the SSH framework and the convenience of the MySQL data language.The system is divided into three major business roles:general library,secondary library, and medical staff. Each role has business rights related to its own role. The system is divided into user login,employee management, customer management, equipment management, inventory management,and warehouse.Manage six business modules to meet hospital need.

The procurement management system for medical and mechanical equipment has been tested and implemented. The The system can effectively improve the efficiency of hospital work, reduce the error rate,improve work efficiency and facilitate service.

Keywords: Medical equipment; Management system; Java EE; SSH

引 言

随着现代技术的不断发展,国家信息化的不断进步,目前,大部分医院都引进了各种各样的高科技医疗设备。这些设备不仅提高了医院护理的效率,还在发展医院的研究和教育方面也发挥了积极作用,医院的收益也是由此而增。评估医院发展水平也可以通过该方式进行评估[1]。医院以科学方式管理这些设备并有效利用的能力,决定了该医院是否能够长远发展,也是一直以来医院急需解决的问题[2]。

医疗信息管理系统的广泛使用以及新的医疗政策的采用,对医院设备的管理又提出了新的需求。由前期调查可知,目前,许多医院没有充分利用信息管理系统来管理机械设备,很多医院依旧采用又医院使用人员手工记录的方式管理机械设备,这样做既增加了工作量,降低了工作效率,延长了工作时间,而且还很容易由于人工导致记录错误。由此可知,设计一款能够有效管理医院机械设备的信息管理系统迫在眉睫[3]。

为优化医疗资源配置,提升管理能力和保障医疗安全,紧密联系HIS系统[4],本项目采用JSP技术,JAVA开发语言、MySQL数据库,采用SSH框架,Jquery技术进行开发,最终得到一个医疗机械设备采购管理系统。功能包括入库、出库、库存查询等。

本文将根据项目背景,系统分析,系统设计,具体实现,分章进行阐述。

本文介绍的组织结构如下:

第一章阐述的内容包括:系统开发使用到的相关技术,包括J2EE技术、SSH框架、Jquery技术、CSS技术、XML技术、Ajax技术以及MySQL数据库技术,都有详细描述。

第二章阐述了本项目的功能需求及项目的细节特征,不同的人员权限操作不同的功能,引出开发本项目的基本思路,为第三章对本项目的具体设计打下了基础。

第三章阐述了该系统的设计思路,包括根据需求设计各个模块的内容,数据库中每个模块表的具体字段,以及每个模块的具体功能以及功能的实现方式。

第四章展示了本系统开发硬件及软件的环境,每个模块功能的介绍以及操作方式,每个模块的具体实现,其中的实现结果通过截图的方式展现出来。

第五章是测试章节,对系统中的几个主要功能进行测试,为保证测试的准确性,在每个阶段中抽取最具代表性的模块进行随机抽样测试,选取登录模块,员工模块,库存模块进行测试。

1 系统开发相关技术

1.1 J2EE技术简介

J2EE(Java 2 Platform,Enterprise Edition)是基于Java 2来进一步优化的开发结构。J2EE可以达到一次编写处处运行的效果,对数据库的JDBC API存取方便,能够在网络应用中保证数据安全性。J2EE全面支持JSP(Java Server Pages)、XML、EJB(Enterprise Java Beans)和API(Application Programming Interface)等,大幅缩减应用系统开发时间[5]。J2EE的完成对整个项目的开发时间和开发效率都有一定的提高,不仅仅具有稳定性更是具有可扩展性[6]。

1.2 SSH框架技术

SSH代表着Struts、Spring和Hibernate。在Web开发中该框架出现的频率十分高,这个框架主要是为后期的项目优化或者调整项目结构提供了很好的帮助。SSH不仅具有view、controller、model这三个基本层次,也能够把这些基本层次进行分离[7]。SSH能够保证整体的结构不受前端变化的影响,对整个系统的复用性是很重要的[8]。同时SSH的便捷性更是为开发人员提供更快速的系统搭建方法,能够使系统开发更加的游刃有余[9]。

1.3 JQuery技术

JQuery是一个兼容多种浏览器的JavaScript框架[10],宗旨是写更少的代码,做更多的事情。他能够完美的兼容一些其他轻量级的库函数,例如js和CSS3。同时,还有许多成熟的第三方插件可供选择[12]。

1.4 CSS技术

CSS的主要功能就是进行网页设计,可以同时实现对网页的静态与动态修饰,使得网页更加具有设计感、层次感与感染力[13]。就目前的CSS技术而言,其在实际应用使用的过程中主要是有以下特点:

一:样式定义丰富。二:节约设计者的时间。三:层叠性。层叠即为叠加,就是指在操作中通过对一个元素的多次设置并层叠来达到预期效果,使得网页个性化更为明显[14]。

1.5 XML技术

XML(Extensible Markup Language)是为了传输数据和存储数据而设计的,其关注的焦点是数据的内容[15]。开发者可以根据自己的需要来定义自己的标签[16]。XML具有语法简洁、可拓展性高、编写方便、通用性强等优点[17]。

本文提出的任务流编辑器也是用XML作为配置文件管理组件的,各个按钮组件就是用XML进行管理的,无需修改源代码,使得该任务流编辑器扩展性更强,更实用[18]。

1.6 Ajax技术

Ajax技术是从Web层的应用过渡到数据层的应用的,这是一种为用户服务,以用户和彼此的交互性为主要性质的Web应用程序的技术[19]。

Ajax一般使用JS脚本将前台与后台连接起来,实现前后台通讯功能,不仅不影响运行速度,而且不会阻碍核心对象响应,并且可以方便用户,不用等待页面的重载就可以实现与服务器的交互[20]。

Ajax有两大重要因素[21],其一是JS脚本的运行效果,其二是浏览器和用户之间很好的融合,并且可以很好的和官方标准融为一体。

1.7 MySQL数据库

数据库有很多种,包括Oracle、SQLServer,虽然MySQL不是最优秀的,但却是中小型企业热衷的数据库,原因就是因为MySQL是一款开源软件,并且功能还很强大;另外MySQL是由最基础的C语言和C++语言编写的,进行多种测试后投入使用[22]。

MySQL所包含的API可适用于各种编程语言,支持多线程,拥有优秀的SQL查询算法,不仅如此,这项技术还提供了大量的管理工具[23],使用了标准的SQL语句对数据库数据进行操作。

MySQL包含4个种类的索引包括普通索引,唯一索引,主键索引和全文索引,虽然这些索引可能会占用数据库的物理和数据空间,但不可否认的是也提高了数据库检索的速度[24]。MySQL还具备事务处理功能,不仅可以防止意外的操作失误所带来的损失,而且可以增强数据的安全性。[25]。

1.8 本章小结

本章主要介绍了本系统开发所使用的开发技术,从前台技术到底层后端应用再到数据库层面所使用的各个技术,包括J2EE技术、SSH框架、Jquery技术、CSS技术、XML技术、Ajax技术以及MySQL数据库技术,都有详细描述。

2 系统分析

2.1 概要分析

可以将本系统分为员工信息管理,供应商信息管理,设备信息管理,库存信息管理,库房信息管理,系统信息管理这六大模块。详细描述如图2-1。

图2-1设备管理系统的功能模块图

2.2 功能需求分析

本系统任务包括有效管理各个库房中设备的流通,如入库管理、出库管理、库存管理等等。可以对库存管理做更加细致的分析,并从中发现更多的细节特征:

库房流通涉及设备的入库,出库两种管理方式。

库存管理涉及设备的数量变更和对库存的查询、汇总等。

各个模块均需要检索功能。

设备需要进行合理的分类。

设备应该有提供者,所以要考虑供应商数据的登记。

物品入库,涉及到设备的存放位置,考虑是否需要动态选择库房。

库存管理中,无论入库还是出库,系统都需要记录执行人信息。

系统需要提供给用户一个唯一的用户账号,该账号对用户在系统中进行相关操作是必不可少的。

需要设置一位系统管理员,具有该系统的全部功能,而其他库管的权限均由系统管理员进行授予。

库管需要有对应的岗位和部门来安置。

库存警告和报警,当库存量达到规定的最低数额时,系统自动报警。

2.3 功能初步设计

用户登录:

功能用途:用户通过输入用户账号、密码、验证码和职位进行系统登录。

操作权限归属:如果想进入系统,就必须要有权限。

输入数据:与系统相关的数据输入。

基本操作:跟登录有关联的行为。

所在位置:当前的界面。

其他说明:系统登录功能就是用来判断该人员是否进行过角色授权,授权过的角色才使用使用系统来完成想要进行的操作,也是为了防止恶意的偷取数据。

员工管理:

功能用途:对员工的相关信息进行管理。

操作权限归属:需要使用系统的人员。

主要数据:员工是客观世界存在的实体,实体的属性就是这个主要的数据。

基本操作:添加员工信息,删除员工,修改员工,条件查询,登录权限授权。

所在位置:员工管理。

其他说明:员工编号是系统识别员工身份信息的依据,同时也是用户登录系统时的账号,也是库管进行库存处理时需要输入的经手人编号。所以,员工编号是自动形成的,无法修改。

客户管理:

功能用途:对相关信息进行管理。

操作权限归属:需要使用系统的人员,系统管理员。

主要数据:供应商是客观世界存在的实体,供应商的属性就是这个主要的数据。

基本操作:供应商的添加、删除、修改和查询。

所在位置:客户管理。

其他说明:每一种设备都有其制造商,库房中的设备在添加时都要填写该项。

设备管理:

功能用途:录入设备的基本信息。

操作权限归属:需要使用系统的人员,系统管理员。

主要数据:设备编号,设备名称,设备类别,供应商,产地,检查类别,有效期,型号,备注。

基本操作:添加设备,删除设备,修改设备,条件查询。

所在位置:设备管理。

其他说明:每一种设备信息在添加时都要使用触发器同步更新到库存信息表中,初始数量为0,在修改设备基本信息时,一些必要数据也要同步更改。

库存管理:

功能用途:填写入库单,填写出库单,库存查询,并且库存达到报警线时能够对用户进行提醒。

操作权限归属:需要使用系统的人员,系统管理员。

主要数据:设备信息,余量,上下限报警。

基本操作:条件查询。

所在位置:库存管理。

其他说明:根据入出库数量更新库存数量,上下限报警线为手动设置。

库房管理:

功能用途:录入库房信息。

操作权限归属:系统管理员。

主要数据:库房编号,库房名称。

基本操作:添加库房,修改库房,删除库房,条件查询。

所在位置:库房管理。

其他说明:库房管理是设备存放的位置。

系统管理:

功能用途:对可以登录的人员以及权限进行管理。

操作权限归属:系统的管理员。

主要数据:员工的相关信息。

基本操作:权限的添加、修改、删除和查询。

所在位置:系统管理。

其他说明:系统管理是对使用者的先关信息进行基本的数据操作。

2.4 本章小结

本章阐述了本项目的功能需求及项目的细节特征,不同的人员权限操作不同的功能,引出开发本项目的基本思路,为第三章对本项目的具体设计打下了基础。

3 系统总体设计

3.1 数据库设计

本系统中各个实体关系如图3-1所示。

图3-1 系统E-R图

departmentinfotable(部门表)的设计是完成部门信息的存储。其结构如表3-1所示。

表3-1 部门信息表

字段名 数据类型 是否为空 是否主键 默认值 说明

id int(4) 否 是 NULL 自增

depId varchar(20) 否 否 NULL 部门编号

depName varchar(20) 否 否 NULL 部门名称

employeeinfotable(员工表)的设计是完成员工的信息的存储。其结构如表3-2所示。

表3-2 员工信息表

字段名 数据类型 是否为空 是否主键 默认值 说明

id int(8) 否 是 NULL 自增

empId varchar(20) 否 否 NULL 员工编号

表3-2 员工信息表-续表

字段名 数据类型 是否为空 是否主键 默认值 说明

empName varchar(20) 否 否 NULL 姓名

empSex varchar(4) 否 否 NULL 性别

empAge int(3) 否 否 NULL 年龄

empIdentCard varchar(20) 否 否 NULL 身份证号

empBirthDate varchar(20) 否 否 NULL 出生日期

empDiploma varchar(20) 否 否 NULL 学历

empJoinDate varchar(20) 否 否 NULL 入职时间

empAddress varchar(50) 否 否 NULL 地址

empPhone varchar(20) 否 否 NULL 电话

depId varchar(20) 否 否 NULL 部门编号

jobId varchar(20) 否 否 NULL 职位编号

goodsinfotable(设备信息表)的设计是完成设备的信息的存储。其结构如表3-3所示。

表3-3 设备信息表

字段名 数据类型 是否为空 是否主键 默认值 说明

id int(8) 否 是 NULL 自增

gId varchar(20) 否 否 NULL 设备编号

gName varchar(20) 否 否 NULL 设备名称

gABC varchar(20) 否 否 NULL 设备类别

supId varchar(20) 否 否 NULL 供应商编号

gAddress varchar(20) 否 否 NULL 地址

gUnit varchar(6) 否 否 NULL 检查类别

gUsefulDate varchar(20) 否 否 NULL 有效期

gTypeId varchar(20) 否 否 NULL 型号

gPicture varchar(20) 否 否 NULL 备注

goodslocationtable(库房信息表)的设计是完成库房的信息的存储。其结构如表3-4所示。

表3-4 库房信息表

字段名 数据类型 是否为空 是否主键 默认值 说明

id int(4) 否 是 NULL 自增

locatId varchar(20) 否 否 NULL 部门编号

locatName varchar(20) 否 否 NULL 部门名称

goodsrowstable(科室信息表)的设计是完成科室的信息的存储。其结构如表3-5所示。

表3-5 科室信息表

字段名 数据类型 是否为空 是否主键 默认值 说明

id int(4) 否 是 NULL 自增

rowId varchar(20) 否 否 NULL 科室编号

rowName varchar(20) 否 否 NULL 科室名称

locatId varchar(20) 否 否 NULL 部门编号

goodsseatstable(诊室信息表)的设计是完成诊室的信息的存储。其结构如表3-6所示。

表3-6 诊室信息表

字段名 数据类型 是否为空 是否主键 默认值 说明

id int(4) 否 是 NULL 自增

seatId varchar(20) 否 否 NULL 诊室编号

seatName varchar(20) 否 否 NULL 诊室名称

locatId varchar(20) 否 否 NULL 部门编号

rowId varchar(20) 否 否 NULL 科室编号

jobsinfotable(职位表)的设计是完成职位表的信息的存储。其结构如表3-7所示。

表3-7 职位信息表

字段名 数据类型 是否为空 是否主键 默认值 说明

id int(4) 否 是 NULL 自增

jobId varchar(20) 否 否 NULL 职位编号

jobName varchar(20) 否 否 NULL 职位名称

depId varchar(20) 否 否 NULL 部门编号

describeJob varchar(20) 否 否 NULL 职位名称

logintable(登录表)是存储登录表信息的。其表结构如表3-8所示。

表3-8 登录信息表

字段名 数据类型 是否为空 是否主键 默认值 说明

id int(4) 否 是 NULL 自增

depId varchar(20) 否 否 NULL 员工编号

depName varchar(20) 否 否 NULL 姓名

loginPass varchar(20) 否 否 NULL 密码

powId varchar(20) 否 否 NULL 权限编号

powerinfotable(权限表)的设计是完成权限表的信息的存储。其表结构如表3-9所示。

表3-9 权限信息表

字段名 数据类型 是否为空 是否主键 默认值 说明

id int(4) 否 是 NULL 自增

powId varchar(20) 否 否 NULL 权限编号

powName varchar(20) 否 否 NULL 权限名称

stockinfotable(库存表)的设计是完成库存表的信息的存储。其表结构如表3-10所示。

表3-10 库存信息表

字段名 数据类型 是否为空 是否主键 默认值 说明

id int(8) 否 是 NULL 自增

stoId varchar(20) 否 否 NULL 设备编号

stoName varchar(20) 否 否 NULL 设备名称

stoTypeId varchar(20) 否 否 NULL 设备类别

stoUnit varchar(6) 否 否 NULL 检查类别

stoNumber int(8) 否 否 NULL 数量

stoUpWarn int(8) 否 否 NULL 上限提醒

stoDownWarn int(8) 否 否 NULL 下限提醒

stoUpDanger int(8) 否 否 NULL 上限报警

stoDownDanger int(8) 否 否 NULL 下限报警

stockininfotable(入库表)的设计是完成入库表的信息的存储。其表结构如表3-11所示。

表3-11 入库信息表

字段名 数据类型 是否为空 是否主键 默认值 说明

id int(16) 否 是 NULL 自增

sInId varchar(20) 否 否 NULL 入库单号

sInDate varchar(20) 否 否 NULL 日期

sInChargeId varchar(20) 否 否 NULL 负责人

sInGoodsId varchar(20) 否 否 NULL 设备编号

sInNumber int(8) 否 否 NULL 数量

sInTypeId varchar(20) 否 否 NULL 型号

sInABC varchar(20) 否 否 NULL 类别

表3-11 入库信息表-续表

字段名 数据类型 是否为空 是否主键 默认值 说明

sInUnit varchar(6) 否 否 NULL 单位

sInPlace varchar(20) 否 否 NULL 位置

sInRemark varchar(100) 否 否 NULL 备注

stockoutinfotable(出库表)的设计是完成出库表的信息的存储。其表结构如表3-12所示。

表3-12 出库信息表

字段名 数据类型 是否为空 是否主键 默认值 说明

id int(16) 否 是 NULL 自增

sOutId varchar(20) 否 否 NULL 出库单号

sOutDate varchar(20) 否 否 NULL 日期

sOutCharId varchar(20) 否 否 NULL 负责人

sOutGoodsId varchar(20) 否 否 NULL 设备编号

sOutNumber int(8) 否 否 NULL 数量

sOutTypeId varchar(20) 否 否 NULL 型号

sOutABC varchar(20) 否 否 NULL 类别

sOutUnit varchar(6) 否 否 NULL 单位

sOutReceiveId varchar(20) 否 否 NULL 接收人

sOutProgramId varchar(20) 否 否 NULL 生产编号

sOutRemark varchar(100) 否 否 NULL 备注

supplytable(供应商信息表)的设计是完成供应商信息表的信息的存储。其表结构如表3-13所示。

表3-13 供应商信息表

字段名 数据类型 是否为空 是否主键 默认值 说明

id int(4) 否 是 NULL 自增

supId varchar(20) 否 否 NULL 供应商编号

supName varchar(20) 否 否 NULL 供应商名称

supCharge varchar(20) 否 否 NULL 负责人

supAddress varchar(20) 否 否 NULL 地址

supPhone varchar(20) 否 否 NULL 电话

supFax varchar(20) 否 否 NULL 传真

supEmail varchar(20) 否 否 NULL 邮箱

supHttp varchar(20) 否 否 NULL 网址

3.2 系统功能详细设计

对系统整体的需求分析已经基本完成,接下来就需要进行具体的编码设计。流程的设计如下图3-2所示。

图3-2 库存系统流程图

普通员工只有被库房管理员进行登陆权限授权才有资格登录,对于所有模块的权限仅有查询功能,无其他操作权限。

二级库管理员的权限则可以对客户,设备,库存,库房,入库,出库模块进行管理。

系统的管理员能够对相同进行全面的管理,系统管理员的权限是最高的,设计的范围也是最多的。

3.2.1 登录模块的详细设计

登录模块的流程图如下图3-3所示。

图3-3 登录模块的流程图

想要进入系统就必须进行账号密码的验证,同时还需要进行验证码的校验,其中验证码功能部分的代码储存在MakeCertPic.java文件内,每次加载时验证码是随机生成的,是通过Graphic画布把该验证码生成出来,然后在前端makeCertPic.jsp页面获取该图片,并将该图片的值保存在session中,让后台能够正常获取到,前台页面便可通过用户输入的验证码的值与后台进行校对,从而完成验证码验证。

当用于进行个人信息输入完成之后,系统就会进行post方法将当前数据进行异步刷新,判断当前输入信息是真实有效的,且存在。如果判断成功则通过,如果失败则弹出提示信息。

3.2.2 用户模块的详细设计

用户模块的流程图如下图3-4所示。

图 3-4 用户添加流程图

员工信息查看页面,用户可以通过选择查看方式,选择查看的条件,然后根据查看条件和输入的信息进行模糊查询,并显示所有查到的信息,如果输入为空,则查找全部,其中用户可以在每一条查到的数据后面点编辑或删除,进一步对选中的信息进行操作。

对员工信息的批量删除模块则是通过JS获取到所有已选中的用户信息,并将数据传输到后台,由后台执行批量删除工作。其中涉及数据传输的格式问题,通过巧妙利用字符串,适当拆分和合并,进而起到对应的效果。

3.2.3 客户模块的详细设计

供应商的添加功能与用户模块基本相同,流程图如图3-5所示。

供应商信息的查询也是通过按条件查询,如果没有输入查询条件那么就是默认对全部进行搜索,后台根据查询条件检索出相关信息,前端页面以EL表达式的形式将结果体现出来。

供应商的批量删除功能与员工模块相同,页面需要根据所选中的数据取出相应的数据id,通过后台对该id或者是更多的字符串进行分析,进而深入的进行删除操作。只要管理员能够完成该操作。

图3-5 供应商添加流程图

3.2.4 设备模块的详细设计

设备的添加功能模块,流程图如下图3-6所示。

图3-6 设备添加流程图

设备模块的添加操作是由以下流程具体的完成。首先要通过JS的加载从后台获取到数据库有关供应商的数据,并在前段页面进行展示,用户就可以通过该展示对想要进行操作的供应商进行操作,省去了用户手动填写供应商的过程,节约了操作时间。

设备编号也是需要验证的,该验证过程与之前的设备编号验证过程是相似的。完成所有必要信息的输入之后进行保存操作。

3.2.5 库存模块的详细设计

库存的模块设计对于这个项目来说是很重要的,入库的详细流程如下图3-7所示。

在进入入库界面的时候,JS模块就开始经由AJAX开始于后台进行交互,并将数据进行异步刷新。输入设备编号时,系统可以通过设备id从而将设备的其他基本信息自动带出来,省去了用户手动填写的时间。如果必要的输入数据都已经输入完成,则点击保存的按钮就可以将当前的输入数据保存到后端的数据库对应的数据表中,进而入库数据更新成功。

图3-7 入库模块设计流程图

出库的流程图详细的流程如下图3-8所示。

图3-8 出库模块设计流程图

当进入到出库单界面的时候,当前页面经由JS模块对后台对应的数据进行了准确的模糊查询操作,并将现有的出单进行编号。完成这些操作后即可保存出库单。

上述流程都结束以后,要对系统的库存余量进行更新,如果发现余量不足时,系统右上角能够进行提醒及警告,通过点击右上角下拉框即可看到是哪个设备余量不足,点击设备即可进入到修改上下限提醒及警告的页面。

3.3 项目搭建

打开MyEclipse新建Web Project命名为WMS系统包目录结构如下图3-9所示。

图3-9 项目结构图

3.4 本章小结

本章列举出了开发本项目的概念设计,总体设计,数据库中表以及表内各个字段的设计,每个模块的业务流程及所需要的功能,本项目根据本章设计内容开发本系统。

4 系统实现

4.1 用户环境

服务器硬件方面CPU要求i5以上;内存要求不小于512MB;硬盘要求不小于40G;服务器端软件方面操作系统Windows 10;数据库服务器要求使用MySQL Workbench6.0;Web服务器要求使用Firefox 57.0或以上;客户端软件方面操作要求Windows 7、Windows 8或Windows 10;浏览器要求Firefox 57.0或以上;开发工具要求使用MyEclipse。

4.2 其他要求

对于访问容量的要求包括系统要求支持的最大并发用户数为20;关于响应时间方面的要求包括复杂功能时间小于400毫秒,另外简单功能的响应时间小于200毫秒。

4.3 用户登录功能

用户进入系统界面的时候,需要将个人的信息进行输入,主要是账号和密码,同时结合验证码模块,该模块的存在主要是为了爬虫的不断的骚扰,增加系统的安全性。

用户也要正确选择自己的角色,该处系统也需要进行校验,角色选错用户也无法进行登录。

用户登录界面如下图4-1所示。

图4-1 用户登录界面

系统的整体开发对于每个用户进入系统看到的操作内容都是不一样的。这不仅仅是功能模块划分的具体体现,也是对用户进行权限管理的形象的表达。

系统主界面如下图4-2所示。

图4-2 系统主界面

4.4 员工管理功能

模块包括有员工的添加、查询功能;部门的添加、查询功能;职位的添加、查询等6个功能,添加员工如图4-3所示。

图4-3 添加员工界面

员工信息查看如图4-4所示。

图4-4 员工信息查看界面

在员工信息查看界面,可以通过点击添加登录权限按钮快捷注册账户,授权后的员工便可以通过自己的员工账号登录本系统,初始密码为123456,权限为医疗人员。

添加部门如图4-5所示。

图4-5 添加部门界面

部门信息查看如图4-6所示。

图4-6 部门信息查看界面

添加职位如图4-7所示。

图4-7 添加职位界面

职位信息查看如图4-8所示。

图4-8 职位信息查看界面

4.5 客户管理功能

本模块供应商的添加和查询两个功能,添加供应商如图4-9所示。

图4-9 添加供应商界面

供应商信息查看如图4-10所示。

图4-10 供应商信息查看

4.6 设备管理功能

本模块有设备的添加和查询两个功能,添加设备如下图4-11所示。

图4-11 添加设备界面

设备信息查看如图4-12所示。

图4-12 设备信息查看界面

4.7 库存管理功能

库存查询如下图4-13所示。

图4-13 库存查询界面

该模块是该系统的必要模块,十分重要,此处对该模块数据的有效性和数据的展示是否有效进行了测试,并测试页面的输入数据的合理性,即测试该系统的表单验证功能。

设备想要入库就必须先完成入库单的填写,通过相关的流程之后才能够完成入库操作,入库单的测试也是必须要重视的一个环节,入库单的填写如图4-14所示。

图4-14 填写入库单

入库单的数据是需要用户准确的填写的,用户完成数据的填写之后,入库单就会由系统自动的生成,设备的基本信息也是不需要手写添加的,按照对应的编号查询即可。

当完成入库操作的时候,后台就对当前的库存量进行更新操作,保证后台设备存储量的准确性。为保证系统数据的安全性,普通用户是没有办法对入库单进行基本数据操作的,这样很大程度保证了数据的安全性。入库单查询如图4-15所示。

图4-15 入库单查询界面

出库部分的实现在主要逻辑上跟入库部分的实现是大有相似之处,出库对数据进行减法操作,而入库是进行加法操作。而完成这些数据操作以后都需要对库存量进行更新,保证数据量的准确性,该环节是必不可少的。填写出库单4-16所示。

图4-16 填写出库单界面

出库单查询如图4-17所示。

图4-17 出库单查询界面

用户进入库存的警示信息修改页面如图4-18所示。

图4-18 警告信息修改界面

4.8 库房管理功能

本模块包括部门管理,科室管理,诊室管理,添加部门如图4-19所示。

图4-19 添加设备部门界面

设备部门信息查看如图4-20所示。

图4-20 设备部门信息查看界面

添加科室界面如图4-21所示。

图4-21 添加科室界面

科室信息查看查看如图4-22所示。

图4-22 科室信息查看界面

添加诊室信息如图4-23所示。

图4-23 添加诊室界面

诊室信息查看如图4-24所示。

图4-24 诊室信息查看界面

4.9 系统管理功能

本模块包括登陆用户信息查看以及权限信息查看两个功能。用来查看哪些人员拥有登陆权限。

用户信息查看如图4-25所示。

图4-25 用户信息查看界面

权限信息查看如图4-26所示。

图4-26 权限信息查看界面

4.10 本章小结

本章讲述了本系统开发硬件及软件的环境,每个模块功能的介绍以及操作方式,每个模块的具体实现,其中的实现结果通过截图的方式展现出来。

5 系统测试

为保证测试的准确性,本章将抽取最具代表性的模块进行抽样测试。

5.1 用户登录测试

对于登陆测试需要分为用户名、密码、验证码、权限四个部分。测试用例如表5.1所示。

表5.1 登录测试

用例编号 操作 输入数据 预期结果 实际结果

5.1-1 输入正确的用户名、密码以及验证码,选择正确的权限后,进行登录 用户名:Z001

密码:123456

验证码:输入正确的验证码

权限:总库 登录成功 成功进入到系统主页面

5.1-2 输入正确的用户名、验证码和错误的密码,选择正确的权限后,进行登录 用户名:Z001

密码:000000

验证码:输入正确的验证码

权限:总库 登录失败 系统提示:密码错误

5.1-3 输入正确的用户名、密码和错误的验证码,选择正确的权限后,进行登录 用户名:Z001

密码:123456

验证码:输入错误的验证码

权限:总库 登录失败 系统提示:验证码错误

5.1-4 输入正确的用户名、密码以及验证码,选择错误的权限后,进行登录 用户名:Z001

密码:123456

验证码:输入正确的验证码

权限:二级库 登录失败 系统提示:用户不存在

5.1-5 输入错误的用户名以及正确的密码、验证码,选择正确的权限后,进行登录 用户名:admin

密码:123456

验证码:输入正确的验证码

权限:总库 登录失败 系统提示:用户不存在

由该表可知系统登录功能正常,用户只有通过输入与数据库相匹配的用户信息才可以进行登录,否则系统将根据错误信息进行不同的登陆报错,登录失败。

5.2 员工管理测试

员工管理模块测试用例如表5.2所示。

表5.2 员工管理测试

用例编号 操作 输入数据 预期结果 实际结果

5.2-1 查看是否显示信息 无 显示成功 显示数据成功

5.2-2 与数据库数据相匹配 无 匹配成功 数据显示一致

5.2-3 输入正确的添加信息,进行添加员工操作 部门编号:门诊部

职位编号:库管

员工编号:自动生成

姓名:张三丰

性别:男

年龄:22

出生日期:1999-09-09

身份证号:210102199909099999

学历:本科

入职时间:2020-09-09

居住地址:沈阳

电话号码:13900000000 添加成功 显示出张三丰的信息

5.2-4 输入正确的添加信息,却有未填字段,进行添加员工操作 部门编号:门诊部

职位编号:库管

员工编号:自动生成

姓名:张三丰

性别:男

年龄:22

出生日期:1999-09-09

身份证号:210102199909099999

学历:本科

入职时间:2020-09-09

居住地址:沈阳

电话号码: 添加失败 提示:不能为空

5.2-5 输入错误的信息格式,进行添加操作 部门编号:门诊部

职位编号:库管

员工编号:自动生成

姓名:张三丰

性别:男

年龄:22

出生日期:1999-09-09

身份证号:210102199909099999

学历:本科

入职时间:2020-09-09

居住地址:沈阳

电话号码:00000000000 添加失败 提示:格式错误

5.2-6 对员工执行修改操作 电话号码:13999999999 修改成功 成功修改张三丰的信息

员工管理模块的测试计划是用户进入员工管理界面后,在查询界面能否显示与数据库中相对应的信息,在搜索栏中填入查询信息,看是否能够检索出对应信息。点击修改,看能否成功修改员工信息并录入到数据库。在添加员工界面输入正确的信息,提示添加成功后,看是否录入数据库,同时查看前端界面是否正确显示。输入错误的信息看是否能够正确提示,添加时有未填入信息看是否正常提示。

测试结果是员工管理功能能正常使用,正确填写员工基本信息即可将员工信息录入本系统,输入错误的信息,系统也能够正确提示报错,通过检索条件也可以对员工进行检索。其他模块功能与本模块情况相近,不一一列举。

5.3 库存管理测试

库存管理模块的测试计划是用户进入库存管理界面后,在填写入库单界面,能够正确的将设备管理中录入的设备成功入库到本系统中,库存中增加正确的数量,填写出库单后能够减少正确的数量,库存不足时,出库单能够正常提示库存不足。填写入出库单时,信息错误或者有漏填的信息能够正常进行报错。填写好设备编号后能否正确带出设备基本信息。通过填写检索条件能够正确检索出库存信息,入库单信息以及出库单信息。设置库存上下限,系统能否正确报警,点击报警信息能否正确跳转到修改对应设备库存上下限的界面。库存管理模块测试用例如表5.3所示。

表5.3 库存功能测试

用例编号 操作 输入数据 预期结果 实际结果

5.3-1 查看是否正确显示库存信息、入库单信息、出库单信息 无 显示成功 显示数据成功

5.3-2 与数据库数据相匹配 无 匹配成功 数据显示一致

5.3-3 输入正确的入库单信息,进行入库操作 单号:自动生成

日期:2020-05-17

负责人:001030000

设备编号:SB001

数量:5

存放区域:沈阳_门诊部,门诊部,诊室1 入库成功 眼压仪入库诊室1,数量5个

表5.3 库存功能测试-续表

用例编号 操作 输入数据 预期结果 实际结果

5.4-3 输入错误的入库单信息,进行入库操作 单号:自动生成

日期:2020-05-17

负责人:001030000

设备编号:99999

数量:5

存放区域:沈阳_门诊部,门诊部,诊室1 入库失败 提示:不存在此设备

5.4-1 输入正确的出库单信息,进行出库操作 单号:自动生成

日期:2020-05-17

负责人:001030000

设备编号:SB001

数量:2

接收人:001030000

生产项目编号:1 出库成功 眼压仪成功出库,数量2个,库存正确减少

5.4-2 输入正确的出库单信息,进行出库操作 单号:自动生成

日期:2020-05-17

负责人:001030000

设备编号:SB001

数量:6

接收人:001030000

生产项目编号:1 出库失败 提示:库存不足

5.5-1 对库存上下限进行修改操作 下限提醒:6 提示库存量提醒 成功显示:提醒如下,眼压仪,点击后正常跳转到库存界面

5.5-2 对库存上下限进行修改操作 下限报警:8 修改失败 提示:不能超过警告下限

测试结果为库存管理功能正常,正确填写入库单信息便可将设备录入到库存中,正确填写出库单信息便可将设备出库,通过修改上下限提醒或报警,系统可正确显示提醒或报警信息。

5.4 本章小结

本章对系统中的几个主要功能进行测试,为保证测试的准确性,在每个阶段中抽取最具代表性的模块进行随机抽样测试,选取登录模块,员工模块,库存模块进行测试。

结 论

项目的实现是以Java语言为开发语言,结合SSH框架的高效性,完成了医疗器械设备采购系统的设计与实现,并且着重对库存管理系统的管理体制进行研究。

项目采用的核心结构方式为B/S,根据项目的具体运行需要,进行了需求设计分析,需求说明,编码设计,编码实现,项目测试等几个核心环节。项目用MySql对后台的数据进行存储,主要是因为该数据库具有很好的适应能力,并且十分符合Web数据存储的要求。项目的完成知识对该案例的针对性实现,如果想要适合所有医院的业务需求,则需要对客户进行具体的分析,结构进行具体针对性的调整。因此,目前系统具有局限性,后期应该不断的优化。

致 谢

本毕业设计是在指导老师高丽及聂菲的悉心指导下完成的。在整个毕业设计过程中,不论在选题、设计还是在撰写论文过程中,老师均给予了我莫大的指导和帮助。在毕业设计过程中,老师耐心地给我分析了库存管理系统开发的思路,使我一开始就能够很好地把握设计的方向,从自己平时的项目实训中选出了最适合该系统的开发方式,并且老师又很负责的给了我很多的改进意见,帮助我解决设计遇到的困难,积累了很多经验,并完成了预期的任务。在此,特向指导老师表示我衷心的感谢和深切的谢意。

在此期间,我还得到了很多同学的帮助,在此一并向他们表示感谢。感谢母校多年来对我的培养,感谢所有关心和帮助我的老师和同学们!

参考文献

[1] 陈善伟. 基于二维码技术的医院耗材全闭环管理系统的设计与应用[J]. 电子技术与软件工程, 2017(22):185-186

[2] 朱家琦, 朱家沐, 马明芳, 王凯, 邓开琴. 医院医用耗材精细化闭环管理系统的设计与应用[J]. 中国医学装备, 2017, 14(08):119-122

[3] 石玉芳. 条形码技术在手术室高值耗材管理系统的应用[J]. 中国医疗器械信息, 2017, 23(10):122-123

[4] 唐泽君, 鄢良平. "十二五"期间医疗耗材的管理探讨[J]. 医疗卫生装备, 2013, 34(02):120-121+125

[5] 郑志刚, 董亚洲. 基于j2ee平台系统开发综述[J]. 无线互联科技, 2014(10):69-70

[6] 庄巧蕙. 基于J2EE的电子商务平台的研究与构建[J]. 大庆师范学院学报, 2018, 38(06):59-63

[7] Matej Zuzčák, Milan Zenka. Expert system assessing threat level of attacks on a hybrid SSH honeynet[J]. Computers & Security, 2020, 92

[8] 张亚梅, 马啸. 基于SSH框架的网站设计与实现[J]. 电脑编程技巧与维护, 2012(10):62-63+106

[9] 孙红艳. 基于SSH框架的班级事物管理系统设计与实现[J]. 电脑编程技巧与维护, 2019(12):135-136+139

[10] 卢肖霞. SSH框架在Web项目开发中的设计与实现[J]. 计算机测量与控制, 2018, 26(10):122-127

[11] 潘蕊. SSH框架的Web网站设计与实现研究[J]. 成才之路, 2019(36):58-59

[12] 梅元昭. 基于Jquery课程网站的设计[J]. 无线互联科技, 2019, 16(10):39-41

[13] 李彦. DIV+CSS技术在网页设计布局中的应用研究[J]. 微型电脑应用, 2020, 36(03):19-21+30

[14] 秦秋滢. 基于CSS技术的网页设计应用研究[J]. 电子世界, 2020(06):194-195

[15] 郭毓东. 基于XML技术的供应链知识管理系统的知识抽取[J]. 物流技术, 2012, 31(13):287-289

[16] 李红飞, 姜海森. 基于XML技术的结构化文档编辑器研究[J]. 软件, 2014, 35(05):114-118

[17] 李品升, 周传生. 基于XML通用软件可扩展平台模型的研究与应用[J]. 沈阳师范大学学报(自然科学版), 2011, 29(01):69-72

[18] 佟玲, 周传生. 基于XML的任务流编辑器的设计与实现[J]. 沈阳师范大学学报(自然科学版), 2015, 33(04):546-550

[19] 郝洁. ASP. NET AJAX框架在Web开发中的应用[J]. 电子技术与软件工程, 2017(17):55

[20] A Technical Method of Online Spatial Attribute Data Management Based on Web Font End[J]. Computer Science and Application. 2016:30-35

[21] 李志伟. 基于AJAX的网页信息交互技术要点及优势[J]. 产业与科技论坛, 2016, 15(09):86

[22] 黄宁. 基于MySQL数据库安全研究[J]. 科学中国人, 2017(2X):16-17

[23] Frank M. Kromann. Using MySQL Databases[J]. PHP and MySQL Recipes. 2016:333-356

[24] 陈年飞, 王麒森, 王志勃. MySQL数据库中关于索引的研究[J]. 信息与电脑(理论版), 2019(05):175-176

[25] Rashmi Parab; Nilima Nikam. Database Security Technique With Database Cache[J]. International Journal of Scientific & Technology Research. 2017, Vol.6(No.12):184-187

附录 源程序清单

由于本系统全部代码过多,所以本章只附核心模块代码。

库存模块:

public class StockAction extends ActionSupport {

/**
 * 
 */
private static final long serialVersionUID = -6139229070608157488L;
private Stockinfotable stock;
private BaseService<Stockinfotable> stockService;
private List<Stockinfotable> stoList ;
private List<Stockinfotable> stocks = new ArrayList<Stockinfotable>();
private String stoText, stoValue;
private Pager pager = new Pager();

/**
 * 根据条件查询
 * @param
 * @return String
 */
public String queryStock() {
	stoText = getParam("sName");
	stoValue = getParam("sValue");
	stoList = stockService.queryStock(stoText, stoValue, Stockinfotable.class);
	if(stocks != null)
		stocks.removeAll(stocks);
	if(pager.getTotalSize() == 0)
		pager.setTotalSize(stoList.size());
	if(pager.getPageNow() < pager.getTotalPage()-1 || pager.getTotalSize()%pager.getPageSize() == 0) {
		for(int i = pager.getPageNow()*pager.getPageSize(); i < (pager.getPageNow()+1)*pager.getPageSize(); i++) {
			stocks.add(stoList.get(i));
		}
	}
	else {
		for(int i = pager.getPageNow()*pager.getPageSize(); i < pager.getPageNow()*pager.getPageSize()+pager.getTotalSize()%pager.getPageSize(); i++) {
			stocks.add(stoList.get(i));
		}
	}
	Logintable lt = (Logintable)ActionContext.getContext().getSession().get("loginuser");
	int m = 0;
	if("2".equals(lt.getPowId())) {
		m = 1;
	} else {
		m = 0;
	}
	return SUCCESS + "Stock" + m;
}
/**
 * 分页模块
 * @return
 */
public String turnFirst() {
	Integer tSize = Integer.parseInt(getParam("tSize"));
	pager.setTotalSize(tSize);
	pager.setPageNow(0);
	return queryStock();
}
public String turnPre() {
	Integer tSize = Integer.parseInt(getParam("tSize"));
	Integer pg = Integer.parseInt(getParam("pNow"));
	pg = pg - 1;
	pager.setPageNow(pg);
	pager.setTotalSize(tSize);
	return queryStock();
}
public String turnNext() {
	Integer pg = Integer.parseInt(getParam("pNow"));
	Integer tSize = Integer.parseInt(getParam("tSize"));
	pg = pg + 1;
	pager.setPageNow(pg);
	pager.setTotalSize(tSize);
	return queryStock();
}
public String turnLast() {
	Integer tSize = Integer.parseInt(getParam("tSize"));
	Integer pg = Integer.parseInt(getParam("pNow"));
	pager.setTotalSize(tSize);
	
	pager.setPageNow(pg);		
	return queryStock();
}
public String turnChoosePage() {
	Integer tSize = Integer.parseInt(getParam("tSize"));
	Integer pageNum = Integer.parseInt(getParam("pageNum"));
	pageNum = pageNum - 1;
	pager.setPageNow(pageNum);
	pager.setTotalSize(tSize);
	return queryStock();
}

/**
 * 修改
 * @param
 * @return String
 */
public String modifyStock() {
	try {
		Integer param = Integer.parseInt(getParam("param"));
		if(param == 0) {
			Integer id = Integer.parseInt(getParam("id"));
			stock = stockService.getObject(Stockinfotable.class, id);
			return "modifyStock";
		} else if(param == 1) {
			stockService.modifyObject(stock);
		}
	} catch (Exception e) {
		e.printStackTrace();
	}
	return queryStock();
}
public void inStock() {
	try {
		stoText = "stoId";
		stoValue = getParam("singoodid");
		int count = Integer.parseInt(getParam("count"));
		stoList = stockService.queryStock(stoText, stoValue, Stockinfotable.class);
		if(stoList.size() > 0)
			stock = stoList.get(0);
		else
		{
			stock = new Stockinfotable();
		}
		count += stock.getStoNumber();
		stock.setStoNumber(count);
		System.out.println(count);
		stockService.modifyObject(stock);
		HttpServletResponse response = ServletActionContext.getResponse();
		response.setCharacterEncoding("utf-8");
		JSONArray jsonarry = JSONArray.fromObject("[{'result':'success'}]");
		response.getWriter().write(jsonarry.toString());
	} catch (Exception e) {
		e.printStackTrace();
	}
}
public void getWarnStock() {
	try {
		stoList = stockService.queryStock(stoText, stoValue, Stockinfotable.class);
		if(stocks != null)
			stocks.removeAll(stocks);
		for(int i = 0; i < stoList.size(); i++) {
			stock = stoList.get(i);
			if(stock.getStoNumber() < stock.getStoDownWarn() && stock.getStoNumber() >= stock.getStoDownDanger()) {
				stocks.add(stock);
			} else if(stock.getStoNumber() > stock.getStoUpWarn() && stock.getStoNumber() <= stock.getStoUpDanger()) {
				stocks.add(stock);
			}
		}
		HttpServletResponse response = ServletActionContext.getResponse();
		response.setCharacterEncoding("utf-8");
		JSONArray jsonarry = JSONArray.fromObject(stocks);
		response.getWriter().write(jsonarry.toString());
	} catch (Exception e) {
		e.printStackTrace();
	}
}
public void getDangerStock() {
	try {
		stoList = stockService.queryStock(stoText, stoValue, Stockinfotable.class);
		if(stocks != null)
			stocks.removeAll(stocks);
		for(int i = 0; i < stoList.size(); i++) {
			stock = stoList.get(i);
			if(stock.getStoNumber() < stock.getStoDownDanger()) {
				stocks.add(stock);
			} else if(stock.getStoNumber() > stock.getStoUpDanger()) {
				stocks.add(stock);
			}
		}
		HttpServletResponse response = ServletActionContext.getResponse();
		response.setCharacterEncoding("utf-8");
		JSONArray jsonarry = JSONArray.fromObject(stocks);
		response.getWriter().write(jsonarry.toString());
	} catch (Exception e) {
		e.printStackTrace();
	}
}
public void outStock() {
	try {
		stoText = "stoId";
		stoValue = getParam("soutgoodid");
		int count = Integer.parseInt(getParam("count"));
		stoList = stockService.queryStock(stoText, stoValue, Stockinfotable.class);
		stock = stoList.get(0);
		count = stock.getStoNumber() - count;
		String str = "";
		if(count < 0) {
			str = "[{'result':'"+ count +"'}]";
		} else {
			str = "[{'result':'success'}]";
			stock.setStoNumber(count);
			stockService.modifyObject(stock);
		}			
		System.out.println(count);			
		HttpServletResponse response = ServletActionContext.getResponse();
		response.setCharacterEncoding("utf-8");
		JSONArray jsonarry = JSONArray.fromObject(str);
		response.getWriter().write(jsonarry.toString());
	} catch (Exception e) {
		e.printStackTrace();
	}
}
/**
 * 添加
 * @param
 * @return String
 */
public String addStock() {
	try {
		Integer param = Integer.parseInt(getParam("param"));
		if(param > 0) {
			stockService.addObject(stock);
		} else
			return "addStock";
	} catch (Exception e) {
		e.printStackTrace();
	}
	return queryStock();
}

/**
 * 删除
 * @param
 * @return String
 */
public String deleteStock() {
	try {
		Integer id = Integer.parseInt(getParam("id"));
		stockService.deleteObject(Stockinfotable.class, id);
	} catch (Exception e) {
		e.printStackTrace();
	}
	return queryStock();
}

/**
 * 获取表单节点值
 * @param key
 * @return String
 */
protected String getParam(String key) {
	return ServletActionContext.getRequest().getParameter(key);
}
public Stockinfotable getStock() {
	return stock;
}
public void setStock(Stockinfotable stock) {
	this.stock = stock;
}
public BaseService<Stockinfotable> getStockService() {
	return stockService;
}
public void setStockService(BaseService<Stockinfotable> stockService) {
	this.stockService = stockService;
}
public List<Stockinfotable> getStoList() {
	return stoList;
}

public List<Stockinfotable> getStocks() {
	return stocks;
}

public String getStoText() {
	return stoText;
}
public void setStoText(String stoText) {
	this.stoText = stoText;
}
public String getStoValue() {
	return stoValue;
}
public void setStoValue(String stoValue) {
	this.stoValue = stoValue;
}
public Pager getPager() {
	return pager;
}
public void setPager(Pager pager) {
	this.pager = pager;
}

}

验证码:

public class MakeCertPic {

private char[] mapTable = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e',

'f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',

'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U',

'V','W','X','Y','Z'};

public String getCertPic(int width, int height, OutputStream os) {

if(width <= 0)

width = 80;

if(height <= 0)

height = 30;

BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);

Graphics g = image.getGraphics();

g.setColor(new Color(0xDCDCDC));//背景色

g.fillRect(0, 0, width, height);

g.setColor(Color.black);//边框色

g.drawRect(0, 0, width-1, height-1);

String strEnsure = "";

for(int i = 0; i < 5; i++) {

strEnsure += mapTable[(int)(mapTable.length * Math.random())];

}

g.setColor(Color.black);

g.setFont(new Font("Atlantic Inline", Font.PLAIN, 20));

String str = strEnsure.substring(0, 1);

g.drawString(str, 5, 25);

g.setColor(Color.green);

str = strEnsure.substring(1, 2);

g.drawString(str, 20, 20);

g.setColor(Color.orange);

str = strEnsure.substring(2, 3);

g.drawString(str, 35, 15);

g.setColor(Color.black);

str = strEnsure.substring(3, 4);

g.drawString(str, 50, 19);

g.setColor(Color.blue);

str = strEnsure.substring(4, 5);

g.drawString(str, 64, 28);

Random rand = new Random();//产生干扰点

for(int i = 0; i < 20; i++) {

int x = rand.nextInt(width);

int y = rand.nextInt(height);

g.setColor(Color.BLACK);

g.drawOval(x, y, 2, 2);

}

g.dispose();

try {

ImageIO.write(image, "JPEG", os);

//

os.flush();

os.close();

os=null;

} catch (IOException e) {

return strEnsure.toLowerCase();

}

return strEnsure.toLowerCase();

}

}

相关推荐
杨充3 分钟前
13.观察者模式设计思想
java·redis·观察者模式
Lizhihao_5 分钟前
JAVA-队列
java·开发语言
喵叔哟15 分钟前
重构代码之移动字段
java·数据库·重构
喵叔哟15 分钟前
重构代码之取消临时字段
java·前端·重构
fa_lsyk17 分钟前
maven环境搭建
java·maven
Daniel 大东36 分钟前
idea 解决缓存损坏问题
java·缓存·intellij-idea
wind瑞43 分钟前
IntelliJ IDEA插件开发-代码补全插件入门开发
java·ide·intellij-idea
HappyAcmen43 分钟前
IDEA部署AI代写插件
java·人工智能·intellij-idea
马剑威(威哥爱编程)1 小时前
读写锁分离设计模式详解
java·设计模式·java-ee
鸽鸽程序猿1 小时前
【算法】【优选算法】前缀和(上)
java·算法·前缀和