1、河南理工大学计算机科学和技术学院课程设计汇报(-1)课程名称 软件工程课程设计 设计题目 企业进销存管理系统 学生姓名 徐 松 学 号 专业班级 软件工程1302 指导老师 王 静 年 1 月 14 日一、系统背景.3二、系统分析3 1.了解需求.3 2.需求任务分析.3 3.数据库.4三、系统设计.41.Item类设计82.数据模型公共类93.Dao公共类143.4系统登录模块设计151.设计登录窗体152.密码文本框163.“登录”按钮173.5系统主窗体设计181.设计菜单栏182.设计工具栏183.设计状态栏193.6销售单模块设计191.设计销售窗体192.添加销售商品193.销售统
2、计194.商品销售19四、总结.21 一、系统背景 中小企业在中国经济发展中含相关键地位,伴随中国市场经济蓬勃发展和大家对计算机普遍应用,批发、零售行业正处于一个高速发展时期。行业快速发展肯定造成竞争加剧,要想在猛烈市场竞争中寻求发展,客观上要求企业必需加强内部管理,提升运行效率。而中国大部分小型批发、零售企业在信息机制上还没有摆脱原有手工模式,企业内部没有形成完善、有效信息化管理机制,企业发展动力不足,从而影响企业连续、稳定、快速发展。当今中国外多数企业竞争特点是:产品种类、规格尤其多,市场需求改变很快,和分销商,零售商关系日益亲密等。而伴随业务量扩大,传统管理方法已经无法处理日益膨胀大量业
3、务数据,企业采取电脑管理进货、库存、销售等很多步骤也已成为趋势及肯定。 实现企业信息化管理是现代社会中小企业稳步发展必需条件,它能够提升企业管理水平和工作效率,最大程度地降低手工操作带来失误。进销存管理系统正是一个信息化管理软件,能够实现企业进货、销售、库存管理等各项业务信息化管理。出于以上原因,本课程设计将基于MySQL数据库并以JAVA为开发环境设计实现一个企业进销存管理系统。该系统包含基础信息管理、进货管理、销售管理、库存管理、查询统计、系统管理多个模块,关键是处理商业企业商品采购、库存和销售各个步骤活动,含有良好人机界面。考虑到系统使用对象可能较多,权限管理良好,数据查询方便,支持多条
4、件查询。 二、系统分析1、了解需求本系统经过进销存系统终端用户和用户进行调研后,得出系统需求关键(1)进货管理商品进货信息管理:商品进货信息包含商品进货数量、单价、供货商、进货日期、等。商品进货管理功效完成进货信息登记、修改和删除等。更新库存:进货信息变动直接关系到库存改变 (2)库存管理库存商品信息管理:商品库存信息包含商品进货数量、单价、供货商、进货日期、等。商品库存管理功效完成库存信息登记、修改和删除、查询等。 (3)销售管理信息管理:商品销售信息包含商品销售数量、单价、统计日等商品销售。管理功效完成销售信息登记、修改和删除,和销售总汇查询。本系统应该对基础数据(用户数据字典)进行维护。
5、系统应该提供强大数据统计、查询、报表生成及打印等功效。系统用户端运行在Windows各版平台下,系统还应该有一个很好飞图形用户界面。系统还应该有很好可扩展性。系统应该轻易上手,方便使用。2、需求分析任务第一项任务:画出“进销存管理系统”组合结构图,即组织结构模型。第二项任务:画出“进销存管理系统”业务操作图,即业务操作模型。第三项任务:画出“进销存管理系统”数据步骤图。第四项任务:列出“进销存管理系统”功效点列表,即功效模型。第五项任务:列出“进销存管理系统”性能点表,即性能模型。第六项任务:确定“进销存管理系统”环境模型,即运行环境。3.数据库数据库设计是进销存信息系统关键,采取规范化设计,
6、使数据库结构尽可能简化,降低冗余,保持系统数据结构一致性。依据不一样需求,一个商品流通企业进销存管理系统可包含多个到上百个不等数据表、数据视图、存放过程和函数等,但最基础数据表应该包含:操作用户数据表、企业信息数据表、采购明细数据表、采购用户数据表、采购信息数据表、供给用户数据表、商品信息数据表、销售明细数据表和销售信息数据表;数据视图包含:采购入库明细视图、累计采购商品视图、累计销售商品视图和销售出库明细视图角色定义组织结构图中各单位职责说明和相关业务,如表:销售人员信息单据进货信息单据商品销售信息单据用户信息单据经手人信息表(jsr)用户实体E-R图企业进销存管理系统将统计全部用户信息,在
7、销售、退货等操作时,将直接引用该用户实体属性。用户实体包含用户编号、用户名称、简称、地址、电话、邮政编码、联络人、联络人电话、传真、开户行和账号等属性,用户实体E-R图图所表示。商品实体E-R图供给商实体E-R图进销存管理系统数据流图三、系统设计1.目标从该阶段开始正式进入软件实际开发阶段,本阶段完成系统大致设计并明确司徒数据结构和软件结构。在软件设计阶段关键是把一个软件需求转化为软件表示过程,2.术语定义总体结构软件系统总体逻辑结构。本系统采取面向对象设计方法,所以逻辑结构为部件组装图概念模型CDM关系数据库逻辑设计模型,包含一张逻辑E-R图及对应数据字典物理模型PDM关系数据库物理设计模型
8、,包含一张物理表关系图及其对应数据字典角色数据库中享受一些特权操作用户子系统含有相对独立功效小系统,一个大软件系统能够划分为多个子系统,每个子系统可由多个模块或多个部件组成模块含有功效独立、能被调用信息单元3. 系统构架1.Item类设计Item类是系统公共类之一,关键用于封装和传输参数信息,这是经典命令模式实现。在Dao类中常常使用该类作为方法参数;另外,在各个窗体界面中也常常使用该类作组件数据,其toString()方法将返回name属性值,所以显示到各个组件上内容就是Item类对象所代表商品、供给商或用户等信息中名称。关键代码以下package com.lzw;public class
9、Item private String id; /定义id属性private String name; /定义name属性public Item() public Item(String id,String name) this.id=id;this.name=name;public String getId() /定义得到id属性方法return id;public void setId(String id) this.id = id;public String getName() /定义得到那么属性方法return name;public void setName(String name)
10、 this.name = name;public String toString() /定义该类字符串表现形式return getName();2.数据模型公共类在com.lzw.dao.model包中存放是数据模型公共类,它们对应着数据库中不一样数据表,这些模型将被访问数据库Dao类和程序中各个模块甚至各个组件所使用。和Item公共类使用方法类似,数据模型也是对数据表中全部字段(属性)封装,不过数据模型是纯粹模型类,它不仅需要重写父类toString()方法,还要重写hashCode()方法和equals()方法模型类关键用于存放数据,并经过对应getXXX()方法和setXXX()方法实现
11、不一样属性访问标准。以商品数据表为例其代码:public class TbSpinfo implements java.io.Serializable private String id;private String spname;private String jc;private String cd;private String dw;private String gg;private String bz;private String ph;private String pzwh;private String memo;private String gysname;public TbSpin
12、fo() public TbSpinfo(String id) this.id = id;public String getId() return this.id;public void setId(String id) this.id = id;public String getSpname() return this.spname;public void setSpname(String spname) this.spname = spname;public String getJc() return this.jc;public void setJc(String jc) this.jc
13、 = jc;public String getCd() return this.cd;public void setCd(String cd) this.cd = cd;public String getDw() return this.dw;public void setDw(String dw) this.dw = dw;public String getGg() return this.gg;public void setGg(String gg) this.gg = gg;public String getBz() return this.bz;public void setBz(St
14、ring bz) this.bz = bz;public String getPh() return this.ph;public void setPh(String ph) this.ph = ph;public String getPzwh() return this.pzwh;public void setPzwh(String pzwh) this.pzwh = pzwh;public String getMemo() return this.memo;public void setMemo(String memo) this.memo = memo;public String get
15、Gysname() return this.gysname;public void setGysname(String gysname) this.gysname = gysname;public String toString() return getSpname();Overridepublic int hashCode() final int PRIME = 31;int result = 1;result = PRIME * result + (bz = null) ? 0 : bz.hashCode();result = PRIME * result + (cd = null) ?
16、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) ?
17、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();return result;Overridepublic boole
18、an equals(Object obj) if (this = obj)return true;if (obj = null)return false;if (getClass() != obj.getClass()return false;final TbSpinfo other = (TbSpinfo) obj;if (bz = null) if (other.bz != null)return false; else if (!bz.equals(other.bz)return false;if (cd = null) if (other.cd != null)return false
19、; else if (!cd.equals(other.cd)return false;if (dw = null) if (other.dw != null)return false; else if (!dw.equals(other.dw)return false;if (gg = null) if (other.gg != null)return false; else if (!gg.equals(other.gg)return false;if (gysname = null) if (other.gysname != null)return false; else if (!gy
20、sname.equals(other.gysname)return false;if (id = null) if (other.id != null)return false; else if (!id.equals(other.id)return false;if (jc = null) if (other.jc != null)return false; else if (!jc.equals(other.jc)return false;if (memo = null) if (other.memo != null)return false; else if (!memo.equals(
21、other.memo)return false;if (ph = null) if (other.ph != null)return false; else if (!ph.equals(other.ph)return false;if (pzwh = null) if (other.pzwh != null)return false; else if (!pzwh.equals(other.pzwh)return false;if (spname = null) if (other.spname != null)return false; else if (!spname.equals(ot
22、her.spname)return false;return true;3.Dao公共类Dao全称是Data Access Object,即数据访问对象。本项目中应用该名称作为数据库访问类名称,在该类中实现了数据库驱动、连接、关闭和多个操作数据库方法,这些方法包含不一样数据表操作方法。在介绍具体数据库访问方法之前,先来看一下Dao类定义,也就是数据库驱动和连接代码。代码以下public class Dao static Statement sql;static ResultSet res;protected static String dbClassName=com.mysql.jdbc.Dr
23、iver;protected static String dbUrl=jdbc:mysql:/localhost:3306/db_database28;protected static String dbUser=root;protected static String dbPwd=;protected static String second = null;public static Connection conn=null; static try if(conn=null) Class.forName(dbClassName).newInstance(); conn = (Connecti
24、on) DriverManager.getConnection(dbUrl,dbUser,dbPwd); catch(Exception ee) ee.printStackTrace(); 3.4系统登录模块设计1.设计登录窗体登录模块窗体设计由两部分组成,一部分是登录窗体,另一部分是窗体中带背景图片内容面板。 1.创建内容面板public class LoginPanel extends JPanel public int width, height;private Image img;public LoginPanel() super();URL url = getClass().getR
25、esource(/res/login.jpg);img = new ImageIcon(url).getImage();protected void paintComponent(Graphics g) super.paintComponent(g);g.drawImage(img, 0, 0, this); 2.创建登录窗体private LoginPanel getLoginPanel() if (loginPanel = null) jLabel1 = new JLabel();jLabel1.setBounds(new Rectangle(86, 71, 55, 18);jLabel1
26、.setText(密码:);jLabel = new JLabel();jLabel.setText(用户名:);jLabel.setBounds(new Rectangle(85, 41, 56, 18);loginPanel = new LoginPanel();loginPanel.setLayout(null);loginPanel.setBackground(new Color(0xD8DDC7);loginPanel.add(jLabel, null);loginPanel.add(getUserField(), null);loginPanel.add(jLabel1, null
27、);loginPanel.add(getPasswordField(), null);loginPanel.add(getLoginButton(), null);loginPanel.add(getExitButton(), null);return loginPanel;2.密码文本框在系统登录窗体“密码”文本框中添加了按键事件监听器,它在获取到“密码”文本框输入回车字符时将实施登录事件,也就是说在“密码”文本框输入密码后,按Enter键将实施和单击“登录”按钮相同业务逻辑。代码以下:private JPasswordField getPasswordField() if (passwor
28、dField = null) passwordField = new JPasswordField();passwordField.setBounds(new Rectangle(143, 69, 125, 22);passwordField.addKeyListener(new KeyAdapter() public void keyTyped(KeyEvent e) if (e.getKeyChar() = n)loginButton.doClick(););return passwordField;3.“登录”按钮“登录”按钮用于实施用户名和密码验证工作,假如验证用户名和密码有效,则开启
29、系统,不然严禁进入系统。在“登录”按钮动作事件监听器中,首先获取用户输入用户名和密码信息,然后调用Dao类checkLogin()方法,假如该方法返回true则登录成功,不然严禁用户登录,并提醒输入用户名和密码无法登录系统。图所表示代码以下:private JButton getLoginButton() if (loginButton = null) loginButton = new JButton();loginButton.setBounds(new Rectangle(109, 114, 48, 20);loginButton.setIcon(new ImageIcon(getCla
30、ss().getResource(/res/loginButton.jpg);loginButton.addActionListener(new ActionListener() public void actionPerformed(ActionEvent e) try userStr = userField.getText();String passStr = new String(passwordField.getPassword();if (!Dao.checkLogin(userStr, passStr) JOptionPane.showMessageDialog(LoginDial
31、og.this,用户名和密码无法登录, 登录失败,JOptionPane.ERROR_MESSAGE);return; catch (Exception e1) e1.printStackTrace();mainFrame.setDefaultCloseOperation(EXIT_ON_CLOSE);mainFrame.setVisible(true);MainFrame.getCzyStateLabel().setText(userStr);setVisible(false););return loginButton;3.5系统主窗体设计1.设计菜单栏本系统菜单栏是由MenuBar类实现,
32、该类是一个自定义菜单栏类,它继承JMenuBar类成为Swing菜单栏组件。下面以创建进货单菜单为例,。(1)创建MenuBar类,该类继承javax.swing.JMenuBar类,而且在该类中定义一个私有组员变量,类型为JMenu,用于表示菜单对象。(2)编写一个名称为getJinhuo_Menu()方法,该方法返回值为一个JMenu对象,也就是一个菜单对象。在该方法中,当进货菜单对象为null时,创建一个菜单对象,并为其设置菜单名和快捷键。(3)编写一个初始化菜单栏界面方法initialize(),在该方法中,首先设置组件尺寸,然后调用JMenuBar对象add()方法向菜单栏中添加一个
33、菜单。(4)编写以下结构方法,用于调用初始化菜单栏界面。(5)在MenuBar类,再创建一个JMenuItem类型组员变量jinhuoItem,表示进货菜单项。(6)编写一个名称为getJinhuoItem()方法,该方法返回值为一个JMenuItem对象,也就是一个菜单项对象。在该方法中,当进货单菜单项对象为null时,创建一个菜单项对象,并为其设置菜单项名、图标和动作事件监听器。(7)根据步骤(5)和步骤(6)方法再创建一个进货退货菜单项对象,名称为jinhuo_tuihuoItem。(8)在getJinhuo_Menu()方法中,应用JMenu对象add()方法向菜单中添加菜单项。2.设
34、计工具栏工具栏用于放置常见命令按钮,如进货单、销售单、库存盘点等。向本系统中添加工具栏方法和添加菜单栏方法类似,也需要继承SwingJTool组件编写自己工具栏。当然,也能够直接使用SwingJTool组件。组件initialize()方法用于初始化工具栏程序界面。3.设计状态栏本系统状态栏显示了目前选择功效窗体、登录用户名、目前日期和本系统所属企业,即版权全部者等信息,以下图所表示。3.6销售单模块设计1.设计销售窗体2.添加销售商品在销售单窗体中单击“添加”按钮,将向table表格中添加新空行,操作员能够在空行第一列字段商品下拉列表框中选择销售商品,这个下拉列表框和进货单窗体不一样,它不是
35、依据供给商字段确定选择框内容,而是包含了数据库中全部能够销售商品。要实现添加销售商品功效,需要为“添加”按钮添加动作监听器,在监听器中实现对应业务逻辑。3.销售统计和进货单统计功效类似,销售单也需要统计功效,统计内容包含货物数量、品种数量、累计金额等信息,实现方法也是经过table表格事件监听器来处理对应统计业务,不过销售单窗体使用不是PropertyChangeListener属性改变事件监听器,而是使用ContainerListener容器监听器。4.商品销售在销售单窗体中添加完销售商品以后,单击“销售”按钮,将完成此次销售单销售业务。系统会统计此次销售信息,并从库存表中扣除销售商品数量。
36、这些业务处理全部是在“销售”按钮动作监听器中完成,该监听器需要获取销售单窗体中全部销售信息和商品信息,将全部商品信息封装为销售明细表模型对象,并将这些模型对象放到一个集合中,然后调用Dao公共类insertSellInfo()方法将该集合和销售主表模型对象保留到数据库中。初始化表格代码:private void initTable() String columnNames = 商品名称, 商品编号, 供给商, 产地, 单位, 规格, 单价,数量, 包装, 批号, 同意文号 ;(DefaultTableModel) table.getModel().setColumnIdentifiers(co
37、lumnNames);TableColumn column = table.getColumnModel().getColumn(0);final DefaultCellEditor editor = new DefaultCellEditor(sp);editor.setClickCountToStart(2);column.setCellEditor(editor);初始化商品下拉框:private void initSpBox() List list = new ArrayList();ResultSet set = Dao.query( select * from tb_spinfo+
38、 where id in (select id from tb_kucun where kcsl0);sp.removeAllItems();sp.addItem(new TbSpinfo();for (int i = 0; table != null & i table.getRowCount(); i+) TbSpinfo tmpInfo = (TbSpinfo) table.getValueAt(i, 0);if (tmpInfo != null & tmpInfo.getId() != null)list.add(tmpInfo.getId();try while (set.next(
39、) TbSpinfo spinfo = new TbSpinfo();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.add
©2010-2024 宁波自信网络信息技术有限公司 版权所有
客服电话:4008-655-100 投诉/维权电话:4009-655-100