企业进销存管理系统课程设计软件工程_第1页
企业进销存管理系统课程设计软件工程_第2页
企业进销存管理系统课程设计软件工程_第3页
企业进销存管理系统课程设计软件工程_第4页
企业进销存管理系统课程设计软件工程_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

河南理工大学计算机科学与技术学院课程设计报告(2015-2016-1)课程名称软件工程课程设计设计题目企业进销存管理系统学生姓名徐松学号专业班级软件工程1302指导教师王静2016年1月14日TOC\o"1-3"\h\u一、系统背景3二、系统分析 31.理解需求32.需求任务分析 33.数据库4三、系统设计41.Item类设计 82.数据模型公共类 93.Dao公共类 143.4系统登录模块设计 151.设计登录窗体 152.密码文本框 163.“登录”按钮 173.5系统主窗体设计 181.设计菜单栏 182.设计工具栏 183.设计状态栏 193.6销售单模块设计 191.设计销售窗体 192.添加销售商品 193.销售统计 194.商品销售 19四、总结21一、系统背景中小企业在我国经济发展中具有重要地位,随着我国市场经济的蓬勃发展和人们对计算机的普遍应用,批发、零售行业正处在一个高速发展的时期。行业的快速发展必然导致竞争的加剧,要想在激烈的市场竞争中谋求发展,客观上要求企业必须加强内部管理,提高运营效率。而我国大部分小型批发、零售企业在信息机制上还没有摆脱原有的手工模式,企业内部没有形成完善的、有效的信息化管理机制,企业发展的动力不足,从而影响企业的持续、稳定、快速的发展。

当今国内外多数企业的竞争特点是:产品的种类、规格特别多,市场需求变化很快,与分销商,零售商的关系日益密切等。而随着业务量的扩大,传统的管理方法已经无法处理日益膨胀的大量的业务数据,企业采用电脑管理进货、库存、销售等诸多环节也已成为趋势及必然。

实现企业信息化管理是现代社会中小企业稳步发展的必要条件,它可以提高企业的管理水平和工作效率,最大限度地减少手工操作带来的失误。进销存管理系统正是一个信息化管理软件,可以实现企业的进货、销售、库存管理等各项业务的信息化管理。

