java课程设计报告自动取款机模拟程序.docx
《java课程设计报告自动取款机模拟程序.docx》由会员分享,可在线阅读,更多相关《java课程设计报告自动取款机模拟程序.docx(60页珍藏版)》请在冰豆网上搜索。
![java课程设计报告自动取款机模拟程序.docx](https://file1.bdocx.com/fileroot1/2022-12/13/4d391950-2360-4628-b2b9-21ffd317e2d2/4d391950-2360-4628-b2b9-21ffd317e2d21.gif)
java课程设计报告自动取款机模拟程序
学院
计算机科学与技术系
课程设计报告
2014~2015学年第一学期
课程
JAVA课程设计
课程设计名称
自动取款机模拟程序
学生姓名
学号
专业班级
指导教师
2014年9月
自动取款机模拟程序
一、课程设计过程概述
这次课程设计的主要目的是结合面向对象程序设计课程,培养我们面向对象软件开发的思维,初步了解软件开发的一般流程,提高用JAVA编程的实际动手能力并增强大家对面向对象的了解。
这次课程设计的主要内容是独立用JAVA语言开发一个小的应用程序
名称:
自动取款机模拟程序
内容:
在PC机上设计一个自动取款机的模拟程序,实现现实中取款机的大部分功能。
二、任务和要求
1.程序分为两部分:
管理端和客户端。
2.管理端负责管理所有的银行卡,管理员可以增加和删除银行卡。
(1)每张银行卡由卡号唯一标识,卡号由9位阿拉伯数字组成;
(2)新增的银行卡密码均为“123456”,卡内金额均为0元;
(3)只有管理员增加的银行卡才能登陆客户端;
(4)删除后的银行卡将不能再登陆客户端。
3.客户端负责常见的取款机操作。
(1)客户端需要登陆,用户输入正确的银行卡号和密码,系统核对无误后才能进行操作;
(2)登陆后,用户可以进行查询余额、取款、存款和修改密码的操作;
(3)修改密码时,用户需输入两次新密码,确定无误后方可更改;
(4)取款和存款操作,有操作结果提示,如“操作成功”或“余额不足,操作失败”等。
三、数据库设计
程序中包括用户客户端和管理客户端,所以在数据库中需要设计用户信息表和管理员信息表分别来保存用户信息和管理员信息(数据库采用MySQL)。
表1用户信息表(user)
列名
数据类型及长度
是否为空
主键
默认值
说明
cardNum
Varchar(12)
NO
主键
用户帐号
password
Int(6)
NO
123456
用户密码
balance
Int(10)
NO
0
余额
表2管理员信息表(admin)
列名
数据类型及长度
是否为空
主键
默认值
说明
adminName
Varchar(10)
NO
主键
管理员帐号
password
Varchar(10)
NO
admin
管理员密码
四、系统设计
1、设计框架
图一总体设计框架
2、总体设计
我所设计的ATM机主要是由登录页面模块还由选择服务模块组成,在登录时可选择用户登录或管理员登陆。
其中用户的选择服务模块由取款模块、存款模块、查询余额模块、修改密码模块、退卡模块组成,管理员的选择服务模块由新建用户模块、删除用户模块、退出模块组成。
其功能结构图如下所示:
图二用户模块设计框图
图三管理员模块设计框图
3、ATM取款机界面设计
我觉得一个系统的界面应该要简单明了,当然样式美观就更好了。
我设计的界面主要是由窗体组成,操作简单。
而每一个窗口则执行相应的功能。
一个系统界面的好坏直接影响到用户的操作,界面设计要求样式美观、简单明了、方便易操作。
我设计的界面主要分为窗体、菜单、按钮和文本输入框几个部分,分别执行相应的操作。
(1)窗体的设计
窗体整个框架使用JFrame类构造,JFrame有自己的外边框和自己的标题,创建JFrame时可以指定其窗口标题,我创建的窗口标题是各个不同功能的模块的名字,比如说查询余额窗口,取款窗口等。
(2)窗体的主要结构的设计
我所设计的窗口的主要结构的特点就是每个窗口都对应着一个特定的功能。
比如说报各种各样的错,还有各种查询余额、取款、选择服务等,所以它们都是由各种按钮和文本框,标签组成的,而联系各个窗体成为一个整体的就是各个按钮的监听事件,另外所有窗口布局均为网格布局。
为了定义各个按钮所对应的命令和操作,首先需要将各个按钮注册给实现了动作事件的监听接口ActionListener的监听者,然后为监听者定义actionPerformed(ActionEvente)方法,在这个方法中调用e.getSource()或e.getActionCommand()来判断用户点击的菜单子项,并完成这个菜单子项定义的操作。
4、各功能模块设计
4.1登录页面模块设计
用户进入登录页面后要输入账号和密码,并选择相应的用户,点击确定后系统会通过连接数据库验证密码是否正确,在密码正确的情况下界面跳转到功能选择界面,否则弹出警告账号或密码错误窗口。
图四登录窗口
界面我采用的是MyEclipse中的Swing插件所做,简单、方便、实用。
文本区调用getText()方法,获取用户想要的字符串。
因为要区分登录者是用户还是管理员,所以设置了两个JRadioButton来确定登录者的身份。
当登录者选择的身份为用户时通过UserDao类驱动加载数据库,从用户表中获取相关信息并与用户输入信息比较,信息相符时登录成功,否则弹出警告窗口。
部分源码如下;
/**
*管理员登录
*/
privatevoidadminLogon(){
StringadminName=userNameTxt.getText();
Stringpassword=newString(passwordTxt.getPassword());
if(StrUtil.isEmpty(adminName)){
JOptionPane.showMessageDialog(null,"账号不能为空!
");
return;
}
if(StrUtil.isEmpty(password)){
JOptionPane.showMessageDialog(null,"密码不能为空!
");
return;
}
Listadmins=newArrayList();
admins=UserDao.selectAdmin("selectadminName,passwordfromadminwhereadminName=?
andpassword=?
;",adminName,password);
if(admins.isEmpty()){
JOptionPane.showMessageDialog(null,"登录失败,账号或密码错误!
");
return;
}else{
this.dispose();
SaveUserInfo.admins=admins;
AdminFrmadminFrm=newAdminFrm();
adminFrm.setVisible(true);
}
}
4.2选择服务模块设计
在选择服务模块中,有各种ATM的服务功能,只要用户在该界面中选择按钮,它就会弹出各个相应的界面。
每一个按钮都有监听器,在选择了按钮后,java.awt.event中的ActionEvent类创建一个事件对象,并将它传递给方法publicvoidactionPerformed(ActionEvente)中的参数e,监视器就会知道所发生的事件,对此事件进行处理。
其中的部分源代码为:
图五主操作窗口
/**
*查询余额
*/
privatevoidb_queryBalanceActionPerformed(java.awt.event.ActionEventevt){
this.dispose();
QueryBalanceFrmbalanceFrm=newQueryBalanceFrm();
balanceFrm.setVisible(true);
}
/**
*存款
*/
privatevoidjb_depositMoneyActionPerformed(java.awt.event.ActionEventevt){
this.dispose();
DisposeMoneyFrmdisposeMoneyFrm=newDisposeMoneyFrm();
disposeMoneyFrm.setVisible(true);
}
/**
*修改密码
*/
privatevoidmodifyPasswordActionPerformed(java.awt.event.ActionEventevt){
this.dispose();
ModifyPasswordFrmmodifyPasswordFrm=newModifyPasswordFrm();
modifyPasswordFrm.setVisible(true);
}
/**
*取款
*/
privatevoidjb_withdrawalMoneyActionPerformed(java.awt.event.ActionEventevt){
this.dispose();
WithdrawMoneyFrmwithdrawMoney=newWithdrawMoneyFrm();
withdrawMoney.setVisible(true);
}
/**
*退出系统
*/
privatevoidjb_exitActionPerformed(java.awt.event.ActionEventevt){
intresult=JOptionPane.showConfirmDialog(null,"是否要退出系统!
");
if(result==0){
this.dispose();
}
}
4.3取款模块设计
当用户点击取款按钮时,可以输入取款金额进行取款,当用户输入的不是整百或者不是数字时,会提示用户重新输入正确的金额;该ATM只允许用取3W下金额,否则会提示用户到柜台去取。
部分界面和源代码如下:
图六取款窗口
/**
*确认取款事件
*/
privatevoidjb_confirmActionPerformed(java.awt.event.ActionEventevt){
intbalance=this.queryBalance();//调用取款方法,获得余额
StringcardNum=users.get(0).getCardNum();//获取用户卡号
intwithdrawMoney;
if(StrUtil.isEmpty(jWithdrawMoneytxt.getText())){//判断输入是否为空
JOptionPane.showMessageDialog(null,"请输入金额!
");
return;
}elseif(!
InputJudge.isFigure(jWithdrawMoneytxt.getText())){
JOptionPane.showMessageDialog(null,"请输入金额!
");
setNull();//置空
return;
}
//获得取款金额
withdrawMoney=Integer.parseInt(jWithdrawMoneytxt.getText())//将字符转换成数值
//只能取面值100元
inttemp=withdrawMoney/100*100;
if(temp>balance){
JOptionPane.showMessageDialog(null,"余额不足!
");
this.setNull();
}else{
if(temp<=0){
JOptionPane.showMessageDialog(null,"请输入正确的金额!
");
this.setNull();
}
elseif(temp>=30000){
JOptionPane.showMessageDialog(null,"请到柜台取款");
setNull();
}
elseif(generalUser.withdrawingMoney(temp,balance,cardNum)){//取款成功、更新数据库
JOptionPane.showMessageDialog(null,"取款成功");
this.setNull();
}
else{
JOptionPane.showMessageDialog(null,"取款失败!
");
this.setNull();
}
}
}
//置空
privatevoidsetNull(){
jWithdrawMoneytxt.setText("");
}
4.4存款模块设计
当用户输入存款金额时,如果输入的不是正确的数字或者整百的金额,会提示用户重新输入;如果用户输入正确,则会提示用户存款成功。
图七存款窗口
/**
*存款
*
*@paramevt
*/
privatevoidjb_confirmActionPerformed(java.awt.event.ActionEventevt){
//存款金额
intmoney;
if(this.jDisposeMoneytxt.getText().isEmpty()){
money=0;
}elseif(!
InputJudge.isFigure(jDisposeMoneytxt.getText())){
JOptionPane.showMessageDialog(null,"请输入正确的金额!
");
setNull();
return;
}
else{
money=Integer.parseInt(this.jDisposeMoneytxt.getText());
}
intbalance=this.queryBalance();
StringcardNum=users.get(0).getCardNum();
inttemp=money/100*100;
if(temp<=0){
JOptionPane.showMessageDialog(null,"请输入正确的金额");
setNull();
}else{
if(generalUser.depositMoney(temp,balance,cardNum)){
JOptionPane.showMessageDialog(null,"存款成功");
setNull();
}else{
JOptionPane.showMessageDialog(null,"存款失败");
setNull();
}
}
}
privatevoidsetNull(){
this.jDisposeMoneytxt.setText("");
}
4.5修改密码模块设计
考虑到银行卡密码为6为数字,用户输入的金额必须为6为数字,否则提示密码格式不正确;另外,用户需要两次输入新密码,且两次要匹配,否则会提示用户两次密码不一致,请重新输入,然后再重新回到修改密码的界面。
在修改密码时用到的方法为:
图八用户修改密码窗口
/**
*修改密码
*/
privatevoidjb_confirmActionPerformed(java.awt.event.ActionEventevt){
//获取两次密码
StringpasswordOne=newString(jPasswordOne.getPassword());
StringpasswordTwo=newString(jPasswordTwo.getPassword());
//获取卡号
StringcardNum=users.get(0).getCardNum();
if(StrUtil.isEmpty(passwordOne)||StrUtil.isEmpty(passwordTwo)){//判断两次密码是否为空
JOptionPane.showMessageDialog(null,"密码不能为空");
setNull();
return;
//判断密码是否是六位数字
}elseif(!
(InputJudge.isPassword(passwordOne))||!
(InputJudge.isPassword(passwordTwo))){
JOptionPane.showMessageDialog(null,"密码由6位阿拉伯数字组成");
setNull();
return;
}
//判断两次密码是否一致
elseif(!
StrUtil.isEqual(passwordOne,passwordTwo)){
JOptionPane.showMessageDialog(null,"两次密码输入不一致!
");
setNull();
return;
//修改密码成功,更新数据库
}elseif(generalUser
.changePassword(passwordOne,passwordTwo,cardNum)){
JOptionPane.showMessageDialog(null,"修改密码成功");
setNull();
this.dispose();
//返回主窗口
GeneralUserFrmgeneralUserFrm=newGeneralUserFrm();
generalUserFrm.setVisible(true);
}else{
JOptionPane.showMessageDialog(null,"修改密码失败");
setNull();
return;
}
}
privatevoidsetNull(){
jPasswordOne.setText("");
jPasswordTwo.setText("");
}
4.6查询余额模块设计
查询余额功能是在主操作窗口中实现的,当用户点击查询余额按钮时在下面的文本框中显示出该账号的当前余额。
图九查询余额窗口
publicQueryBalanceFrm(){
this.users=SaveUserInfo.users;
//获得卡号
intbalance=neralUser.QueryBalance(users.get(0).getCardNum());
initComponents();
this.setLocation(400,200);
this.jBalanceTxt.setText(balance+"");
}
4.7管理员操作模块设计
管理员登录后可以进行的操作有开户、销户等功能。
在开户操作时要先检查新的账户是否已经存在,同时检查新增用户的卡号(12为数字)、密码(6位数字)是否正确;如果密码和余额不填写,默认会添加密码为123456、余额0元。
图十管理员操作窗口
图十一新增用户
/**
*修改密码
*/
privatevoidjb_confirmActionPerformed(java.awt.event.ActionEventevt){
//获取两次密码
StringpasswordOne=newString(jPasswordOne.getPassword());
StringpasswordTwo=newString(jPasswordTwo.getPassword());
//获取卡号
StringcardNum=users.get(0).getCardNum();
if(StrUtil.isEmpty(passwordOne)||StrUtil.isEmpty(passwordTwo)){//判断两次密码是否为空
JOptionPane.showMessageDialog(null,"密码不能为空");
setNull();
return;
//判断密码是否是六位数字
}elseif(!
(InputJudge.isPassword(passwordOne))||!
(InputJudge.isPassword(passwordTwo))){
JOptionPane.showMessageDialog(null,"密码由6位阿拉伯数字组成");
setNull();
return;
}
//判断两次密码是否一致
elseif(!
StrUtil.isEqual(passwordOne,passwordTwo)){
JOptionPane.showMessageDialog(null,"两次密码输入不一致!
");
setNull();
return;
//修改密码成功,更新数据库
}elseif(generalUser
.changePassword(passwordOne,passwordTwo,cardNum)){
JOptionPane.showMessageDialog(null,"修改密码成功");
setNull();
this.dispose();
//返回主窗口
GeneralUserFrmgeneralUserFrm=newGeneralUserFrm();
generalUserFrm.setVisible(true);
}else{
JOptionPane.showMessageDialog(null,"修改密码失败");
setNull();
return;
}
}
图十二销户窗口
/**
*刷新
*@paramevt
*/
privatevoidjb_refreshActionPerformed(java.awt.event.ActionEventevt){
this.fillTable();