基于Java Swing 和MySQL的企业进销存管理系统

获取项目源文件,技术交流与指导联系Q:1225467431
摘 要
随着信息化时代的到来,生活中各种信息趋向数字化、清晰化,应用于各行业的信息管理系统应运而生。进销存管理系统是促进企业发展的重要组成部分,是商业企业经营管理中的核心环节,也是一个企业能否取得效益的关键,如果能够做到合理采购、及时销售、库存量最小、减少积压,那么企业就能够取得最佳效益。在现代社会中,大多数企事业单位,特别是中小型企业,实现信息化管理是首要任务。只有实现信息化管理,才能够提高工作效率和企业的管理水平。市场经济快速多变,竞争激烈,企业采用进销存管理系统管理进货、库存、销售等诸多环节已成为趋势及必然。
本系统是一个基本的进销存管理系统,利用信息化手段把先进的企业管理方法引入企业的实践,为企业的管理改革提供切实易行的途径。系统对企业中常见的采购、库存销售等商业活动以及相关的供应商和客户等基本信息进行管理。
本文以企业进销存管理系统的分析和设计为出发点,详细介绍了开发本系统的各个步骤:系统分析、系统设计、系统编码实现和系统测试。在系统分析中先后用数据流图、系统的功能结构图分析了系统所需的各种数据和功能模块。在系统设计和系统实现部分,详细的展现了系统的数据库设计与实现,以及系统的各个功能模块的所需的数据库表、表字段以及菜单的设计。系统实现了强大的经销存管理,包括基本信息、采购、进货、销售和库存管理。
系统采用Java Swing技术,以MySQL作为后台数据库管理系,使用Eclipse集成环境工具进行开发,界面简洁美观、性能满足要求、功能完善,经测试,本系统的设计是正确的。

关键词:信息化管理;进销存管理系统;Java Swing;Mysql;

ABSTRACT
With the advent of the information age, living in a variety of information tends to digital, clear, information management systems used in various industries came into being. Inventory management system is an important part of the promotion of enterprise development is a core part of the management of commercial enterprises, is an enterprise the ability to obtain the key to effective, timely sales if you can do a reasonable purchase, minimum inventory levels, reduce the backlog. , then the business will be able to achieve the best efficiency. In modern society, the majority of enterprises, especially SMEs, to achieve information management is a priority. Only information management, to improve the efficiency and management level of enterprises. Market economy is rapidly changing, highly competitive, enterprise management of inventory management system to purchase, inventory, sales, and many other areas has become a trend and inevitable.
This system is a basic inventory management systems, and use of information technology means the introduction of advanced management methods to the practice of the enterprise, to provide effective and easy way for enterprise management reform. Management system for enterprise purchasing, inventory, sales and other commercial activities, as well as suppliers and customers and other basic information.
In this paper, the inventory management system analysis and design as a starting point, details the various steps of the development of the system: system analysis, system design, system coding and system testing. System analysis has used data flow diagrams, the functional block diagram of the system required by the system data and functional modules. In system design and system implementation part of the show in detail the system’s database design and implementation, as well as the various functional modules of the system required database tables, table fields, and menu design. System to achieve a strong distribution inventory management, including basic information, procurement, purchasing, selling and inventory management.
The system uses the Java Swing technology, MySQL as a backend database manager system, using the Eclipse integrated development of environmental tools, the interface is simple and beautiful performance to meet the requirements, fully functionalhas been tested the design of this system is correct.

Keywords: information management; inventory management system; Java Swing; MySQL;

目录
第一章 前言 1
1.1 系统开发背景 1
1.2 系统开发目的与意义 1
1.3 企业进销存系统的发展现状 2
第二章 系统分析 4
2.1 系统开发的目标 4
2.2 可行性分析 4
2.2.1 可行性研究的前提 5
2.2.2 经济可行性 5
2.2.3 技术可行性 5
2.2.4 社会可行性 6
2.2.5 操作可行性 6
2.3 需求分析 6
2.3.1 系统的功能需求 6
2.3.2 数据字典设计 7
2.3.3 系统的性能需求 10
2.3.4 出错处理需求 10
2.3.5 约束需求 10
2.3.6 开发环境 11
第三章 总体设计 12
3.1 系统功能结构设计 12
3.2 数据库设计 13
3.2.1 概念结构设计 13
3.2.2 逻辑结构设计 20
3.2.3 数据表设计 21
第四章 详细设计 30
4.1界面设计 30
4.1.1 界面概述 30
4.1.2 主界面设计 30
4.2 功能模块设计 31
4.2.1 系统登录模块设计 31
4.2.2 供应商基本信息管理模块设计 32
4.2.3 入库信息查询模块设计 33
4.2.4 用户管理模块设计 34
4.2.5 经手人管理模块设计 35
4.2.6 订购商品信息管理模块设计 36
4.2.7 采购入库管理模块设计 37
4.2.8 库存调拨模块设计 38
4.2.9 销售退货管理模块设计 38
4.2.10 其他模块设计 39
第五章 系统实现 40
5.1 公共类设计 40
5.1.1 SaveUserInfo公共类 40
5.1.2 OnlyNumber公共类 40
5.1.3 DaoConn公共类 41
5.2软件实现 41
5.2.1 用户登录模块 41
5.2.2 供应商基本信息管理模块 43
5.2.3 入库信息查询模块 47
5.2.4 用户信息管理模块设计 48
5.2.5 经手人管理模块设计 53
5.2.6 订购商品信息管理模块 55
5.2.7 采购入库管理模块 57
5.2.8 销售出库管理模块 59
5.3 开发常见问题与解决 61
5.3.1 不显示系统登录窗体 61
5.3.2运行程序时找不到数据库驱动 61
5.3.3运行程序时用户名或密码不正确 62
5.3.4运行程序时找不到数据库 62
5.4 系统测试 62
5.4.1测试目标 62
5.4.2测试方法 63
5.4.3测试方案 63
5.4.4 测试用例 63
5.4.5 测试运行 67
5.4.6 测试结论 72
总 结 73
附录A 系统使用说明书 74
参考文献 76
致 谢 77

第一章 前言
1.1 系统开发背景
计算机技术作为现代科学技术的基础和核心,已经而且将继续对人类文明社会的进步与发展产生深刻影响。在我们生活的21世纪里计算机技术已经在各行各业中发挥着不可替代的作用。当前越来越多的商业、企事业单位已经将计算机技术应用于日常的管理工作。科学的运用计算机技术进行管理工作不仅可以使管理工作规范化、系统化、自动化而且可以节省相当的人力、物力。它能够使用户的管理工作走上良性运转轨道,从而为其快速发展奠定基础。因此各单位对与本行业相关管理软件的需求也十分迫切。
管理信息系统(MIS, Management Information System)是一个由人和计算机等组成的能够提供信息以支持一个组织机构内部的作业,管理、分析和决策职能的系统。进、销、存的管理是企业自身管理信息系统的重要组成部分。
进销存是以货物流为基础,以票据流为主线和动力,以金额流作为补充的三种数据流层的关于进货,销售和库存的表述。而进销存系统,是在企业计算机局域网环境下,以数字化、信息化的方式对这种表述进行建模、运算与存储的软件系统。进销存系统的初始作用在很大程度上表现为对传统手工纸质单据的替代。这种特性最直观的降低了企业人力资源的消耗,提高了劳动生产率。因此,在企业信息化进程中,进销存系统必然会起到无可替代的先锋作用。
1.2 系统开发目的与意义
目前,企业进销存管理系统已经成为企业信息系统不可缺少的一部分。通过该系统,可以了解到企业内部商品的库存情况和销售情况,有利于企业作出更好的决策。
在进销存管理系统中,采购管理、销售管理以及库存管理是商场运营的基础,它将企业的其他基础信息管理链接起来共同组成一个完整的进、销、存管理系统。该系统可以帮助企业工作人员对库存商品进行详尽、全面地控制和管理,提供的采购分析和销售分析可以为管理者的决策提供依据。对库存的实时管理可以大大降低库存和减少资金占用,避免货品积压或短缺,保证日常经营的正常进行。
进销存管理系统是基于先进的软件和高速、大容量的硬件基础上的新的进销存管理模式,通过集中式的信息数据库,将企业的进、销、存、供应商管理以及客户管理等企业的经营业务有机的结合起来中,达到数据共享、降低成本、提高效率、改进服务等目的。同时还可以从以下几个方面来提高管理水平:
(1)提高管理效率降低人工成本
(2)降低采购成本
(3)及时调整营销策略
(4)防范陈呆死帐提高帐款管理
(5)减少仓储面积,提高房产综合利用
(6)降低储备资金占用
(7)加快资金周转实现的经济效益
(8)强化财务控制实现的经济效益
(9)高效决策
1.3 企业进销存系统的发展现状
在信息技术的催化之下,世界经济的变革已经进入了加速状态。世界经济一体化,企业经营全球化,以及高度竞争造成的高度个性化与迅速改变的客户需求,令企业与顾客、企业与供方的关系变得更加密切和复杂。强化管理,规范业务流程,提高透明度,加快商品资金周转,以及为流通领域信息管理全面网络化打下基础,是销售公司乃至众多商业企业梦寐以求的愿望。
进销存软件概念起源于上世纪80年代,由于电算化的普及,计算机管理的推广,不少企业对于仓库货品的进货、存货、出货管理,有了强烈的需求,进销存软件的发展从此开始。
进入90年代以后,随着进销存软件的应用面越来越广,出现了许多从功能上,从用途上,更为全面的进销存系统,从单纯的货品数量管理,扩展为货品的流程管理,进销存软件对每一批货品的来源,存放,去向,都作仔细的记录,随后并延伸为财务进销存一体化的管理模式。
进入00年以后,各种各样的进销存软件产品应运而生,在仓库进销存管理的基础上,集合了财务管理。客户管理,业务管理等相关内容,成为进销存财一体化的管理系统。目前国内比较出名财务软件公司纷纷推出进销存软件,每种进销存软件的功能和特点个不一样,国内进销存软件市场可大体分为三大派系:
第一类以“深信”为首,将进销存做成专业的财务软件,供会计使用。此类软件专业性强、功能强大、可用于报税。但此类软件前期培训成本较高,且对于非财务人员不适用,有很强的排它性。
第二类以“管家婆”为首,将进销存专业、复杂的程序隐入幕后,做成傻瓜型的软件,供普通用户使用。此类软件操作界面简单,易学易用,非财务人员也能快速掌握。但此类软件功能比较单一,很多统计数据无法实现。
第三类以“金蝶智慧记”为首,针对个体批发店、个体零售店、网店、简单管理小企业的免费进销存软件。主要功能:进出货记录、管理库存、管理欠款、管理收支、管理客户、管理供应商、统计报表等,界面简单,功能齐全,简单易学。
随着3G移动网络的部署,进销存已经进入了移动时代。移动进销存,是利用无线网络实现进销存的技术。它将原有进销存系统上的进销存管理功能迁移到手机。移动进销存系统具有传统进销存系统无法比拟的优越性。移动进销存 系统使业务软摆脱时间和场所局限,随时进行随地与公司业务平台沟通,有效提高管理效率,推动企业效益增长。移动进销存系统就是一个集3G移动技术、智能移动终端、VPN、身份认证、地理信息系统(GIS)、Webservice、商业智能等技术于一体的移动进销存产品。