出于以上原因,本课程设计将基于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(){ publicItem(Stringid,Stringname){ this.id=id; =name; publicStringgetId(){//定义得到id属性的方法 returnid; publicvoidsetId(Stringid){ this.id=id; publicStringgetName(){//定义得到则属性的方法 returnname; publicvoidsetName(Stringname){ =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(){ publicTbSpinfo(Stringid){ this.id=id; publicStringgetId(){ returnthis.id; publicvoidsetId(Stringid){ this.id=id; publicStringgetSpname(){ returnthis.spname; publicvoidsetSpname(Stringspname){ this.spname=spname; publicStringgetJc(){ returnthis.jc; publicvoidsetJc(Stringjc){ this.jc=jc; publicStringgetCd(){ returnthis.cd; publicvoidsetCd(Stringcd){ this.cd=cd; publicStringgetDw(){ returnthis.dw; publicvoidsetDw(Stringdw){ this.dw=dw; publicStringgetGg(){ returnthis.gg; publicvoidsetGg(Stringgg){ this.gg=gg; publicStringgetBz(){ returnthis.bz; publicvoidsetBz(Stringbz){ this.bz=bz; publicStringgetPh(){ returnthis.ph; publicvoidsetPh(Stringph){ this.ph=ph; publicStringgetPzwh(){ returnthis.pzwh; publicvoidsetPzwh(Stringpzwh){ this.pzwh=pzwh; publicStringgetMemo(){ returnthis.memo; publicvoidsetMemo(Stringmemo){ this.memo=memo; publicStringgetGysname(){ returnthis.gysname; publicvoidsetGysname(Stringgysname){ this.gysname=gysname; publicStringtoString(){ returngetSpname(); @Override publicinthashCode(){ finalintPRIME=31; intresult=1; result=PRIME*result+((bz==null)0:bz.hashCode()); result=PRIME*result+((cd==null)0:cd.hashCode()); result=PRIME*result+((dw==null)0:dw.hashCode()); result=PRIME*result+((gg==null)0:gg.hashCode()); result=PRIME*result+((gysname==null)0:gysname.hashCode()); result=PRIME*result+((id==null)0:id.hashCode()); result=PRIME*result+((jc==null)0:jc.hashCode()); result=PRIME*result+((memo==null)0:memo.hashCode()); result=PRIME*result+((ph==null)0:ph.hashCode()); result=PRIME*result+((pzwh==null)0:pzwh.hashCode()); result=PRIME*result+((spname==null)0:spname.hashCode()); returnresult; @Override publicbooleanequals(Objectobj){ if(this==obj) returntrue; if(obj==null) returnfalse; if(getClass()!=obj.getClass()) returnfalse; finalTbSpinfoother=(TbSpinfo)obj; if(bz==null){ if(other.bz!=null) returnfalse; }elseif(!bz.equals(other.bz)) returnfalse; if(cd==null){ if(other.cd!=null) returnfalse; }elseif(!cd.equals(other.cd)) returnfalse; if(dw==null){ if(other.dw!=null) returnfalse; }elseif(!dw.equals(other.dw)) returnfalse; if(gg==null){ if(other.gg!=null) returnfalse; }elseif(!gg.equals(other.gg)) returnfalse; if(gysname==null){ if(other.gysname!=null) returnfalse; }elseif(!gysname.equals(other.gysname)) returnfalse; if(id==null){ if(other.id!=null) returnfalse; }elseif(!id.equals(other.id)) returnfalse; if(jc==null){ if(other.jc!=null) returnfalse; }elseif(!jc.equals(other.jc)) returnfalse; if(memo==null){ if(other.memo!=null) returnfalse; }elseif(!memo.equals(other.memo)) returnfalse; if(ph==null){ if(other.ph!=null) returnfalse; }elseif(!ph.equals(other.ph)) returnfalse; if(pzwh==null){ if(other.pzwh!=null) returnfalse; }elseif(!pzwh.equals(other.pzwh)) returnfalse; if(spname==null){ if(other.spname!=null) returnfalse; }elseif(!spname.equals(other.spname)) returnfalse; 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{ if(conn==null){ Class.forName(dbClassName).newInstance(); conn=(Connection)DriverManager.getConnection(dbUrl,dbUser,dbPwd);}catch(Exceptionee){ ee.printStackTrace();3.4系统登录模块设计1.设计登录窗体登录模块的窗体设计由两部分组成,一部分是登录窗体,另一部分是窗体中带背景图片的内容面板。1.创建内容面板publicclassLoginPanelextendsJPanel{ publicintwidth,height; privateImageimg; publicLoginPanel(){ super(); URLurl=getClass().getResource("/res/login.jpg"); img=newImageIcon(url).getImage(); protectedvoidpaintComponent(Graphicsg){ super.paintComponent(g); g.drawImage(img,0,0,this);2.创建登录窗体 privateLoginPanelgetLoginPanel(){ if(loginPanel==null){ jLabel1=newJLabel(); jLabel1.setBounds(newRectangle(86,71,55,18)); jLabel1.setText("密码:"); jLabel=newJLabel(); jLabel.setText("用户名:"); jLabel.setBounds(newRectangle(85,41,56,18)); loginPanel=newLoginPanel(); loginPanel.setLayout(null); loginPanel.setBackground(newColor(0xD8DDC7)); loginPanel.add(jLabel,null); loginPanel.add(getUserField(),null); loginPanel.add(jLabel1,null); loginPanel.add(getPasswordField(),null); loginPanel.add(getLoginButton(),null); loginPanel.add(getExitButton(),null); returnloginPanel;2.密码文本框在系统登录窗体的“密码”文本框中添加了按键事件监听器,它在获取到“密码”文本框输入的回车字符时将执行登录事件,也就是说在“密码”文本框输入密码后,按Enter键将执行与单击“登录”按钮相同的业务逻辑。代码如下: privateJPasswordFieldgetPasswordField(){ if(passwordField==null){ passwordField=newJPasswordField(); passwordField.setBounds(newRectangle(143,69,125,22)); passwordField.addKeyListener(newKeyAdapter(){ publicvoidkeyTyped(KeyEvente){ if(e.getKeyChar()=='\n') loginButton.doClick(); returnpasswordField;3.“登录”按钮“登录”按钮用于执行用户名和密码的验证工作,如果验证用户名和密码有效,则启动系统,否则禁止进入系统。在“登录”按钮的动作事件监听器中,首先获取用户输入的用户名与密码信息,然后调用Dao类的checkLogin()方法,如果该方法返回true则登录成功,否则禁止用户登录,并提示输入的用户名与密码无法登录系统。如图所示代码如下: privateJButtongetLoginButton(){ if(loginButton==null){ loginButton=newJButton(); loginButton.setBounds(newRectangle(109,114,48,20)); loginButton.setIcon(newImageIcon(getClass().getResource( "/res/loginButton.jpg"))); loginButton.addActionListener(newActionListener(){ publicvoidactionPerformed(ActionEvente){ try{ userStr=userField.getText(); StringpassStr=newString(passwordField .getPassword()); if(!Dao.checkLogin(userStr,passStr)){ JOptionPane.showMessageDialog(LoginDialog.this, "用户名与密码无法登录","登录失败", JOptionPane.ERROR_MESSAGE); return; }catch(Exceptione1){ e1.printStackTrace(); mainFrame.setDefaultCloseOperation(EXIT_ON_CLOSE); mainFrame.setVisible(true); MainFrame.getCzyStateLabel().setText(userStr); setVisible(false); 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={"商品名称","商品编号","供应商","产地","单位","规格","单价", "数量","包装","批号","批准文号"}; ((DefaultTableModel)table.getModel()) .setColumnIdentifiers(columnNames); TableColumncolumn=table.getColumnModel().getColumn(0); finalDefaultCellEditoreditor=newDefaultCellEditor(sp); editor.setClickCountToStart(2); column.setCellEditor(editor);初始化商品下拉框: privatevoidinitSpBox(){ Listlist=newArrayList(); ResultSetset=Dao.query("select*fromtb_spinfo" +"whereidin(selectidfromtb_kucunwherekcsl>0)"); sp.removeAllItems(); sp.addItem(newTbSpinfo()); for(inti=0;table!=null&&i<table.getRowCount();i++){ TbSpinfotmpInfo=(TbSpinfo)table.getValueAt(i,0); if(tmpInfo!=null&&tmpInfo.getId()!=null) list.add(tmpInfo.getId()); try{ while(set.next()){ TbSpinfospinfo=newTbSpinfo(); spinfo.setId(set.getString("id").trim()); if(list.contains(spinfo.getId())) continue; spinfo.setSpname(set.getString("spname").trim()); spinfo.setCd(set.getString("cd").trim()); spinfo.setJc(set.getString("jc").trim()); spinfo.setDw(set.getString("dw").trim()); spinfo.setGg(set.getString("gg").trim()); spinfo.setBz(set.getString("bz").trim()); spinfo.setPh(set.getString("ph").trim()); spinfo.setPzwh(set.getString("pzwh").trim()); spinfo.setMemo(set.getString("memo").trim()); spinfo.setGysname(set.getString("gysname").trim()); sp.addItem(spinfo); }catch(SQLExceptione){ e.printStackTrace();在事件中计算品种数量、货品总数、合计金额 privatefinalclasscomputeInfoimplementsContainerListener{ publicvoidcomponentRemoved(ContainerEvente){ //清除空行 clearEmptyRow(); //计算代码 introws=table.getRowCount(); intcount=0; doublemoney=0.0; //计算品种数量 TbSpinfocolumn=null; if(rows>0) column=(TbSpinfo)table.getValueAt(rows-1,0); if(rows>0&&(column==null||column.getId().isEmpty())) r

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论