欢迎添加微信互相交流学习哦!
项目源码:https://gitee.com/oklongmm/biye
目 录
1 系统分析 1
1.1 设计背景 1
1.2 需求分析 1
1.2.1 功能需求分析 1
1.2.2 其他需求分析 1
1.3 功能结构图 2
1.4 功能模块描述 2
2 系统设计 3
2.1 对包的描述 3
2.2 对类的描述 3
2.2.1 class UserLogin登陆界面 3
2.2.2 class MainView选择服务界面 4
2.2.3 class DrawMoney取款界面 4
2.2.4 class SaveMoney存款界面 4
2.2.5 class SearchMoney查询界面 5
2.2.6 class UserLoginMode登陆 5
2.2.7 class DrawMoneyMode取款 5
2.2.8 class DrawMoneyMode存款 5
2.2.9 class SearchMoneyMode查询 5
2.2.10 class SqlHelper数据表示层 6
2.3 接口 6
2.4 数据库连接 6
2.5 减少代码冗余 6
2.6 UML图 7
3 系统实现 8
3.1 登陆页面模块 8
3.2 选择服务模块 8
3.3 取款模块 9
3.4 存款模块 9
3.5 查询模块 10
4 系统测试 11
4.1 登陆页面模块测试 11
4.2选择服务模块测试 11
4.3 取款模块测试 12
4.4 存款模块效果测试 14
4.5查询模块测试 15
5 总结 16
1 系统分析
1.1 设计背景
ATM自动柜员机(automatic teller machine)是银行在不同地点设置的一种小型机器,利用一张信用卡大小的胶卡上的磁带〔或芯片卡上的芯片〕记录客户的基本户口资料(通常就是银行卡,或称金融卡,或称提款卡),让客户可以透过机器进行提款、存款、转帐等银行柜台服务,大多数客户都把这种自助机器称为提款机。中国大陆在1980年代末期才开始在深圳出现提款机,现在扩展至全国。并且多数柜员机都已加入银联网络,只要是有银联标志的银行卡都可以通用,但收费与否则和发卡行的规定有关。没有银联标志的卡只能在本行网络的柜员机上使用。目前,国内已有大量自动柜员机,遍布于银行营业大厅、超市、商业机构、机场、车站、码头和闹市区。
因为ATM技术的高安全性和高速度,所以在我国的发展十分迅速,尤其在银行领域。我国宽带网已初具规模,已建立成完整的电子商务安全认证体系。几乎所有的银行都是采用ATM技术,主要用于各地区之间交换数据和ATM终端。
该课程设计目标是实现一个ATM机系统,客户通过该系统可以实现一些基本的功能,包括自动取款存款功能,账户信息查询等功能。
1.2 需求分析
1.2.1 功能需求分析
本ATM机系统的主要功能,当用户输入给定的卡号和密码时,验证成功后,系统能登陆到ATM机系统,用户可以实现取款(每次取款金额为100的倍数,总额不超过10000元,支取金额不允许透支),存款(不能出现负存款)以及查询账户信息的功能。
1.2.2 其他需求分析
(1)性能描述
实施性好,灵活性强,易于不同年龄段的人操作。
(2)设计约束
开发工具:Myeclipse10.0
运行环境:win7
(3)界面要求
以Windows窗口结合用photoshop制作的图片的形式显示,每个窗口的标题栏都要有自己对应的标题名称,以及不同的按钮和选择菜单。
1.3 功能结构图
图1-1 系统功能结构图
1.4 功能模块描述
如图1-1所示,具体描述如下:
(1) 登陆页面模块,对用户进行身份验证。
(2) 选择服务模块,包括取款,存款,余额查询,退卡。
(3) 取款模块,实现取款的具体操作。
(4) 存款模块,实现存款的具体操作。
(5) 查询模块,查看当前登陆人员的余额。
(6) 退卡模块,完成需要的功能后,退出系统,返回到登陆界面
2 系统设计
2.1 对包的描述
com.atm_dao数据表示层,在该包下封装了一个名字为SqlHelper的类,包括连接数据库以及对数据库表的的crud(增加,删除,修改和查询)操作。
com.atm_model业务逻辑层,用于判断表示层传来的用户数据是否存在,如果存在返回真,不存在返回假,并将操作记录下来。例如,程序中,登陆验证时,如果输入的用户名和密码与银行数据库中的账号和密码一致时,类名为UserLoginModel就会返回true,用户可以进入到选择服务模块,用户名与密码不一致时,就返回false,提示用户重新输入。
com.atm_view界面层,用于显示各种功能界面,包括登陆界面,选择服务界面,查询余额界面,取款界面和存款界面。
2.2 对类的描述
2.2.1 class UserLogin登陆界面
成员变量:
JLabel jl_1,jl_2 JTextField jtf1 JPasswordField jpf1 JButton jb1, jb2 ArrayList<String> al, temp UserLoginModel ulm
成员方法:
public void createComponent(){}创建组件的方法。
public UserLogin(){}构造方法,初始化成员变量,并设置面板布局,显示。
public void actionPerformed(ActionEvent e){} 对事件的处理方法,包括对登陆按钮盒取消按钮的处理,对登陆按钮的处理方法,当账号和密码验证成功后,需要创建一个选择服务面板,这时需要把当前的账号传过去。点击取消按钮,退出系统。
2.2.2 class MainView选择服务界面
成员变量:
JButton jb1, jb2, jb3, jb4;
JPanel jp1;
String accountId;
成员方法:
public void createComponent(){}创建组件的方法。
public MainView(String accountId){}带参数的构造方法,用于接收登陆界面中传过来的有效的账号,然后设置布局,显示。
public void actionPerformed(ActionEvent e){}对事件的处理方法,包括对取款、存款、查询以及退卡按钮的处理,对取款按钮的处理方法,点击取款按钮时,就会创建取款面板,并把当前的账号传过去。其他按钮的处理方法类似于取款按钮,这里不再一一叙述。
2.2.3 class DrawMoney取款界面
成员变量:
JLabel jl
JTextField jtf
JButton jb1, jb2
String accountId
成员方法:
public void createComponent(){}创建组件的方法。
public DrawMoney(String accountId){}带参数的构造方法,用于接收登陆界面中传过来的有效的账号,然后设置布局,显示。
public void actionPerformed(ActionEvent e){}对事件的处理方法,当输入的取款金额不合法时,系统会弹出一个警告窗口,提示重新输入,输入的金额有效时,需要创建一个DrawMoneyModel类,需要把当前的账号传过去,然后对账户的金额进行相应的处理。
2.2.4 class SaveMoney存款界面
成员变量:
JLabel jl
JTextField jtf
JButton jb1, jb2
String accountId
成员方法:
public void createComponent(){}创建组件的方法。
public SaveMoney(String accountId){}带参数的构造方法,用于接收登陆界面中传过来的有效的账号,然后设置布局,显示。
public void actionPerformed(ActionEvent e){}对事件的处理方法,当输入的存款金额不合法时,系统会弹出一个警告窗口,提示重新输入,输入的金额有效时,需要创建一个SaveMoneyModel类,需要把当前的账号传过去,然后对账户的金额进行相应的处理。
2.2.5 class SearchMoney查询界面
成员变量:
JLabel jl;
JTextField jtf;
JButton jb2;
String accountId;
SearchMoneyModel smm;
成员方法:
public void createComponent(){}创建组件的方法,包括创建SearchMoneyMode对象,将当前的账号传入,得到当前账户的余额。其他组件的创建不在一一详述。
public SearchMoney(String accountId){}带参数的构造方法,用于接收登陆界面中传过来的有效的账号,然后设置布局,显示。
public void actionPerformed(ActionEvent e){}对事件的处理方法,对取消按钮的响应,点击取消时,返回到登陆界面。
2.2.6 class UserLoginModel登陆
成员变量:
ArrayList<String> al ;
SqlHelper sh;
ResultSet rs;
成员方法:
public ArrayList<String> check(String userAccountId, String passWord){}用于返回账号和密码。
2.2.7 class DrawMoneyModel取款
成员变量:
SqlHelper sh;
成员方法:
public DrawMoneyModel(String drawMoney, String accountId){}根据取款的金额更新账户的余额。
2.2.8 class SaveMoneyModel存款
成员变量:
SqlHelper sh;
成员方法:
成员方法:
public SaveMoneyModel(){}根据存款的金额更新账户的余额。
2.2.9 class SearchMoneyModel查询
成员变量:
SqlHelper sh;
ResultSet rs;
成员方法:
public double returnYuE(String accountId){}用于返当前账户的余额。
2.2.10 class SqlHelper数据表示层
成员变量:
Connection con;
PreparedStatement ps;
ResultSet rs ;
成员方法:
public SqlHelper(){}连接数据库。
public ResultSet queryEx(String sql, String[] paras){}实现查询。
public boolean updateEx(String sql, String[] paras){}实现增加、删除和修改。
2.3 接口
在com.atm_view创建了一个名为CreateCompent接口,在该接口中包括一个创建组件的方法,在各个界面中都实现了该接口。
2.4 数据库连接
对数据库的连接封装在了类SqlHelper中,具体的方法如下。
1.加载驱动
2.得到连接
3.创建prepareStatement对象
4.执行sql语句
2.5 减少代码冗余
1.在com.mytools中创建 MyFont类,类中创建了多个字体对象。每一个类使用字体的话,可以直接引入包com.mytools,设置需要的字体。
2.在com.atm_dao中创建了SqlHelper类,封装了对数据库的连接,无需在每一个操作(crud)中再次连接数据库。
2.6 UML图
(如图2-1所示)
图2-1 ATM机 UML图
3 系统实现
3.1 登陆页面模块
登陆结界面中需输入卡号和密码,若输入的卡号和密码与银行数据库中卡号与密码一致,才会跳转到选择服务模块,若不一致会弹出相应的警告窗口。
在界面设计中,用到了JLabel、JButton等组件。核心的代码(部分)如下:
if(e.getSource()==jb1){
al=new ArrayList<String>();
al.add(jtf1.getText().trim());
al.add( new String(jpf1.getPassword()));
ulm=new UserLoginModel();
temp=ulm.check(al.get(0), al.get(1));
if(al.equals(temp)){
new MainView(al.get(0));
this.dispose();
}else{
JOptionPane.showMessageDialog(this, "您输入的银联账号
和密码不匹配,请重新输入!");
}
}else if(e.getSource()==jb2){
this.dispose();
}
3.2 选择服务模块
选择模块有四部分组成,分别是取款模块、存款模块、查询模块和退卡模块,为
每个模块注册了监听,用户点击了某个按钮,系统就会跳转到相应的操作界面。 核心的代码(部分)如下:
if(e.getSource()==jb1){
new DrawMoney(this.accountId);
this.dispose();
}else if(e.getSource()==jb2){
new SaveMoney(this.accountId);
this.dispose();
}else if(e.getSource()==jb3){
SearchMoneyModel smm=new SearchMoneyModel();
}else if(e.getSource()==jb4){
this.dispose();
new UserLogin();
}
3.3 取款模块
取款模块界面主要有JButton,JLabel以及JTextField组成。用户在文本框中
输入取款的金额,必须是100的倍数,并且一次性取款不能超过10000元。当然取款的金额也不能超过当前账户的余额,并且余额不能为负值。 核心的代码(部分)如下:
if(num>userYuE){
JOptionPane.showMessageDialog(this, "余额不足!您当前
的余额为 "+userYuE+" 元");
}
if(num>10000){
JOptionPane.showMessageDialog(this, "取款金额需在100到
10000元之间);
}
if(num>=100 && num<=10000 && num<=userYuE){
if(num%100==0){
JOptionPane.showMessageDialog(this, "您取款的金额为
"+num+" 元");
JOptionPane.showMessageDialog(this, "系统正在处理您当前的操作
请稍后。。。");
JOptionPane.showMessageDialog(this, "已成功取款 "+num+" 元,
请收好您的现金!");
new DrawMoneyModel(drawMoney,accountId);
}else {
JOptionPane.showMessageDialog(this,"您输入的金额不合法,请重
新输入!");
}
3.4 存款模块
存款界面的设计类似于取款界面。用户可以在文本框中输入存款的金额,点击确
定后,当前账户就会增加存款的金额。核心代码(部分)如下:
if(num<=0){
JOptionPane.showMessageDialog(this,"您输入的存款金额不合
法,请输入大于0的数字!");
}else{
JOptionPane.showMessageDialog(this, "您存款的金额为
"+num+" 元");
JOptionPane.showMessageDialog(this, "系统正在处理您当前的操
作请稍后。。。");
JOptionPane.showMessageDialog(this, num+"元"+"已经存入您的
账户!");
new SaveMoneyModel(saveMoney,accountId);
}
}else if(e.getActionCommand().equals("取消")){
this.dispose();
new MainView(this.accountId);
}
}
3.5 查询模块
查询模块的设计类似于前两个界面,也是由JButton,JLabel以及JTextField
组成。核心代码(部分)如下:
try {
while(rs.next())
{
userYuE=rs.getDouble(1);
}
} catch (SQLException e) {
e.printStackTrace();
}
return userYuE;
4 系统测试
4.1 登陆页面模块测试
在如图4-1所示的登陆界面,输入卡号和密码后,点击登陆时系统会判断当前的卡号与密码是否与银行数据库中的存放的卡号与密码一致,如果不一致会弹出一个警告窗口(如图4-2所示)点击确定后,跳转到登陆界面。卡号和密码都正确后,会进入到选择服务模块(如图4-3所示)。
图4-1 ATM机登陆界面图
图4-2 账号密码错误提示图
4.2 选择服务模块测试
图4-3选择服务模块图
4.3 取款模块测试
图4-4 取款模块图
取款金额只能在100元10000元之间,并且是100的倍数,如果取款金额不在该 范围内(以20000为例),会弹出一个警告窗口(如图4-5)
图4-5 取款金额不合法警告图
账户余额不足会弹出一个警告窗口(如图4-6)
图4-6 余额不足警告图
取款成功(以100元为例)会弹出提示窗口(图4-7,4-8,4-9)
图4-7 取款金额提示图
图4-8 系统工作缓冲提示图
图4-9 成功取款图
4.4 存款模块效果测试
图4-10 存款模块效果图
如果输入的存款金额(以-1元为例)不合法,会弹出警告窗口(如图4.11)
图4-11 存款金额不合法警告图
输入存款的金额(以100元为例),点击确定按钮,会弹出提示窗口,(如图4-12,4-13,4-14所示)
图4-12存款金额提示图
图4-13系统工作缓冲提示图
图4-14成功存款效果图
4.5查询模块测试
图4-15 查询效果图
5 总结
在这次的课程中,我主要运用了Java语言的界面设计,异常处理,awt控件, swing控件,JDBC,MVC模式等知识,综合运用了Java语言。我深刻感受到了面向对象语言中类库的强大功能,再一次体会到了使用API文档的必要性,为以后学习Java Web 以及Java EE奠定了坚实的基础。
在测试过程中出现最多的一个异常是空指针异常,原因是对象只是在前面声明了,而没有在后面创建。对于异常的处理我采用了打印输出来判断哪一个程序语句出错,定位成功后,我再采取相应的措施进行处理。通过对种种异常的处理,真正提高了我对程序的调试能力。
最后还要感谢老师不厌其烦且细心的指导。