第二章 系统分析
2.1 系统开发的目标
在进销存管理系统中,采购管理、销售管理以及库存管理是商场运营的基础,它将企业的其他基础信息管理链接起来共同组成一个完整的进、销、存管理系统。
现从采购管理、销售管理、库存管理及用户权限管理四个方面对系统开发的目标进行分析。
采购管理:系统可以进行进行入库采购;经过采购签单的物品才进行入库操作,同时更新库存量,并可以对入库商品进行入库查询操作,没有进过采购签单的商品不能进行入库操作;对于入库的商品还可以进行退货操作,并同步更新库存量,且能进行退货查询。
销售管理:系统可以进行销售签单操作,只有经过销售签单操作的客户才能拿到销售订单,然后根据销售订单进行出库操作,同步更新库存量,并可以对销售出库的商品进行查询操作,没有销售订单的商品不能出库;对于销售出库的商品也可以进行退货操作,并同步更新库存量,且能进行退货查询。
库存管理:系统可以进行库存盘点、库存调拨和库存查询等操作,只有经过入库签单的商品才能够入库存储,同步更新库存量,并可以对仓库中的库存商品进行查询操作,没有经过入库签单的商品不能进行入库操作。
用户权限管理:系统管理员还可以对用户的权限进行设置,可以把用户设置为一般用户或管理员,设置为管理员权限的用户可以修改密码和查看用户信息,而一般用户只能修稿密码而不能查看用户信息。具有系统管理员权限的用户和管理员权限的用户还可以进行添加用户和进行经手人设置等操作,而一般用户不能添加用户,也不能进行经手人设置。
根据企业对进销存管理的要求,制定企业进销存管理系统还应达到如下目标:
(1)灵活的人机交互界面,操作简单方便、界面简洁美观。
(2)可以通过菜单、工具栏或导航按钮灵活操作。
(3)对进货和销售提供相应的退货管理功能。
(4)实现各种查询,如单一条件或多条件查询等。
(5)可以随时修改系统口令。
(6)系统最大限度地实现了易安装性、易维护性和易操作性。
(7)系统运行稳定、安全可靠。
2.2 可行性分析
根据《GB8567—88计算机软件产品开发文件编制指南》中可行性分析的
要求,制定可行性研究报告如下。
(1)编写目的
为了给软件开发企业的决策层提供是否进行项目实施的参考依据,现以文件的形式分析项目的风险、项目的经济可行性及技术可行性。
(2)编写背景
江西理工大学信息工程学院软件082班辛冰同学毕业设计时所选课题。
2.2.1 可行性研究的前提
(1)要求
附加进货–退货和销售退货功能以增加管理的灵活性。
a.系统的功能要符合企业的实际情况。
b.提供窗口集合操作和菜单管理。
c.支持管理用户的功能,提高系统安全性。
(2)目标
简易通企业进销存管理系统的主要目标是提供强大的进销存管理功能,减少盲目采购、降低采购成本、合理控制库存、减少资金占用,并提稿市场灵敏度。
2.2.2 经济可行性
信息技术的运用已成社会发展主流,以前的人工处理缓慢,出错率高将导致企业内部沟通不畅,信息滞后,将很难为企业做出有效的决策提供有力的依据,因此,缺少及时,准确,有效的信息,企业在发展上寸步难行。所以采用现代化的手段进行进销存必然会使企业提高工作效率。这样就极大地提高企业管理的效率,使企业走向科学化、正规化管理,从而在日益激烈的竞争中立于不败之地。
简易通企业进销存管理系统的开发不需要昂贵的服务器,所有的软硬件都是免费的,开发成本极低;另由于本次课题是毕业设计选题,所以项目启动的资金是不需要的。项目完成后,会给本人提供资源储备,包括技术、经验的积累。
通过上述分析,开发企业进销存管理系统在经济方面是完全可行的。
2.2.3 技术可行性
系统是典型的MIS管理信息系统,使用Java Swing技术进行用户界面的开发,该项技术目前已发展的相当成熟,提供的信息完善,界面友好;采用MySQL开发和管理数据库,对数据库操作采用事务处理机制,具有强大的错误处理功能。
本人接受过专业知识的培训,以前也做过一定规模的系统,具有一定经验,项目的开发时限为3个月,时间充足。
综上所述,开发企业进销存管理系统在经济方面是完全可行的。

2.2.4 社会可行性
此系统软件是一款通用性极强的商业企业进销存管理系统,软件囊括了商业企业日常经营管理的全过程。软件适用于食品、服装、保健品、电子、电器、物资、化妆品等商业领域的企业。软件覆盖商业企业商品的采购、销售、库存、管理决策支持等各个环节,软件的各个模块操作界面简单、实用,软件帮助系统图文并茂,让用户可以在最短的时间内掌握软件的使用方法,助用户生意早日更上一层楼。软件的采购管理、销售管理、库存管理功能强大,灵活,同时为用户提供方便实用的模糊查询功能,用户可以在最短时间内找到自己所需要的信息。
通过上述分析,开发企业进销存管理系统在社会方面是完全可行的。
2.2.5 操作可行性
系统有非常人性化的界面,虽然功能繁多,但是所有功能按钮一目明了,客户只需按着系统界面的指示即可完美的掌控本系统,简单实用,在操作上是完全可行的。
终上所述,该项目满足经济可行性、技术可行性、社会可行性及操作可行性,因此,我认为该项目可以进行开发。
2.3 需求分析
2.3.1 系统的功能需求
简易通企业进销存管理系统的主要工作,是对企业的采购、进货、销售和库存以信息化的方式进行管理。它可以最大限度的减少各个环节中可能出现的错误,能够有效减少盲目采购、降低采购成本、合理控制库存、减少资金占用,并提高市场灵敏度,是企业能够合理安排进销存的每个关键步骤,并能够提升企业市场竞争力。针对这些问题,经销商对产品的进销存合理化提出了更高的要求。概括的讲,用户对进销存系统的需求具有普遍性。
通过实际调查,要求简易通企业进销存管理系统具有以下功能:
(1)界面设计美观大方、方便、快捷、操作灵活。
(2)可以通过导航按钮快速实现人机交互操作。
(3)实现强大的进销存管理,包括基本信息、采购、进货、销售和库存管理。
(4)能够在不同的操作系统下运行,不局限特定的平台。
(5)提供库存盘点、调拨功能,提供多条件查询和模糊查询。
(6)提供技术支持的联系方式,可以连接到技术网站。

系统业务流程图如图2-1所示。

图2-1 系统业务流程图
2.3.2 数据字典设计
数据字典(Data dictionary)是一种用户可以访问的记录数据库和应用程序源数据的目录,数据字典是指对数据的数据项、数据结构、数据流、数据存储、处理逻辑、外部实体等进行定义和描述,是系统中各类数据描述的集合,是进行详细数据收集和数据分析所获得的主要成果。数据字典在数据库设计中占有很重要的地位。

2.3.3 系统的性能需求
(1)精度
在进行向数据库文件提取数据时,要求数据记录定位正确;在往数据库文件添加数据时,要求输入准确。
(2)时间特性要求
本软件由于数据库尚小,相应时间、更新处理时间、数据传送、转换时间、计算时间等都非常迅速,如下:
a.响应时间:响应时间5秒之内;
b.更新处理时间:由系统运行状态决定;
c.数据的转换和传输时间:能够在5秒钟内完成;
2.3.4 出错处理需求
在用户输入一些不合法数据的时候,能够进行一些合理的提示信息,不会因为输入错误而导致系统错误,或者程序停止运行;
2.3.5 约束需求
系统必须满足以下的限制条件:
(1)安全可靠;
(2)该系统必须确保对数据进行完全保护,以避免未经授权的访问;
(3)界面友好,操作简单;
(4)软件系统开放性好,结构灵活,可扩充,易维护;
(5)遵循总体设计方案对它的约束,在其实施的各个阶段都要服从它的一些规定,包括功能设计、系统配置和计划;
(6)平台限制:受Windows系统性能的限制,开发环境可能达不到理想的状态,而在Linux系统下的工具不可避免存在bug,需要选择最有效的工具在最合适的操作系统下进行开发工作;
2.3.6 开发环境
开发环境包括硬件环境和软件环境。
本系统的硬件开发环境
(1)显示器:液晶14吋。
(2)分辨率:1024*768
(3)CPU:P4 2.1GHz。
(4)内存:1024MB以上。
本系统的软件开发环境
(1)操作系统:Windows XP。
(2)数据库:MySQL 5.5。
(3)JDK环境:Java SE Development KIT Version 6。
(4)开发工具:Eclipse 3.4.2。
(5)数据库管理软件:MySQL–Front 5.1。

第三章 总体设计
3.1 系统功能结构设计
本系统主要由以下7大功能模块构成,分别包括:基本信息管理、入库管理、销售管理、退货管理、库存管理、系统维护、帮助。
基本信息管理:包括供应商的基本信息、商品的基本信息、客户的基本信息、员工的基本信息和经手人设置。
入库管理:包括采购订单、采购入库、入库查询和采购订单查询。
销售管理:包括销售签单、销售出库、销售查询和销售签单查询。
退货管理:包括入库退货、入库退货查询、销售退货和销售退货查询。
库存管理:包括库存盘点、库存调拨、和库存查询。
系统维护:包括添加用户、用户设置和退出系统。
帮助:包括关于和访问技术网站。
系统的功能结构图如图3-1所示

图3-1 系统功能结构图

3.2 数据库设计
3.2.1 概念结构设计
概念结构设计是指将需求分析得到的用户需求抽象为信息结构即概念模型的过程,概念结构设计就是对信息世界进行建模。
数据库概念设计最常用的方法是实体联系法,此方法是用E-R图来描述现实世界的有力工具它可以很清晰地表示出实体之间的关系。
E-R图概念化地构建实体间关系的模型,这使得它们区别于数据库模型图。E-R图的理念是:项目所有参与者能理解E-R图。E-R图由不同实体类型、关系、特性和类型构成。实体是诸如用户的实际对象,有时更抽象,但必须有业务意义。特性用于描述实体,关系用于实体之间。
a.实体:现实世界中的事物;
b.属性:事物的特性;
c.联系:现实世界中事物间的关系。实体集的关系有一对一、一对多、多对多的联系。
本系统采用自底向上的设计方法,包含的实体如下:
(1)供应商实体图:

图3-2 供应商实体图

(2)经手人实体图:

图3-3 经手人实体图
(3)库存调拨实体图:

图3-4 库存调拨实体图

(4)客户实体图:

图3-5 客户实体图

(5)库存实体图:

图3-6 库存实体图

(6)入库订单明细实体图:

图3-7 入库订单明细实体图

(7)入库订单实体图:

图3-8 入库订单实体图

(8)入库退货明细实体图:

图3-9 入库退货明细实体图

(9)入库退货实体图:

图3-10 入库退货实体图

(10)入库明细实体图:

图3-11 入库明细实体图

(11)入库实体图:

图3-12 入库实体图

(12)销售明细实体图:

图3-13 销售明细实体图

(13)销售实体图:

图3-14 销售实体图

(14)商品实体图:

图3-15 商品实体图

(15)用户实体图:

图3-16 用户实体图

(16)销售签单明细实体图:

图3-17 销售签单实体图

(17)销售签单实体图:

图3-18 销售签单实体图

(18)销售退货明细实体图:

图3-19 销售退货明细实体图

(19) 销售退货实体图:

图3-20 销售退货实体图

(20)员工实体图:

