1、 毕 业 论 文 学生姓名 学 号 学院 计算机科学和技术学院 专 业 计算机科学和技术学院(软件工程) 题 目 基于JSP仓库管理系统 设计和实现 指导老师 讲 师/硕 士 (姓 名) (专业技术职称/学位) 年 月 摘 要:仓库管理系统是一个企业不可或缺部分,高效仓库管理系统能够为企业发展和经营提供坚强后盾。伴随科技不停发展,用计算机对仓库进行管理,含有些人工管理所无法比拟优点,比如:检索快速、查找方便、保密性好、成本低、寿命长等。这些优点能极大
2、地提升仓库管理效率, 使企业仓库管理井井有条,为企业健康发展发明良好条件。本文在分析现有管理系统开发技术基础上,实现了以Eclipse为开发平台基于JSP,以MySql作为后台数据库仓库管理系统。该系统关键含有基础信息管理、库存管理、信息查询、用户管理等功效模块。 关键词:仓库管理,JSP,MySql数据库 Abstract: Warehouse management system is an indispensable part of the enterprise. A warehouse management system with high efficiency ca
3、n provide a strong backing for the development and management of enterprises. With the development of technology,to manage the warehouse with computer has the incomparable advantages of manual management.For example, quick search, find convenient, good security, low cost, long service life etc. Thes
4、e advantages can greatly improve the efficiency of warehouse management, the enterprise storage management be arranged in good order, and create good conditions for the healthy development of enterprises. In this paper, based on analysis of the existing management system development technology, in o
5、rder to realize the Eclipse as the development platform based on JSP, using MySql as the background database warehouse management system. The system mainly has the basic information management, inventory management, information query, user management module Keywords: Warehouse management, JSP,
6、MySql database 目 录 1 绪论 4 1.1 开发背景 4 1.2 开发意义 4 1.3 本文组织结构 4 2 系统处理方案 5 2.1 JSP语言概述 5 2.2 SSH框架 5 2.3 MySql数据库 5 2.4 系统平台环境 5 3 需求分析 6 3.1 面向用户人群 6 3.2 功效需求分析 6 3.3 业务步骤图 7 4 数据库设计 9 4.1 E-R模型 9 4.2 数据模型 12 5 具体设计 15 5.1 数据库连接类 15 5.2 系统关键模块 16 结 论 34 参 考 文 献 35 致
7、 谢 36 1 绪论 1.1 开发背景 一直以来企业使用传统人工方法来管理文件库存,这种管理方法存在很多缺点,如: 保密性差、效率低等,而且时间一长,将产生大量数据和文件, 这对于企业查找、更新和维护全部带来了很多困难。因为缺乏科学管理和管理工具,企业在业务上和管理上安排全部存在着很多不便。所以针对这些问题而开发系统含有很好前景。 1.2 开发意义 伴随时代不停发展,社会正在不停向信息化时代前进。因为能够有效地搜集和处理多种信息,提升办事效率,电子自动化办公越来越被重视。而伴随互联网技术不停发展,又为电子自动化办公发展提供了良好前景。现在,很多企业已经拥有了计算机设备,含有
8、物质条件,但很多工作仍由管理者手工操作完成,这就造成无须要浪费。计算机流行原因关键有以下多个方面: 1.计算机能够替换手工操作进行很多繁杂工作; 2.计算机能够节省大量资源; 3.计算机能够极大地提升大家工作效率; 4.计算机能够使敏感文档愈加安全; 5.电子自动化办公是优异生产力发展关键标志。 总而言之,用计算机开发软件系统,替换人工操作进行管理,能够节省大量人力、物力,是企业发展肯定趋势[1]! 1.3 本文组织结构 本系统将以书本和部分课外书籍为参考,从系统开发背景→需求分析→概要设计→具体设计→具体开发一步步对系统进行分析和设计。各个章节安排以下: 第一章为绪论,简述
9、项目标开发背景和开发意义; 第二章具体介绍了项目开发应用技术,比如JSP,框架和数据库等; 第三章是需求分析,介绍了系统设计目标和系统关键功效模块。 第四章是数据库设计,在E-R模型基础上,再设计出对应逻辑模型。 第五章依据系统功效模块具体介绍了各模块设计过程并给出部分实现代码。 2 系统处理方案 2.1 JSP语言概述 JSP(Java Server Pages)是由Sun Microsystems企业提倡、很多企业参与一起建立一个动态网页技术标准。它关键目标是将表示逻辑从Servlet中分离出来。它是在传统网页HTML文件(*.htm,*.html)中插入Java程序段(
10、Scriptlet)和JSP标识(tag),从而形成JSP文件(*.jsp)。全部程序操作全部在服务器端实施,网络上传送给用户端仅是得到结果,这么大大降低了对用户浏览器要求,即使用户浏览器端不支持Java,也能够访问JSP网页。用JSP开发Web应用是跨平台,既能在Linux下运行,也能在其它操作系统上运行[2]。 2.2 SSH框架 SSH 在J2EE项目中表示了3种框架,即 Spring + Struts +Hibernate。本系统采取MVC开发模式来编写代码,MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller
11、)缩写[3]。Struts对Model,View和Controller全部提供了对应组件。Spring是一个轻量级控制反转(IoC)和面向切面(AOP)容器框架,它由Rod Johnson创建。它是为了处理企业应用开发复杂性而创建[4]。Spring使用基础JavaBean来完成以前只可能由EJB完成事情。 Hibernate是一个开放源代码对象关系映射框架,它对JDBC进行了很轻量级对象封装,能够应用在任何使用JDBC场所,能够在Servlet/JSPWeb应用中使用,也能够在应用EJBJ2EE架构中替换CMP,完成数据持久化重担[5]。 2.3 MySql数据库 MySQL是一个关系型
12、数据库管理系统,由瑞典MySQL AB企业开发,现在属于Oracle企业。MySQL是一个关联数据库管理系统,关联数据库将数据保留在不一样表中,而不是将全部数据放在一个大仓库内,这么就增加了速度并提升了灵活性。MySQLSQL语言是用于访问数据库最常见标准化语言。因为其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,通常中小型网站开发全部选择MySQL作为网站数据库[6]。 2.4 系统平台环境 (1)硬件环境: 服务器: CPU: 2G或以上; 内存:1G RAM或以上; 硬盘:80G或以上; 用户端: CPU: 1G或以上; 内存:64MB以上内存或更高; 硬
13、盘:20G或以上。 (2)软件开发环境: 操作系统:WindowsXP; 所用工具:Eclipse,Navicat for MySQL; 数据库:MySQL。 3 需求分析 3.1 面向用户人群 1. 管理员:作为系统管理员和维护者,对系统基础信息、仓库管理等模块进行数据管理,并对系统更新作出立即响应,使得系统能愈加好地运行。 2. 一般用户:作为系统使用者,注册登陆系统后,能够查询系统基础信息、仓库信息、修改个人信息等。 3.2 功效需求分析 仓库管理系统 基础信息管理 库存管理 信息查询 用户管理 用户添加,删除 用户密码修改 添加入库统计 添加出库统计
14、 按仓库查询 按货物查询 用户添加删除 用户权限修改 系统设置 个人信息修改 图3-1 系统功效模块图 本系统是一款仓库管理系统,意在对仓库自动化管理以适应信息化社会生产方法。依据仓库管理系统需求,划分了仓库功效模块,关键分为用户管理模块、入库出库模块、仓库查询模块、盘点统计模块[7]。具体功效图3-1所表示。 3.3 业务步骤图 该系统用户分为一般用户和管理员。管理员拥有全部权限,而一般用户只能进行查询操作。 1 2 3 3.1 3.2 3.3 3.3.1 管理员模块 图3-2 管理员使用步骤图 管理员使用步骤图3-2所表示。 1. 登
15、录 登陆界面包含账号和密码两个文本框和身份选择单选框,用户登陆成功就会转到系统主页面,不然将会提醒账号密码错误。 2. 查询信息 用户登陆查询信息界面能够对仓库信息(仓库、货物、供给商、部门、入库单、出库单)进行查询。 3. 设置信息(管理员) 管理员用户登陆设置信息界面能够对仓库信息(仓库、货物、供给商、部门、入库单、出库单)进行设置。 4. 添加统计(管理员) 管理员用户登陆添加界面能够添加入库和出库信息。 5. 修改密码 用户能够修改自己密码,需要先验证旧密码,验证成功后经过输入两次新密码对密码进行修改。 6. 用户管理(管理员) 管理员用户能够对已添加用户权限进行
16、修改,也能够删除已存在用户。 3.3.2 一般用户模块 图3-3 一般用户使用步骤图 一般用户使用步骤图3-3所表示。 一般用户只能进行查询操作和修改个人信息。 4 数据库设计 数据库是一个存放数据并对数据进行操作工具。数据库作用在于组织和表示信息,即数据库就是相关信息集合。本章从E-R模型分析设计为切入点,关键介绍了数据库设计。依据仓库管理系统功效,将其E-R图转化为数据库表,为系统实现奠定了基础。 4.1 E-R模型 E-R模型即实体-联络模型,它是由实体集、属性和联络集组成。实体集用矩形框表示,矩形框内写上实体名。实体属性用椭圆框表示,框内写上属性名,并用无向边和其
17、对应实体集相连。实体间联络用菱形框表示,菱形框中写上以合适含义命名名字,用无向连线将参与联络实体矩形框分别和菱形框相连,并在连线上标明联络类型,即1—1、1—N或M—N。 本系统E-R模型关键包含部门实体、货物实体、用户实体、供给商实体、仓库实体、入库单实体和出库单实体共七个实体集和一个各实体联络集。E-R模型以下文所述。 4 5 6 6.1 1. 部门实体用来存放部门信息,E-R图图4-1所表示: 部门 部门电话 部门地址 部门经理 部门编号 部门名称 图4-1 部门实体E-R图 2. 货物实体用来存放货物信息,E-R图图4-2所表示: 货物 货物编号
18、供货商编号 计量单位 货物价格 货物规格 货物名称 图4-2 货物实体E-R图 3. 用户实体用来存放用户信息,E-R图图4-3所表示: 用户 用户编号 用户密码 用户权限 用户名 图4-3用户实体E-R图 4. 供给商实体用来存放供给商信息,E-R图图4-4所表示: 供给商 供给商电话 供给商地址 供给商联络人 供给商编号 供给商名称 图4-4供给商实体E-R图 5. 仓库实体用来存放仓库信息,E-R图图4-5所表示: 仓库 仓库电话 库存总量 仓库管理员 仓库编号 已用库存量 图4-5仓库实体E-R图 6
19、 入库单实体用来存放入库单信息,E-R图图4-6所表示: 入库单 入库编号 管理员编号 仓库编号 修改时间 入库时间 入库类型 货物编号 入库数量 图4-6入库单实体E-R图 7. 出库单实体用来存放出库单信息,E-R图图4-7所表示: 出库单 出库编号 管理员编号 仓库编号 修改时间 出库时间 部门编号 货物编号 出库数量 图4-7出库单实体E-R图 8.各实体联络E-R图图4-8所表示。用户经过添加入库单和出库单统计入库信息和出库信息,供给商提供货物,部门使用货物,一条统计对应一个供给商或部门, 货物入库 货物出库 仓库 入库单
20、 出库单 供给商 部门 货物 存放 用户 添加 n n 1 1 添加 1 1 n n m n m m 图4-8 各实体联络E-R图 4.2 数据模型 依据4.1中分析得出E-R图,本系统采取MySql数据库管理系统,在MySql数据库管理系统中新建名称为mystorage数据库,本系统所使用全部数据信息均将存放于该数据库中。以下列举数据表。 1 1.1 1.2 1. 部门表(department) 表4-1 部门表 列名 数据类型 大小 说明 depaId int 4 部门编号 depaName varchar
21、24 部门名称 depaPerson varchar 15 部门经理 depaPhone char 11 部门电话 depaAddr varchar 90 部门地址 2. 货物表(goods) 表4-2 货物表 列名 数据类型 大小 说明 goodsId int 4 货物编号 suppId int 4 供给商编号 goodsName varchar 30 货物名称 goodsSize varchar 10 货物规格 goodsPrice int 4 货物价格 unit char 6 计量单位 3. 入库表(
22、instore) 表4-3 入库表 列名 数据类型 大小 说明 instId int 4 入库编号 instClass char 1 入库类型 goodsId int 4 货物编号 instNum int 4 入库数量 instTime datetime 8 入库时间 modifyTime datetime 8 修改时间 stoId int 4 仓库编号 userId int 4 管理员编号 4. 出库表(outstore) 表4-4 出库表 列名 数据类型 大小 说明 outstId int 4 出
23、库编号 depaId int 4 部门编号 goodsId int 4 货物编号 outstNum int 4 出库数量 outstTime datetime 8 出库时间 modifyTime datetime 8 修改时间 stoId int 4 仓库编号 userId int 4 管理员编号 5. 仓库表(store) 表4-5 仓库表 列名 数据类型 大小 说明 stoId int 4 仓库编号 stoPerson varchar 15 仓库管理员 stoPhone char 11 仓库电话
24、usedVolu int 4 已用库存量 allVolu int 4 库存总量 6. 供给商表(supplier) 表4-6 供给商表 列名 数据类型 大小 说明 suppId int 4 供给商编号 suppName varchar 45 供给商名称 suppPerson varchar 15 供给商联络人 suppPhone char 11 供给商电话 suppAddr varchar 90 供给商地址 7. 用户表(user) 表4-7 用户表 列名 数据类型 大小 说明 userId int 4 用户
25、编号 userName varchar 15 用户名 pass varchar 16 用户密码 userLevel char 1 用户权限 8. 库存表(stock) 表4-8 库存表 列名 数据类型 大小 说明 stoId int 4 仓库编号 goodsId int 4 货物编号 stock int 4 库存量 以上就是mystorage数据库数据表。 5 具体设计 5.1 数据库连接类 在对数据库连接过程中,为了使代码更精简,将对数据库连接方法封装在DriverMana公共类中,其中包含数据库连接方法getConn、Re
26、sultSet关闭方法closers、PreparedStatement关闭方法closepstmt、Connection关闭方法closecon。以下即为代码: public class DriverMana { public static Connection getConn(){ Connection con=null; try { Class.forName("com.mysql.jdbc.Driver"); con=DriverManager.getConnection("jdbc:mysql://localhost:3306/mystorage", "
27、root", "root"); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } return con; } public static void closers(ResultSet rs){ if(rs!=null){ try { rs.close(); } catch (SQLException e) { e.printStackTrac
28、e(); } } } public static void closepstmt(PreparedStatement pstmt){ if(pstmt!=null){ try { pstmt.close(); } catch (SQLException e) { e.printStackTrace(); } } } public static void closecon(Connection con){ if(con!=null){ try { con.close(); } c
29、atch (SQLException e) { e.printStackTrace(); } } } } 5.2 系统关键模块 5.2.1 登录模块 图5-1 登录界面 本模块关键用于对用户身份进行判别。用户有两种身份:一般用户和管理员。用户经过单选框选择登录身份,经过表单输入用户名、密码,系统依据用户提供信息对用户进行身份判别。界面图5-1所表示。 后台代码实现: public void doPost(HttpServletRequest request, HttpServletResponse response) throws Serv
30、letException, IOException { String userName=request.getParameter("username"); String password=request.getParameter("paswrd"); String userLevel=request.getParameter("userLevel"); User luser=new User(); luser.setUserName(userName); luser.setPassword(password); luser.setUserLevel(u
31、serLevel); ILoginDao loginDao=new LoginDaoImpl(); User login=loginDao.getUser(luser); if(login!=null){ HttpSession session=request.getSession(); session.setAttribute("login", login); ServletContext context=this.getServletContext(); RequestDispatcher dispatcher; if(login.
32、getUserLevel().equals("0")){ dispatcher=context.getRequestDispatcher("/comUser.jsp"); } else{ dispatcher=context.getRequestDispatcher("/manaUser.jsp"); } dispatcher.forward(request, response); } else{ request.setAttribute("loginFail","登录失败"); ServletContext co
33、ntext=this.getServletContext(); RequestDispatcher dispatcher=context.getRequestDispatcher("/login.jsp"); dispatcher.forward(request, response); } } 5.2.2 目录生成模块 由登陆界面进入主界面后,总体界面图5-2所表示: 图5-2 主界面 画面左边即为目录。目录模块关键用于生成目录部分,菜单折叠展开是使用javascript代码实现。 菜单展开折叠功效实现代码: 5.2.3 基础信息管理模块 基础信息管理模块包含供给商管理、货物管理、仓库信息管理和部门管理。 1. 供给商管理 本功效用于对供给商信息统计管理。管理员能够添加新供给商,修改已经有供给商信息,删除供给商信息等。界面图5-4所表示: 图5-4 供给商管理界面 关键代码: 1) 添加供给商 public void doPost(HttpServletRequest re
37、quest, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); String suppName=request.getParameter("suppName"); String suppPerson=request.getParameter("suppPerson"); String suppPh
38、one=request.getParameter("suppPhone"); String suppAddr=request.getParameter("suppAddr"); Supplier supplier=new Supplier(); supplier.setSuppName(suppName); supplier.setSuppPerson(suppPerson); supplier.setSuppPhone(suppPhone); supplier.setSuppAddr(suppAddr); ISupplierDao supplierDao=new
39、SupplierDaoImpl(); int i=supplierDao.addSupplier(supplier); if(i>0){ request.setAttribute("addPromt", "添加成功!"); } else{ request.setAttribute("addPromt", "添加失败!"); } this.getServletContext().getRequestDispatcher("/addSupplier.jsp").forward(request, response); } 2) 删除供给商 public voi
40、d doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String[] dele=request.getParameterValues("dele");
int suppId=0;
int rs=0;
for(int i=0;i 41、ierDaoImpl();
rs=supplierDao.deleSupplier(suppId);
if(rs==0){
break;
}
}
if(rs>0){
request.setAttribute("delePromt", "删除成功!");
}
else{
request.setAttribute("delePromt", "删除失败!");
}
this.getServletContext().getRequestDispatcher("/toSupply").forward(request, response);
42、
}
2. 货物管理
本功效用于对货物信息统计管理。管理员能够添加新货物,修改已经有货物信息,删除货物信息等。界面图5-5所表示:
图5-5 货物管理界面
实现代码和供给商管理相同。
3. 仓库信息管理
本功效用于对仓库信息统计管理。管理员能够添加新仓库,修改已经有仓库信息,删除仓库信息等。界面图5-6所表示:
图5-6 仓库管理界面
实现代码和供给商管理相同。
4. 部门管理
图5-7 部门管理界面
本功效用于对部门信息统计管理。管理员能够添加新部门,修改已经有部门信息,删除部门信息等。界面图5-7所表示。
实现代码和供给商管理相同。
5.2.4 库存管 43、理模块
库存管理模块包含入库管理、出库管理和库存管理。
1. 入库管理
本功效用于对货物入库统计管理。当某种已经有货物进货后,就能够在此处进行添加新纪录,查询或删除已经有统计等操作。界面图5-8所表示:
图5-8 入库管理界面
关键代码:
1) 添加入库单
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
44、String instClass=request.getParameter("instClass");
int goodsId=Integer.parseInt(request.getParameter("goodsId"));
double instNum=Double.parseDouble(request.getParameter("instNum"));
int stoId=Integer.parseInt(request.getParameter("stoId"));
Date date=new Date();
HttpSession session=r 45、equest.getSession();
User login=(User)session.getAttribute("login");
int userId=login.getUserId();
Instore instore=new Instore();
instore.setGoodsId(goodsId);
instore.setInstClass(instClass);
instore.setInstNum(instNum);
instore.setStoId(stoId);
instore.setInstTime(date);
46、instore.setModifyTime(date);
instore.setUserId(userId);
IInstoreDao instoreDao=new InstoreDaoImpl();
int i=0;
if(request.getParameter("instId").equals("")){
i=instoreDao.addInstore(instore);
if(i>0){
IStockDao stockDao=new StockDaoImpl();
Stock stock=new Stock();
s 47、tock.setStoId(stoId);
stock.setGoodsId(goodsId);
stock.setStock(instNum);
int j=0;
if(stockDao.queryStock(stock)){
j=stockDao.updateStock(stock,1);
}
else{
j=stockDao.addStock(stock);
}
int volume=Integer.parseInt(request.getParameter("volume"));
48、 IStorageDao storageDao=new StorageDaoImpl();
i=storageDao.updateStorage(volume, stoId,1);
if(i>0&&j>0){
request.setAttribute("addPromt", "添加成功!");
}
else{
request.setAttribute("addPromt", "添加失败!");
}
}
else{
request.setAttribute("addPromt", "添加失败 49、");
}
}
else{
int instId=Integer.parseInt(request.getParameter("instId"));
instore.setInstId(instId);
instore.setModifyTime(new Date());
i=instoreDao.updateInstore(instore);
if(i>0){
request.setAttribute("modifyPromt", "修改成功!");
}
else{
request.setAtt 50、ribute("modifyPromt", "修改失败!");
}
}
this.getServletContext().getRequestDispatcher("/toAddInstore").forward(request, response);
}
2) 删除入库单
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String[] dele=request.getParame






