《基于JAVA企业进销存管理系统毕业设计(含源文件).doc》由会员分享,可在线阅读,更多相关《基于JAVA企业进销存管理系统毕业设计(含源文件).doc(57页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、 企业进销存管理系统学 院专 业班 级学 号姓 名指导教师教师职称年月日WORD. 摘要【摘要】进销存管理系统是一个基于Internet的应用系统,它是一个面对当前的进销存管理工作基本还处于手工和半信息自动化处理状态而应运而生的一个基于Internet的一个完全信息自动化的系统,整个系统从符合操作简便、界面友好、灵活、实用、安全的要求出发,完成进货、销售、库存管理的全过程。企业单位只需具备访问Internet的条件即可在系统发布的站点上进行进销存的管理。在图型化的人机界面中完成日常的进销存管理工作.一方面摆脱了时间和空间的限制,另一方面有效的解决的数据共享的问题。经过实际使用证明,本文所设计的
2、企业进销存管理系统可以满足企业进货、销售管理方面的需要。【关键词】库存 销售 企业进销存管理系统目录摘要10 引言11 系统分析21.1 需求分析21.2 可行性分析22 总体设计22.1 项目规划22.2 系统功能结构图33 系统设计33.1 设计目标33.2 开发及运行环境43.3 数据库设计44 JavaBean的编写54.1 数据库操作的JavaBean的编写54.2 中文乱码处理的JavaBean的编写74.3 客户基本信息的JavaBean的编写74.4 提交客户信息的JavaBean的编写84.5 查询、分页JavaBean的编写(QuestString.java)94.6 显示
3、系统时间的JavaBean的编写145 用户登录模块设计156 系统首页设计167 基础信息管理主要功能模块设计187.1 客户信息管理设计187.2 客户信息查询设计198 库存管理主要功能模块设计228.1 商品入库信息设计238.2 商品价格调整设计26附录A 参考文献附录B 数据表附录C 文件架构图0引言随着中国电子商务、互联网业务的迅猛发展,国内许多企业已跨入电脑网络管理时代,并因此提高了管理效率和市场竞争力。但目前仍有部分企业还停留在原始计账管理阶段。而随着全球经济信息化的进程和WTO的成功实现,企业面临着前所未有的机遇和挑战,在如此激变的社会形势和激烈的市场竞争下,愈来愈多的企业
4、管理者意识到效率管理和科学管理的重要性,以及增强市场竞争力的迫切性,因此建立科学、规X、高效的管理制度和秉承富有竞争力的经营理念是每一个企业管理者的渴望,企业采用电脑管理进货、库存、销售等诸多环节也已成为趋势及必然。在进货、库存、销售环节中,由于商品种类繁多、业务量大、库存管理复杂,使用手工操作的工作量很大,在操作过程中也很容易出现各种错误。而采用计算机管理则可以大大提高日常工作的效率,不仅将原来由手工操作的进货、出货及销售这一整套流程用计算机进行全程管理,而且消除了手工操作中可能存在的不确定因素,达到进销存管理流程清晰,从而能够比较彻底地贯彻经营者的管理模式。1 系统分析1.1 需求分析通过
5、调查研究,要求系统满足以下功能:q 由于操作人员的计算机知识水平有限,因此要求系统具有良好的人机界面。q 如果系统的使用对象较多,则要求有较好的权限管理。q 方便的数据查询功能,并支持多条件查询。q 在各种单据中根据输入的基础数据自动计算金额,尽量减少人工干预。q 对客户或供应商的往来账目进行有效管理,绝不存在假账、漏账、差账等情况。q 通过计算机,能够直接“透视”仓库存储情况。q 对某一时间段内的某种商品的销售情况按数量或金额进行升序或降序排行。q 图表分析年销售额。1.2 可行性分析通过计算机网络系统对企业进行全面的管理,满足了企业的现代化管理的要求。q 经济性当前许多中小型企业都使用人工
6、管理方式(即纸和笔)来管理企业的进销存,这样的管理方式既困难又浪费时间和成本,并且容易出现漏账、差账的情况,因此中小企业应该向大型企业那样采用先进的管理方式,提高企业效率、降低企业运营成本。q 技术性企业进销存管理系统从中小企业的实际出发,可有效地管理企业的进销存情况,并降低企业运营成本、及时调整营销策略、提高库房的利用率。2 总体设计2.1 项目规划企业进销存管理系统是一个典型的数据库开发应用程序,由基础信息管理、库存管理、商品销售、查询统计、往来管理、系统设置6部分组成。q 基础信息管理该模块主要是对企业的客户信息、商品信息、供应商信息进行有效管理,并可实现按不同条件对这些数据进行查询。q
7、 库存管理该模块主要是对商品的入库及入库退货信息进行有效管理,对商品的价格进行调整,同时可按不同条件查询库存商品。q 商品销售该模块主要是对商品的销售及销售退货信息进行有效管理。q 查询统计该模块主要实现按不同条件查询商品的入库信息及销售信息,并可对某一时间段内某种商品的销售情况按数量或金额进行升序或降序排行,同时可对某一年度的销售额进行图表分析。q 往来管理该模块主要实现对商品的入库结账、入库退货结账、销售结账、销售退货结账信息进行有效管理,同时可实现销售结账信息及入库结账信息的查询操作。q 系统设置访模块主要实现对操作员及操作员密码进行有效管理。2.2 系统功能结构图企业进销存管理系统的功
8、能结构如图1所示。图1 系统功能结构图3 系统设计3.1 设计目标本系统针对中小型企业进销存管理现状,通过网络对企业的进销存进行有效管理。本系统主要实现如下目标:q 系统采用人机对话方式,界面美观友好,信息查询灵活、方便、快捷、准确,数据存储安全可靠。q 实现企业内一些基础信息的设置及查询。q 商品的入库、入库退货、销售、销售退货流程清晰。q 数据计算自动完成,提高工作效率。q 与供应商和客户之间的账目清晰。q 以图表形式对年销售额进行分析。q 实现多条件查询。q 可方便快捷地查询库存信息,并可对商品价格进行调整。q 对某一时间段内的某种商品按照销售数量或销售金额进行销售升序排行或降序排行。q
9、 操作员可以随时修改自己的口令。q 对用户输入的数据,系统进行严格的数据检验,尽可能排除人为的错误。q 系统最大限度地实现了易维护性和易操作性。q 系统运行稳定、安全可靠。3.2 开发及运行环境硬件平台:q CPU:P41.8GHz。q 内存:256MB以上。软件平台:q 操作系统:Windows2000。q 数据库:SQL Server 2000。q 开发工具包:JDK Version1.4.2。q JSP服务器:Tomcat。q 浏览器:IE5.0,推荐使用IE6.0。q 分辨率:最佳效果1024768像素。3.3 数据库设计本系统采用SQL Server 2000数据库,系统数据库名称为
10、db_shopping。数据库db_shopping中包含17X表。关于数据库中的数据表请参见附录B。4JavaBean的编写根据系统的需求编写需要的JavaBean。下面将给出企业进销存管理系统中所需要的JavaBean的编写过程。4.1 数据库操作的JavaBean的编写数据库连接的JavaBean的编写代码如下:package .mingri.dbconn;import java.sql.*;import javax.naming.*;import javax.sql.DataSource;public class DBConn public static synchronized Co
11、nnection getConnection() throws Exception try Context initCtx=new javax.naming.InitialContext(); /获得JNDI初始上下文对象/在JNDI命名空间java:p/env段里获得上下文对象 Context envCtx=(Context)initCtx.lookup(java:p/env); DataSource ds=(DataSource)envCtx.lookup(jdbc/mingri); /通过JNDI名获得数据源对象 return ds.getConnection(); catch(SQLE
12、xception e) throw e; catch(NamingException e) throw e; 数据库操作的JavaBean的编写代码如下:package .mingri.dbconn;import java.sql.*;import .mingri.dbconn.DBConn;public class DBResult private Connection con; public DBResult() this.con=DBConn.getConnection(); /* * 用于获得执行SQL语句的ResultSet对象 */ public ResultSet getResu
13、lt(String sql) try Statement stmt=con.createStatement(); ResultSet rs=stmt.executeQuery(sql); return rs; catch(Exception e) return null; /* * 用于执行SQL语句没有返回值 */ public void doExecute(String sql) try Statement stmt=con.createStatement(); stmt.executeQuery(sql); catch(Exception e) /* * 用于获得执行SQL语句的Prep
14、aredStatement(预处理)对象 */public PreparedStatement getPreparedStatement(String sql) try PreparedStatement pstmt=con.prepareStatement(sql); return pstmt; catch(Exception e) return null; /* * 关闭连接 */ public void closeCon() trythis.con.close(); catch(Exception e) e.printStackTrace(); 4.2 中文乱码处理的JavaBean的编
15、写在JSP开发中,经常出现乱码问题,我们可以指定编码方式,以消除乱码。package .mingri.chinese;import java.io.*;public class ToChinese public String trans(String chi) String result=null; byte temp; try temp=chi.getBytes(iso-8859-1); result=new String(temp); catch(UnsupportedEncodingException e) System.out.println(e.toString(); return
16、result; 4.3 客户基本信息的JavaBean的编写这段代码用来封装客户的基本信息,并对每个属性提供set#X()和get#X()方法,来对其进行操作。package .mingri.info;public class KhinfoBean private String khname; /客户全称 private String khjc; /客户简称 private String address; /地址 private String postcode; /邮政编码 private String tel; / private String fax; /传真 private String
17、 lxr; /联系人 private String lxrtel; /联系人 private String email; /电子 private String khyh; /开户银行 private String yhzh; /银行账号 public String getKhname() return khname; public void setKhname(String khname) this.khname = khname; /省略部分代码4.4 提交客户信息的JavaBean的编写在填写完客户基本信息后,就应该向数据库中执行插入操作。这个类中有两个方法setKhinfo()和Regi
18、st()。其中setKhinfo(KhinfoBean khinfo)方法是用来设置该类中的属性khinfo,其值为参数传递来的KhinfoBean的对象。然后执行预处理语句,并通过预处理对象pstmt的setString()方法来设置准备要插入数据库的内容,最后通过execute()来执行插入的操作。具体代码如下:package .mingri.info;import .mingri.dbconn.DBResult;import java.sql.*;public class KhRegist private KhinfoBean khinfo; DBResult rst=new DBRes
19、ult(); public void setKhinfo(KhinfoBean khinfo) this.khinfo=khinfo; public void regist() throws Exception String reg=insert into tb_customer values(?,?,?,?,?,?,?,?,?,?,?); try PreparedStatement pstmt=rst.getPreparedStatement(reg); /创建一个预处理语句,然后设置他们的参数 pstmt.setString(1,khinfo.getKhname(); pstmt.setS
20、tring(2,khinfo.getKhjc(); pstmt.setString(3,khinfo.getAddress(); pstmt.setString(4,khinfo.getPostcode(); pstmt.setString(5,khinfo.getTel(); pstmt.setString(6,khinfo.getFax(); pstmt.setString(7,khinfo.getLxr(); pstmt.setString(8,khinfo.getLxrtel(); pstmt.setString(9,khinfo.getEmail(); pstmt.setString
21、(10,khinfo.getKhyh(); pstmt.setString(11,khinfo.getYhzh(); /执行更新操作 pstmt.executeUpdate(); catch(Exception e) e.printStackTrace(); throw e; 4.5 查询、分页JavaBean的编写(QuestString.java)该系统中主要的方法分为两部分:一部分是根据用户提交的不同请求调用不用的方法来获取SQL语句;另一部分是用于分页显示。用于完成分页显示的方法有:q void setQuerySql(String httpfile,String pages,Stri
22、ng strCount):通过参数传递来设置Bean中的属性。q void querySql(String countSql):执行SQL语句,获得分页显示时的各个属性。q String pageFooter():用来动态的给出一个表单该表单用来进行分页和统计页面间的跳转。这部分代码是本系统中查询部分的骨架,所有涉及到查询操作的代码部分全都调用了该Bean 中相应的方法,并完成了分页显示。代码如下:package .mingri.info;import .mingri.dbconn.DBResult;import java.sql.*;import java.io.*;public class
23、 QuestString private int curPage; /当前页数 private int maxPage; /最大页数 private int maxRowCount; /总记录数(即从数据库中查出的所有记录) private int pageSize=2; /每页要显示的记录数 private DBResult db; /记录集对象 private String httpFile; /当前地址栏的文件,即具体的JSP文件 private String cif; /选择的查询字段 private String ccif; /选择的查询运算符 private String qval
24、ue; /查询关键字 private String countSql=null; /用来存储select count (*) 语句 private String topSql=null; /用来存储 select top 2语句 private String nowPage=null; /初始化当前页curPage变量,即获取当前页的具体页号 private String str_parameter; /在做翻页时,传递除pages以外的其他参数 private String andor; /查询的与/或条件 private String sdate; /查询起始时间,即从什么日期开始查询 p
25、rivate String edate; /查询结束时间,即到什么日期结束 private String orderby; /排序条件,即按什么排序 private String paixu; /排序方法,即升序或降序 public QuestString() /构造方法,用来设置db为一个DBResult()对象 db=new DBResult(); public int getCurPage() return curPage; public void setCurPage(int curPage) this.curPage = curPage; /省略了对Bean中其他属性设置的部分代码/
26、* * 通过参数传递来设置Bean中的属性 */ public void setQuerySql(String httpfile,String pages,String strCount) this.nowPage=pages; /将表单提交过来的参数pages(第几页)的值传递给变量nowPage保存 this.httpFile=httpfile; /用来动态设置处理表单请求的JSP文件 this.countSql=strCount; /用来设置执行select count(*)的SQL语句 try querySql(countSql); /调用querySql方法,并将参数countSql
27、传递到该方法中 catch(Exception e) e.printStackTrace(); /* * 执行SQL语句,获得分页显示时的各个属性 */ public void querySql(String countSql) throws SQLException /在setQuerySql方法中已经设置了nowPage的值,其值就是pages if(this.nowPage=null) /如果nowPage的值为空,也就是传递pages的值为空 this.curPage=1; /那么就将当前页的值设为1; else this.curPage=Integer.parseInt(this.n
28、owPage); if(this.curPagethis.maxPage) /如果当前页大于总页数,则当前页等于总页数 this.curPage=this.maxPage; /那么当前页就是最大页 rsCount.close(); /关闭总记录数的结果集 /* * 一个字符串,用来动态的给出一个表单 * 该表单用来进行分页和统计页面间的跳转 */ public String pageFooter() /创建一个表单 String str = ; int prev = this.curPage- 1; /向前翻页,即当前页减1 int next = this.curPage +1; /向后翻页,
29、即当前页加1 str = str + 总计 + this.getMaxRowCount() + 条记录, + 【共 + this.getMaxPage()+ 页】; str = str + 【 + this.pageSize + 条/页】 当前第 + this.getCurPage() + 页 ; if(this.curPage 1) str = str + 首页 ; else str = str + 首页 ; if(this.curPage 1) str = str + 上一页 ; else str = str + 上一页 ; if(this.curPage this.maxP
30、age) str = str + 下一页 ; else str = str + 下一页 ; if(this.maxPage 1 & this.curPage!= this.maxPage) str = str + 尾页; else str = str + 尾页; /在页面跳转间设置隐藏表单,来保存不同的请求 str = str + 转到页+ ; return str; /* * 根据不同条件来获取不同的查询前N条的SQL语句 */ public String getString(String table) if(ccif.equals(=) String strSql=select top +
31、this.pageSize*this.curPage+ * from +table+ where+ +cif+=+qvalue+; return strSql; else if(ccif.equals(LIKE) String strSql=select top +this.pageSize*this.curPage+ * from +table+ where+ +cif+ +like+ +%+qvalue+%; return strSql; else if(ccif.equals(ALL) String strSql=select top +this.pageSize*this.curPag
32、e+ * from +table; return strSql; else if(ccif.equals() String strSql=select top +this.pageSize*this.curPage+ * from +table+ where +cif+ +qvalue+; return strSql; return null; /* * 根据不同条件来获得不同的计算记录总数的SQL语句 */ public String getCount(String table) if(ccif.equals(=) String strSql=select count(*) from +ta
33、ble+ where+ +cif+=+qvalue+; return strSql; else if(ccif.equals(LIKE) String strSql=select count(*) from +table+ where+ +cif+ +like+ +%+qvalue+%; return strSql; else if(ccif.equals(ALL) String strSql=select count(*) from +table; return strSql; else if(ccif.equals() String strSql=select count(*) from
34、+table+ where +cif+ +qvalue+; return strSql; return null; /* * 根据不同条件和不同的起始日期和结束日期来获得不同的计算记录总数的SQL语句 */ public String getDateCount(String table) if(ccif.equals(=) /在sdate到edate时间段中进行精确查询 String strSql=select count(*) from +table+ where +cif+ = +qvalue+ andor+ xsdate between +sdate+ and +edate+; retu
35、rn strSql; else if(ccif.equals(LIKE) /在sdate到edate时间段中进行模糊查询 String strSql=select count(*) from +table+ where +cif+ like %+qvalue+%+ andor+ xsdate between +sdate+ and +edate+; return strSql; else if(ccif.equals(ALL) /取出表中所有记录 String strSql=select count(*) from +table; return strSql; return null; /* * 根据不同条件和不同的起始日期和结束日期来获得不同的查询,前N条的SQL语句 */ public String getDateString(String table) if(ccif.equals(=) String strSql=se