图3-21 员工实体图
3.2.2 逻辑结构设计
(1)供应商(供应商编号,供应商名称,供应商简称,供应商地址,邮政编码,供应商电话,供应商传真,供应商联系人,联系人电话,开户银行,银行账号,电子信箱)。
(2)经手人(经手人编号,经手人姓名,经手人性别,经手人政治面貌,经手人电话,经手人是否启用)。
(3)库存调拨(库存编号,调拨编号,商品名称,商品简称,商品产地,计量单位,商品规格,调拨数量,调拨日期,操作员,备注)。
(4)客户(客户编号,客户全称,客户简称,客户地址,客户邮编,客户电话,客户传真,客户联系人,联系人电话,电子信箱,开户银行,银行账号)。
(5)库存(库存编号,商品名称,商品简称,商品产地,商品包装,商品规格,计量单位,商品单价,商品数量)。
(6)入库订单明细(入库订单编号,商品编号,商品单价,商品数量)。
(7)入库订单(入库编号,品种数,商品金额,验收结论,供应商全称,供应商联系人,订购日期,操作员,经手人,结算方式)。
(8)入库退货明细(入库退货编号,商品编号,商品名称,商品简称,商品产地,商品规格,商品单价,商品数量)。
(9)入库退货(入库退货编号,品种数,商品金额,供应商全称,退货日期,
退货时的操作员,退货时的经手人,结算方式)。
(10)入库明细(入库编号,商品编号,商品单价,商品数量,入库订单编号)。
(11)入库(入库编号,品种数,商品金额,验收结论,供应商全称,供应商联系人,入库日期,订购日期,订购操作员,订购经手人,结算方式,入库经手人,入库操作员,入库订单编号)。
(12)销售明细(销售票号,商品编号,商品名称,销售单价,销售数量,销售签单票号)。
(13)销售(销售票号,品种数,商品金额,验收结论,客户名称,销售日期,签单日期,销售签单时的操作员,销售签单时的经手人,结算方式,销售时的操作员,销售时的经手人,销售签单号)。
(14)商品(商品编号,商品名称,商品简称,商品产地,计量单位,商品规格,商品包装,商品批号,批准文号,供应商编号,供应商全称,备注)。
(15)用户(用户名,登陆密码,用户权限)。
(16)销售签单明细(销售签单编号,商品编号,商品名称,商品单价,商品数量)。
(17)销售签单(销售签单编号,品种数量,商品金额,验收结论,客户全称,签单日期,签单操作员,签单经手人,结算方式)。
(18)销售退货明细(销售退货编号,商品编号,商品名称,商品简称,商品产地,商品规格,商品单价,商品数量,销售编号)。
(19)销售退货(销售退货编号,品种数量,商品金额,客户全称,退货日期,退货操作员,退货经手人,结算方式)。
(20)员工(员工编号,员工姓名,员工性别,政治面貌,出生日期,员工地址,员工邮编,员工电话,电子信箱)。
3.2.3 数据表设计
依据E-R图,在数据库服务器中创建了数据库为db_jxc的数据库,它包含20个表,如图3-22所示。

图3-22 MySQL-Front窗口
(1)供应商信息表
供应商信息表的名称为tb_gysinfo,它主要用于存储供应商的详细信息,其结构如表3-1所示。
表3-1 供应商信息表
字段名称 数据类型 字段大小 是否主键 说明
id varchar 50 主键 供应商编号
gysqc varchar 90 供应商名称
jc varchar 50 供应商简称
address varchar 100 供应商地址
yb varchar 50 邮政编码
dh varchar 50 供应商电话
cz varchar 50 供应商传真
lxr varchar 50 供应商联系人
lxrdh varchar 50 联系人电话
khyh varchar 50 开户银行
yhzh varchar 50 银行账号
dzxx varchar 50 电子信箱
(2)经手人信息表
经手人信息表的名称为tb_jsr,它主要用于存储经手人的详细信息,其结构如表3-2所示。
表3-2 经手人信息表
字段名称 数据类型 字段大小 是否主键 说明
id varchar 30 主键 经手人编号
xm varchar 50 经手人姓名
xb varchar 10 经手人性别
zzmm varchar 20 经手人政治面貌
dh varchar 50 经手人电话
sfqy varchar 10 经手人是否启用
(3)库存调拨信息表
库存调拨信表的名称为tb_kcdb,它主要用于存储库存调拨的详细信息,其结构如表3-3所示。
表3-3 库存调拨信息表
字段名称 数据类型 字段大小 是否主键 说明
dbid varchar 30 主键 调拨编号
id varchar 30 库存编号
spmc varchar 50 商品名称
jc varchar 20 商品简称
cd varchar 100 商品产地
dw varchar 20 商品单位
gg varchar 30 商品规格
dbsl int 11 调拨数量
dbrq datetime 调拨日期
memo varchar 200 备注
czy varchar 20 操作员
(4)客户信息表
客户信息表的名称为tb_khinfo,它主要用于存储客户的详细信息,其结构如表3-4所示。
表3-4 客户信息表
字段名称 数据类型 字段大小 是否主键 说明
id varchar 50 主键 客户编号
khqc varchar 50 客户全称
jc varchar 50 客户简称
dz varchar 100 客户地址
yb varchar 50 客户邮编
dh varchar 50 客户电话
cz varchar 50 客户传真
lxr varchar 50 客户联系人
lxrdh varchar 50 联系人电话
dzxx varchar 50 电子信箱
khyh varchar 60 开户银行
yhzh varchar 60 银行账号
(5)库存信息表
库存信息表的名称为tb_kucun,它主要用于存储库存的详细信息,其结构如表3-5所示。
表3-5 库存信息表
字段名称 数据类型 字段大小 是否主键 说明
id varchar 30 主键 库存编号
spmc varchar 50 商品名称
jc varchar 25 商品简称
cd varchar 50 商品产地
gg varchar 50 商品规格
bz varchar 50 商品包装
dw varchar 10 计量单位
dj varchar 50 商品单价
sj int(11) 11 商品数量
(6)入库订单明细明细表
入库订单明细明细表的名称为tb_rkdd_detail,它主要用于存储入库订单明细的详细信息,其结构如表3-6所示。
表3-6 入库订单明细信息表
字段名称 数据类型 字段大小 是否主键 说明
rkddid varchar 30 主键 入库订单编号
spid varchar 40 商品编号
dj decimal(19,4) 商品单价
sl int(11) 商品数量
(7)入库订单主表
入库订单主表的名称为tb_rkdd_main,它主要用于存储入库订单单据的详细信息,其结构如表3-7所示。
表3-7 入库订单主表
字段名称 数据类型 字段大小 是否主键 说明
rkddid varchar 30 主键 入库订单编号
pzs int(11) 品种数量
je decimal(19,4) 商品金额
ysjl varchar 50 验收结论
gysqc varchar 100 供应商全称
qyslxr varchar 50 供应商联系人
dgrq datetime 订购日期
czy varchar 30 入库操作员
jsr varchar 30 入库经手人
jsfs varchar 20 结算方式
(8)入库退货明细表
入库退货明细表的名称为tb_rkth_detail,它主要用于存储入库退货明细的详细信息,其结构如表3-8所示。
表3-8 入库退货明细表
字段名称 数据类型 字段大小 是否主键 说明
rkthid varchar 30 主键 入库退货编号
spid varchar 50 商品编号
spmc varchar 50 商品名称
jc varchar 20 商品简称
cd varchar 100 商品产地
gg varchar 20 商品规格
dj decimal(19,4) 商品单价
sl int(11) 商品数量
(9)入库退货主表
入库退货主表的名称为tb_rkth_main,它主要用于存储入库退货的详细信息,其结构如表3-9所示。

表3-9 入库退货主表
字段名称 数据类型 字段大小 是否主键 说明
rkthid varchar 30 主键 入库退货编号
pzs float 品种数量
je decimal(19,4) 商品金额
gysqc varchar 100 供应商全称
thrq datetime 退货日期
czy varchar 30 入库操作员
jsr varchar 30 入库经手人
jsfs varchar 10 结算方式
(10)入库明细表
入库明细表的名称为tb_ruku_detail,它主要用于存储入库详细信息,其结构如表3-10所示。
表3-10 入库明细表
字段名称 数据类型 字段大小 是否主键 说明
rkid varchar 30 主键 入库编号
spid varchar 50 商品编号
dj decimal(19,4) 商品单价
sl int 商品数量
rdddid varchar 50 入库订单编号
(11)入库主表
入库主表的名称为tb_ruku_main,它主要用于存储入库单据信息,其结构如表3-11所示。
表3-11 入库主表
字段名称 数据类型 字段大小 是否主键 说明
rkid varchar 30 主键 入库编号
pzs int(11) 品种数量
je decimal(19,4) 商品金额
ysjl varchar 50 验收结论
gysqc varchar 100 供应商全称
gyslxr varchar 50 供应商联系人
rkrq datetime 入库日期
dgrq datetime 订购日期
dgczy varchar 30 订购操作员
dgjsr varchar 30 订购经手人
jsfs varchar 10 结算方式
rkjsr varchar 30 入库经手人
rkczy varchar 30 入库操作员
rkddid varchar 50 入库订单编号
(12)销售明细表
销售明细表的名称为tb_sell_detail,它主要用于存储销售详细信息,其结构如表3-12所示。
表3-12 销售明细表
字段名称 数据类型 字段大小 是否主键 说明
xsid varchar 30 主键 销售票号
spid varchar 50 商品编号
spmc varchar 100 商品名称
dj decimal(19,4) 销售单价
sl integer 销售数量
xsqdid varchar 30 销售签单票号
(13)销售主表
销售主表的名称为tb_sell_main,它主要用于存储销售单据信息,其结构如表3-13所示。
表3-13 销售主表
字段名称 数据类型 字段大小 是否主键 说明
xsid varchar 30 主键 销售票号
pzs integer 8 销售品种数
je decimal(19,4) 8 总计金额
ysjl varchar 50 验收结论
khqc varchar 100 客户名称
xsrq datetime 销售日期
qdrq datetime 签单日期
qdczy varchar 30 销售签单的操作员
qdjsr varchar 30 销售签单的经手人
jsfs varchar 10 结算方式
xsxczy varchar 30 销售时的操作员
xsjsr varchar 30 销售时的经手人
xsqdid varchar 30 销售签单号
(14)商品信息表
商品信息表的名称为tb_spinfo,它主要用于存储商品的详细信息,其结构如表3-14所示。
表3-14 商品信息表
字段名称 数据类型 字段大小 是否主键 说明
id varchar 50 主键 商品编号
spmc varchar 50 商品名称
jc varchar 50 商品简称
cd varchar 50 产地
dw varchar 50 商品计量单位
gg varchar 50 商品规格
bz varchar 50 包装
ph varchar 50 批号
pzwh varchar 50 批准文号
gysid varchar 50 供应商编号
gysqc varchar 90 供应商全称
memo varchar 100 备注
(15)用户信息表
用户信息表的名称为tb_user,它主要用于存储用户的详细信息,其结构如表3-15所示。
表3-15 用户信息表
字段名称 数据类型 字段大小 是否主键 说明
username varchar 30 主键 用户名
password varchar 50 登录密码
quanxian varchar 50 用户权限
(16)销售签单明细表
销售签单明细表的名称为tb_xsqd_detail,它主要用于存储销售签单的详细信息,其结构如表3-16所示。
表3-16 销售签单明细表
字段名称 数据类型 字段大小 是否主键 说明
xsqdid varchar 30 主键 销售签单编号
spid varchar 50 商品编号
spmc varchar 100 商品名称
dj decimal(19,4) 商品单价
sl int(11) 商品数量
(17)销售签单主表
销售签单主表的名称为tb_xsqd_main,它主要用于存储销售签单单据信息,其结构如表3-17所示。
表3-17 销售签单主表
字段名称 数据类型 字段大小 是否主键 说明
xsqdid varchar 30 主键 销售签单编号
pzs int(11) 品种数
je decimal(19,4) 金额
ysjl varchar 50 验收结论
khqc varchar 100 客户全称
qdrq datetime 签单日期
czy varchar 30 操作员
jsr varchar 30 经手人
jsfs varchar 10 结算方式
(18)销售退货明细表
销售退货明细表的名称为tb_xsth_detail,它主要用于存储销售退货明细的详细信息,其结构如表3-18所示。
表3-18 销售退货明细表
字段名称 数据类型 字段大小 是否主键 说明
xsthid varchar 30 主键 销售退货编号
spid varchar 50 商品编号
spmc varchar 100 商品名称
jc varchar 30 商品简称
cd varchar 100 商品产地
gg varchar 30 商品规格
dj decimal(19,4) 商品单价
sl int(11) 商品数量
xsid varchar 30 销售编号
(19)销售退货主表
销售退货主表的名称为tb_xsth_main,它主要用于存储销售退货单据信息,其结构如表3-19所示。
表3-19 销售退货主表
字段名称 数据类型 字段大小 是否主键 说明
xsthid varchar 30 主键 销售退货编号
pzs int(11) 品种数
je decimal(19,4) 金额
khqc varchar 100 客户全称
thrq datetime 退货日期
czy varchar 30 操作员
jsr varchar 30 经手人
jsfs varchar 10 结算方式
(20)员工信息表
员工信息表的主要名称为tb_yginfo,它主要用于存储员工的详细信息,其结构如表所示。
表3-20 员工信息表
字段名称 数据类型 字段大小 是否主键 说明
id varchar 30 主键 员工编号
xm varchar 50 员工姓名
xb varchar 10 员工性别
zzmm varchar 20 政治面貌
csrq datetime 出生日期
dz varchar 100 地址
yb varchar 20 员工邮编
dh varchar 50 员工电话
dzxx varchar 50 电子信箱

