上周老师要求我们做个作业,那么我们就做一个Java企业商品进销存管理系统
源码+实训报告+系统测试报告已经打包好,方便给需要的同学使用!
链接:https://pan.baidu.com/s/14SaUQeWkt7uEa_yOBdVs0w
提取码:lwmb
这是做出来的样品:
本系统的开发适用于多个行业,可以帮助企业快速有效管理进货、销售、库存、查询统计等各项业务,合理控制进销存各个环节,提高资金利用率,实现管理高效率和实时性。本系统是根据人们在日常生活中的实际需求而开发的,完全能够实现人们对商品的基础信息管理、进货管理、销售管理、查询统计、库存管理、系统管理等功能,一般而言,通过使用进销存管理系统,可以在以下几方面提高企业的管理水平:
更好地了解供应商和客户信息,加强对商品资料的管理。
降低采购成本,及时了解采购情况。
准确了解销售动态,及时调整营销策略。
了解库存情况,及时进行价格管理以及库存数量维护。
减少储备资金占用,加速资金周转,提高资金利用率。
提供商业数据智能分析,了解商业动态,为管理者提供决策依据。
流程图:
程序环境:
SQL server 2005和myeclipse8.5。
具体过程
软件安装和帐户设定
1-1:安装“MS Sql Server 2005(SP2)”(内置帐户选择sa,密码设为123;如果没有设置内置帐户sa的话,请直接使用WinNT登录“SQL Server Management Studio”,选择安全性→登录名→sa→登录属性,然后设置密码123,关闭“SQL Server Management Studio”)
1-2:安装“MyEclipse 5.5.1 GA”
1-3:下载连接驱动包“sqljdbc.jar”
1-4:设置SQL Server服务器:
“开始”→“程序”→“Microsoft SQL Server 2005”→“配置工具”→“SQL Server Configuration Manager”(确认“SQL Server Management Studio”已关闭)
“SQL Server 2005服务”中停止服务“SQL Server(SQLEXPRESS)”(默认是启动状态)
“SQL Server 2005网络配置”→“MSSQLSERVER的协议”,启动“TCP/IP”(默认是禁用状态),然后双击“TCP/IP”进入属性设置,在“IP地址”里,确认“IPAll”中的“TCP端口”为1433
“SQL Server 2005服务”中启动服务“SQL Server(MSSQLSERVER)”(默认是停止状态)
关闭“SQL Server Configuration Manager”(此时可以启动“SQL Server Management Studio”,并用帐户sa、密码123登录,SQL Server服务器设置正确的话应该能登录成功)
创建测试数据库和表
2-1:启动“SQL Server Management Studio”,并用帐户sa、密码123登录(SQL Server服务器设置正确的话应该能登录成功),创建一个数据库JSPTest,内建一个表regist
2-2:创建测试的Java工程和代码
2-3:启动“MyEclipse”→“File”→“New”→“Project”→“Java Project”,命名为Test
2-4:打开Test的“Properties”→“Java Build Path”→“Libraries”→“Add External JARs”,选择下载好的连接驱动包“sqljdbc.jar”,然后点击“OK”确定
2-5:SQL Server 2005中加载驱动和URL的语句为:
protected static String dbClassName= “com.microsoft.sqlserver.jdbc.SQLServerDriver”;
protected static String dbUrl= “jdbc:sqlserver://localhost:1433;DatabaseName=db_JXC”;
protected static String dbUser=“sa”;
protected static String dbPwd=“123”;
主窗体是系统的欢迎界面。用程序的主窗体包括系统菜单和工具栏,其中系统菜单是包含系统中所有功能的菜单项,工具栏是提供常用的功能的快捷访问按钮。(该系统采用了导航面板综合了系统菜单和工具栏的优点,导航面板的界面更美观,操作更快捷。)
创建主窗体
创建JXCFrame类,在类中创建和初始化窗体对象,为窗体添加桌面面板,并且设置背景图片。
Frame=new JFrame(“企业进销存管理系统”);//创建窗体对象
desktopPanel=new JDeskPanel();//创建桌面面板
JTabbedPane navigationPanel=createNavigationPanel();//创建导航面板
编写updateBackImage()方法,初始化背景标签,背景标签使用HTML超文本语言设置了主窗体的背景图片(该图片会随着主窗体的大小自动缩放)。
在类的静态代码中设置了系统的外观样式。使用了UIManager类的setLookAndFeel()方法设置程序界面使用本地外观。
编写主窗体的mian()入口方法,创建登录窗体对象(登录窗体会验证登录信息,并显示主窗体界面)
创建导航面板
在JXCFrame类中编写createNavigationPanel()方法,创建JTabbePanel选项卡面板对象。(为了突出选项卡的立体效果,设置该选项卡使用了BevelBorder边框效果。)然后依次创建了基础信息管理面板、库存管理面板、销售管理面板、查询统计面板、进货管理面板和系统管理面板的选项卡。
JTabbedPane tabbedPane=new JTabbedPane();//创建JTabbePanel选项卡面板对象
JPanel baseManagePanel=new JPanel();//基础信息管理面板
JPanel depotManagePanel=new JPanel();//库存管理面板
JPanel sellManagePanel=new JPanel();//销售管理面板
JPanel searchStatisticPanel=new JPanel();//查询统计面板
JPanel stockManagePanel=new JPanel();//进货管理面板
JPanel sysManagePanel=new JPanel();//管理系统面板
编写createFrameButton()方法,该方法负责创建Action对象,该对象是用来创建并显示窗体对象,(图标、文本等属性),本系统没有使用系统菜单,所以该方法直接创建按钮对象。
Icon icon=new ImageIcon(imgUrl);//创建按钮图标
Icon_roll=new ImageIcon(imgUrl_roll);//创建鼠标经过按钮的图标
Icon_down=new ImageIcon(imgUrl_down);//创建按钮按下的图标
Action action=new openFrameAction(fName,cname,icon);//用openFrameAction类创建Actio对象
编写内部类openFrameAction,它必须要继承AbstraAction类实现Action接口。该类用于创建导航按钮的Ation对象,并且为每一个导航按钮定义创建不同窗体对象的动作监听器,当这个监听器的按钮被按下时,调用getFrame()方法获取相应的窗体对象,并显示在主窗体中。
编写getIFrame()方法。该方法就是用来创建指定名称的窗体对象,使用了java反射技术,调用不同窗体类的默认构造方法创建窗体对象。
公共模块设计
编写Dao公共类
Dao类主要负责有关数据库的操作,该类在静态代码段中驱动并连接数据库,然后将所有的数据库访问方法定义为静态的。
Class.forName(dbClassName).newInstance();//加载数据库驱动类
conn=DriverManager.getConnection(dbUrl,dbUser,dbPwd);//获取数据库连接
addGys()方法(添加供应商信息的方法)
该方法用于添加供应商的基础信息,它接收供应商的实体类TbGysinfo作方法的参数,然后把实体对象中的所有属性存入供应商数据表中。
getGysinfo()方法(读取指定供应商的信息)
该方法将根据Item对象中封装的供应商ID编号和供应商名称获取供应商的数据,然后将该供应商的数据封装到实体对象中,然后返回该实体对象。
updateGys()方法(修改供应商信息的方法)
该方法用于更新供应商的基础信息,它接收供应商的实体类TbGysinfo作方法参数,在方法中直接解析供应商实体对象中的属性,并且将这些属性更新到数据表中。
insertRukuInfo()方法
该方法负责完成入库单信息的添加,(库存表、入库主表、入库详细表等多个数据表的操作)。为了保证数据的完整性,该方法将入库信息的添加操作放在事务中完成,方法将接收入库主表的实体类TbRukuMain作为参数,该实体类中包含了入库详细表的引用。
getKucun()方法
该方法用于获取指定商品ID编号或者名称的库存信息,方法接收一个Item对象作参数,该对象中封装了商品的ID编号和商品的名称信息,如果库存表中存在该商品的库存记录,就获取该记录并将记录中的数据封装到库存表的实体对象中,然后将该实体对象作为方法的返回值。
编写Item类
Item类主要用于封装和传递参数信息,这是典型命令模式的实现。
在Dao类中经常使用该类作为方法参数;在各个窗体界面中也经常使用该类作组件数据,其toString()方法将返回name属性值,所以显示到各个组件上的内容是Item类的对象所代表的商品、供应商、或者客户等信息的名称。
基础信息主要功能模块详细设计
基础信息管理模块的有三个功能:客户信息管理、商品信息管理和供应商信息管理。其中客户信息管理所使用的的数据表是tb_khinfo,其功能类包括KeHuTianJiaPanel类和KeHuXiuGaiPanel类;商品信息管理所使用的数据表是tb_spinfo,其功能类包括ShangPinTianJiaPanel类和ShangPinXiuGaiPanel类;供应商信息管理所使用的数据表是tb_gysinfo,其功能类包括GysTianJiaPanel类和GysXiuGaiPanel类。整个基础信息管理模块的技术分析以供应商信息管理面板为例,下面简单介绍一下供应商信息管理的添加、修改和删除的实现过程。
GysTianJiaPanel类
该类用于实现系统供应商添加功能,实现在界面将显示多个用于输入供应商信息的文本框。界面中主要包括以下控件:
控件类型
控件名称
主要属性
用途
JtextField
quanChengF
无
供应商全称
JianChengF
无
简称
BianMaF
无
邮政编码
DiZhiF
无
地址
DianHuaF
无
电话
ChuangZhenF
无
传真
LianXiRenF
无
联系人
lianXiRenDianHuaF
无
联系人电话
YinHangF
无
银行
EmailF
无
邮箱
Jbutton
TjButton
设置按钮文本为“添加”
设置动作监听器为TjActionListener类的实例对象
添加
ResetButton
设置按钮文本为“重填”
设置动作监听器为
ResetActionListener类的实例对象
重填
要点介绍:
ResetActionListener类。作为“重填”按钮的事件监听器。该类必须实现ActionListener接口,并在actionPerformed()方法中清除界面中的所有文本框内容。
代码如下:
TjActionListener类。作为“添加”按钮的事件监听器。该类必须实现ActionListener接口,并在actionPerformed()方法中实现用户输入的验证和供应商信息的保存。
代码如下:
GysXiuGaiPanel类
该类主要实现供应商修改和删除的功能。在该界面中有许多文本框用于输入供应商信息,这些文本框会根据所选供应商自动填充内容,点击修改按钮后回自动写入修改后的供应商内容。
控件类型
控件名称
主要属性
用途
JtextField
quanChengF
无
供应商全称
JianChengF
无
简称
BianMaF
无
邮政编码
DiZhiF
无
地址
DianHuaF
无
电话
ChuangZhenF
无
传真
LianXiRenF
无
联系人
lianXiRenDianHuaF
无
联系人电话
YinHangF
无
银行
EmailF
无
邮箱
JComboBox
Gys
设置初始大小为(230,21)
调用initComboBox()方法初始化下拉列表
设置组件选择事件调用doGysSelectAction()方法
选择供应商
Jbutton
tjjButton
设置按钮文本为“修改”
设置动作监听器为ModifyActionListener类的实例对象
修改
resetButton
设置按钮文本为“删除”
设置动作监听器为
DeltActionListener类的实例对象
删除
要点介绍:
initComboBox()方法。用于初始化选择供应商的下拉列表框。该方法先获取Dao类中的getGysInfos()方法,然后再将获取到的信息封装成Item对象并添加到下拉列表框中(主要是获取ID和供应商名称)。然后再下拉列表框的Item对象中用toString()方法显示供应商名称。
代码:
doGysSelectAction()方法。在使用下拉列表框时选择或更改供应商信息的时候被调用。主要根据选择的供应商名称,填充相应的供应商信息到文本框中。
代码如下:
ModifyActionListener类。修改按钮的事件监听器。必须实现ActionListener接口,并在actionPerformed()方法中获取文本框内容,并可以将修改后的供应商信息,通过调用Dao类的updateGys()方法,把修改后的信息写入到数据库。
代码:
DeltActionListener类。删除按钮的事件监听器。必须实现ActionListener接口,并在actionPerformed()方法中获取文本框内容,通过调用Dao类中的delete()实现把供应商信息从后台数据库删除。
代码:
进货管理模块设计
企业进销存管理系统中的进货模块管理主要包括进货单和进货退货两个部分。由于它们的实现方法相似,这里主要以进货单功能为主,介绍进货模块对本系统的意义和实现的业务逻辑。
进货单
主要负责记录企业的商品进货信息,可以单击“添加”按钮,在商品表中添加进货的商品信息。在“供应商”下拉列表框中选择不同的供应商,将会改变商品中可以添加的商品。进货单的程序界面如下图:
进货退货
进货退货功能主要负责记录进货管理中的退货信息,界面效果如下图。在选择了退货的商品之后,单价“退货”,将把表格中商品退货信息更新到数据库中。
技术分析
进货管理模块使用JDBC实现事务操作,因为进货和退货的业务逻辑涉及到3个数据表,为保证数据的完整性,将3个数据表的操作放在事务中实现,如果对任何一个数据表的操作出现错误或是不可执行的操作,那么事务中的所有操作都将取消,并恢复到事务执行的数据状态;否则3个数据表的操作全部执行。下面是JDBC事务操作的关键方法。
setAutoCommit()方法
该方法用于连接对象的自动提交模式。如果连接处对象的自动提交模式为true,则它的所有SQL语句被执行作为单个事务提交;否则,该连接对象的SQL语句将聚集到事务中,直到调用commit()方法或rollback()方法为止。默认情况下,新连接的自动提交模式为true。
语句:
Void setAutoCommit(boolean autoCommit)
autoCommit:该参数为true表示启用连接对象的自动提交模式:false表示禁用链接对象的自动提交模式。
getAutoCommit()
判断此连接对象是否启用了自动提交模式。
语法:
Boolean getAutoCommit()
commit()方法
该方法将执行提交SQL语句执行数据库操作,并释放此连接对象当前持有的所有数据库锁。此方法只在禁用自动提交模式情况下使用。
语法:
Void commit()
rollback()方法
该方法将取消在事务中进行的所有更改,并释放此连接对象当前持有的所有数据库锁。此方法只在禁止自动提交模式情况下使用。
语法:
Void rollback()
进货单实现过程
创建jinhuodan类,用于实现本系统的进货单功能的界面和业务逻辑。界面中定义的主要控件如表:
进货单界面中的主要控件
编写inittable()方法,该方法用于初始化食品表格的表头,列编辑器等。设置表格中第一个列的编辑器使用下拉列表框样式的编辑器,通过编辑器选择商品的名称,其他的商品信息将自动填充,代码如下:
private void initTable(){
String[]columnNames={“商品名称”,“商品编号”,“产地”,“单位”,“规格”,“包装”,“单价”,
“数量”,“批号”,“批准文号”};
((DefaultTableModel)table.getModel())
.setColumnIdentifiers(columnNames);
TableColumn column=table.getColumnModel().getColumn(0);
final DefaultCellEditor editor=new DefaultCellEditor(sp);
editor.setClickCountToStart(2);
column.setCellEditor(editor);
}
编写initSpBox()方法,该方法用于初始化表格中的商品下拉表框。它首先调用Dao类的query()方法获取指定供应商所提供的所有商品信息,然后将这些商品信息封装成商品对象,并把这些对象添加到商品下拉框中。代码如:
private void initSpBox(){
List list=new ArrayList();
ResultSet set=Dao.query(“select*from tb_spinfo where gysName=’”
+gys.getSelectedItem()+"’");
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()){
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.addItem(spinfo);
}
}catch(SQLException e){
e.printStackTrace();
}
}
库存管理模块设计
库存业务
库存管理是指在上产经营中为销售和耗用而存储的各种资产。企业存货不当都会增加不必要的费用:存货过多将导致物资的积压、存储费用增加、流动资金周转不利,并且过量的库存会掩盖管理不善的问题。存货不足则影响企业的正常销售活动。库存管理的目标是需求最佳存货数量,使库存的成本总额最小化。其主要功能如下:
库存盘点和价格调整等日常处理。
价格调整功能主要用于调整库存中指定商品的单价,当用户选择了此商品,价格调整功能的界面会显示该商品在库存中的单价、数量、金额、单位、产地等信息,用户可以单击“单价”后即可修改商品的价格。如下图所示:
库存管理模块中包括库存盘点和价格调整两个功能,库存盘点功能是将库存信息显示在表格中,由操作员输入盘点的商品数量,然后自动计算损益值,价格调整功能涉及下拉列表框的选择事件监听和事件处理技术,为防止用户的错误输入,程序界面经常需要将可枚举的输入内容封装在下拉列表框中,限制用户的输入。但是,想要知道下拉列表框的改变,还需要为下拉列表框添加相应的事件监听器。下面就进行简单的介绍:
addItemListener()方法可以为下拉列表框添加ItemListener监听器,当更改下拉列表框的选项时,将产生相应的事件,这个事件会被添加的ItemListener监听器捕获。
价格调整实现过程:
创建JiaGeTiaoZheng类,用于实现本系统的价格调整功能界面和业务逻辑。界面中的主要控件如下:
控件类型
控件名称
主要属性设置
用途
JTextField
KuCunJinE
无
库存金额
KuCunShuLiang
无
库存数量
DanJia
无
库存单价
Jlabel
ShangPinMingCheng
无
商品名称
GuiGe
无
规格
ChanDi
无
产地
DanWei
无
单位
Jbutton
OkButton
无
确定
CloseButton
无
关闭
编写UpdateJinE()方法,用于更新库存金额,该方法将“单价”文本框的内容转换为Double类型,将“库存数量”文本框的内容转换为Integer类型,然后用它们的乘积更新“库存金额”文本框的内容,代码如下:
private void updateJinE(){//更新库存金额的方法
Double dj=Double.valueOf(danJia.getText());
Integer sl=Integer.valueOf(kuCunShuLiang.getText());
kuCunJinE.setText((dj*sl)+"");
}
创建ItemActionListener类,它必须实现ItemListener接口和接口中的itemStateChanged()方法,成为下拉列表框的事件监听器。当改变界面中选择的商品时,相应的ItemEvent事件会通知监听器处理业务逻辑,也就是根据摆选择的商品名称更新其他的控件内容。代码如下:
ItemListener:下拉列表框的事件监听器必须实现的分接口。
ITemStateChanged():当下拉列表框的选中项发生改变时将触发该方法。
ItemEvent:这是选项事件类,在用户更改带有多项选择内容的组件选项时,将产生该事件。例如下拉选择框组件。
创建OKActionListener类,它必须实现ActionListener接口和接口中的actionPerformed()方法,在这个方法中获取新的库存商品价格,然后调用Dao类的updateKuCunDj()方法更新库存价格。代码如下: