还剩21页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
河南理工大学计算机科学与技术学院课程设计报告(2015-2016-1)课程名称软件工程课程设计设计题目企业进销存管理系统学生姓名徐松学号311309060209专业班级软件工程1302指导教师王静2016年1月14日
二、系统分析
41.Item类设计
82.数据模型公共类
93.Dao公共类
143.4系统登录模块设计
151.设计登录窗体
152.密码文本框
163.“登录”按钮
173.5系统主窗体设计
181.设计菜单栏
182.设计工具栏
183.设计状态栏
193.6销售单模块设计
191.设计销售窗体
192.添加销售商品
193.销售统计
194.商品销售19
一、系统背景中小企业在我国经济发展中具有重要地位,随着我国市场经济的蓬勃发展和人们对计算机的普遍应用,批发、零售行业正处在一个高速发展的时期行业的快速发展必然导致竞争的加剧,要想在激烈的市场竞争中谋求发展,客观上要求企业必须加强内部管理,提高运营效率而我国大部分小型批发、零售企业在信息机制上还没有摆脱原有的手工模式,企业内部没有形成完善的、有效的信息化管理机制,企业发展的动力不足,从而影响企业的持续、稳定、快速的发展 当今国内外多数企业的竞争特点是产品的种类、规格特别多,市场需求变化很快,与分销商,零售商的关系日益密切等而随着业务量的扩大,传统的管理方法已经无法处理日益膨胀的大量的业务数据,企业采用电脑管理进货、库存、销售等诸多环节也已成为趋势及必然 实现企业信息化管理是现代社会中小企业稳步发展的必要条件,它可以提高企业的管理水平和工作效率,最大限度地减少手工操作带来的失误进销存管理系统正是一个信息化管理软件,可以实现企业的进货、销售、库存管理等各项业务的信息化管理 出于以上原因,本课程设计将基于MySQL数据库并以JAVA为开发环境设计实现一个企业进销存管理系统该系统包括基础信息管理、进货管理、销售管理、库存管理、查询统计、系统管理几个模块,主要是处理商业企业商品的采购、库存和销售各个环节的活动,具有良好的人机界面考虑到系统的使用对象可能较多,权限管理良好,数据查询方便,支持多条件查询
二、系统分析
1、理解需求 本系统通过进销存系统的终端用户和客户的进行调研后,得出系统需求的关键
(1)进货管理 商品进货信息管理商品进货信息包括商品进货数量、单价、供货商、进货日期、等商品进货管理功能完成进货信息登记、修改和删除等更新库存进货信息的变动直接关系到库存的变化
(2)库存管理 库存商品信息管理商品库存信息包括商品进货数量、单价、供货商、进货日期、等商品库存管理功能完成库存信息登记、修改和删除、查询等
(3)销售管理 信息管理商品销售信息包括商品销售数量、单价、统计日等商品销售管理功能完成销售信息登记、修改和删除,以及销售总汇查询 本系统应该对基础数据(用户数据字典)进行维护系统应该提供强大的数据统计、查询、报表生成及打印等功能系统客户端运行在Windows各版的平台下,系统还应该有一个较好飞图形用户界面系统还应该有很好的可扩展性系统应该容易上手,方便使用
2、需求分析任务 第一项任务画出“进销存管理系统”的组合结构图,即组织结构模型第二项任务画出“进销存管理系统”的业务操作图,即业务操作模型 第三项任务画出“进销存管理系统”的数据流程图 第四项任务列出“进销存管理系统”的功能点列表,即功能模型 第五项任务列出“进销存管理系统”的性能点表,即性能模型 第六项任务确定“进销存管理系统”的环境模型,即运行环境
3.数据库数据库设计是进销存信息系统的核心,采用规范化设计,使数据库结构尽可能简化,减少冗余,保持系统数据结构的一致性根据不同的需求,一个商品流通企业进销存管理系统可包括几个到上百个不等的数据表、数据视图、存储过程以及函数等,但最基本的数据表应该包括操作用户数据表、公司信息数据表、采购明细数据表、采购客户数据表、采购信息数据表、供应客户数据表、商品信息数据表、销售明细数据表和销售信息数据表;数据视图包括采购入库明细视图、累计采购商品视图、累计销售商品视图和销售出库明细视图角色定义组织结构图中各单位职责说明与相关业务,如表 销售人员信息单据 进货信息单据商品销售信息单据用户信息单据经手人信息表jsr客户实体E-R图企业进销存管理系统将记录所有的客户信息,在销售、退货等操作时,将直接引用该客户的实体属性客户实体包括客户编号、客户名称、简称、地址、电话、邮政编码、联系人、联系人电话、传真、开户行和账号等属性,客户实体E-R图如图所示商品实体E-R图供应商实体E-R图进销存管理系统数据流图
三、系统设计
1.目的 从该阶段开始正式进入软件的实际开发阶段,本阶段完成系统的大致设计并明确司徒的数据结构与软件结构在软件设计阶段主要是把一个软件需求转化为软件表示的过程,
2.术语定义总体结构 软件系统的总体逻辑结构本系统采用面向对象的设计方法,所以逻辑结构为部件组装图 概念模型CDM 关系数据库的逻辑设计模型,包括一张逻辑E-R图及相应的数据字典 物理模型PDM 关系数据库物理设计模型,包括一张物理表关系图及其相应的数据字典 角色 数据库中享有某些特权操作的用户 子系统 具有相对独立功能的小系统,一个大的软件系统可以划分为多个子系统,每个子系统可由多个模块或多个部件组成 模块 具有功能独立、能被调用的信息单元系统构架
1.Item类设计Item类是系统的公共类之一,主要用于封装和传递参数信息,这是典型命令模式的实现在Dao类中经常使用该类作为方法参数;另外,在各个窗体界面中也经常使用该类作组件数据,其toString方法将返回name属性值,所以显示到各个组件上的内容就是Item类的对象所代表的商品、供应商或者客户等信息中的名称关键代码如下packagecom.lzw;publicclassItem{privateStringid;//定义id属性privateStringname;//定义name属性publicItem{}publicItemStringidStringname{this.id=id;this.name=name;}publicStringgetId{//定义得到id属性的方法returnid;}publicvoidsetIdStringid{this.id=id;}publicStringgetName{//定义得到那么属性的方法returnname;}publicvoidsetNameStringname{this.name=name;}publicStringtoString{//定义该类字符串的表现形式returngetName;}}
2.数据模型公共类在com.lzw.dao.model包中存放的是数据模型公共类,它们对应着数据库中不同的数据表,这些模型将被访问数据库的Dao类和程序中各个模块甚至各个组件所使用和Item公共类的使用方法类似,数据模型也是对数据表中所有字段(属性)的封装,但是数据模型是纯粹的模型类,它不但需要重写父类的toString方法,还要重写hashCode方法和equals方法模型类主要用于存储数据,并通过相应的getXXX方法和setXXX方法实现不同属性的访问原则以商品数据表为例其代码publicclassTbSpinfoimplementsjava.io.Serializable{privateStringid;privateStringspname;privateStringjc;privateStringcd;privateStringdw;privateStringgg;privateStringbz;privateStringph;privateStringpzwh;privateStringmemo;privateStringgysname;publicTbSpinfo{}publicTbSpinfoStringid{this.id=id;}publicStringgetId{returnthis.id;}publicvoidsetIdStringid{this.id=id;}publicStringgetSpname{returnthis.spname;}publicvoidsetSpnameStringspname{this.spname=spname;}publicStringgetJc{returnthis.jc;}publicvoidsetJcStringjc{this.jc=jc;}publicStringgetCd{returnthis.cd;}publicvoidsetCdStringcd{this.cd=cd;}publicStringgetDw{returnthis.dw;}publicvoidsetDwStringdw{this.dw=dw;}publicStringgetGg{returnthis.gg;}publicvoidsetGgStringgg{this.gg=gg;}publicStringgetBz{returnthis.bz;}publicvoidsetBzStringbz{this.bz=bz;}publicStringgetPh{returnthis.ph;}publicvoidsetPhStringph{this.ph=ph;}publicStringgetPzwh{returnthis.pzwh;}publicvoidsetPzwhStringpzwh{this.pzwh=pzwh;}publicStringgetMemo{returnthis.memo;}publicvoidsetMemoStringmemo{this.memo=memo;}publicStringgetGysname{returnthis.gysname;}publicvoidsetGysnameStringgysname{this.gysname=gysname;}publicStringtoString{returngetSpname;}@OverridepublicinthashCode{finalintPRIME=31;intresult=1;result=PRIME*result+bz==null0:bz.hashCode;result=PRIME*result+cd==null0:cd.hashCode;result=PRIME*result+dw==null0:dw.hashCode;result=PRIME*result+gg==null0:gg.hashCode;result=PRIME*result+gysname==null0:gysname.hashCode;result=PRIME*result+id==null0:id.hashCode;result=PRIME*result+jc==null0:jc.hashCode;result=PRIME*result+memo==null0:memo.hashCode;result=PRIME*result+ph==null0:ph.hashCode;result=PRIME*result+pzwh==null0:pzwh.hashCode;result=PRIME*result+spname==null0:spname.hashCode;returnresult;}@OverridepublicbooleanequalsObjectobj{ifthis==objreturntrue;ifobj==nullreturnfalse;ifgetClass!=obj.getClassreturnfalse;finalTbSpinfoother=TbSpinfoobj;ifbz==null{ifother.bz!=nullreturnfalse;}elseif!bz.equalsother.bzreturnfalse;ifcd==null{ifother.cd!=nullreturnfalse;}elseif!cd.equalsother.cdreturnfalse;ifdw==null{ifother.dw!=nullreturnfalse;}elseif!dw.equalsother.dwreturnfalse;ifgg==null{ifother.gg!=nullreturnfalse;}elseif!gg.equalsother.ggreturnfalse;ifgysname==null{ifother.gysname!=nullreturnfalse;}elseif!gysname.equalsother.gysnamereturnfalse;ifid==null{ifother.id!=nullreturnfalse;}elseif!id.equalsother.idreturnfalse;ifjc==null{ifother.jc!=nullreturnfalse;}elseif!jc.equalsother.jcreturnfalse;ifmemo==null{ifother.memo!=nullreturnfalse;}elseif!memo.equalsother.memoreturnfalse;ifph==null{ifother.ph!=nullreturnfalse;}elseif!ph.equalsother.phreturnfalse;ifpzwh==null{ifother.pzwh!=nullreturnfalse;}elseif!pzwh.equalsother.pzwhreturnfalse;ifspname==null{ifother.spname!=nullreturnfalse;}elseif!spname.equalsother.spnamereturnfalse;returntrue;}}
3.Dao公共类Dao的全称是DataAccessObject,即数据访问对象本项目中应用该名称作为数据库访问类的名称,在该类中实现了数据库的驱动、连接、关闭和多个操作数据库的方法,这些方法包括不同数据表的操作方法在介绍具体的数据库访问方法之前,先来看一下Dao类的定义,也就是数据库驱动和连接的代码代码如下publicclassDao{staticStatementsql;staticResultSetres;protectedstaticStringdbClassName=com.mysql.jdbc.Driver;protectedstaticStringdbUrl=jdbc:mysql://localhost:3306/db_database28;protectedstaticStringdbUser=root;protectedstaticStringdbPwd=1003037761;protectedstaticStringsecond=null;publicstaticConnectionconn=null;static{try{ifconn==null{Class.forNamedbClassName.newInstance;conn=ConnectionDriverManager.getConnectiondbUrldbUserdbPwd;}}catchExceptionee{ee.printStackTrace;}}
3.4系统登录模块设计
1.设计登录窗体登录模块的窗体设计由两部分组成,一部分是登录窗体,另一部分是窗体中带背景图片的内容面板
1.创建内容面板publicclassLoginPanelextendsJPanel{publicintwidthheight;privateImageimg;publicLoginPanel{super;URLurl=getClass.getResource/res/login.jpg;img=newImageIconurl.getImage;}protectedvoidpaintComponentGraphicsg{super.paintComponentg;g.drawImageimg00this;}}
2.创建登录窗体privateLoginPanelgetLoginPanel{ifloginPanel==null{jLabel1=newJLabel;jLabel
1.setBoundsnewRectangle86715518;jLabel
1.setText密 码;jLabel=newJLabel;jLabel.setText用户名;jLabel.setBoundsnewRectangle85415618;loginPanel=newLoginPanel;loginPanel.setLayoutnull;loginPanel.setBackgroundnewColor0xD8DDC7;loginPanel.addjLabelnull;loginPanel.addgetUserFieldnull;loginPanel.addjLabel1null;loginPanel.addgetPasswordFieldnull;loginPanel.addgetLoginButtonnull;loginPanel.addgetExitButtonnull;}returnloginPanel;}
2.密码文本框在系统登录窗体的“密码”文本框中添加了按键事件监听器,它在获取到“密码”文本框输入的回车字符时将执行登录事件,也就是说在“密码”文本框输入密码后,按Enter键将执行与单击“登录”按钮相同的业务逻辑代码如下privateJPasswordFieldgetPasswordField{ifpasswordField==null{passwordField=newJPasswordField;passwordField.setBoundsnewRectangle1436912522;passwordField.addKeyListenernewKeyAdapter{publicvoidkeyTypedKeyEvente{ife.getKeyChar==\nloginButton.doClick;}};}returnpasswordField;}
3.“登录”按钮“登录”按钮用于执行用户名和密码的验证工作,如果验证用户名和密码有效,则启动系统,否则禁止进入系统在“登录”按钮的动作事件监听器中,首先获取用户输入的用户名与密码信息,然后调用Dao类的checkLogin方法,如果该方法返回true则登录成功,否则禁止用户登录,并提示输入的用户名与密码无法登录系统如图所示代码如下privateJButtongetLoginButton{ifloginButton==null{loginButton=newJButton;loginButton.setBoundsnewRectangle1091144820;loginButton.setIconnewImageIcongetClass.getResource/res/loginButton.jpg;loginButton.addActionListenernewActionListener{publicvoidactionPerformedActionEvente{try{userStr=userField.getText;StringpassStr=newStringpasswordField.getPassword;if!Dao.checkLoginuserStrpassStr{JOptionPane.showMessageDialogLoginDialog.this用户名与密码无法登录登录失败JOptionPane.ERROR_MESSAGE;return;}}catchExceptione1{e
1.printStackTrace;}mainFrame.setDefaultCloseOperationEXIT_ON_CLOSE;mainFrame.setVisibletrue;MainFrame.getCzyStateLabel.setTextuserStr;setVisiblefalse;}};}returnloginButton;}
3.5系统主窗体设计
1.设计菜单栏本系统的菜单栏是由MenuBar类实现的,该类是一个自定义菜单栏类,它继承JMenuBar类成为Swing的菜单栏组件下面以创建进货单菜单为例,
(1)创建MenuBar类,该类继承javax.swing.JMenuBar类,并且在该类中定义一个私有的成员变量,类型为JMenu,用于表示菜单对象
(2)编写一个名称为getJinhuo_Menu的方法,该方法的返回值为一个JMenu对象,也就是一个菜单对象在该方法中,当进货菜单对象为null时,创建一个菜单对象,并为其设置菜单名和快捷键
(3)编写一个初始化菜单栏界面的方法initialize,在该方法中,首先设置组件的尺寸,然后调用JMenuBar对象的add方法向菜单栏中添加一个菜单
(4)编写以下构造方法,用于调用初始化菜单栏界面
(5)在MenuBar类,再创建一个JMenuItem类型的成员变量jinhuoItem,表示进货菜单项
(6)编写一个名称为getJinhuoItem的方法,该方法的返回值为一个JMenuItem对象,也就是一个菜单项对象在该方法中,当进货单菜单项对象为null时,创建一个菜单项对象,并为其设置菜单项名、图标和动作事件监听器
(7)按照步骤
(5)和步骤
(6)的方法再创建一个进货退货菜单项对象,名称为jinhuo_tuihuoItem
(8)在getJinhuo_Menu方法中,应用JMenu对象的add方法向菜单中添加菜单项
2.设计工具栏工具栏用于放置常用命令按钮,如进货单、销售单、库存盘点等向本系统中添加工具栏的方法和添加菜单栏的方法类似,也需要继承Swing的JTool组件编写自己的工具栏当然,也可以直接使用Swing的JTool组件组件的initialize方法用于初始化工具栏的程序界面
3.设计状态栏本系统的状态栏显示了当前选择的功能窗体、登录用户名、当前日期和本系统所属公司,即版权所有者等信息,如下图所示
3.6销售单模块设计
1.设计销售窗体
2.添加销售商品在销售单窗体中单击“添加”按钮,将向table表格中添加新的空行,操作员可以在空行的第一列字段的商品下拉列表框中选择销售的商品,这个下拉列表框和进货单窗体的不同,它不是根据供应商字段确定选择框内容,而是包含了数据库中所有可以销售的商品要实现添加销售商品功能,需要为“添加”按钮添加动作监听器,在监听器中实现相应的业务逻辑
3.销售统计和进货单的统计功能类似,销售单也需要统计功能,统计的内容包括货品数量、品种数量、合计金额等信息,实现方式也是通过table表格的事件监听器来处理相应的统计业务,但是销售单窗体使用的不是PropertyChangeListener属性改变事件监听器,而是使用ContainerListener容器监听器
4.商品销售在销售单窗体中添加完销售商品之后,单击“销售”按钮,将完成本次销售单的销售业务系统会记录本次销售信息,并从库存表中扣除销售的商品数量这些业务处理都是在“销售”按钮的动作监听器中完成的,该监听器需要获取销售单窗体中的所有销售信息和商品信息,将所有商品信息封装为销售明细表的模型对象,并将这些模型对象放到一个集合中,然后调用Dao公共类的insertSellInfo方法将该集合与销售主表的模型对象保存到数据库中初始化表格代码privatevoidinitTable{String[]columnNames={商品名称商品编号供应商产地单位规格单价数量包装批号批准文号};DefaultTableModeltable.getModel.setColumnIdentifierscolumnNames;TableColumncolumn=table.getColumnModel.getColumn0;finalDefaultCellEditoreditor=newDefaultCellEditorsp;editor.setClickCountToStart2;column.setCellEditoreditor;}初始化商品下拉框privatevoidinitSpBox{Listlist=newArrayList;ResultSetset=Dao.queryselect*fromtb_spinfo+whereidinselectidfromtb_kucunwherekcsl0;sp.removeAllItems;sp.addItemnewTbSpinfo;forinti=0;table!=nullitable.getRowCount;i++{TbSpinfotmpInfo=TbSpinfotable.getValueAti0;iftmpInfo!=nulltmpInfo.getId!=nulllist.addtmpInfo.getId;}try{whileset.next{TbSpinfospinfo=newTbSpinfo;spinfo.setIdset.getStringid.trim;iflist.containsspinfo.getIdcontinue;spinfo.setSpnameset.getStringspname.trim;spinfo.setCdset.getStringcd.trim;spinfo.setJcset.getStringjc.trim;spinfo.setDwset.getStringdw.trim;spinfo.setGgset.getStringgg.trim;spinfo.setBzset.getStringbz.trim;spinfo.setPhset.getStringph.trim;spinfo.setPzwhset.getStringpzwh.trim;spinfo.setMemoset.getStringmemo.trim;spinfo.setGysnameset.getStringgysname.trim;sp.addItemspinfo;}}catchSQLExceptione{e.printStackTrace;}}在事件中计算品种数量、货品总数、合计金额privatefinalclasscomputeInfoimplementsContainerListener{publicvoidcomponentRemovedContainerEvente{//清除空行clearEmptyRow;//计算代码introws=table.getRowCount;intcount=0;doublemoney=
0.0;//计算品种数量TbSpinfocolumn=null;ifrows0column=TbSpinfotable.getValueAtrows-10;ifrows0column==null||column.getId.isEmptyrows--;//计算货品总数和金额forinti=0;irows;i++{Stringcolumn7=Stringtable.getValueAti7;Stringcolumn6=Stringtable.getValueAti6;intc7=column7==null||column
7.isEmpty0:Integer.valueOfcolumn7;Doublec6=column6==null||column
6.isEmpty0:Double.valueOfcolumn6;count+=c7;money+=c6*c7;}pzs.setTextrows+;hpzs.setTextcount+;hjje.setTextmoney+;}publicvoidcomponentAddedContainerEvente{}}根据商品下拉框的选择,更新表格当前行的内容privatesynchronizedvoidupdateTable{TbSpinfospinfo=TbSpinfosp.getSelectedItem;Itemitem=newItem;item.setIdspinfo.getId;TbKucunkucun=Dao.getKucunitem;introw=table.getSelectedRow;ifrow=0spinfo!=null{table.setValueAtspinfo.getIdrow1;table.setValueAtspinfo.getGysnamerow2;table.setValueAtspinfo.getCdrow3;table.setValueAtspinfo.getDwrow4;table.setValueAtspinfo.getGgrow5;table.setValueAtkucun.getDj+row6;table.setValueAtkucun.getKcsl+row7;table.setValueAtspinfo.getBzrow8;table.setValueAtspinfo.getPhrow9;table.setValueAtspinfo.getPzwhrow10;table.editCellAtrow7;}}停止单元格编辑privatevoidstopTableCellEditing{TableCellEditorcellEditor=table.getCellEditor;ifcellEditor!=nullcellEditor.stopCellEditing;}
四、总结本课程设计在对企业的进货业务、销售业务和库存管理业务进行分析后,提出了自己的进、销、存管理系统结构系统成功的解决了脱离有纸的管理方式,在管理数据时非常方便以及在操作数据库时也非常的方便系统可以通过计算机对企业货物进行系统和安全的管理,极大地减低了管理者和操作者的工作量。