超市进销存管理系统参考文献
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
摘要
最初的超市进销存管理都是靠人力来完成的,但随着在市场经济的引导下,我国的超市经营规模日益扩大,销售额和门店数大幅度增加,许多超市正向品种多样化发展,需要处理大量的信息,时刻要更新产品销售信息,不断添加商品信息,并对商品的各种信息进行统计分析.因此,在超市管理中引进现代化的办公软件,实现超市商品信息的处理,从而方便管理人员的决策和管理,解除后顾之忧。
本系统主要完成对超市的管理,包括顾客管理、厂家管理、商品管理、退货管理,购物车管理,采购管理、个人管理,管理员管理,系统管理等几个方面.系统可以完成对各类信息的浏览、查询、添加、删除、修改等功能。
系统采用C/S架构,采用SQL Server 2000来设计数据库,并使用当前优秀的集成开发工具Eclipse并安装MyEclipse插件,项目运行环境为JDK1.6.开发模式采用敏捷开发模式,使用CVS进行协同开发,代码书写格式规范,注释详细。
关键字:Java 、SQL Server 、超市、MyEclipse、进销存管理系统、Swing
第1章概述
超市进销存管理系统是一个典型的信息管理系统(MIS),其开发主要包括后台数据库的建立和维护以及前端界面程序的开发两个方面.超市进销存管理系统在设计上体现了人性化和“以人为本”的精神。
界面设计上亲切友好,简单直观,便于操作.
系统的核心是进货、销售和库存三者之间的联系,每一个表的修改都将会牵扯到其它的表,当完成进货、销售和退货操作时系统会自动地完成相对应信息的修改。
查询功能也是系统的核心之一,在系统中可以进行模糊查询和精确查询,其目的都是为了方便用户使用,以求更快的查找到相应的基本信息。
利用超市管理系统可以在以下几个方面提高超市管理的水平:
✓提高管理效率
✓提高销售额
✓降低人工成本
✓降低采购成本
✓商业数据智能分析
✓高效决策
第2章系统开发的技术基础
2.1 Java概述
Java,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台的总称。
用Java实现的HotJava浏览器(支持Java applet)显示了Java的魅力:跨平台、动态的Web、Internet计算。
从此,Java被广泛接受并推动了Web的迅速发展,常用的浏览器现在均支持Java applet。
2.2 SQL Server 2000简介
SQL Server 是一个关系数据库管理系统,它最初是由Microsoft Sybase 和Ashton-Tate三家公司共同开发的,于1988 年推出了第一个OS/2 版本。
在Windows NT 推出后,Microsoft与Sybase 在SQL Server 的开发上就分道扬镳了。
Microsoft 将SQL Server 移植到Windows NT系统上,专注于开发推广SQL Server 的Windows NT 版本;Sybase 则较专注于SQL Server在UNIX 操作系统上的应用。
在本系统使用的是Microsoft SQL Server ,以后简称为SQL Server 或MS SQL Server。
2.3 Eclipse简介
Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。
就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。
幸运的是,Eclipse 附带了一个标准的插件集,包括 Java 开发工具(Java Development Tools,JDT)。
2.4 系统运行坏境
为了保证系统稳定、良好、无故障的运行,应保证:
1)计算机硬件在586等级以上.
2)因为采用SQL Server 2000数据库,所以操作系统最低需要安装Windows
2000。
系统要求操作系统为中文WIN2000,WINXP,WIN2003,WIN7。
3)装有Microsoft SQL Server 2000 SP4的补丁程序.
4)屏幕分辨率800X600以上.
第3章系统分析
3.1 可行性分析
根据《超市进销存管理系统概要说明书》和《超市进销存管理系统详细说明书》中的系统可行性分析的要求,指定系统可行性研究报告如下。
3.1.1 技术可行性
从技术角度分析,这项开发工作所涉及的专业技术为:Java编程技术、Swing、J2SE、SQL Server2000、JDBC。
由于开发中涉及Microsoft SQL Server 2000的应用,所以最好使用Windows2000以上的版本或Windows XP版本。
3.1.2 经济可行性
采用计算机管理不但可以提高工作效率,而且还可以节省人力、物力、财力,这样原来几个人干的工作现在一个人就完全可以胜任.因此单从节省的职工工资、提高工作效率而避免各种直接或间接的经济损失角度来看,该系统实际所能够起到的作用将会远远大于投入的开发费用,所以从经济上是完全可行的。
3.1.3 操作可行性
开发所采用的工具是MyEclipse,开发出的应用程序均是图形化界面,操作员几乎不用记住任何DOS命令就可以直接操作此软件。
另外,软件的操作员大多已经会基本的Windows操作,即便不会操作Windows,经过短期的培训也能熟练地使用本软件,所以在操作上也是可行的.
3.1.4 运行可行性
本系统经过精心设计开发,比较紧凑,项目比较小,所以对软硬的要求并不高,运行投入也相对较少,现在普通的电脑都能够满足条件,因此,本系统在运行上是可行的。
3.1.5 法律可行性
经过参阅《学生管理手册》中学生处分、奖励、毕业等相关内容,本系统的设计与开发完全符合学校规定,更无任何与法律相抵触的方面。
因此,本系统在法律上是可行的。
综上所述,此系统开发目标已明确,在技术和经济等方面都可行,不会存在
问题,并且投入少、效率高.因此认为该超市进销存管理系统可以开发。
3.2 系统需求分析
超市进销存系统必须提供顾客信息、厂家信息、采购信息、销售信息、库存信息和财务信息的基础设计:提供强大的精确查找和模糊查找信息的功能,可以分不同权限、不同用户对该系统进行操作。
另外,该系统还必须保证数据的安全性、完整性和准确性。
超市进销存财务一体化系统的目标是实现超市信息化管理,减少盲目采购、降低采购成本、合理控制库存、减少资金占用并提升超市综合竞争力。
时间就是金钱,效率就是生命。
超市进销存管理系统能够为超市节省大量人力资源,减少管理费用,从而间接为超市节约成本,提高超市效率。
3.2.1 职能分析
通过与超市人员进行交流,发现超市管理系统需要满足来自多个不同用户的要求。
在超市经营中,按照人员的职能分为五大类,分别是顾客、营业员、采购员、经理、系统管理员。
顾客
顾客是超市的上帝,超市的一切都是为顾客服务的!顾客的要求就是能购买到实惠的商品。
顾客按类型又可以分为三种:
1. 普通顾客:购买商品(不打折,无须注册)
2. 会员:购买商品(打9折)办会员卡10元,有充值功能!如果充值金
额大于100,每充100元送5元
3。
贵宾:购买商品(打8。
5折)办贵宾卡20元,有充值功能!如果充值金额大于100,每充100元送5元
采购员
采购员的要求是查看经理指派给自己的所有采购信息并按规定完成任务,即去联系厂家并按规定验收采购的商品,并退回不合格的采购商品.修改自己的账号密码.
营业员
营业员的要求是销售商品给顾客,添加购物车信息、可以查看、查找、添加、修改顾客信息、但不可以删除顾客信息。
并做好记录顾客因各种原因而退货的商品信息。
修改自己的账号密码.
经理
经理的要求是能够查看1)采购、2)销售、3)库存、4)商品、5)营业额等信息从而进行高效决策,如:下达采购信息;添加删除用户,即雇佣和解雇职员.修改自己的账号密码.
系统管理员
系统管理员只具有管理用户和管理系统的权限,不具备所有用户的权限,即没有采购员、营业员、经理等角色的权限。
修改自己的账号密码。
3.2.2 功能分析
通过与超市管理人员进行反复的讨论,最终确定系统应该实现以下功能:
1)对商品信息的变动进行处理
在商品的采购和销售过程中,商品信息总是在不断变化的,比如商品价格的调整、商品信息的修改、新商品信息的增加以及旧商品信息的删除,因此设计系统时必须考虑到这些情况。
商品信息有商品编号、商品名、商品数量、商品规格、商品价格、厂家名等属性。
2)对用户信息的变动进行处理
需考虑到职员的雇佣和解雇、所以用户信息的修改及删除也是要有的。
3)对采购信息的变动进行处理
采购员在采购的过程中采购信息也在不断发生改变,因此也要充分考虑。
采购信息有采购编号、采购日期、商品厂家、采购员、商品价格、商品规格、商品数量等属性.
4)对销售信息的变动进行处理
营业员在销售的过程中销售信息也在不断发生改变,如顾客买到了劣质产品要求退货,因此也要充分考虑。
5)查询及统计功能
要求可以根据指定的条件对厂家信息、顾客信息、商品信息、采购信息、销售信息进行查询和对每天账务的收入支出进行统计查询!查询又分为精确查询和模糊查询。
3.2.3 附加功能
为了能当超市增加新的业务需求时能方便的升级系统,所以系统应当具有良好的扩张性。
也需要能够与第三方产品对接,比如:与短信平台对接以提供短信发送和接收功能。
与声讯系统对接,提供自动呼叫服务.与邮件系统对接以发送和接受邮件。
第4章系统设计
根据系统分析的描述以及与超市人员的沟通,实现目标如下:
界面设计简洁、友好、美观大方。
操作简单、快捷方便.
数据存储安全、可靠。
信息分类清晰、准确.
强大的查询功能,保证数据查询的灵活性.
提供销售排行榜,为管理员提供真实的数据信息。
提供灵活、方便的权限设置功能,使整个系统的管理分工明确.
对用户输入的数据,系统进行严格的数据检验,尽可能排除人为的错误。
由于此系统是一个典型的客户/服务器(C/S)体系结构的数据库应用程序,
因此具体设计阶段主要分两大部分进行:数据库的设计和各种功能模块及页面的设计。
从运用的技术角度分析,即SQL Server部分的设计和Java部分的设计。
下面,我们将从这两个方面对系统的设计进行阐述.
4.1 数据库设计
超市进销存管理系统是一个基于C/S架构的应用程序,它可以直接在本地计算机上运行,而不需要向Web应用那样部署到指定的服务器中。
所以这个超市进销存管理系统在本地计算机上安装了SQL Server 2000数据库服务器,将数据库和应用程序放在同一个计算机中,可以节省开销、提升系统安全性。
另外,本系统也可以在网络内的其他计算机中运行,但是这需要将数据库对外开放、会降低数据安全性,其数据库运行环境如下:
➢硬件平台:
✓CPU:Inter E2180 2GHz
✓内存:2GB
✓硬盘空间:160GB
➢软件平台:
✓操作系统:Windows XP SP3
✓数据库:SQL Server 2000
超市进销存管理系统的数据库设计采用关系数据模型理论,有关系的元素组成一张表,表与表之间用外键保持一致性,用主键的方式确保记录的唯一性。
涉及的表有充值表、顾客表、厂家表、商品表、日志表、财务表、退货表、销售表、购物车表、采购表和用户表共十一张表。
超市管理系统模块分为:登录模块、顾客管理模块、厂家管理模块、商品管理模块、退货管理模块、购物车管理模块、采购管理模块、个人管理模块、管理员管理模块和系统管理模块共十大模块。
为了方便数据库的设计,缩小开发周期,我用PowerDesigner软件把表都设计好,然后自动生成数据库的建表SQL语句。
在对数据库进行访问时我用到了MVC设计模式中DAO(Data Access Object)技术封装对数据库的查询、删除、插入等各种操作,这样提高数据库访问的透明性和系统的灵活性。
4.1.1 E—R图
超市进销存管理系统主要实现从进货、退货、库存到销售的一体化信息管理,涉及到了顾客信息、厂家信息、商品信息等多个实体。
下面简单介绍几个关键的实体E—R图.
顾客实体E—R图
超市进销存管理系统将记录所有的顾客信息,顾客实体包括顾客编号、顾客姓名、顾客性别、顾客年龄、顾客联系电话、顾客联系地址、顾客电子邮箱、顾客类型、顾客可用余额、顾客可用积分等属性,顾客E-R图如图1所示。
超市进销存管理系统将记录所有的厂家信息,厂家实体包括厂家编号、厂家名称、厂家负责人、厂家联系电话、厂家地址等属性,厂家E —R 图如图2所示。
商品实体E —R E-R 图如图3所示。
4.1.2 使用,通过这些实构。
本系统使用12.5。
使图4 超市进销存管理系统的模型
4.1.3 数据字典
4.2 功能模块设计
根据以上对超市管理系统数据库的分析,一个标准的超市进销存管理系统应该实现的主要的功能模块有:登录模块、采购管理模块、退货管理模块、商品信息管理模块、购物车管理模块、用户管理模块、顾客管理模块、厂家管理模块、统计管理模块、管理员管理模块.(共十大模块)下面对这些功能模块作下简单的介绍.
登录模块
用于验证用户的登录。
不同的用户成功登录后显示的窗体是不一样的.这是每个系统都应该具有的功能,在这里我要特别的介绍一下了。
别小看了一个普通的登录模块,它包含的用户需求可以是有几十条的。
比如:用户不能重复登录,输入三次密码错误后,应该锁定用户的账号,记住密码功能等等。
顾客管理模块
这个模块用于维护顾客的资料。
系统中顾客分为三种:贵宾、会员、普通顾客。
类型为0表示普通顾客,为1表示会员,为2表示贵宾,系统默认有一个BuyerID为0的普通顾客。
其都有如下几个基本信息:顾客ID、顾客名、性别、年龄、地址、电话、E—mail、顾客类别。
顾客的信息是超市一个很重要的
市场资源、必须持久性的保存到数据库中,同时为了数据的安全性,应定期将数据备份到其他介质上保存或把数据打印成资料保管起来。
顾客管理包括:增加顾客、删除顾客、修改顾客、查询顾客。
为了方便,加入了准确查询和模糊查询。
厂家管理模块
这个模块用于维护厂家的资料。
系统中厂家有如下几个基本的信息:厂家ID、厂家名称、厂家经理、厂家联系电话、厂家地址。
厂家的信息也是超市的一个很重要的信息,所以必须是管理员或经理才能查看.同时为了数据的安全性,应定期将数据备份到其他介质上保存或把数据打印成资料保管起来。
厂家管理模块包括:增加厂家信息、删除厂家信息、修改厂家信息、查询厂家信息。
为了方便,加入了准确查询和模糊查询。
商品管理模块
这个模块用户维护商品的资料。
当超市中出现了由于商品价格定价过高而导致商品不畅销的商品时,可以更新商品的价格信息.系统中商品都有如下几个基本信息:商品ID、商品名称、商品数量、商品规格、商品价格、商品厂家名。
商品信息管理包括:更新商品信息、查询商品信息。
为了方便,加入了准确查询和模糊查询。
退货管理模块
用于对采购了问题产品而退货和顾客购买了问题产品而退货的信息进行登记。
采购员对应采购退货,工作流程:对超市的采购退货记录进行详细记录。
营业员对应销售退货,工作流程:对超市的销售退货记录进行详细记录.为了方便,加入了准确查询和模糊查询.
购物车管理模块
用于营业员管理超市的销售业务,其主要功能是让营业员进行销售信息的添加及查询。
为了让经理和系统管理员了解销售情况!购物车管理模块工作流程是:营业员先扫描顾客购物车里面的商品,然后确定顾客是普通顾客还是会员,是付现金还是刷卡,最后打印出销售小票.并把销售记录进行详细的记录。
为了方便,加入了准确查询和模糊查询。
采购管理模块
用于采购员管理超市的采购业务,其主要功能是完成超市采购信息的添加及查询.工作流程是:经理通过查看超市的销售状况和对库存进行盘点,对库存不足的商品进行采购,并下达采购信息,指派给相对应的采购员去完成,采购员则接受经理的命令,去厂家采购商品,并验收入库,还要对超市的采购记录进行详细记录。
为了方便,加入了准确查询和模糊查询。
个人管理模块
用户系统用户修改自己的账号密码和修改自己的个人信息。
不同的用户只能够修改自己的密码和个人信息。
提高了系统的安全性和准确性.个人管理模块还有换班管理以及局域网聊天子系统等功能,方便用户的特殊需求,如超市职工需请假,则可以通过换班管理,和其他人交接班,以方便超市的正常运转。
局域网聊天是为了经理给超市职工下达通知以及超市职工向经理汇报情况等提供方便,提高工作效率,异地协同办公.
管理员管理模块
用于给系统分配登录用户。
不同的用户具有不同的权限,权限管理可以提高系统的安全性。
系统用户分为四种级别的用户,系统管理员、经理、营业员和
采购员。
其都有如下几个基本信息:用户ID、用户名、用户密码、用户电话、用户地址、用户类别。
系统默认有一个系统管理员admin,密码设置为admin,系统管理员能够操作系统中所有的功能.用户管理包括对经理、营业员、采购员等用户进行添加和删除等管理。
工作流程:1、负责系统登录用户的管理。
为了方便,加入了准确查询和模糊查询。
系统管理模块
系统管理是软件最基本、最重要的信息。
其包含有查看系统日志、查看销售信息、查看充值信息和收入支出统计等功能.查看系统日志要求对该系统的使用情况进行记录,如何时何地何人使用过该超市进销存财务一体化系统,以及对重要信息的增删改进行记录,方便经理进行查阅。
查看销售信息、查看充值信息和收入支出统计等功能模块用于管理员或经理了解超市的经营情况,从而做出重要性的高校决策。
提高管理效率!
4.3 输入输出设计及实现
运行该系统出现登录窗体,如图5所示。
图5
关键代码如下:
public class Login {
private JTextField userNameField;
private JTextField userPwdField;
private JButton confirmBtn;
private JButton cancelBtn;
private JFrame loginFrame;
/**
* 初始化窗体并给按钮添加监听事件
*/
public void init() {
initFrame();
// 给窗口添加监听事件
// 接收窗口事件的抽象适配器类(匿名内部类)
loginFrame.addWindowListener(new WindowAdapter(){
@Override
public void windowClosing(WindowEvent e){
System。
exit(0);// 关闭窗口时调用System。
exit(0)关闭Java虚拟机}
});
// 给登录按钮添加监听事件
confirmBtn。
addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String userName = userNameField。
getText();
String userPwd = userPwdField。
getText();
if (userName.equals("") &&userPwd。
equals("")){
JOptionPane.showMessageDialog(null,"用户名或密码不能为空!");
return;
} else {
if (new UserDAO()。
judge(userName,userPwd)) {
//将用户登录情况写入系统日志
new Common().addLog(userName,"登录系统”);
loginFrame.setVisible(false);
new MainManage(userName)。
init();
}else {
JOptionPane.showMessageDialog(null,"用户名或密码错误!”);
}
}
}
});
// 给取消按钮添加监听事件
cancelBtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e){
System.exit(0);
}
});
// 给密码文本框添加监听事件
userPwdField.addKeyListener(new KeyListener() {
public void keyPressed(KeyEvent e) {
if (e。
getKeyCode()== 10){// 返回与此事件中的键相关联的整数keyCode。
String userName = userNameField。
getText();
String userPwd = userPwdField.getText();
if (userName.equals(””)&&userPwd.equals(”")){
JOptionPane.showMessageDialog(null, ”用户名或密码不能为空!");
return;
}else {
if (new UserDAO().judge(userName,userPwd)) {
// 将用户登录情况写入系统日志
new Common().addLog(userName, ”登录系统”);
loginFrame.setVisible(false);
new MainManage(userName).init();
} else {
JOptionPane.showMessageDialog(null, "用户名或密码错误!”);
}
}
}
}
public void keyReleased(KeyEvent e) {
}
public void keyTyped(KeyEvent e){
}
});
}
/**
* 初始化窗体
*/
private void initFrame() {
loginFrame = new JFrame("登录超市进销存管理系统”);
// 设置窗口的显示位置和大小
loginFrame.setBounds(400, 300,380,300);
// 设置窗口的大小固定
loginFrame.setResizable(false);
// 设置窗口的布局格式
loginFrame.setLayout(null);
// 添加图片
Icon icon = new ImageIcon(”res\\about2。
jpg”);
JLabel aboutLabel = new JLabel(icon);// 创建具有指定图像的// JLabel实例。
该标签在其显示区内垂直和水平居中对齐。
aboutLabel。
setBounds(0,0,380, 150);
loginFrame.add(aboutLabel);
// 添加用户名
JLabel userNameLabel = new JLabel("用户名:”);
userNameLabel。
setBounds(5, 155,60,20);
loginFrame.add(userNameLabel);
userNameField = new JTextField();
userNameField。
setBounds(70,155,300,20);
loginFrame。
add(userNameField);
// 添加密码
JLabel userPwdLabel = new JLabel(”密码:”);
userPwdLabel.setBounds(5, 180, 60, 20);
loginFrame.add(userPwdLabel);
userPwdField = new JPasswordField();
userPwdField。
setBounds(70,180, 300,20);
userPwdField.setFocusable(true);
loginFrame。
add(userPwdField);
confirmBtn = new JButton(”登录");
confirmBtn.setBounds(70, 220,60, 20);
loginFrame.add(confirmBtn);
cancelBtn = new JButton("取消”);
cancelBtn.setBounds(220,220, 60,20);
loginFrame.add(cancelBtn);
loginFrame。
setVisible(true);
}
public static void main(String[]args) {
// TODO Auto-generated method stub
new Login().init();
}
}
输入用户名、密码后进入超市进销存管理系统主窗体界面如下图所示。
图6
选择“购物车管理"/“添加购物车信息"按钮,在弹出的窗体中进行对销售信息的操作。
如下图所示。
图7
关键代码实现:
public void init(){
initFrame();
// 给窗体添加监听事件
shopCarManageFrame。
addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
shopCarManageFrame.setVisible(false);
}
});
// 给商品ID文本框添加监听事件,敲入商品ID后回车得到商品的基本信息
goodsIDField.addKeyListener(new KeyListener() {
public void keyPressed(KeyEvent e) {
if (e。
getKeyCode()== 10){// 返回与此事件中的键相关联的整数keyCode。
if (goodsIDField.getText().trim().equals(”")
|| new Common()。
isLetter(goodsIDField.getText()
.toString().trim())) {
JOptionPane。
showMessageDialog(null, ”请输入正确的商品ID!”);
} else {
con = DBConn。
getConn();
String sql = ”select *from t_goods where goodsID = ?”;
try {
int goodsID = Integer。
parseInt(goodsIDField.getText()。
trim());
ps = con。
prepareStatement(sql);
ps.setInt(1,goodsID);
rs = ps。
executeQuery();
if (rs。
next()) {
goodsNameField.setText(rs。
getString(”GoodsName”));
goodsPriceField。
setText(rs。
getString(”GoodsPrice"));
goodsTypeField。
setText(rs
.getString("GoodsType"));
goodsVO = new GoodsDAO().findVOByGoodsID(goodsID);
}else {
JOptionPane.showMessageDialog(null,
”你输入的商品ID不存在!”);
goodsIDField。
setText("”);
}
} catch (SQLException e1) {
// TODO Auto—generated catch block
e1.printStackTrace();
} finally {
DBConn。
freeConn(con);
}
}
}
}
public void keyReleased(KeyEvent e){
}
public void keyTyped(KeyEvent e){
}
});
// 给购买按钮添加监听事件
purchaseBtn。
addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
if(data。
size()==0){
JOptionPane.showMessageDialog(null,"至少要买点什么吧?”);
}else{
int buyerType = buyerVO.getBuyerType();
if (buyerType != 0) {
// 作判断,如果卡上的余额不足以付账,则提示该充值了!
if(sumPrice>buyerVO.getBuyerBalance()){
JOptionPane。
showMessageDialog(null, ”卡上金额不足,请充值!”);
shopCarManageFrame.setVisible(false);
new AddMoneyForVIPFrame(buyerVO,userName)。
init ();
}else{
new PurchaseManageForVIP(shopCarID, userName,buyerVO,sum,sumPrice).init();
shopCarManageFrame.setVisible(false);
}
}else {
new PurchaseManage(shopCarID, userName,buyerVO,sum,
sumPrice)。
init();
shopCarManageFrame.setVisible(false);
}
}
}
});
// 给购买数量文本框添加监听事件
buyGoodsNumField.addKeyListener(new KeyListener(){
public void keyPressed(KeyEvent e) {
// TODO Auto—generated method stub
if (e。
getKeyCode()== 10) {
if (goodsIDField.getText()。
equals("”)
|| goodsPriceField.getText()。
equals(”")
||buyGoodsNumField.getText().equals(”")
|| new Common()。
isLetter(buyGoodsNumField。
getText ()。
toString().trim())) {
JOptionPane。
showMessageDialog(null,
”你输入的信息有误,请输入正确的信息!");
}else if (Integer。
parseInt(buyGoodsNumField.getText())〈= 0) {
JOptionPane。
showMessageDialog(null,”怎么是负数,难道你不想买东西了吗?");
}else if (Integer。
parseInt(buyGoodsNumField.getText())〉goodsVO。
getGoodsNum()){
JOptionPane。
showMessageDialog(null, "库存商品数量不足!请及时采购!”);
}else {
if(buyerVO。
getBuyerType()!=0){// 如果是会员或贵宾的话就要判断卡上的余额是否足以付账
if(sumPrice〉buyerVO。
getBuyerBalance()){
JOptionPane.showMessageDialog(null,"卡上金额不足,请充值!”);
// 进入到会员充值界面
shopCarManageFrame.setVisible(false);
new AddMoneyForVIPFrame(buyerVO,userName)。
init();
}else{
sellGoods();
}
}else{
sellGoods();
}
}
}
}
private void sellGoods(){
con = DBConn.getConn();
String sql = "insert into t_shopcar values(?,?,?,?,?,?,?,?)”;
try {
ps = con.prepareStatement(sql);
ps.setString(1, shopCarIDField。
getText());
ps.setInt(2,Integer。
parseInt(goodsIDField。
getText()。
trim()));
ps。
setString(3, goodsNameField。
getText());
ps。
setString(4, goodsTypeField.getText());
ps.setInt(5, Integer。
parseInt(buyGoodsNumField
.getText()));
ps。
setDouble(6,Double。
valueOf(goodsPriceField。
getText()));
ps.setString(7,buyerNameField.getText());
ps.setString(8, userName);
int i = ps.executeUpdate();
if (i 〉0) {
// 从商品信息表中更新商品信息数据
sql = "update t_goods set GoodsNum = GoodsNum - ? where GoodsID = ?";
ps = con.prepareStatement(sql);
ps。
setInt(1, Integer.parseInt(buyGoodsNumField。
getText()));
ps。
setInt(2, Integer.parseInt(goodsIDField
.getText()。
trim()));
int j = ps。
executeUpdate();
if (j 〉0) {
// 获得商品总数
sum = sum
+ Integer.parseInt(buyGoodsNumField。
getText());
// 获得商品总价
sumPrice = sumPrice
+ Double
.parseDouble(goodsPriceField。
getText())
*Integer。
parseInt(buyGoodsNumField。
getText());
shopCarManageFrame.setVisible(false);
new ShopCarManage(userName, shopCarID,
buyerVO,sum,sumPrice)。
init();
goodsIDField.setText("”);
goodsNameField。
setText(”");
goodsTypeField。
setText("");
goodsPriceField.setText("”);
buyGoodsNumField。
setText(”");
} else {
JOptionPane.showMessageDialog(null,
”添加到购物车失败!");
}
}else {
JOptionPane。
showMessageDialog(null, ”添加到购物车失败!");
}
} catch (SQLException e1){
e1.printStackTrace();
} finally {
DBConn.freeConn(con);
}
}
public void keyReleased(KeyEvent e){
}
public void keyTyped(KeyEvent e) {
}
});
}
选择“个人管理”/“局域网聊天"按钮,在弹出的窗体中进行局域网聊天操作。
如图8所示。
图8
第5章系统测试与发布
在现代软件开发过程中,测试不再作为一个独立的生命周期,单元测试成为与编写代码同步进行的开发活动.单元测试能够提高程序员对程序的信心,保证程序的质量,加快软件开发速度,使程序易于维护。
5.1 单元测试概述
单元测试是在软件开发过程中要进行的最低级别的测试活动,在单元测试活动中,软件的独立工作单元将在与程序的其他部分相隔离的情况下进行测试。
在一种传统的结构化编程语言中,如Java语言,要进行测试的工作单元一般是方法。
在像C++这样的面向对象的语言中,要进行测试的基本单元是类.单元测试不仅仅是作为无错编码的一种辅助手段,在一次性的开发过程中使用,单元测试还必须是重复的,无论是在软件修改或移植到新的运行环境的过程中.因此,所有的测试都必须在整个软件系统的生命周期中进行.
5.2 什么是单元测试
✓它是一种验证行为
程序中的每一项功能都可以通过单元测试来验证其正确性。
它为以后的开发提供支持。
就算是开发后期,也可以轻松地增加功能或更改程序结构,更不用担心这个过程中会破坏重要的东西.而且它为代码的重构提供了保障。
这样,我们就可以自由地对程序进行改进。
✓它是一种设计行为
编写单元测试将我使我们从调用者的角度观察、思考。
特别是先写测试,迫使我们把程序设计成易于调用和可测试的,即迫使我们解除软件中的耦合。
✓它是一种编写文档的行为
在很多项目的初期,项目中的大部分程序员都能够自觉地编写单元测试。
随着项目的进展、任务的加重,离交付时间越来越近,不能按时完成项目的风险越来越大,单元测试就往往成为牺牲品了。
项目经理因为进度的压力也不重视了,程序员因为编码的压力和无人看管而不再为代码编写单元测试了,越是在项目的后期,能够坚持编写测试的程序员在整个项目组中所占的比例越来越低。
为了追赶项目进度,多数程序员将没有经过任何测试的程序代码上传到版本控制系统,项目经理也不再追问,照单全收。
这样做的结果就是在项目后期,技术骨干人员只好加班加点进行系统集成,集成完了之后,下发给测试人员测试,Bug的报告数量翻倍增长.程序员开始修改Bug,但有非常多的Bug隐藏得很深,一直潜伏到生产环境中去。
5.3 系统打包发布
Java应用程序可以打包成Jar文件,Jar文件是一个简单的ZIP格式的文件,它包含程序中的类文件和执行程序的其他资源文件。
在程序发布之前,需要将所有的编译好了的Java文件封装到一个程序打包文件中,然后将这个程序的打包文件提交给客户使用。
一旦程序打包之后,就可以使用简单的命令来执行它.另外,如果配置好Java环境或使用JDK的安装程序构建Java环境,那么就可以像运行本地可执行文件一样去执行Jar文件。
然后可以发送到桌面快捷方式,这样就可以点击桌面的快捷方式来运行该超市进销存管理系统。