第四章 详细设计
4.1界面设计
4.1.1 界面概述
界面设计是人与机器之间传递和交换信息的媒介,包括硬件界面和软件界面,是计算机科学与心理学、设计艺术学、认知科学和人机工程学的交叉研究领域。近年来,随着信息技术与计算机技术的迅速发展,网络技术的突飞猛进,人机界面设计和开发已成为国际计算机界和设计界最为活跃的研究方向。
用户界面也称作UI(User Interface),是人机交互重要部分,也是软件使用的第一印象,是软件设计的重要组成部分。软件界面设计现在越来越被软件设计重视,所谓的用户体验大部分就是指软件界面的设计。
用户界面设计在工作流程上分为结构设计、交互设计、视觉设计三个部分。随着产品屏幕操作的不断普及,用户界面已经融入我们的日常生活。一个良好设计的用户界面,可以大大提高工作效率,使用户从中获得乐趣,减少由于界面问题而造成用户的咨询与投诉,减轻客户服务的压力,减少售后服务的成本。因此,用户界面设计对于任何产品/服务都极其重要。
4.1.2 主界面设计
当用户登录系统时,首先是迎接用户系统登录窗体,系统登录窗体如图4-1所示。

图4-1 系统登录窗体
当用户输入用户名及登录密码后,点击登录按钮,系统判定用户名及登陆密码正确后,用户将进入系统主界面,系统主界面如图4-2所示。

图4-2 系统主界面
4.2 功能模块设计
4.2.1 系统登录模块设计
(1)功能说明
系统登录模块主要用于对进入简易通企业进销存管理系统的用户进行安全性检查,以防止非法用户进入该系统。只有输入正确的用户名和密码,单击登录按钮才能进入系统。“登录”按钮用于执行用户名密码的验证工作,如果验证用户名和密码有效,则启动系统,否则禁止进入系统,并提示“用户名或密码不正确!!!”
(2)系统登录窗体设计
在zzk.zhuoyue.daohang包中创建LoginFrame类,该类继承自JFrame类,使其成为一个窗体,设置窗体的标题为“系统登录”,在窗体内容面板的中央放置一个自定义的用于显示背景的内部类面板,设置面板的布局为NULL,并在窗体上放1个空布局的面板,在面板上放置2个标签和2个文本框,实现系统登录窗体的设计。
(3)系统登录流程图如图4-3所示。

图4-3 系统登录流程图
4.2.2 供应商基本信息管理模块设计
(1)功能说明
“供应商基本信息管理”模块负责添加、修改、删除和查询供应商信息,其中“添加供应商信息”选项卡用于添加供应商的基本信息,“修改供应商信息”选项卡用于修改指定的供应商信息,“删除供应商信息”选项卡用于删除指定供应商信息和查询供应商的信息。在“供应商基本信息管理”窗体界面中选择“添加供应商信息”选项卡,可以直接输入供应商的基本信息,输入完成后单击“保存”按钮,可以保存本次输入的供应商信息,同时“保存”按钮变为灰色不可用状态。单击“继续输入”按钮,“保存”按钮变为可用状态,并可以输入新的供应商信息。单击“返回”按钮将退出供应商基本信息管理窗体,返回应用程序主窗体。
(2)窗体设计
在项目“简易通企业进销存管理系统”中新建一个包zzk.zhuoyue.jbxxframe,然后在该包中建立一个名称为GysInfoFrame窗体,设置窗体布局为“边框式”布局,并在“边框式”布局的窗体中心放1个选项卡面板,在选项卡面板上放置3个NULL布局的面板对应选项卡面板上的3个选项。
(3)供应商基本信息管理系统流程图如图4-4所示。

图4-4 供应商基本信息管理系统流程图
4.2.3 入库信息查询模块设计
(1)功能说明
“入库信息查询”模块负责查询商品的入库信息,可以根据选中的复选框,制定查询方式是单一条件查询还是多条件查询。通过两个组合框可以选择不同的字段进行查询,也可以指定是精确查询还是模糊查询。单击“查询”按钮可以查询指定条件的入库信息,单击“全部显示”按钮又可以显示所有入库商品的信息。
(2)窗体设计
在项目“简易通企业进销存管理系统”的zzk.zhuoyue.dinggouruku包中建立一个名为RukuChxunFrame的JFrame窗体,设置窗体布局为NULL,在窗体上放置1个滚动面板、1个表和1个面板,在面板上放置3个复选框、3个文本框、3个按钮和2个组合框。
(3)入库信息查询系统流程图如图4-5所示。

图4-5 入库信息查询系统流程图
4.2.4 用户管理模块设计
(1)功能描述
“用户设置窗体”模块用于添加新用户、设置权限、删除用户、查看用户和修改登录用户密码操作等操作,当登录用户是一般用户时,只能修改其密码不能进行其他操作;当登录用户是管理员时,除了可以修改密码,还可以查看用户信息;当登录用户是系统管理员时,可以进行所有操作。
(2)在项目“简易通企业进销存管理系统”的zzk.zhuoyue.userframe包中建立一个名称为EditUserInfoFrame的JFrame窗体,设置窗体布局为“边框式”
布局,在窗体中心放1个选项卡面板,在选项卡面板中放3个面板,在第一个面板上放置3个标签、1个文本框、2个密码框和2个按钮。在第2个面板上放置2个标签、2个组合框和2个按钮。在第3个面板上放置1个标签、1个组合框、4个按钮和1个滚动面板,在滚动面板上放1个表。
(3)用户管理模块的系统流程图如图4-6所示。

图4-6 用户管理系统流程图
4.2.5 经手人管理模块设计
(1)功能描述
“经手人管理”模块用于添加经手人、启用或禁用经手人以及删除经手人等操作。
(2)窗体设计
在项目“简易通企业进销存管理系统”的zzk.zhuoyue.jbxxframe包中建立一个名为JsrInfoFrame的JFrame窗体,设置窗体布局为“边框式”布局,在窗体中心放一个选项卡面板,在选项卡面板中放两个面板,在第一个上放置5个标签、3个文本框、2个组合框、3个按钮和1个滚动面板,在滚动面板上放1个表。在第二个面板上放置6个标签、6个文本框、3个按钮和1个滚动面版,在滚动面板上放1个表。
(3)经手人管理模块系统流程图如图4-7所示。

图4-7 经手人管理系统流程图
4.2.6 订购商品信息管理模块设计
(1)功能描述
“订购商品信息”管理模块负责商品入库前的订单操作,只有订购了的商品才能入库,否则不能入库。单击“添加”按钮,可以初始化组件,添加新记录;单击“删除”按钮,可以删除表格中选择的记录;单击“订购”按钮,可以保存本次订购信息。
(2)窗体设计
在项目中新建一个包zzk.zhuoyue.dinggouruku,然后在该包中建立一个名称为CaigouDingdanFrame的JFrame窗体,设置窗体布局为“边框式”布局,并在“边框式”布局的窗体中心放置一个NULL布局的面板,在面板上放置11个标签、8个文本框、4个按钮、4个组合框、1个滚动面板和1个表。
(3)订购商品信息管理模块系统流程图如图4-8所示。

图4-8 订购商品信息系统流程图
4.2.7 采购入库管理模块设计
(1)功能说明
“采购入库管理”模块负责商品订购信息的入库操作,以采购订单票号为依据进行入库,没有进行采购签单的商品不能入库。
(2)窗体设计
在项目“简易通企业进销存管理系统”的包zzk.zhuoyue.dinggouruku中建立一个名称为CaigouRukuFrame的JFrame窗体,设置窗体布局为“边框式”布局,并在“边框式”布局的窗体中心放一个NULL布局的面板,在面板上放置8个标签、7个文本框、4个按钮、1个组合框、4个滚动面板、4个表和1个选项卡面板。
(3)采购入库管理模块系统流程图如图4-9所示。

图4-9 采购入库系统流程图
4.2.8 库存调拨模块设计
(1)功能说明
“库存调拨窗体”模块包含两个选项卡,“添加商品调拨信息”选项卡用于库存商品的调拨操作,“查询商品调拨信息”选项卡用于查询商品的调拨信息。
(2)窗体设计
在项目“简易通企业进销存管理系统”的zzk.zhuoyue.kucun包中建立一个名称为KucunDiaoboFrame的JFrame窗体,设置窗体布局为“边框式”布局,并在窗体中心放一个选项卡面板,在选项卡面板上放置两个空布局的面板,在第一个面板上放置11个标签、12个文本框(其中有一个在商品编号文本框的后方)、4个按钮和1个滚动面板,在滚动面板中放置1个表。在第二个面板上放置1个标签、1个文本框、1个组合框、3个按钮和一个滚动面板,在滚动面板中放置1个表。
(3)库存调拨模块系统流程图如图4-10所示。

图4-10 库存调拨系统流程图
4.2.9 销售退货管理模块设计
(1)功能说明
“销售退货管理”模块负责已经销售商品的退货操作,退货时要先选择经手人、结款方式和客户名称,然后单击“录入数据”按钮,打开“录入商品销售退货信息”窗体,输入退货信息。
“录入商品销售退货信息”窗体用于销售退货信息的输入操作,该窗体的3个组合框中显示的是“销售退货管理”窗体中所选客户名称的商品销售信息。任一组合框中选择商品信息后按Enter键,其他组件会自动显示相关内容,用户只需选择者销售票号并输入单价和数量即可,单击“确定”按钮后,如果输入的数量超出销售的数量会有相应提示,否则直接添加到“销售退货管理”窗体中。
(2)窗体设计
在项目“简易通企业进销存管理系统”的zzk.zhuoyue.xiaoshoushouchuku包中建立一个名称为XiaoshouTuiFrame的JFrame窗体,设置窗体布局为空布局,并在窗体上放一个空布局面板,在面板上放置13个标签、10个文本框、4个按钮、3个组合框,再在窗体上放1个选项卡面板,并在选项卡面板上放两个面板,每个面板上各放置1个滚动面板和1个表。
(3)销售退货管理模块的系统流程图如图4-11所示。

图4-11 销售退货系统流程图
4.2.10 其他模块设计
本系统还包含主窗体模块、入库退货管理模块、库存盘点模块、库存调拨模块、销售订单管理模块和销售退货模块。其他模块程序的操作也是对数据进行增加、更新、删除、查找以及分页等操作,其程序的设计和上面的一些模块设计的思路是一致的。

第五章 系统实现
5.1 公共类设计
公共类是代码重用的一种形式,它将各个功能模块经常调用的方法提取到公用的JAVA类中,例如,访问数据库的Daoconn类容纳了建立数据库连接的方法,其他功能模块都可以使用该类建立与数据库连接和对数据库进行各种操作。这样不但实现了项目代码的重用,还提高了程序的性能和代码的可读性。
5.1.1 SaveUserInfo公共类
SaveUserInfo公共类放在zzk.zhuoyue.savestate包中,用于保存用户的登录信息,userName属性用于存储登录用户名,password属性用于存储登录用户的密码,quanxian属性用于存储登录用户的权限。SavaUserInfo公共类的程序代码如下:
package zzk.zhuoyue.savestate;
public class SaveUserInfo {
private static String userName = “”;
private static String password = “”;
private static String quanXian = “”;
public static String getPassword() {
return password;
}
public static void setPassword(String password) {
SaveUserInfo.password = password;
}
public static String getQuanXian() {
return quanXian;
}
public static void setQuanXian(String quanXian) {
SaveUserInfo.quanXian = quanXian;
}
public static String getUserName() {
return userName;
}

public static void setUserName(String userName) {
	SaveUserInfo.userName = userName;
}

}
5.1.2 OnlyNumber公共类
OnlyNumber公共类放在zzk.zhuoyue.onlynumber包中,用于监听用户输入字符,当遇到非法字符时终止输入,这样可以在很大程度上减少输入的错误,极大地方便了用户的操作。OnlyNumber公共类的程序代码如下:
package zzk.zhuoyue.onlynumber;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
public class OnlyNumber extends KeyAdapter {
public void keyTyped(KeyEvent e) {
String key="-0123456789.";
if(key.indexOf(e.getKeyChar())<0){
e.consume();
}
}
}
5.1.3 DaoConn公共类
DaoConn公共类放在zzk.zhuoyue.dao包中,用于指定数据库驱动,连接数据库名称、用户名称和密码以及获得数据连接对象,为其他功能模块操作数据库提供方便。DaoConn公告类的程序代码如下:
package zzk.zhuoyue.dao;
import java.sql.
;
public class DaoConn {
public Connection getConn() throws Exception
{
Class.forName(“com.mysql.jdbc.Driver”);
Connection conn=null;
Connection btn=null;
String url=“jdbc:mysql://localhost:3306/db_jxc”;
String user=“root”;
String password=“123”;
conn=DriverManager.getConnection(url, user, password);
return conn;
}
}
5.2软件实现
5.2.1 用户登录模块
(1)窗体设计
本系统用户登录模块窗体设计如图5-1所示。

图5-1 用户登录窗体
(2)代码实现
登录按钮用于执行用户名和密码验证工作,如果验证用户名和密码有效,则启动系统,否则禁止进入系统,并提示“用户名或密码不正确!!!”,代码如下:
private void btn_enterActionPerformed(java.awt.event.ActionEvent evt) {
Connection conn = null;
Statement st = null;
ResultSet rs = null;
try {
conn = daoConn.getConn();
st = conn.createStatement(); /
String user = txf_username.getText().trim();
String pwd = new String(pwd_password.getPassword()).trim();
String sql = “select * from tb_user where username=’” + user+ “’ and password=’” + pwd + “’”;
rs = st.executeQuery(sql);
if (rs.next() && rs.getString(“username”) != null) {
String quanxian = rs.getString(“quanxian”);
SaveUserInfo.setUserName(user);
SaveUserInfo.setPassword(pwd);
SaveUserInfo.setQuanXian(quanxian);
MainDaohangFrame.launch();
hideLoginFrame();
}
else {
JOptionPane.showMessageDialog(this, “用户名或密码不 正确!!!”);
txf_username.setText("");
pwd_password.setText("");
txf_username.requestFocus();
}
}
catch (Exception ex) {
JOptionPane.showMessageDialog(this, ex.getMessage(), “数据 库异常”,
JOptionPane.INFORMATION_MESSAGE);
}
finally {
try {
conn.close();
}
catch (Exception e) {

			}
		}
	}

5.2.2 供应商基本信息管理模块
供应商基本信息管理模块分为3个部分:添加供应商信息,修改供应商信息、删除供应商信息。
(1)添加供应商信息
a.添加供应商信息窗体设计如图5-2所示。

