资源描述
兰州理工大学课程设计
计算机与通信学院软件
职业技术学院
课程设计说明书
产品销售管理系统
作 者:黄国辉
学 号:11700313
专 业:软件技术
班 级:软件(3)班
指导教师:任学惠
答辩时间:2012年6月22日
设计题目(中文)
产品销售管理系统
设计者姓名及学号(中文)
学号:11700313
姓名:黄国辉
摘 要
本文介绍了商品销售管理系统的开发过程。论文详尽论述了从需求分析、系统分析、概要设计、详细设计、以及测试与调试的整个开发过程,遵循软件工程的方法。
文章中所论述的管理信息系统,是一个将业务处理从纯人工操作转换成人工与计算机共同处理的一个实例,并对转换过程进行了详细策划。
本软件开发的过程中采用本系统采用了GUI设计,生成软件界面美观。
主题词: 商品销售管理
目录
一、课程设计目的 5
二、课程设计的任务及要求 5
任务:图形化界面(GUI)编程,编写一个记事本程序 5
三、实验步骤与源程序 5
四、测试数据与实验结果 11
五、结果分析与实验体会 19
源代码 21
六、设计体会与小结 69
七、参考文献 70
一、课程设计目的
(1)使学生巩固和提高Java编程技术;
(2)培养学生掌握程序设计的基本思路和方法;
(3)加强学生研发、调试程序的能力;
(4)培养学生分析、解决问题的能力;
(5)提高学生的科技论文写作能力二.
二、课程设计的任务及要求
任务:图形化界面(GUI)编程,编写一个记事本程序
(1)用图形用户界面实现。
(2)能实现编辑、保存、另存为、查找替换等功能。
三、实验步骤与源程序
1. 选题与团队分工
选题: 产品销售管理系统
分工:
角色
姓名
承担的具体任务
组长
黄国辉
程序的主入口、客户类、修改产品、修改客户、下单及一些界面类
组员
陈旦旦
产品类、销添加删除客户、产品的类
组员
赵晓涛
初始化数据类、查询客户、产品类、用户类
2. 系统需求分析
系统功能描述
商品销售系统
系统管理员:添加客户资料、删除客户资料、修改客户资料、查询客户资料、添加商品、删除商品、修改商品、查询商品、下单、取消下单、修改密码(包括销售人员)
销售人员:添加客户资料、修改客户资料、查询客户资料、修改商品、下单、取消下单、修改密码
系统用例图
(黄国辉)
搜查实体类
异常类
(陈旦旦)
(赵晓涛)
四、测试数据与实验结果
登陆界面
输入错误
系统管理员主界面
修改客户(失败)
修改客户(成功)
添加产品
查询客户资料
销售人员主界面
下单
查询产品
修改密码
五、结果分析与实验体会
(黄国辉)本次实验对系统的功能没有做修改,主要是优化了系统的结构。首先是本次实验大量运用了继承,尤其是界面,大多数的界面继承的是ReviseClientGUI这个界面,重复利用了界面上的布局以及标签,大大简化了工作量以及代码的长度,有些界面是继承的一些相似的界面,例如删除客户继承了删除产品的界面,而删除产品又是继承于修改客户这个界面。其次,本次实验添加了一个自定义异常类,当创建新用户的时候密码低于三位数会自动派出此异常。本次试验还添加了一个Search类,里面有一些常用函数,例如查找客户、查找产品、比较字符串、删除客户等方法,在其他界面中要用可以调用此嘞的一些方法,实现了类的封装。此外,本次实验还将以前在输入一些非法数据会产生的异常给补上了,例如有NullPointerException、NumberFormatException等等。有一些界面只需要 接收一个用户输入的数据,所以就是用了JOPtionPane类中的showInputDialog函数用来接收数据,大大简化了代码量,优化了系统性能。本次实验画了整体系统的类图之间的关系,大大加深了我对此系统的了解,形成了一个严密的框架,对于今后的学习会有很大的帮助。
老师的代码对于我们的学习是有很大的帮助的,学习是一件长期的事,实践着“痛并快乐着……”的感觉是非常好的,我会继续坚持下去的。
(陈旦旦)本次实验主要运用了属性以及函数的继承,隐藏,重载等操作。通过遮羞方法的运用,能够明显简化代码的复杂度,尤其是继承的运用,通过继承其他属性函数的操作,从而简化程序的复杂度,此外还需要运用文本域的隐藏操作,对于新的操作需要重新定义标签和文本域,另外在继承操作时需要注意继承的对象公共和私有,来避免错误。在编程时会出现一些异常,对于异常的处理,可以通过public void p(int x){
try{
}
catch(Exception e){
}
finally{
}
}语句来捕获异常,如果在try语句中出现异常,则会被抛出。对于处理不了的异常或者要转型的异常,在方法的声明处通过throws语句抛出异常。本次实验还练习了通过visio软件画系统类图和用例图,包括实体类、界面类,特性与操作的参数的输入,顶层包的加载等等。
(赵晓涛)第三次试验是在第二次的基础上的拓展,在这次试验中我完成了我所有的包中的文件的测试,以及完成了相应的文件的类图的画图。在类图的画画过程中还是有一些不懂得地方,对于系统中的集体的操作和特性有的区分的不是很清楚,在画类图的时候参考了老师的类图的画法,还有同学的帮助。这次试验掌握了类图的画法,和对继承的一些了解。
源代码
/* 销售系统主登陆窗口图形界面类 */
package SalesSystem;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import SalesSystem.lhz.*;
import SalesSystem.xc.*;
import SalesSystem.qyb.*;
import java.util.*;
public class GUI extends Frame implements ActionListener,ItemListener
{
TextField txId; //一定一个宽度为10个字符的文本框,用于答案输入
TextField txPassword;
Label lbTitle;
Label lbId;
Label lbPassword;
Button btOk;
Button btCancel;
Button btReset;
Label type;
Choice typeChoice;
Font myFont;
String chtype;
public User u;
GUI() //构造函数,用来初始化
{
super("主登陆界面"); //调用父类构造函数
btOk=new Button("确定");
btCancel=new Button("退出");
btReset=new Button("重置");
chtype="销售人员";
typeChoice=new Choice();
type=new Label("身份:");
lbTitle=new Label("商品销售系统 ");
lbTitle.setFont(myFont);
lbId=new Label("用户账号 ");
txId=new TextField(10);
lbPassword=new Label("用户密码 ");
txPassword=new TextField(10);
myFont=new Font("宋体",Font.BOLD,20); //定义字体为黑体、加粗、字号18
GridBagLayout gbl=new GridBagLayout();
GridBagConstraints gbc=new GridBagConstraints();
setLayout(gbl );
// 设置标题控件的位置
gbc.anchor=GridBagConstraints.NORTH; //让标题顶部居中
gbc.gridwidth=GridBagConstraints.REMAINDER; //让标题成为所在行最后(也是唯一)一个组件
add(lbTitle,gbc);
//设置姓名控件的位置
gbc.anchor=GridBagConstraints.WEST; //让ID标签位于左侧
gbc.gridwidth=1; //占一个单元格
add(lbId,gbc);
gbc.gridwidth=GridBagConstraints.REMAINDER; //让ID输入框成为所在行最后一个组件
add(txId,gbc);
//设置密码控件的位置
gbc.gridwidth=1;
add(lbPassword,gbc);
gbc.gridwidth=GridBagConstraints.REMAINDER;
add(txPassword,gbc);
//设置身份控件的位置
gbc.gridwidth=1;
add(type,gbc);
add(typeChoice,gbc);
typeChoice.add("销售人员");
typeChoice.add("系统管理员");
gbc.gridwidth=GridBagConstraints.REMAINDER; //让ID输入框成为所在行最后一个组件
add(typeChoice,gbc);
gbc.anchor=GridBagConstraints.SOUTH;
gbc.gridwidth=1;
add(btOk,gbc);
gbc.gridwidth=1;
add(btCancel,gbc);
gbc.gridwidth=GridBagConstraints.REMAINDER; //让ID输入框成为所在行最后一个组件
add(btReset,gbc);
btOk.addActionListener(this); //为输入文本框注册监听器对象
btReset.addActionListener(this); //为按钮注册监听器对象
btCancel.addActionListener(this);
typeChoice.addItemListener(this);
setBackground(Color.yellow); //设置背景色为黄色
setSize(300,260);
setBounds(450,220,300,260);
setVisible(true);
validate();
}
public void itemStateChanged(ItemEvent e)
{
if(e.getItemSelectable() instanceof Choice)
{
chtype=((Choice)e.getItemSelectable()).getSelectedItem();
}
}
public void actionPerformed(ActionEvent e) //实现ActionListener接口的actionPerformed方法
{
if(e.getSource()==btOk)
{//判断事件源,如果是输入文本框
boolean a,b,c;
a=Init.init.user1.userTypeJudge(txId.getText(),txPassword.getText(),chtype);
b=Init.init.user2.userTypeJudge(txId.getText(),txPassword.getText(),chtype);
c=Init.init.user3.userTypeJudge(txId.getText(),txPassword.getText(),chtype);
if(a||b||c)
{
if(chtype.equals("系统管理员"))
{
new ManagerGUI("系统管理员:黄国辉");
this.setVisible(false);
}
else
{
if(b)u=Init.init.user2;
else u=Init.init.user3;
new SalesmanGUI("销售人员:"+txId.getText(),u);
this.setVisible(false);
}
}
else if(Init.init.user1.userPsdJudge(txId.getText(),txPassword.getText())||Init.init.user2.userPsdJudge(txId.getText(),txPassword.getText())||Init.init.user3.userPsdJudge(txId.getText(),txPassword.getText()))
JOptionPane.showMessageDialog(null,"密码输入错误!");
else JOptionPane.showMessageDialog(null,"此账号不存在!","错误",JOptionPane.ERROR_MESSAGE);
}
else if(e.getSource()==btReset)
{
txId.setText("");
txPassword.setText("");
}
else
System.exit(0); //系统正常退出,如果参数是1,则为异常退出
}
}
/* 销售系统主入口类 */
package SalesSystem;
import java.util.*;
import java.io.*;
import SalesSystem.xc.*;
public class Main
{
public static void main (String args[])
{
System.out.println(Init.init.user1.tostring());
System.out.println(Init.init.user2.tostring());
System.out.println(Init.init.user3.tostring());
System.out.println(Init.init.goods[0].tostring());
System.out.println(Init.init.goods[1].tostring());
System.out.println(Init.init.goods[2].tostring());
System.out.println(Init.init.goods[3].tostring());
System.out.println(Init.init.goods[4].tostring());
new GUI(); //构造一个新窗体对
}
}
/* 销售系统添加客户图形界面类 */
package SalesSystem.lhz;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import SalesSystem.qyb.*;
import SalesSystem.xc.*;
public class AddClientGUI extends AddGoods //继承与AddGoods 因为AddGoods与其界面比较相似
{
Search search=new Search();
public AddClientGUI()
{
super("添加客户");
lbID.setText("客户姓名");
lbGender.setText("客户性别");
lbTitle1.setText("添加客户");
lbGoodsamount1.setVisible(false);
txtGoodsamount1.setVisible(false);
btnOK.setBounds(30,130,80,40);
btnQuit.setBounds(110,130,80,40);
btnReset.setBounds(190,130,80,40);
setSize(300,230);
setBounds(300,160,300,230);
}
public void actionPerformed(ActionEvent e)
{
if(e.getSource()==btnQuit)
dispose();
else if(e.getSource()==btnOK)
{
String tmpname=txtGoodsname1.getText();
if(Search.isEmpty(tmpname))//是否输入文字
{
try{
search.searchClient(tmpname);
if(search.findClient!=null)
{JOptionPane.showMessageDialog(null,"此客户已存在");}
else
{
Init.init.client[Client.lth++]=new Client(tmpname,txtGoodsprice1.getText());
JOptionPane.showMessageDialog(null,"添加客户资料成功");
this.setVisible(false);
}
}
catch(NullPointerException ee){}
}
}
else
{
txtID.setText("");
txtGender.setText("");
}
}
}
/* 销售系统添加产品图形界面类 */
package SalesSystem.lhz;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import javax.swing.JOptionPane;
import SalesSystem.qyb.*;
import SalesSystem.xc.*;
public class AddGoods extends ReviseClientGUI//界面继承了ReviseClientGUI添加了异常处理 若未输入弹出错误对话框
{
public JTextField txtGoodsname1;//引用
public JTextField txtGoodsprice1;
public JTextField txtGoodsamount1;
public JLabel lbGoodsname1;
public JLabel lbGoodsprice1;
public JLabel lbGoodsamount1;
Search sGoods;
public AddGoods(String s)
{
super(s);
sGoods=new Search();
txtGoodsname1=txtID;
txtGoodsprice1=txtGender;
txtGoodsamount1=txtGoodsname;
lbGoodsname1=lbID;
lbGoodsprice1=lbGender;
lbGoodsamount1=lbGoodsname;
lbTitle1.setText("添加产品");
lbGoodsname1.setText("产品名称");
lbGoodsprice1.setText("产品价格");
lbGoodsamount1.setText("产品总量");
btnOK.setBounds(30,170,80,40);
btnQuit.setBounds(110,170,80,40);
btnReset.setBounds(190,170,80,40);
lbTitle1.setBounds(100,0,150,40);
lbGoodsname1.setBounds(50,50,100,30);
txtGoodsname1.setBounds(130,50,100,30);
lbGoodsprice1.setBounds(50,90,100,30);
txtGoodsprice1.setBounds(130,90,100,30);
lbGoodsamount1.setBounds(50,130,100,30);
txtGoodsamount1.setBounds(130,130,100,30);
setSize(300,270);
setBounds(300,160,300,270);
lbGoodsprice.setVisible(false);
txtGoodsprice.setVisible(false);
lbGoodsamount.setVisible(false);
txtGoodsamount.setVisible(false);
}
public void actionPerformed(ActionEvent e)
{
if(e.getSource()==btnQuit)
dispose();
else if(e.getSource()==btnOK)
{
String tmpname=txtGoodsname1.getText();
if(sGoods.isEmpty(tmpname))
{
try{
sGoods.searchGoods(tmpname);
if(sGoods.findGoods!=null)
{JOptionPane.showMessageDialog(null,"此商品已存在");}
else
{
try{
Init.init.goods[Goods.lth++]=new Goods(tmpname,Integer.parseInt(txtGoodsprice1.getText()),Integer.parseInt(txtGoodsamount1.getText()),Integer.parseInt(txtGoodsamount1.getText()));
JOptionPane.showMessageDialog(null,"添加产品成功");
this.setVisible(false);}
catch(NumberFormatException ee){JOptionPane.showMessageDialog(null,"请在价格、数量一栏输入数字字符","警告",JOptionPane.WARNING_MESSAGE);}
}
}
catch(NullPointerException eee){}
}
}
else
{
txtGoodsname1.setText("");
txtGoodsprice1.setText("");
txtGoodsamount1.setText("");
}
}
}
/* 销售系统修改密码图形界面类 */
package SalesSystem.lhz;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import javax.swing.JOptionPane;
import java.io.*;
import SalesSystem.qyb.*;
import SalesSystem.xc.*;
import SalesSystem.*;
public class ChangeSalesmanPsd extends InquiryGoodsGUI
{
JLabel lbname;
JLabel lbPWD;
JLabel lbNewPWD;
JLabel lbPWDAgain;
JTextField txtname;
JTextField txtPWD;
JPasswordField JPNewPWD;
JPasswordField txtPWDAgain;
User u;
public ChangeSalesmanPsd(User tmp)
{
super();
u=tmp;
setTitle("修改密码");
lbPWD=lbGender;
lbNewPWD=lbGoodsname;
lbPWDAgain=lbGoodsprice;
txtPWD=txtGender;
JPNewPWD=new JPasswordField();
txtPWDAgain=new JPasswordField();
lbTitle1.setText("修改密码");
lbPWD.setText("原始密码");
lbNewPWD.setText("新密码");
lbPWDAgain.setText("重复输入");
add(JPNewPWD);
add(txtPWDAgain);
btnOK.setBounds(30,210,80,40);
btnQuit.setBounds(110,210,80,40);
btnReset.setBounds(190,210,80,40);
txtPWDAgain.setBounds(130,170,100,30);
JPNewPWD.setBounds(130,130,100,30);
lbID.setVisible(false);
txtID.setVisible(false);
txtGoodsname.setVisible(false);
txtGoodsprice.setVisible(false);
btnReset.setVisible(true);
}
public void actionPerformed(ActionEvent e)
{
if(e.getSource()==btnQuit)
dispose();
if(e.getSource()==btnOK)//将销售人员参数传过来,避免了输入用户名与数据库中所有用户比较的麻烦
{
if(u.userPsdJudge(u.getPassword(),txtPWD.getText()))
{
if(u.userPsdJudge(JPNewPWD.getText(),txtPWDAgain.getText()))
{
if(u.alterPassword(JPNewPWD.getText()))
this.setVisible(false);
}
else
JOptionPane.showMessageDialog(null,"两次输入密码不一致!");
}
else
JOptionPane.showMessageDialog(null,"输入原密码错误!","错误",JOptionPane.ERROR_MESSAGE);
}
if(e.getSource()==btnReset)
{
txtPWD.setText("");
JPNewPWD.setText("");
txtPWDAgain.setText("");
}
}
}
/* 销售系统删除客户类 */
package SalesSystem.lhz;
import javax.swing.*;
import SalesSystem.qyb.*;
import SalesSystem.xc.*;
public class DeleteClient//改进后直接用系统自带的showInputDialoge方法获得输入字符大大简化代码
{
String tmpname;
Search search;
public DeleteClient()
{
search=new Search();
tmpname=JOptionPane.showInputDialog(null ,"输入产品的名字","删除产品",JOptionPane.PLAIN_MESSAGE);
if(Search.isEmpty(tmpname))//是否输入文字
search.deleteClient(tmpname);//把删除客户坐在了业务类里
}
}
/*销售系统删除商品类*/
package SalesSystem.lhz;
import javax.swing.*;
import SalesSystem.qyb.*;
import SalesSystem.xc.*;
public class DeleteGoods//使用了系统内置的输入框 简化了很多小步骤
{
String tmpname;
Search search;
public DeleteGoods()
{
search =new Search();
tmpname=JOptionPane.showInputDialog(null ,"输入产品的名字","删除产品",JOptionPane.PLAIN_MESSAGE);
if(Search.isEmpty(tmpname))
search.deleteGoods(tmpname);
}
}
/* 销售系统产品实体类 */
package SalesSystem.lhz;
import SalesSystem.qyb.*;
import SalesSystem.xc.*;
public class Goods
{
private String Name;
private int Price;
private int TotalAmount;
private int Left;
public static int lth;
static
{
lth=0;
}
public Goods(String name,int price,int total,int left)
{
Name=name;
Price=price;
TotalAmount=total;
Left=left;
lth++;
}
public Goods(String name,int price,int total)//初始化余量等于总量
{
Name=name;
Price=price;
TotalAmount=total;
Left=total;
lth++;
}
public String getName()
{
return Name;
}
public void alterName(String tmp)
{
Name=tmp;
}
public int getPrice()
{
return Price;
}
展开阅读全文