JSP仓库管理系统的设计与实现_本科毕业论文(28页).doc
-JSP仓库管理系统的设计与实现_本科毕业论文-第 26 页毕 业 论 文学生姓名学 号学院 计算机科学与技术学院专 业计算机科学与技术学院(软件工程)题 目基于JSP的仓库管理系统的设计与实现摘要:仓库管理系统是一个企业不可或缺的部分,高效的仓库管理系统可以为企业的发展和经营提供坚强的后盾。随着科技的不断发展,用计算机对仓库进行管理,具有人工管理所无法比拟的优点,例如:检索迅速、查找方便、保密性好、成本低、寿命长等。这些优点能极大地提高仓库管理的效率, 使企业的仓库管理井井有条,为企业的健康发展创造良好的条件。本文在分析现有管理系统开发技术的基础上,实现了以Eclipse为开发平台的基于JSP的,以MySql作为后台数据库的仓库管理系统。该系统主要具备基本信息管理、库存管理、信息查询、用户管理等功能模块。关键词:仓库管理,JSP,MySql数据库Abstract: Warehouse management system is an indispensable part of the enterprise. A warehouse management system with high efficiency can 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. These 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 order 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 moduleKeywords: Warehouse management, JSP, MySql database目 录1 绪论41.1 开发背景41.2 开发意义41.3 本文组织结构42 系统解决方案52.1 JSP语言概述52.2 SSH框架52.3 MySql数据库52.4 系统平台环境53 需求分析63.1 面向的用户人群63.2 功能需求分析63.3 业务流程图74 数据库设计94.1 E-R模型94.2 数据模型125 详细设计155.1 数据库连接类155.2 系统主要模块16结 论34参 考 文 献35致 谢361 绪论1.1 开发背景一直以来企业使用传统人工的方式来管理文件库存,这种管理方式存在许多缺点,如: 保密性差、效率低等,而且时间一长,将产生大量的数据和文件, 这对于企业查找、更新和维护都带来了很多的困难。由于缺乏科学的管理和管理工具,企业在业务上和管理上的安排都存在着许多不便。因而针对这些问题而开发的系统具有很好的前景。1.2 开发意义随着时代的不断发展,社会正在不断向信息化时代迈进。由于能够有效地收集和处理各种信息,提高办事效率,电子自动化办公越来越被重视。而随着互联网技术的不断发展,又为电子自动化办公的发展提供了良好的前景。如今,很多企业已经拥有了计算机设备,具备物质条件,但很多工作仍由管理者手工操作完成,这就造成不必要的浪费。计算机流行的原因主要有以下几个方面:1.计算机可以代替手工操作进行许多繁杂的工作;2.计算机可以节省大量资源;3.计算机可以极大地提高人们的工作效率;4.计算机可以使敏感文档更加安全;5.电子自动化办公是先进生产力发展的重要标志。综上所述,用计算机开发的软件系统,替代人工操作进行管理,可以节约大量的人力、物力,是企业发展的必然趋势1!1.3 本文组织结构本系统将以课本和一些课外书籍为参考,从系统开发背景需求分析概要设计详细设计具体开发一步步对系统进行分析和设计。各个章节安排如下:第一章为绪论,简述项目的开发背景和开发意义;第二章详细介绍了项目开发的应用技术,比如JSP,框架和数据库等;第三章是需求分析,介绍了系统的设计目标和系统的主要功能模块。第四章是数据库设计,在E-R模型的基础上,再设计出相应的逻辑模型。第五章根据系统功能模块详细介绍了各模块的设计过程并给出部分实现代码。2 系统解决方案2.1 JSP语言概述JSP(Java Server Pages)是由Sun Microsystems公司倡导、许多公司参与一起建立的一种动态网页技术标准。它的主要目的是将表示逻辑从Servlet中分离出来。它是在传统的网页HTML文件(*.htm,*.html)中插入Java程序段(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)的缩写3。Struts对Model,View和Controller都提供了对应的组件。Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架,它由Rod Johnson创建。它是为了解决企业应用开发的复杂性而创建的4。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。 Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,可以应用在任何使用JDBC的场合,可以在Servlet/JSP的Web应用中使用,也可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任5。2.3 MySql数据库MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司。MySQL是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。MySQL的SQL语言是用于访问数据库的最常用标准化语言。由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择MySQL作为网站数据库6。2.4 系统平台环境(1)硬件环境:服务器:CPU: 2G或以上;内存:1G RAM或以上;硬盘:80G或以上;客户端:CPU: 1G或以上;内存:64MB以上内存或更高;硬盘:20G或以上。(2)软件开发环境:操作系统:WindowsXP;所用工具:Eclipse,Navicat for MySQL;数据库:MySQL。3 需求分析3.1 面向的用户人群1. 管理员:作为系统的管理员和维护者,对系统基本信息、仓库管理等模块进行数据的管理,并对系统的更新作出及时的响应,使得系统能更好地运行。2. 普通用户:作为系统的使用者,注册登陆系统后,可以查询系统基本信息、仓库信息、修改个人信息等。3.2 功能需求分析仓库管理系统基本信息管理库存管理信息查询用户管理用户添加,删除用户密码修改添加入库记录添加出库记录按仓库查询按货物查询用户添加删除用户权限修改系统设置个人信息修改图3-1 系统功能模块图本系统是一款仓库管理系统,旨在对仓库的自动化管理以适应信息化社会的生产方式。根据仓库管理系统的需求,划分了仓库的功能模块,主要分为用户管理模块、入库出库模块、仓库查询模块、盘点统计模块7。具体功能如图3-1所示。3.3 业务流程图该系统的用户分为普通用户和管理员。管理员拥有所有权限,而普通用户只能进行查询的操作。3.3.1 管理员模块图3-2 管理员使用流程图管理员使用流程如图3-2所示。1. 登录登陆界面包括账号和密码两个文本框和身份选择单选框,用户登陆成功就会转到系统主页面,否则将会提示账号密码错误。2. 查询信息用户登陆查询信息界面可以对仓库信息(仓库、货物、供应商、部门、入库单、出库单)进行查询。3. 设置信息(管理员)管理员用户登陆设置信息界面可以对仓库信息(仓库、货物、供应商、部门、入库单、出库单)进行设置。4. 添加记录(管理员)管理员用户登陆添加界面可以添加入库和出库信息。5. 修改密码用户可以修改自己的密码,需要先验证旧密码,验证成功后通过输入两次新密码对密码进行修改。6. 用户管理(管理员)管理员用户可以对已添加的用户权限进行修改,也可以删除已存在的用户。3.3.2 普通用户模块图3-3 普通用户使用流程图普通用户使用流程如图3-3所示。普通用户只能进行查询操作和修改个人信息。4 数据库设计数据库是一种存储数据并对数据进行操作的工具。数据库的作用在于组织和表达信息,即数据库就是相关信息的集合。本章从E-R模型的分析设计为切入点,重点介绍了数据库的设计。根据仓库管理系统的功能,将其E-R图转化为数据库表,为系统的实现奠定了基础。4.1 E-R模型E-R模型即实体-联系模型,它是由实体集、属性和联系集构成。实体集用矩形框表示,矩形框内写上实体名。实体的属性用椭圆框表示,框内写上属性名,并用无向边与其对应的实体集相连。实体间的联系用菱形框表示,菱形框中写上以适当的含义命名的名字,用无向连线将参加联系的实体矩形框分别与菱形框相连,并在连线上标明联系的类型,即11、1N或MN。本系统的E-R模型主要包括部门实体、货物实体、用户实体、供应商实体、仓库实体、入库单实体和出库单实体共七个实体集和一个各实体联系集。E-R模型如下文所述。1. 部门实体用来存储部门信息,E-R图如图4-1所示:部门部门电话部门地址部门经理部门编号部门名称图4-1 部门实体E-R图2. 货物实体用来存储货物信息,E-R图如图4-2所示:货物货物编号供货商编号计量单位货物价格货物规格货物名称图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. 入库单实体用来存储入库单信息,E-R图如图4-6所示:入库单入库编号管理员编号仓库编号修改时间入库时间入库类型货物编号入库数量图4-6入库单实体E-R图7. 出库单实体用来存储出库单信息,E-R图如图4-7所示:出库单出库编号管理员编号仓库编号修改时间出库时间部门编号货物编号出库数量图4-7出库单实体E-R图8各实体联系E-R图如图4-8所示。用户通过添加入库单和出库单记录入库信息和出库信息,供应商提供货物,部门使用货物,一条记录对应一个供应商或者部门,货物入库货物出库仓库入库单出库单供应商部门货物存放用户添加nn11添加11nnmnmm图4-8 各实体联系E-R图4.2 数据模型根据4.1中分析得出的E-R图,本系统采用MySql数据库管理系统,在MySql数据库管理系统中新建名称为mystorage的数据库,本系统所使用的所有数据信息均将存储于该数据库中。以下列举数据表。1. 部门表(department)表4-1 部门表列名数据类型大小说明depaIdint4部门编号depaNamevarchar24部门名称depaPersonvarchar15部门经理depaPhonechar11部门电话depaAddrvarchar90部门地址2. 货物表(goods)表4-2 货物表列名数据类型大小说明goodsIdint4货物编号suppIdint4供应商编号goodsNamevarchar30货物名称goodsSizevarchar10货物规格goodsPriceint4货物价格unitchar6计量单位3. 入库表(instore)表4-3 入库表列名数据类型大小说明instIdint4入库编号instClasschar1入库类型goodsIdint4货物编号instNumint4入库数量instTimedatetime8入库时间modifyTimedatetime8修改时间stoIdint4仓库编号userIdint4管理员编号4. 出库表(outstore)表4-4 出库表列名数据类型大小说明outstIdint4出库编号depaIdint4部门编号goodsIdint4货物编号outstNumint4出库数量outstTimedatetime8出库时间modifyTimedatetime8修改时间stoIdint4仓库编号userIdint4管理员编号5. 仓库表(store)表4-5 仓库表列名数据类型大小说明stoIdint4仓库编号stoPersonvarchar15仓库管理员stoPhonechar11仓库电话usedVoluint4已用库存量allVoluint4库存总量6. 供应商表(supplier)表4-6 供应商表列名数据类型大小说明suppIdint4供应商编号suppNamevarchar45供应商名称suppPersonvarchar15供应商联系人suppPhonechar11供应商电话suppAddrvarchar90供应商地址7. 用户表(user)表4-7 用户表列名数据类型大小说明userIdint4用户编号userNamevarchar15用户名passvarchar16用户密码userLevelchar1用户权限8. 库存表(stock)表4-8 库存表列名数据类型大小说明stoIdint4仓库编号goodsIdint4货物编号stockint4库存量以上就是mystorage数据库的数据表。5 详细设计5.1 数据库连接类在对数据库连接的过程中,为了使代码更精简,将对数据库的连接方法封装在DriverMana公共类中,其中包括数据库连接方法getConn、ResultSet的关闭方法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", "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.printStackTrace();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(); catch (SQLException e) e.printStackTrace();5.2 系统主要模块5.2.1 登录模块图5-1 登录界面本模块主要用于对用户身份进行鉴别。用户有两种身份:普通用户和管理员。用户通过单选框选择登录身份,通过表单输入用户名、密码,系统根据用户提供的信息对用户进行身份鉴别。界面如图5-1所示。后台代码实现:public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, 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(userLevel);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.getUserLevel().equals("0")dispatcher=context.getRequestDispatcher("/comUser.jsp");elsedispatcher=context.getRequestDispatcher("/manaUser.jsp");dispatcher.forward(request, response);elserequest.setAttribute("loginFail","登录失败");ServletContext context=this.getServletContext();RequestDispatcher dispatcher=context.getRequestDispatcher("/login.jsp");dispatcher.forward(request, response);5.2.2 目录生成模块由登陆界面进入主界面后,总体界面如图5-2所示:图5-2 主界面画面左边即为目录。目录模块主要用于生成目录部分,菜单的折叠展开是使用javascript代码实现的。菜单展开折叠功能实现代码:<script language="javascript">var divheight=130;var speed=11;var i=0;var s;var p=0;function doOpenClose(n)if(document.getElementById("bbb"+n).offsetHeight<11)i=0;inc(n);elseif(document.getElementById("bbb"+n).offsetHeight>divheight)p=divheight;inc2(n);function inc(x)i=i+10;document.getElementById("bbb"+x).style.height=i+"px"if(i>divheight)i=divheight-5;var s=setTimeout("inc("+x+")",speed);if(i=125)window.clearTimeout(s);function inc2(x)if(p>1)p=p-10;document.getElementById("bbb"+x).style.height=p+"px"var s=setTimeout("inc2("+x+")",speed);if(p=0)window.clearTimeout(s);</script>5.2.3 基本信息管理模块基本信息管理模块包括供应商管理、货物管理、仓库信息管理和部门管理。1. 供应商管理本功能用于对供应商信息的记录管理。管理员可以添加新的供应商,修改已有的供应商信息,删除供应商信息等。界面如图5-4所示:图5-4 供应商管理界面主要代码:1) 添加供应商public void doPost(HttpServletRequest request, 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 suppPhone=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 SupplierDaoImpl();int i=supplierDao.addSupplier(supplier);if(i>0)request.setAttribute("addPromt", "添加成功!");elserequest.setAttribute("addPromt", "添加失败!");this.getServletContext().getRequestDispatcher("/addSupplier.jsp").forward(request, response);2) 删除供应商public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException String dele=request.getParameterValues("dele");int suppId=0;int rs=0;for(int i=0;i<dele.length;i+)suppId=Integer.parseInt(delei);ISupplierDao supplierDao=new SupplierDaoImpl(); rs=supplierDao.deleSupplier(suppId);if(rs=0)break;if(rs>0)request.setAttribute("delePromt", "删除成功!");elserequest.setAttribute("delePromt", "删除失败!");this.getServletContext().getRequestDispatcher("/toSupply").forward(request, response);2. 货物管理本功能用于对货物信息的记录管理。管理员可以添加新的货物,修改已有的货物信息,删除货物信息等。界面如图5-5所示:图5-5 货物管理界面实现代码与供应商管理相似。3. 仓库信息管理本功能用于对仓库信息的记录管理。管理员可以添加新的仓库,修改已有的仓库信息,删除仓库信息等。界面如图5-6所示:图5-6 仓库管理界面实现代码与供应商管理相似。4. 部门管理图5-7 部门管理界面本功能用于对部门信息的记录管理。管理员可以添加新的部门,修改已有的部门信息,删除部门信息等。界面如图5-7所示。实现代码与供应商管理相似。5.2.4 库存管理模块库存管理模块包括入库管理、出库管理和库存管理。1. 入库管理本功能用于对货物入库的记录管理。当某种已有货物进货后,就可以在此处进行添加新纪录,查询或删除已有记录等操作。界面如图5-8所示:图5-8 入库管理界面主要代码:1) 添加入库单public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException response.setContentType("text/html");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=request.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);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();stock.setStoId(stoId);stock.setGoodsId(goodsId);stock.setStock(instNum);int j=0;if(stockDao.queryStock(stock)j=stockDao.updateStock(stock,1);elsej=stockDao.addStock(stock);int volume=Integer.parseInt(request.getParameter("volume");IStorageDao storageDao=new StorageDaoImpl();i=storageDao.updateStorage(volume, stoId,1);if(i>0&&j>0)request.setAttribute("addPromt", "添加成功!");elserequest.setAttribute("addPromt", "添加失败!");elserequest.setAttribute("addPromt", "添加失败!");elseint instId=Integer.parseInt(request.getParameter("instId");instore.setInstId(instId);instore.setModifyTime(new Date();i=instoreDao.updateInstore(instore);if(i>0)request.setAttribute("modifyPromt", "修改成功!");elserequest.setAttribute("modifyPromt", "修改失败!");this.getServletContext().getRequestDispatcher("/toAddInstore").forward(request, response);2) 删除入库单public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException String dele=request.getParameterValues("dele");int instId=0;int rs=0;for(int i=0;i<dele.length;i+)instId=Integer.parseInt(delei);IInstoreDao instoreDao=new InstoreDaoImpl();rs=in