图5-2 添加供应商信息窗体
b.代码实现。
private void btn_baocunActionPerformed(java.awt.event.ActionEvent evt) {
try {
String gysid=null;
String gysqc=txf_gysqc.getText().trim();
String jiancheng=txf_jiancheng.getText().trim();
String dizhi=txf_dizhi.getText().trim();
String youbian=txf_youbian.getText().trim();
String dianhua=txf_dianhua.getText().trim();
String chuanzhen=txf_chuanzhen.getText().trim();
String lianxiren=txf_lianxiren.getText().trim();
String lianxidianhua=txf_lianxidianhua.getText().trim();
String kaihuhang=txf_kaihuhang.getText().trim();
String lianxidianhua=txf_lianxidianhua.getText().trim();
String kaihuhang=txf_kaihuhang.getText().trim();
String yinhangzhanghao=txf_yinhangzhanghao.getText().trim();
String email=txf_email.getText().trim();
if (gysqc.equals("") || jiancheng.equals("") || dizhi.equals("") ||
JOptionPane.showMessageDialog(this,“信息不全,请输入。”);
return;
}
conn=daoConn.getConn();
st=conn.createStatement();
String sql=“select Max(id) as id from tb_gysinfo”;
rs=st.executeQuery(sql);
if (rs.next() && rs.getString(“id”)!=null) {
String id=rs.getString(“id”);
String subgysid=id.substring(3);
gysid=“gys”+String.valueOf(Integer.parseInt(subgysid)+1);
}else {
gysid=“gys1001”;
}
String addsql=“insert into tb_gysinfo values(’”+gysid+"’,’"+
gysqc+"’,’"+jiancheng+"’,’"+dizhi+"’,’"+youbian+"’,’"+
st.executeUpdate(addsql);
JOptionPane.showMessageDialog(this,“保存成功!!!”);
addGysqcToComboBox(cmb_xiugaigysqc);
addGysqcToComboBox(cmb_shanchugysqc);
addGysqcToComboBox(cmb_xiugaigysqc);
addGysqcToComboBox(cmb_shanchugysqc);
gysqc=cmb_xiugaigysqc.getSelectedItem().toString();
queryGysInfoToTextFields(gysqc);
showGysInfoToTable(“全部”);
btn_baocun.setEnabled(false)
ex.printStackTrace();
(2)修改供应商信息
a.修改供应商信息窗体设计如图5-3所示

图5-3 修改供应商信息窗体
b.代码实现
public void updateGysInfo(String gysid){
try
{
String gysqc=txf_xiugaigysqc.getText().trim();
String jiancheng=txf_xiugaijiancheng.getText().trim();
String dizhi=txf_xiugaidizhi.getText().trim();
String youbian=txf_xiugaiyoubian.getText().trim();
String dianhua=txf_xiugaidianhua.getText().trim();
String chuanzhen=txf_xiugaichuanzhen.getText().trim();
String lianxiren=txf_xiugailianxiren.getText().trim();
String lianxidianhua=txf_xiugailianxidianhua.getText().trim();
String kaihuhang=txf_xiugaikaihuhang.getText().trim()
String email=txf_xiugaiemail.getText().trim();
conn=daoConn.getConn();
ps.setString(1,gysqc);
ps.setString(2,jiancheng);
ps.setString(3,dizhi);
ps.setString(4,youbian);
ps.setString(5,dianhua);
ps.setString(6,chuanzhen);
ps.setString(7,lianxiren);
ps.setString(8,lianxidianhua);
ps.setString(9,kaihuhang);
ps.setString(10,yinhangzhanghao);
ps.setString(11,email);
ps.setString(12,gysid);
ps.executeUpdate();
JOptionPane.showMessageDialog(this,“修改成功!!!”)
}catch(Exception ex){
JOptionPane.showMessageDialog(this,"数据库异常!!!)
}finally{
(3)删除供应商信息
a.删除供应信息窗体设计如图5-4所示。

图5-4 删除供应商信息页面
b.代码实现。
private void btn_shanchuActionPerformed(java.awt.event.ActionEvent evt) {
Object object=null;
int selectedRow=tb_shanchu.getSelectedRow();
if (totalRows>1 && selectedRow==-1)
{
JOptionPane.showMessageDialog(this,“请选择要删除的行!!!”);
return;
}else if (totalRows==1){
object=tableModel.getValueAt(0,0);
}else if (totalRows<1 || tb_shanchu.getRowCount()==0){
JOptionPane.showMessageDialog(this,“没有可以删除的数据!!!”);
return;
}else{
object=tableModel.getValueAt(selectedRow,0);
}
if (object!=null){
String gysid=object.toString();
if (JOptionPane.showConfirmDialog(this,“确实要删除该供应商信息 吗?\t\n单击确定按钮将永久删除,不能恢复。\t\n”,"确认对话框 ",JOptionPane.OK_CANCEL_OPTION)==JOptionPane.OK_OPTION)
{
deleteGysInfo(gysid);
addGysqcToComboBox(cmb_xiugaigysqc);
addGysqcToComboBox(cmb_shanchugysqc);
if (cmb_xiugaigysqc.getItemCount()>0){
String
queryGysInfoToTextFields(gysqc);
showGysInfoToTable(gongyingshangquancheng);
}
}
}else
{
JOptionPane.showMessageDialog(this,“请选择有数据的行!!!”);
}
}
5.2.3 入库信息查询模块
(1)入库信息查询窗体设计如图5-5所示。

图5-5 入库查询页面页面
(2)代码实现。
由于篇幅有限,这里只给出“查询”按钮的事件处理过程和该事件处理过程所用到的方法。
private void showDataToTable(String sql) {
String[] columnNames = { “入库票号”, “商品编号”, “商品名称”, “产地”, " 规格", “单价”,“数量”, “金额”, “结算方式”, “入库日期”, “批号”, "批准文号 ", “供应商全称”, “验收结论”, “备注” };
String[][] tableValues = getData(sql);
tableModel = new DefaultTableModel(tableValues, columnNames);
tb_showrukuinfo.setModel(tableModel);
TableColumn column = tb_showrukuinfo.getColumn(“入库票号”);
column.setPreferredWidth(110);
column = tb_showrukuinfo.getColumn(“产地”);
column.setPreferredWidth(100);
}
5.2.4 用户信息管理模块设计
用户信息管理模块主要分为4个部分:添加用户信息,删除用户信息,设置用户权限、修改用户密码。
(1)添加用户信息
a.添加用户信息窗体设计如图5-6所示。

图5-6 添加用户信息窗体
b.代码实现。
private void saveUserInfo(String username, String pwd) {
try {
String sql = “insert into tb_user values(?,?,?)”;
conn = daoConn.getConn();
ps = conn.prepareStatement(sql);
ps.setString(1, username);
ps.setString(2, pwd);
ps.setString(3, “一般用户”);
ps.executeUpdate();
JOptionPane.showMessageDialog(this, “新用户添加成功。”);
}
catch (Exception ex) {
JOptionPane.showMessageDialog(this, “数据库中已经存在该用 户。\t\n请换个用户名。”);
}
finally {
try {
conn.close();
}
catch (Exception e) {
JOptionPane.showMessageDialog(this, “数据库异常。\t\n”
+ e.getMessage());
}
}
txf_username.setText(null);
pwd_password.setText(null);
pwd_okpassword.setText(null);
txf_username.requestFocus();
}
(2)删除用户信息
a.删除用户信息窗体设计如图5-7所示。

图5-7 删除用户信息窗体
b.代码实现。
Privatevoidbtn_scshanchuActionPerformed(java.awt.event.ActionEvent evt) {
try {
if (SaveUserInfo.getQuanXian().equals(“系统管理员”)) {
int currentRow = tb_showuserinfo.getSelectedRow();
String username = “”;
Object object = tableModel.getValueAt(currentRow, 0);
if (object != null) {
username = object.toString();
}
String sql = “delete from tb_user where username=?”;
conn = daoConn.getConn();
ps = conn.prepareStatement(sql);
ps.setString(1, username);
if (ps.executeUpdate() > 0) {
JOptionPane.showMessageDialog(this, “删除成功!!!”);
showUsername();
showUserInfoToTable(“全部”);
}
}
else if (SaveUserInfo.getQuanXian().equals(“管理员”)) {
JOptionPane
.showMessageDialog(this, “管理员只具有查看用户信息的权限,不能删除用户!!!”);
}
}
catch (Exception ex) {
ex.printStackTrace();
}
(3)设置用户权限
a.设置用户权限窗体设计如图5-8所示。

图5-8 设置用户权限窗体
b.代码实现
private void jTabbedPane1StateChanged(javax.swing.event.ChangeEvent evt) {
if (jTabbedPane1.getTitleAt(jTabbedPane1.getSelectedIndex()).equals(
“设置权限”)) {
if (SaveUserInfo.getQuanXian().equals(“系统管理员”)) {
addUserToComboBox(cmb_username, “系统管理员”);
showQuanxian();
}
else if (SaveUserInfo.getQuanXian().equals(“管理员”)) {
addUserToComboBox(cmb_username, “管理员”);
showQuanxian();
}
else {
JOptionPane.showMessageDialog(this, “您不具有该权限,您只能修改密码!!!”);
jTabbedPane1.setSelectedIndex(0);
}
}
if (jTabbedPane1.getTitleAt(jTabbedPane1.getSelectedIndex()).equals(
“删除用户”)) {
if (SaveUserInfo.getQuanXian().equals(“系统管理员”)) {
showUsername();
showUserInfoToTable(“全部”);
addUserToComboBox(cmb_username, “系统管理员”);
if (SaveUserInfo.getQuanXian().equals(“系统管理员”)) {
addUserToComboBox(cmb_username, “系统管理员”);
showQuanxian();
}
else if (SaveUserInfo.getQuanXian().equals(“管理员”)) {
addUserToComboBox(cmb_username, “管理员”);
showQuanxian();

		}
		else if (SaveUserInfo.getQuanXian().equals("管理员")) {
			showUsername();
			showUserInfoToTable("全部");
			addUserToComboBox(cmb_username, "管理员");
			
		}
		else {
			JOptionPane.showMessageDialog(this, "您不具有该权限,您只能修改密码!!!");
			jTabbedPane1.setSelectedIndex(0);
		}
	}
}

(4)修改用户密码
a.修改用户密码窗体设计如图5-9所示。

图5-9 修改用户密码窗体
b.代码实现
private void btn_xiugaiActionPerformed(java.awt.event.ActionEvent evt) {
String username = SaveUserInfo.getUserName();
String oldpwd = new String(pwd_oldpassword.getPassword());
String username = SaveUserInfo.getUserName();
String oldpwd = new String(pwd_oldpassword.getPassword());
String newpwd = new String(pwd_newpassword.getPassword());
String oknewpwd = new String(pwd_oknewpassword.getPassword());
if (newpwd == null || newpwd.equals("")) {
JOptionPane.showMessageDialog(this, “原密码不能为空!!!”);
}
else if (oldpwd.equals(SaveUserInfo.getPassword())) {
if (newpwd == null || newpwd.equals("")) {
JOptionPane.showMessageDialog(this, “新密码不能为空!!!”);
}
else if (oknewpwd == null || oknewpwd.equals("")) {
JOptionPane.showMessageDialog(this, “确认新密码不能为空!!!”);
}
else if (!newpwd.equals(oknewpwd)) {
JOptionPane.showMessageDialog(this, “新密码和确认新密码不一致!!!”);
}
else {
try {
if (JOptionPane.showConfirmDialog(this,
“确实要修改密码吗?\t\n单击确定按钮将修改。”, “确认对话框”,
JOptionPane.OK_CANCEL_OPTION) == JOptionPane.OK_OPTION) {
String sql = “update tb_user set password=? where username=?”;
conn = daoConn.getConn();
ps = conn.prepareStatement(sql);
ps.setString(1, newpwd);
ps.setString(2, username);
ps.executeUpdate();
JOptionPane.showMessageDialog(this, “密码修改成功!!!”);
SaveUserInfo.setPassword(newpwd);
}
}
catch (Exception ex) {
JOptionPane.showMessageDialog(this, “数据库异常。\t\n”
+ ex.getMessage());
}
finally {
try {
conn.close();
}
catch (Exception e) {
e.printStackTrace();
}
}
}
}
else {
JOptionPane.showMessageDialog(this, “原密码不正确!!!”);
}
String oldpwd = new String(pwd_oldpassword.getPassword());
String newpwd = new String(pwd_newpassword.getPassword());
String oknewpwd = new String(pwd_oknewpassword.getPassword());
String oknewpwd = new String(pwd_oknewpassword.getPassword());
pwd_oldpassword.setText(null);
pwd_newpassword.setText(null);
pwd_oknewpassword.setText(null);
pwd_oldpassword.requestFocus();
}
5.2.5 经手人管理模块设计
(1)经手人模块窗体设计如图5-10所示。

图5-10 经手人管理窗体
(2)代码实现。
a.添加经手人
private void btn_tianjiaActionPerformed(java.awt.event.ActionEvent evt) {
try{
String id=jsrid;
String xingming=cmb_xingming.getSelectedItem().toString().trim();
String xingbie=txf_xingbie.getText().trim();
String zhengzhimianmu=txf_zhengzhimianmu.getText().trim();
String dianhua=txf_dianhua.getText().trim();
String sql=“insert into tb_jsr values(?,?,?,?,?,?)”;
if (xingming.equals(“单击选择经手人”)){
JOptionPane.showMessageDialog(this,“请选择经手人。”);
return;
}
conn=daoConn.getConn();
ps=conn.prepareStatement(sql);
ps.setString(1,id);
ps.setString(2,xingming);
ps.setString(3,xingbie);
ps.setString(4,zhengzhimianmu);
ps.setString(5,dianhua);
ps.setString(1,id);
ps.setString(2,xingming);
ps.setString(3,xingbie);
ps.setString(4,zhengzhimianmu);
ps.setString(5,dianhua);

        ps.setString(6,shifouqiyong);
        if (ps.executeUpdate()>0){
            addJsrToComboBox(cmb_xingming);
            cmb_xingming.setEnabled(false);
            btn_tianjia.setEnabled(false);
            showJsrInfoToTable();
            JOptionPane.showMessageDialog(this,"保存成功!!!");
        }else{
            JOptionPane.showMessageDialog(this,"保存失败!!!");
        }
    }catch(Exception e){
        JOptionPane.showMessageDialog(this,"保存失败!!!\t\n"+"数据库中		已经存在该			员工信息。");
        return;

b.设置经手人是否启用
private void whetherOption(boolean tf){
try{
String shifouqiyong="";
if (tf==false){
shifouqiyong=“启用”;
}else
{
shifouqiyong=“禁用”;
}
conn=daoConn.getConn();
st=conn.createStatement();
String sql=“update tb_jsr set sfky=’”+shifouqiyong+"’ where id =’"+jsrid+"’";
st.executeUpdate(sql);
txf_setShifouqiyong.setText(shifouqiyong);
}catch(Exception ex){
ex.printStackTrace();
}finally{
try{
conn.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
5.2.6 订购商品信息管理模块
(1)订购商品信息窗体设计如图5-11所示。

图5-11 订购商品信息窗体
(2)代码实现。
private void btn_dinggouActionPerformed(java.awt.event.ActionEvent evt) {
String jsr = cmb_jsr.getSelectedItem().toString();
String ysjl = txf_ysjl.getText();
if (showDataToCompoment()) {
if (jsr.equals(“请选择经手人”)) {
JOptionPane.showMessageDialog(this, “请选择经手人!!!”);
}
else if (ysjl == null || ysjl.equals("")) {
JOptionPane.showMessageDialog(this, “请输入验收结论!!!”);
txf_ysjl.requestFocus();
}
else {
if (txf_rkddid.getText() == null
|| txf_rkddid.getText().trim().equals("")
|| txf_dgrq.getText() == null
|| txf_dgrq.getText().trim().equals("")) {
JOptionPane.showMessageDialog(this, “请单击添加按钮, 输入相关信息后,再订购。”);
}
else {
try {
if (txf_rkddid.getText() == null
|| txf_rkddid.getText().trim().equals("")
|| txf_dgrq.getText() == null
|| txf_dgrq.getText().trim().equals("")) {

					String sql = "insert into tb_rkdd_detail values(?,?,?,?)";    
					conn = daoConn.getConn();
					conn.setAutoCommit(false);                  
					ps = conn.prepareStatement(sql);             
					String rkddid = txf_rkddid.getText();
					int totalRows = tb_spinfo.getRowCount();
					int hpsl = 0;                             
					float dj = 0;                             
					String spbh = null;
					for (int i = 0; i < totalRows; i++) {
						spbh = (String) tb_spinfo.getValueAt(i, 1);       
						try {
							dj = Float.parseFloat(tb_spinfo
									.getValueAt(i, 6).toString());        
							hpsl = Integer.parseInt(tb_spinfo.getValueAt(i,
									7).toString());                       
						}
						catch (Exception ex) {
							JOptionPane.showMessageDialog(this,
									"商品单价或数量无效,请输入数字,				并回车确认。");
							return;
						}
						if (spbh != null && hpsl > 0 && dj > 0) {
							ps.setString(1, rkddid);            
							ps.setString(2, spbh);               
							ps.setFloat(3, dj);                  
							ps.setInt(4, hpsl);                  
							ps.executeUpdate();                  
							ps.addBatch();                      
						}
						else {
							JOptionPane.showMessageDialog(this,
									"商品数量输入有误,请重新输入,并回				车确认。");
							return;
						}
						spbh = null;
						hpsl = 0;
						dj = 0;
					}

5.2.7 采购入库管理模块
(1)采购入库管理窗体设计如图5-12所示。

图5-12 采购入库窗体
(2)代码实现
private void btn_dinggouActionPerformed(java.awt.event.ActionEvent evt) {
String jsr = cmb_jsr.getSelectedItem().toString();
String ysjl = txf_ysjl.getText();
if (showDataToCompoment()) {
if (jsr.equals(“请选择经手人”)) {
JOptionPane.showMessageDialog(this, “请选择经手人!!!”);
}
else if (ysjl == null || ysjl.equals("")) {
JOptionPane.showMessageDialog(this, “请输入验收结论!!!”);
txf_ysjl.requestFocus();
}
else {
if (txf_rkddid.getText() == null
|| txf_rkddid.getText().trim().equals("")
|| txf_dgrq.getText() == null
|| txf_dgrq.getText().trim().equals("")) {
JOptionPane.showMessageDialog(this, “请单击添加按钮,输 入相关信息后,再订购。”);
}
else {
try {
String sql = “insert into tb_rkdd_detail values(?,?,?,?)”;
conn = daoConn.getConn();
conn.setAutoCommit(false);
ps = conn.prepareStatement(sql);
String rkddid = txf_rkddid.getText();
int totalRows = tb_spinfo.getRowCount();
int hpsl = 0;
float dj = 0;
String spbh = null;
for (int i = 0; i < totalRows; i++) {
spbh = (String) tb_spinfo.getValueAt(i, 1);
try {
dj = Float.parseFloat(tb_spinfo
.getValueAt(i, 6).toString());
hpsl = Integer.parseInt(tb_spinfo.getValueAt(i,
7).toString());
}
catch (Exception ex) {
JOptionPane.showMessageDialog(this,
“商品单价或数量无效,请输入数字,并 回车确认。”);
return;
}

						}
						else {
							JOptionPane.showMessageDialog(this,"商品数量				输入有误,请重新输入,并回车确认。");
							return;
						}
						spbh = null;
						hpsl = 0;
						dj = 0;
					}

5.2.8 销售出库管理模块
(1)销售出库管理窗体设计如图5-13所示。

图5-13 销售出库管理窗体
(2)代码实现。
public String[][] showDataToTable(String table, String[] fieldList,
String conditionField, String condition) {
try {
conn = daoConn.getConn();
st = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
String sql = “select “;
for (int i = 0; i < fieldList.length; i++) {
if (i < fieldList.length - 1) {
sql = sql + fieldList[i] + “,”;
}
else {
sql = sql + fieldList[i] + " from " + table;
}
}
if (!conditionField.trim().equals(””)
&& conditionField.indexOf(“in”) > 0) {
sql = sql + " where " + conditionField;
}
else if (!conditionField.trim().equals("")) {
sql = sql + " where " + conditionField + “=’” + condition + “’”;
}
rs = st.executeQuery(sql);
md = rs.getMetaData();
String[][] returnData = null;
if (rs.last()) {
returnData = new String[rs.getRow()][md.getColumnCount()];
}
else {
returnData = new String[0][md.getColumnCount()];
}
rs.beforeFirst();
int currentR = 0;
while (rs.next()) {
for (int column = 0; column < md.getColumnCount(); column++) {
if (md.getColumnTypeName(column + 1).trim().equals(
“numeric”)) {
returnData[currentR][column] = String.valueOf(rs
.getFloat(column + 1));
}
else if (md.getColumnTypeName(column + 1).trim().equals(
“int”)) {
returnData[currentR][column] = String.valueOf(rs
.getInt(column + 1));
}
else {
returnData[currentR][column] = rs.getString(column + 1);
}
}
currentR++;
}
return returnData;
}
catch (Exception ex) {
ex.printStackTrace();
return null;
}
5.3 开发常见问题与解决
5.3.1 不显示系统登录窗体
(1)问题描述:在编写程序的过程中,需要运行程序进行测试,但是在运行时不显示系统登录窗体,在控制台输出如图4-8所示的异常信息。

图5-14 异常信息
(2)发生问题的原因:在用ImageIcon创建图像时,图片文件的URL地址不正确,因而发生了空指针异常。
(3)问题的解决方法:指定图片的正确的URL,然后在用ImageIcon创建图像。创建图像的正确代码如下:
URL url=PanelBack.class.getResource(“/res/登录.jpg);
Image image=new ImageIcon(url).getImage();
5.3.2运行程序时找不到数据库驱动
(1)问题描述:在编写程序的过程中,需要运行程序进行测试,但是在运行时能打开系统登录窗体,当输入用户名“mr”和密码“mrsoft”后,单击“登录”按钮,弹出数据库异常对话框,提示“com.mysql.jdbc.Driver”错误信息。
(2)发生问题的原因:没有把数据库驱动够建到类库路径,因而导致运行时找不到数据库驱动。
(3)问题的解决办法:在简易通企业进销存管理系统上单击鼠标右键,在弹出的快捷菜单中选择“属性”命令,在打开的“简易通企业进销存管理系统的属性”对话框的左侧列表中悬着“Java构建路径”选项,在右侧选择“库”选项卡,单击“添加Jar”按钮,将打开“选择Jar”对话框,选择MySQL的数据库驱动,单击“确定”按钮,再单击“简易通企业进销存管理系统的属性”对话框中的“确定”按钮,完成把数据库驱动构建到类库路径的操作。
5.3.3运行程序时用户名或密码不正确
(1)问题描述:在编写程序的过程中,需要运行程序进行测试,但是在运行时能打开系统登录窗体,当输入用户名“mr”和密码“mrsoft”后,单击“登录”按钮,弹出“数据库异常”对话框。
(2)发生问题原因:在公共类中连接数据库时,连接数据库服务器的用户名和密码不正确。
(3)问题的解决办法:在连接数据库的公共类中,把连接数据库的用户名改为正确的用户root和读者当前计算机系统中的MySQL数据库的正确密码。
5.3.4运行程序时找不到数据库
(1)问题描述:在编写程序的过程中,需要运行程序进行测试,但是在运行时能打开系统登录窗体,当输入用户名“mr”和密码“mrsoft”后,单击“登录”按钮,弹出“数据库异常”对话框。
(2)发生问题的原因:在公共类中连接数据库时,数据库名书写不正确,导致应用程序找不到数据库。
(3)问题的解决方法:在连接数据库的公共类中,把数据库名改为本系统正确的数据库名db_jxc即可解决。
5.4 系统测试
系统测试,英文是System Testing。是将已经确认的软件、计算机硬件、外设、网络等其他元素结合在一起,进行信息系统的各种组装测试和确认测试,系统测试是针对整个产品系统进行的测试,目的是验证系统是否满足了需求规格的定义,找出与需求规格不符或与之矛盾的地方,从而提出更加完善的方案。系统测试发现问题之后要经过调试找出错误原因和位置,然后进行改正。是基于系统整体需求说明书的黑盒类测试,应覆盖系统所有联合的部件。对象不仅仅包括需测试的软件,还要包含软件所依赖的硬件、外设甚至包括某些数据、某些支持软件及其接口等。
5.4.1测试目标
系统测试的任务是为了发现缺陷、证明程序中有错误。一个好的测试指的是它可能发现至今尚未发现的缺陷。一次成功的测试指的是发现了新的软件缺陷的测试。
系统测试的目标是:
(1)确认软件的质量,一方面是确认系统做了你所预期的事情(Do the right thing),另一方面是确认系统以正确的方式来做了这个事情(Do it right)。
(2)提供信息,为风险评估所准备的信息。
(3)系统测试不仅是在测试软件产品的本事,而且还包括软件开发的过程。
5.4.2测试方法
软件测试的方法和技术是多种多样的。从测试是否针对系统的内部结构和具体实现算法的角度,可分为白盒测试和黑盒测试。
(1)白盒测试:白盒测试也称结构测试或逻辑驱动测试,它是按照程序内部的结构测试程序,通过测试来检测产品内部动作是否按照设计规格说明书的规定正常进行,检验程序中的每条通路是否都能按预定要求正确工作。这一方法是把测试对象看作一个打开的盒子,测试人员依据程序内部逻辑结构相关信息,设计或选择测试用例,对程序所有逻辑路径进行测试,通过在不同点检查程序的状态,确定实际的状态是否与预期的状态一致。
(2)黑盒测试:黑盒测试也称功能测试,它是通过测试来检测每个功能是否都能正常使用。在测试中,把程序看作一个不能打开的黑盒子,在完全不考虑程序内部结构和内部特性的情况下,在程序接口进行测试,它只检查程序功能是否按照需求规格说明书的规定正常使用,程序是否能适当地接收输入数据而产生正确的输出信息。黑盒测试着眼于程序外部结构,不考虑内部逻辑结构,主要针对软件界面和软件功能进行测试。
5.4.3测试方案
根据系统开发情况将测试方案设计为以下三部分:
单元测试部分:该部分测试,时间要求在每个模块编写完成后进行,用例要使用模块内部变量测试,不涉及其它功能模块;
组装测试部分:该部分测试在相关模块编写完成后进行,对两个或以上模块综合测试,测试用例要求使用的变量必须涉及到所要测试的所有模块;
确认测试部分:该部分测试在所有模块编写完成后进行,对整个软件系统进行综合测试,其中包括功能和性能的测试。
5.4.4 测试用例
(1)系统登录测试用例
用户登录测试用例如表5-1到表5-5所示。
表5-1 测试用例Denglu1
测试用例编号 Denglu1
测试项目 用户登录
预置条件
输入
操作步骤 打开后台管理页面,点击登录按钮
预期输出 弹出账户不存在或密码错误对话框

表5-2 测试用例Denglu2
测试用例编号 Denglu2
测试项目 用户登录
预置条件 用户xinbing数据库中已存在
输入 用户xinbing
操作步骤 打开后台管理页面,点击登录按钮
预期输出 弹出请输入密码对话框

表5-3 测试用例Denglu3

测试用例编号 Denglu3
测试项目 用户登录
预置条件 用户diaosi在数据库中不存在
输入 用户diaosi,密码38224
操作步骤 打开后台管理页面,输入用户diaosi,密码38224,点击登录按钮
预期输出 弹出账户不存在或密码错误对话框

表5-4 测试用例Denglu4
测试用例编号 Denglu4
测试项目 用户登录
预置条件 用户xinbing在数据库中存在,但密码不为38224
输入 用户xinbing,密码38224
操作步骤 打开后台管理页面,输入用户xinbing,密码38224,点击登录按钮
预期输出 弹出账户不存在或密码错误对话框

表5-5 测试用例Denglu5
测试用例编号 Denglu5
测试项目 用户登录
预置条件 用户xinbing在数据库中存在,密码为123
输入 用户xinbing,密码123
操作步骤 打开后台管理页面,输入用户xinbing,密码123,点击登录按钮
预期输出 登录成功,跳到后台主界面

(2)用户权限测试用例
用户权限测试用例如表5-6到表5-10所示。
表5-6 测试用例Quanxian1
测试用例编号 Quanxian1
测试项目 用户权限
预置条件 用户xingbing成功登录,权限为一般用户
输入
操作步骤 点开用户设置,点击设置权限按钮
预期输出 您不具有该权限,您只能修改密码

表5-7 测试用例Quanxian2
测试用例编号 Quanxian2
测试项目 用户权限
预置条件 用户aaa成功登录,权限为管理员
输入
操作步骤 点开用户设置,点击删除用户按钮
预期输出 您不具有该权限,您只能修改密码

表5-8 测试用例Quanxian3
测试用例编号 Quanxian3
测试项目 用户权限
预置条件 用户mr成功登录,权限为系统管理员
输入
操作步骤 点开用户设置,点击设置用户按钮
预期输出 打开用户权限设置界面,可以设置用户为一般用户或管理员

表5-9 测试用例Quanxian4
测试用例编号 Quanxian4
测试项目 用户权限
预置条件 用户aaa成功登录,权限为管理员
输入
操作步骤 点开经手人设置
预期输出 您不具有该权限

表5-10 测试用例5
测试用例编号 Quanxian5
测试项目 用户权限
预置条件 用户mr成功登录,权限为系统管理员
输入
操作步骤 点开经手人设置
预期输出 打开经手人设置面板,可以添加经手人和设置经手人是否启用等状态

(3)采购入库测试用例
采购入库测试用例如表5-11到表5-14所示。
表5-11 测试用例ruku1
测试用例编号 ruku1
测试项目 采购入库
预置条件 用户xinbing成功登录,权限为一般用户
输入
操作步骤 点开采购入库面板,点击采购订单票号按钮
预期输出 必须先签采购入库单才能够进行入库操作

表5-12 测试用例ruku2
测试用例编号 ruku2
测试项目 采购入库
预置条件 用户xinbing成功登录,权限为一般用户
输入

操作步骤 点开采购订单面板,填好基本信息后,选择供应商,并选择好准备采购入库的商品,填好相关信息后,点击订购按钮。
预期输出 商品订购成功

表5-13 测试用例ruku3
测试用例编号 ruku3
测试项目 采购入库
预置条件 用户xinbing成功登录,权限为一般用户
输入
操作步骤
操作步骤 再次打开采购入库面板,填好基本信息后,点击采购票号按钮,点击采购订单票号按钮,并选好已经订购好的商品,点击保存。
预期输出 商品保存成功

表5-14 测试用例ruku4
测试用例编号 ruku4
测试项目 采购入库
预置条件 用户xinbing成功登录,权限为一般用户。
输入

操作步骤 打开入库查询面板,可以对仓库中商品进行查询,查看本次采购商品是否成功入库。
预期输出 可以再库存中查看到本次采购的商品
5.4.5 测试运行
(1)用户登录测试用例运行结果如下列图所示。
a.测试用例Denglu1运行结果如图5-15所示。

图5-15 测试用例Denglu1
b.测试用例Denglu2运行结果如图5-16所示。

图5-16 测试用例Denglu2
c.测试用例Denglu3运行结果如图5-17所示。

图5-17 测试用例Denglu3
d.测试用例Denglu4运行结果如图5-18所示。

图5-18 测试用例Denglu4
e.测试用例Denglu5运行结果如图5-19所示。

图5-19 测试用例Denglu5
(2)用户权限测试用例运行结果如下列图所示。
a.测试用例quanxian1运行结果如图5-20所示。

图5-21 测试用例quanxian1
b.测试用例quanxian2运行结果如图5-22所示。

图5-23 测试用例quanxian2
c.测试用例quanxian3运行结果如图5-24所示。

图5-24 测试用例quanxian3
d.测试用例quanxian4运行结果如图5-25所示。

图5-25 测试用例quanxian4
e.测试用例quanxian5运行结果如图5-26所示。

图5-26 测试用例quanxian5
(3)采购入库测试用例运行结果如下列图所示。
a.测试用例ruku1运行结果如图5-27所示。

图5-27 测试用例ruku1
b.测试用例ruku2运行结果如图5-28所示。

图5-28 测试用例ruku2
c.测试用例ruku3运行结果如图5-29所示。

图5-29 测试用例ruku3
d.测试用例ruku4运行结果如图5-30所示。

图5-30 测试用例ruku4
5.4.6 测试结论
(1)测试结果:功能基本都能实现。
(2)软件能力:经测试证实该软件在各方面的综合能力较好。
(3)存在的不足:有些考虑不周,功能可以进行扩展。
(4)测试评价:该软件基本上满足了企业对进销存管理系统的功能要求,能满足企业日常业务需求。

总 结
通过努力,经过一个多月的设计和开发,企业进销存系统基本开发完毕。本论文着重介绍了如何开发企业进销存系统,在系统设计部分介绍了企业进销存管系统的数据表的设计和系统流程及业务流程图的设计。在总体设计中描绘了系统的总体功能框架,并分别设计各子模块的功能模块图。在详细设计中讲解了系统模块和系统子模块的开发过程。总的来说,其设计信息和功能基本符合用户需求。
但同时,本系统的缺陷也是明显的,如安全性,效率问题等等。由于个人经验及能力尚欠不足,系统在技术实现上还有很多不尽如人意的地方。比如,一开始就编码,没有很好的做好概要设计,加重了代码修改及维护的工作量;只考虑技术的实现,对美工考虑不足,页面间的逻辑关系有时不是很合理等,在已经完成的程序中,也存在许多不尽人意的算法,也没有统一优化,系统有待进一步改善。
这次毕业设计中通过与同组同学的合作加强了我的协作意识,而且增强了自己的自学能力。同时在独立学习解决问题的过程中,也提高了我的工作能力,为我今后走上工作岗位积累了宝贵的经验。
但是由于毕业设计时间较短,所以该系统还有许多不尽如人意的地方,比如用户界面不够美观,出错处理不够等多方面问题。这些都有待进一步改善。 系统的其它不足之处,恳请各位老师、同学指教。

附录A 系统使用说明书
1 系统介绍
企业进销存系统的主要工作,是对企业的采购、进货、销售和库存以信息化的方式进行管理。它可以最大限度地减少各个环节中可能出现的错误,能够有效减少盲目采购、降低采购成本、合理控制库存、减少资金占用,并提高市场灵敏度,使企业能够合理安排进销存的每个关键步骤,并能够提升企业市场竞争力。
本系统具有以下功能:
(1)界面设计美观大方、方便、快捷、操作灵活。
(2)可以通过导航按钮快速实现人机交互操作。
(3)实现强大的进销存管理,包括基本信息、采购、进货、销售和库存管理。
(4)能够在不同的操作系统下运行,不局限特定的平台。
(5)提供库存盘点、调拨功能,提供多条件查询和模糊查询。
(6)提供技术支持的联系方式,可以连接到技术网站。
2 系统特色
(1)采用稳定、安全、高效的数据库系统MySQL作为后台数据库,性能稳定、高效、数据安全。
(2)安装过程简单、方便,无需设置,装完就可正常使用。
(3)非常人性化的操作界面,所有操作设定均进过多年的实践总结而来,极大的方便使用者,和考虑到使用者的操作流程和业务处理流程习惯。这套软件只需要短短几分钟就可以完全的掌握其基本操作。
(4)详细的报表查询管理,报表提供了有关企业进货,销售,库存,成本、往来、人事工资等一系列报表,覆盖面广,统计方法科学,数据准确。
3 注意事项
(1)本系统的系统管理员用户名为:mr,登录密码为:mrsoft,用户登录后可自行更改登录密码,防止他人盗用。
(2)本系统的用户权限分为3个等级,分别为:系统管理员、管理员和一般用户,分工明确。
(3)本系统只有系统管理员才有权限添加用户、删除用户和设置用户权限,其他用户无此权限。
4 使用说明
在使用本系统时,请按照以下说明对系统进行操作。
输入用户名和登录密码后,点击登录,用户将进入进销存系统主窗体模块,主窗体是人机交互的界面,本系统所有功能按钮都在主窗体上一一排列,用户通过主窗体中的菜单、工具栏和按钮等组件进行管理操作。系统主窗体如图1所示。

图1 系统主窗体
(1)选择“供应商基本信息”按钮,在弹出的窗体中进行对供应商的基本信息添加、修改及删除的业务处理。
(2)选择“采购订单”按钮,在弹出的窗体中进行对商品入库前的订购操作,只有订购了的商品才能够进行下一步“采购入库”操作,否则不能入库。
(3)选择“入库查询”按钮,在弹出的窗体中进行对仓库中的商品进行盘点、查询的业务处理,用户只需输入相应的查询条件即可进行商品的查询。
(4)选择“入库退货”按钮,在弹出的窗体中进行对入库商品的退货操作。
(5)选择“用户权限”按钮,在弹出的窗体中进行对用户信息的添加、删除及设置用户权限的操作,只有系统管理员有此权限。
(6)其他功能按钮的功能依此类推,用户只需按着系统界面的指示即可良好的掌控本系统,实现企业进销存的信息化管理。

参考文献
[1]萨师煊 王珊. 数据库系统概论(第四版)[M]. 北京:高等教育出版社.2008
[2]耿祥义编著. Java2实用教程[M]. 北京:清华大学出版社,2006年7月
[3]窦万峰主编 蒋锁良 杨俊 杨君. 软件工程方法与实践[M]. 北京:机械工业出版社.2009
[4]张海藩. 软件工程导论(第5版)[M]. 北京:清华大学出版社.2008
[5]窦万峰主编 蒋锁良 杨俊 杨君. 软件工程实验教程[M]. 北京:机械工业出版社.2009
[6]郭真 王国辉. JSP程序设计教程[M]. 北京:人民邮电出版社.2009
[7]陈明. Java语言程序设计课程实践[M]. 北京:清华大学出版社.2009
[8]苗春义. Java项目开发全程实录[M]. 北京:清华大学出版社.2008
[9]吴亚峰 索依娜. 30天学通Java Web[M]. 北京:电子工业出版社.2009
[10]Ron Patton著 张小松 玉钰 曹跃译. 软件测试[M]. 北京:机械工业出版社.2010
[11]耿祥义编著. Java2实用教程[M]. 北京:清华大学出版社.2006年7月
[12]赵毅主编. 跨平台程序设计语言—Java. 西安:西安电子科技大学出版社.2006
[13]丁振凡主编. Java语言实用教程. 北京:北京邮电大学出版社.2005
[14]王路群. Java高级程序设计. 北京:中国水利水电出版社.2006
[15]柳西玲 许斌. Java语言应用开发基础. 北京:清华大学出版社.2006
[16]朱喜福等编. Java程序设计. 北京:人民邮电出版社.2005

致 谢
在我的指导老师李江华老师的悉心指导下,我的毕业设计和毕业论文圆满完成了。
在企业进销存系统的开发过程中,我得到了指导老师的细心指导。老师与我们一起研讨开发项目,为我们提供开发实例,帮助我们进行调研和分析,耐心地指导我们进行开发和解决问题。他严密的逻辑思维以及严谨的治学态度都给予了我们极大的鼓励与帮助,在他的帮助下我们不断进步并自我们提高。在此过程中,对于我们遇到的所有问题和困难,老师都给予了细心的解答和真诚的帮助,在此我们表示衷心的感谢。
在这里我们还要感谢我的同学,在开发过程中,我们以积极上进的精神,刻苦钻研,互相帮助使设计目标得以实现。我们很高兴能在这样有凝聚力和好学上进的氛围中学习和工作,是大家的支持和帮助让我的毕业设计和毕业论文能够顺利完成!
此外,我的毕业设计课题得以很好的完成,这和学校为我们提供的良好的学习和工作环境,以及设计过程给予我支持和帮助的软件系各位老师是分不开的,特此向他们表示衷心的感谢!
在此,我向所有帮助过我们的老师、同学和朋友们表示真挚的感谢以及美好的祝福。祝愿大家在今后的日子里,百尺竿头,更进一步。

你可能感兴趣的:(基于Java Swing 和MySQL的企业进销存管理系统)