ATM网络编程CS课程设计报告.docx
《ATM网络编程CS课程设计报告.docx》由会员分享,可在线阅读,更多相关《ATM网络编程CS课程设计报告.docx(47页珍藏版)》请在冰豆网上搜索。
ATM网络编程CS课程设计报告
《C/S项目实训》课程设计报告
组别
:
学生姓名
学号
:
学生姓名
:
学号
:
学生姓名
:
学号
:
专业班级
:
题目
:
模拟ATM机网络编程
指导教师
:
年月日
摘要
本ATM系统的目的就是建立一个客户平台,用户使用此平台除了可以进行查询余额、存款、取款、转账、修改密码等基本业务办理,还可以进行查询明细,定期存款等ATM取款系统的针对的用户群是使用此软件系统的用户,用户做为系统的服务群体,可以使用数据库已有的账号与密码,登陆ATM系统。
当用户成功登陆后就可以根据用户的需求进行各项业务的办理,办理完所有的手续后,用户的输入的新资料以及办理的业务处理后的信息都会反馈到数据库并且都会存入到数据库中。
这样用户就完成了办理业务。
关键词:
ATM数据库客户端服务器端
第一章引言
选题背景及意义
随着信息时代科技的飞速发展,使用ATM取款机、计算机等技术的发展,不仅提高了工作效率,而且大大的提高了其安全性。
对于一些复杂的信息,就能够充分的发挥它们的优越性。
本系统就是为了更方便人们的生活而设计的。
ATM系统作为一款数据传输的技术,用户信息和资金信息的繁杂,包含很多的数据的管理,以前的都是由一些柜员进行操作,而且手续很多。
对于ATM取款系统数据的统计和核实等都是采用卡号进行核对的,对于用户的信息资料、以及等用人工办理。
数据信息处理工作量大,繁琐。
数据处理手工操作,工作量大,工作时需实时认真办理,一但出现错误将带来很大的损失。
由于信息一定要准确真实,认真的进行各项核对工作,工作人员和管理员也只是当时对它比较清楚,时间一长,如再要进行查询,就得在众多的资料中翻阅、查找了,造成查询费时、费力。
针对这一系列问题,我们设计了这一个系统,使得用户可以安全的进行操作,可以便捷、快速的进行取款、存款、修改密码、查询余额、查询交易明细、挂失、开户以及完成一些商业上的交易,如转账,大大地提高了办公效率,能够及时、准确、有效的帮用户办理各种繁琐的手续。
第二章系统分析
2.1需求分析
2.1.1总体需求
开发一款系统软件,此软件运行于银行的ATM机器上,可以供用户使用,完成用户的经济交易,使得用户不需要专门到银行去办理业务,只需要到相关银行的ATM机器上操作即可。
银行可以节约人力资源,不需要为每个客户人工服务。
2.1.2 具体事务
用户:
用户存钱,用户取钱,用户转账,用户查询账户信息,用户修改个人设置,用户查看个人交易记录。
ATM机器:
与用户交互界面,帮助提示信息,用户需要操作实现,用户操作纪录记录,与数据库实时同步。
2.2功能分析
实现ATM的基本功能,包括:
查询余额、取款、存款、改密码、转账等基本功能;查询余额:
连接数据库,根据正确的用户名与密码登陆查询对应的余额;取款、存款:
存款与取款的金额必需为100的整数倍,且每次操作不大于3000元,成功修改后,更新对应数据库的内容;修改密码:
只有旧密码正确,新密码符合要求,且两次输入相同的情况下才可以成功修改密码;转账:
每次转账的金额必需小于余额,只有输入的转账账号两次都相同的情况下,才可以成功转账; 用数据库(或文件)保存当前用户的用户卡号、密码、姓名、余额
2.3主要难点
ATM取款系统是面向特定对象群是在此软件系统开户办理的用户,所以用户进入开户办理时的资料都需要严格核查,用户登陆系统后,应该能根据自己的需要进行各项业务的办理。
鉴于软件系统使用环境一般在网络上或银行门口装置机械,为了考虑到软件的安全性,对于每个用户来说,系统的安全性直接影响着自身的利益,同时也有可能也使用此软件的银行带来很的损失。
特别是网络环境,到处伴随着危险,ATM取款系统针对这一用户群,采取一些有效的措施,登陆后用户办理完的业务信息反馈到客户端数据库里,做好防止信息被拦截工作。
2.4开发工具与环境
2.4.1开发工具
•开发语言:
Java、SQL
•数据库:
MySql5.5
•操作系统:
Windows8.0
2.4.2开发环境
•硬件方面:
个人计算机
•软件方面:
Myeclipse7.0
第三章概要设计
3.1设计思想
本ATM系统需要满足用户的需求,即可以进行各项业务的办理。
用户可以根据数据库中正确的卡号和密码登录到系统,登录成功后可进行操作,所有的数据都要从数据库中获取,当数据被修改后,则必须改变数据库中,相应账号中的数据,如存款后,则要更新相应账号中的余额;而修改密码后,则要更新相应账号中的密码信息,原来的密码就不能使用
3.2数据库设计
数据库选择了Access2003的数据库作为后台,创建了客户的信息表,然后通过配置ODBC数据源,加载JDBC驱动程序,引用java.sql包来创建数据库连接,然后在程序中执行SQL语句来对数据进行读取和修改。
数据库表如下图:
3.2.1管理员表
3.2.2用户表
3.2.3用户信息表
3.2.4定期存款表
3.3功能模块划分
本系统可以划分为如下功能模块:
登录、开户、销户、挂失、解挂、修改密码、查询、取款、存款、转账等模块。
第四章详细设计
4.1总设计流图
4.2登录设计
(1)实现效果:
(2)关键代码如下:
publicvoidactionPerformed(ActionEvente){
//TODOAuto-generatedmethodstub
if(e.getSource()==btOk){
//提取账号和密码
Stringaccount=tfAccount.getText();
Stringpwd=newString(pfPwd.getPassword());
//发送连接请求
Sockets;
try{
s=newSocket(InetAddress.getByName("127.0.0.1"),8090);
InputStreamips=s.getInputStream();
OutputStreamops=s.getOutputStream();
BufferedReaderbr=newBufferedReader(newInputStreamReader(ips));
PrintWriterpw=newPrintWriter(ops);
//发送消息头
pw.write("Login\r\n");
pw.flush();
//发送账号密码
pw.write(account+"\r\n");
pw.write(pwd+"\r\n");
pw.flush();
//接收服务器响应
Stringecho=br.readLine();
if(echo.equals("1")){//账号有误
JOptionPane.showMessageDialog(Login.this,"账号有误!
");
tfAccount.setText("");
pfPwd.setText("");
}
if(echo.equals("2")){//账号和密码都正确
//接收卡的基本信息,并且创建一个card类
floatmoney=Float.parseFloat(br.readLine());
booleanbool=Boolean.parseBoolean(br.readLine());
Stringname=br.readLine();
Stringsex=br.readLine();
intage=Integer.parseInt(br.readLine());
Stringid=br.readLine();
Stringphone=br.readLine();
//并且创建一个card类
currCard=newCard(account,name,sex,age,id,pwd,phone,money,bool);
//接收判断卡号是不是可以用的bool变量
Stringstr=br.readLine();
if(str.equals("ok")){//用户处于正常状态
newBasic(br,pw,currCard).init();
Login.this.dispose();
}elseif(str.equals("error")){//密码错误三次
inti=JOptionPane.showConfirmDialog(null,"该账户已被冻结,是否解冻?
","提示!
",
JOptionPane.YES_NO_OPTION);
if(i==JOptionPane.OK_OPTION){
newJieGua(br,pw,currCard).init();
Login.this.dispose();
}else{
tfAccount.setText("");
pfPwd.setText("");
}
}
}elseif(echo.equals("3")){//密码错误
JOptionPane.showMessageDialog(Login.this,"您输入的密码有误!
");
tfAccount.setText("");
pfPwd.setText("");
}elseif(echo.equals("4")){//密码错误三次
JOptionPane.showMessageDialog(Login.this,"您输入的密码已错误3次,即将吞卡!
");
System.exit(0);
}
}catch(IOExceptione1){
e1.printStackTrace();
}
}elseif(e.getSource()==btCancel){
tfAccount.setText("");
pfPwd.setText("");
}elseif(e.getSource()==a){
//newtogerther().init();
this.dispose();
}elseif(e.getSource()==adduser){
Sockets;
try{
s=newSocket(InetAddress.getByName("127.0.0.1"),8090);
InputStreamips=s.getInputStream();
OutputStreamops=s.getOutputStream();
BufferedReaderbr=newBufferedReader(newInputStreamReader(ips));
PrintWriterpw=newPrintWriter(ops);
newAddUser(br,pw).init();
this.setVisible(false);
}catch(UnknownHostExceptione1){
//TODOAuto-generatedcatchblock
e1.printStackTrace();
}catch(IOExceptione1){
//TODOAuto-generatedcatchblock
e1.printStackTrace();}
}
4.3开户设计
(1)实现效果:
(2)关键代码如下:
publicvoidactionPerformed(ActionEventarg0){
//TODOAuto-generatedmethodstub
booleanflag2=true;
Stringname=newString(tfname.getText());
Stringaccount=newString(tfaccount.getText());
Stringonepwd=newString(pffirstpwd.getPassword());
Stringtwopwd=newString(pfsecondpwd.getPassword());
Stringidcard=newString(tfidcard.getText());
Stringphone=newString(tfphone.getText());
jb.addItemListener(newItemListener(){
@Override
publicvoiditemStateChanged(ItemEventarg0){
//TODOAuto-generatedmethodstub
}
});
if(onepwd.equals("")&&idcard.equals("")&&name.equals("")
&&phone.equals("")){
JOptionPane.showMessageDialog(AddUser.this,"请认真填写个人信息!
");
}else{
if(!
onepwd.equals(twopwd)){
JOptionPane.showMessageDialog(AddUser.this,"两次输入的密码不一致!
");
}else{
JOptionPane.showMessageDialog(AddUser.this,sex);
//newLogin().init();
//AddUser.this.dispose();
}
}
}
try{
pstmt=conn.prepareStatement(sql);
pstmt.setString(1,transAccount);
rs=pstmt.executeQuery();
if(rs.next()){
transCard=newCard();
transCard.setName(rs.getString("name"));
transCard.setSex(rs.getString("sex"));
transCard.setAge(rs.getInt("age"));
transCard.setID(rs.getString("id"));
transCard.setPhone(rs.getString("phone"));
}
returntransCard;
}catch(SQLExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
4.4主界面设计
(1)实现效果:
(2)关键代码如下:
publicvoidactionPerformed(ActionEvente){
//TODOAuto-generatedmethodstub
if(e.getSource()==SaveM){
newSaveM(br,pw,currCard).init();}
if(e.getSource()==TakeM){
newTakeM2(br,pw,currCard).init();}
if(e.getSource()==TransM){
newTranM(br,pw,currCard).init();}
if(e.getSource()==QueryM){
newChaXun(br,pw,currCard).init();}
if(e.getSource()==a1){
newMima(br,pw,currCard).init();
this.dispose();}
if(e.getSource()==a2){
JOptionPane.showMessageDialog(Basic.this,"请在30秒内取走你的卡片,否则将会被吞卡");
newLogin().init();
this.setVisible(false);
}
if(e.getSource()==DelUser){
newDelUser(br,pw,currCard).init();
this.setVisible(false);}
if(e.getSource()==GuaShi){
newGuaShi(br,pw,currCard).init();
this.setVisible(false);
}
}
4.5存款设计
(1)实现效果:
(2)关键代码如下:
this.addWindowListener(newWindowAdapter(){
publicvoidwindowClosing(WindowEvente){
pw.write("Logoff\r\n");
pw.flush();
SaveM.this.dispose();
}
});
Imagesimages=newImages();
images.AddImage(this,("image\\3.jpg"));
for(inti=0;i<10;i++){
btNum[i].addActionListener(newActionListener(){
@Override
publicvoidactionPerformed(ActionEvente){
//TODOAuto-generatedmethodstub
Stringstr=e.getActionCommand();
if(!
isNum){
text.setText(str);
isNum=true;
}
else{
text.setText(text.getText()+str);
}
}
});
}
btOk.addActionListener(newActionListener(){
@Override
publicvoidactionPerformed(ActionEvente){
//TODOAuto-generatedmethodstub
//把text里的数据取出来强制转换成int,用k来接受
intk=Integer.parseInt(text.getText());
if(k%100==0){
if(k>3000){
JOptionPane.showMessageDialog(SaveM.this,"对不起,你一次最多只能存入3000元现金!
");
text.setText("");
}else{
pw.write("save\r\n");
pw.write(k+"\r\n");
pw.flush();
Stringstr;
try{
str=br.readLine();
if(str.equals("saveSuccess")){
//更新当前集合数据
currCard.setMoney(currCard.getMoney()+k);
text.setText("");
JOptionPane.showMessageDialog(SaveM.this,"存款成功!
");
}else{
JOptionPane.showMessageDialog(SaveM.this,"存款失败!
");
}
}catch(IOExceptione1){
//TODOAuto-generatedcatchblock
e1.printStackTrace();
}
}
}else{
JOptionPane.showMessageDialog(SaveM.this,"你输入的金额不对!
");
}
}
});
btCancel.addActionListener(newActionListener(){
@Override
publicvoidactionPerformed(ActionEvente){
//TODOAuto-generatedmethodstub
SaveM.this.dispose();
}
});
4.6取款设计
(1)实现界面:
(2)关键代码如下:
publicvoidactionPerformed(ActionEvente){
//TODOAuto-generatedmethodstub
//把text里的数据取出来强制转换成int,用k来接受
intk=Integer.parseInt(text.getText());
if(k==0){
JOptionPane.showMessageDialog(TakeM.this,"警告:
请不要随意操作!
!
");
}
if(currCard.getMoney()>=k){
if(k%100==0){
if(k>3000){
JOptionPane.showMessageDialog(TakeM.this,"对不起,你一次最多只能提取3000元现金!
");
text.setText(""