《ATM管理系统.docx》由会员分享,可在线阅读,更多相关《ATM管理系统.docx(21页珍藏版)》请在三一办公上搜索。
1、ATM管理系统ATM管理系统 引言:本系统采用JAVA语言并在eclipse环境下编写测试完成,涉及类的概念,以及面向对象的几大特性,也有异常处理机制,采用集合存储账户数据,基本可以满足大多数BAM系统的相关实现。JAVA类的面相对象的应用,拥有异常处理机制,不会因为输入错误而导致程序崩溃。本系统各个类之间的相互关系,涉及继承、封装、多态、抽象,在多态中又涉及重载和重写,相关联系请关注代码注释。可以实现数据保存功能,数据将保存在文件中。最后账户号自动生成,比较符合现实。 1、软件需求分析 1.1 市场需求 由于的各方面发展速度的大幅提高,几乎所有的银行都配备了不用繁琐的人工操作的ATM自动取款
2、机。人们可以随时随地进行交易,不再受银行的服务时间的约束,取款时也为人们节省了很多时间,方便快捷。对于配有ATM自动取款机的银行,客户较多,系统需操作方便,信息读取与存储及时快速,方便客户进行自由交易和系统管理员对信息的管理。 1.2 功能需求 软件应包含取款、存款、转账、查询、修改密码等ATM机的主要功能。 2、程序结构 本系统主要有7个类,即 Account SaveAccount:不能透支 CreditAccount:可以透支 Bank ATMOpenAccountFrame ATMLoginFrame ATMMainFrame 注:带有完善的相关信息提示弹出窗口 (见下面截图)类的具体
3、属性级行为见代码 3、功能介绍 主要功能有:1.开户 2.查询账户余额 3.存款 4.取款 5.转账 4、软件设计 7、运行时界面简示 1.初始界面 2.账户登录后界面 3.相关信息提示一览 1、查询: 2、存款: 3、取款: 4、转账: 4、用户开户界面: 注意事项: 1、本系统采用的编程环境是JDK1.7,jer7。所以,运行代码需要保持电脑上所装的JDK为1.7以上版本,如有报错,只需换个高一点的版本即可。注意:第一次装JDK,要配置环境变量 2、本系统代码涉及到包,所以如果报名不一致就会报错,解决方法:修改一下包名即可 3、建议把各个类写在同一个包下面,且每一个类单独写一个java文件
4、,如下图: 4、在运行程序前,需要在项目下面新建一个account.txt文件,并在其中写入至少一个账户信息,否则在初始化的时候会因为找不到账户信息,从而产生异常。 系统源码: Account类 package com.qx; import javax.swing.JOptionPane; /* * 账户类:包含两种账户类型-1.储蓄账户 2.信用账户 */ public abstract class Account /属性 protected long id; protected String password; protected String name; protected String
5、 personId; protected String accountType; protected double balance; /构造方法 public Account super; public Account(long id, String password, String name, String personId, String type,double balance) super; this.id = id; this.password = password; this.name = name; this.personId = personId; this.accountTyp
6、e = type; this.balance = balance; /getXxx,setXxx方法 public long getId return id; public void setId(long id) this.id = id; public String getPassword return password; public void setPassword(String password) this.password = password; public String getName return name; public void setName(String name) t
7、his.name = name; public String getPersonId return personId; public void setPersonId(String personId) this.personId = personId; public String getAccountType return accountType; public void setAccountType(String accountType) this.accountType = accountType; public double getBalance return balance; publ
8、ic void setBalance(double balance) this.balance = balance; /* * 存款 */ public void deposit(double money) balance += money; /* * 取款 */ public abstract void withdraw(double money); SavingAccount类 package com.qx; import javax.swing.JOptionPane; /* * 储蓄账户类 */ public class SavingAccount extends Account /构
9、造函数 public SavingAccount super; public SavingAccount(long id, String password, String name, String personId,String accountType, double balance) super(id, password, name, personId, accountType, balance); /对父类的withdraw实现 public void withdraw(double money) if(balance money) /*System.out.println(对不起,账户余
10、额不足!);*/ JOptionPane.showMessageDialog(null, 对不起,账户余额不足!, 信息提示,JOptionPane.ERROR_MESSAGE); else balance -= money; CreditAccount类 package com.qx; import javax.swing.JOptionPane; /* * 信用账户类,增加一个信用额度ceiling属性 */ public class CreditAccount extends Account private int ceiling; /构造函数 public CreditAccount
11、super; public CreditAccount(long id, String password, String name, String personId,String accountType, double balance, int ceiling) super(id, password, name, personId, accountType, balance); this.ceiling = ceiling; /getXxx,setXxx方法 public int getCeiling return ceiling; public void setCeiling(int cei
12、ling) this.ceiling = ceiling; /实现父类的withdraw public void withdraw(double money) if(balance + ceiling) money) /*System.out.println(对不起,已超出您的信用额度!);*/ JOptionPane.showMessageDialog(null, 对不起,已超出您的信用额度!, 信息提示,JOptionPane.ERROR_MESSAGE); else balance -= money; Bank类 package com.qx; import java.io.Buffer
13、edReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Properties; import java
14、x.swing.JOptionPane; /* * Bank类 * 编写Bank类,属性: 1.当前所有的账户对象的集合,存放在数组中 2.当前账户数量 方法: 1.用户开户,需要的参数:id,密码,密码确认,姓名,身份证号码,账户类型,返回新创建的Account对象的账号, 提示:用s1.equals(s2) 可以比较s1,s2两个字符串的值是否相等.账户类型是一个整数,为0的时候表示储蓄账户,为1的时候表示信用账户 2.用户登录,参数:id,密码 返回登录账户的账号 3.用户存款,参数:id,存款数额,返回void 4.用户取款,参数:id,取款数额,返回void 5.查询余额,参数:id
15、,返回该账户的余额 double 用户会通过调用Bank对象以上的方法来操作自己的账户,请分析各个方法需要的参数 */ public class Bank /*private Account accounts = new Account20;*/ private List accountsList; private int number;/账户数目 private int id = 1001;/确定银行账号从1001开始生成,即第一个账户的账号是1001 /构造函数 public Bank accountsList=new ArrayList; number = 0; BufferedRead
16、er bufReader = null; Properties props=System.getProperties; String path=props.getProperty(user.dir); try bufReader=new BufferedReader(new FileReader(new File(path,account.txt); String s = bufReader.readLine; while(s != null) String str = s.split(,); if(str4.equals(0) Account savingAcc = new SavingAc
17、count(Long.parseLong(str0), str1.toString, str2.toString, str3.toString,str4.toString, Double.parseDouble(str5); accountsList.add(savingAcc); else Account creditAcc = new CreditAccount(Long.parseLong(str0), str1.toString, str2.toString, str3.toString,str4.toString, Double.parseDouble(str5),5000); ac
18、countsList.add(creditAcc); number +; id+; s = bufReader.readLine; catch (NumberFormatException e) / TODO Auto-generated catch block e.printStackTrace; catch (FileNotFoundException e) / TODO Auto-generated catch block e.printStackTrace; catch (IOException e) / TODO Auto-generated catch block e.printS
19、tackTrace; finally try if(bufReader != null) bufReader.close; catch (IOException e) / TODO Auto-generated catch block e.printStackTrace; /getXxx,setXxx public List getAccounts return accountsList; public void setAccounts(List accounts) this.accountsList = accounts; public int getNumber return number
20、; public void setNumber(int number) this.number = number; public int getId return id; public void setId(int id) this.id = id; /* * 开户 */ public Account openAccount(String passwd1, String passwd2, String name, String personId, String type) /创建一个新账户 Account account = null; /判断两次密码是否一致 if(passwd1.equal
21、s(passwd2) /若一致,再判断账户类型 if(type.equals(1) /可令开始余额为10,信用额度为5000 account = new CreditAccount(id, passwd1, name, personId, type, 10, 5000); else account = new SavingAccount(id, passwd1, name, personId, type, 10); /将账户存入账户集合accountsList中 accountsList.add(account); JOptionPane.showMessageDialog(null, 开户成
22、功!,信息提示, JOptionPane.INFORMATION_MESSAGE); JOptionPane.showMessageDialog(null, 您的卡号为:+id+n+ 您的密码为:+passwd1+n+您的户名为:+name+n+ 您的身份证号为:+personId+n+您的账户类型为:+type+n,信息提示, JOptionPane.INFORMATION_MESSAGE); account.accountType = type; number+; id+; return account;/此时开户成功 else JOptionPane.showMessageDialog(
23、null, 对不起!您两次密码输入不匹配,开户失败!, 信息提示,JOptionPane.ERROR_MESSAGE); return null;/此时开户失败 /* * 保存数据 */ public void saveAccountDate BufferedWriter bufWriter=null; try Properties props=System.getProperties; String path=props.getProperty(user.dir); String s = null; bufWriter=new BufferedWriter(new FileWriter(ne
24、w File(path,account.txt); for(Iterator iterator = accountsList.iterator;iterator.hasNext;) /若存在账户 Account acc = (Account) iterator.next; /写入账户信息到account.txt bufWriter.write(acc.id+,); bufWriter.write(acc.getPassword+,); bufWriter.write(acc.getName+,); /* bufWriter.write(acc.getPersonId+,); bufWriter
25、.write(acc.getAccountType+,); bufWriter.write(Double.toString(acc.getBalance); bufWriter.newLine; bufWriter.flush;/清空缓存中的内容 catch (IOException e) / TODO Auto-generated catch block e.printStackTrace; finally try if(bufWriter!=null) bufWriter.close; catch (IOException e) / TODO Auto-generated catch bl
26、ock e.printStackTrace; * 登录验证 */ public Account verifyAccount(long id, String password) Account account = null; Account acc = null; for(Iterator iterator = accountsList.iterator; iterator.hasNext;) /若存在账户 acc = (Account) iterator.next; if (acc != null) if (id = acc.getId & password.equals(acc.getPas
27、sword) account = acc; break; else break; return account; /* * 转账验证 */ public Account verifyAccount(long id) Account account = null; Account acc = null; for(Iterator iterator = accountsList.iterator; iterator.hasNext;) /若存在账户 acc = (Account) iterator.next; if (acc != null) if (id = acc.getId) account
28、 = acc; break; else break; return account; /* * 转账 */ public void transferAccount(Account account1, Account account2, double money) account1.withdraw(money); account2.deposit(money); /* * 存款 */ public void deposit(Account account, double money) account.deposit(money); /* * 取款 */ public void withdraw
29、(Account account, double money) account.withdraw(money); ATMLoginFrame类 package com.qx; import java.awt.Dimension; import java.awt.GridLayout; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; impo
30、rt javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTextField; public class ATMLoginFrame extends JFrame private JLabel jblCardNo,jblPasswd; private JTextField jtfCardNo,jtfPasswd; private JButton jbOk,jbCancel,jbOpenAccount; private JPanel jp1,jp2,j
31、p3,jp4; private Bank bank; public ATMLoginFrame bank=new Bank; /实例化所有组件 jblCardNo=new JLabel(用户名:); jblPasswd=new JLabel(密 码:); jtfCardNo=new JTextField(20); jtfPasswd=new JTextField(20); jbOk=new JButton(确定); jbCancel=new JButton(取消); jbOpenAccount=new JButton(没有账户,开户); jp1=new JPanel; jp2=new JPan
32、el; jp3=new JPanel; jp4=new JPanel; 出 jp1.add(jblCardNo); jp1.add(jtfCardNo); jp2.add(jblPasswd); jp2.add(jtfPasswd); jp3.add(jbOk); jp3.add(jbCancel); jp4.add(jbOpenAccount); /将每行逐行添加到frame中 this.add(jp1); this.add(jp2); this.add(jp3); this.add(jp4); this.setLayout(new GridLayout(4, 1);/取消默认管理器,设置为
33、3行1列的网格布局 Dimension d=Toolkit.getDefaultToolkit.getScreenSize; this.setTitle(登陆界面); this.setBounds(d.width-300)/2, (d.height-200)/2, 300, 200); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);/设置关闭窗口时JVM同时推this.pack;/调整窗口至能容纳组件的最小尺寸 this.setVisible(true);/设置窗口可见 this.setResizable(false);/不能最大化 /
34、使用匿名内部类给2个按钮注册监听器 jbCancel.addActionListener( new ActionListener public void actionPerformed(ActionEvent e) dispose;/关闭窗口 ); jbOk.addActionListener( new ActionListener public void actionPerformed(ActionEvent e) /取出用户界面输入的用户名和密码 long cardNo=Integer.parseInt(jtfCardNo.getText); String passwd=jtfPasswd
35、.getText; /调用Bank的相关方法将二者与正确的做比对 Account account=bank.verifyAccount(cardNo, passwd); if(account!=null)/假如正确,进入操作界面 ATMMainFrame mainFrame=new ATMMainFrame(bank,account);/进入操作界面 dispose;/关闭登陆界面 else/假如错误,使用对话框提示错误信息 JOptionPane.showMessageDialog(null, 卡号或密码错误, 信息提示,JOptionPane.ERROR_MESSAGE); ); jbOp
36、enAccount.addActionListener( new ActionListener public void actionPerformed(ActionEvent arg0) ATMOpenAccountFrame openFram=new ATMOpenAccountFrame; dispose;/关闭登陆界面 ); /* * param args */ public static void main(String args) ATMLoginFrame atm=new ATMLoginFrame; ATMMainFrame类 package com.qx; import jav
37、a.awt.Dimension; import java.awt.FlowLayout; import java.awt.GridLayout; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Scanner; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JO
38、ptionPane; import javax.swing.JPanel; public class ATMMainFrame extends JFrame private Account account; private Bank bank; private JButton jbDeposit,jbWithdraw,jbCancel,jbQuery,jbTransfer; private JLabel jblMsg,jblName; private JPanel jp1,jp2,jp3,jp4; /* * param args */ public ATMMainFrame(final Ban
39、k bank,Account tmpA) this.account=tmpA; this.bank=bank; jbQuery=new JButton(查询); jbDeposit=new JButton(存款); jbWithdraw=new JButton(取款); jbTransfer=new JButton(转账); jbCancel=new JButton(退卡); jblName=new JLabel(账户姓名: +account.getName); jblMsg=new JLabel; jp1=new JPanel; jp2=new JPanel; jp3=new JPanel;
40、 jp4=new JPanel; jp1.add(jbQuery); jp1.add(jbDeposit); jp2.add(jbWithdraw); jp2.add(jbTransfer); jp3.add(jbCancel); jp4.add(jblName); jp4.add(jblMsg); /将每行逐行添加到frame中 this.add(jp1); this.add(jp2); this.add(jp3); this.add(jp4); 出 this.setLayout(new GridLayout(4, 1);/取消默认管理器,设置为4行1列的网格布局 Dimension d=T
41、oolkit.getDefaultToolkit.getScreenSize; this.setTitle(操作界面); this.setBounds(d.width-300)/2, (d.height-200)/2, 300, 200); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);/设置关闭窗口时JVM同时推/this.pack;/调整窗口至能容纳组件的最小尺寸 this.setVisible(true);/设置窗口可见 this.setResizable(false); /使用匿名内部类给查询按钮注册监听器 jbQuery.ad
42、dActionListener( new ActionListener public void actionPerformed(ActionEvent e) JOptionPane.showMessageDialog(null, 您账户的当前余额为:+account.getBalance, 信息提示,JOptionPane.INFORMATION_MESSAGE); ); /给存款按钮注册监听器 jbDeposit.addActionListener( new ActionListener public void actionPerformed(ActionEvent arg0) ); String s= JOptionPane.showInputDialog(请输入存款金额:); double money=Double.parseDouble(s.equals()?0:s); bank.deposit(account, money); JOptionPane.showMessageDialog(null, 存款成功!,信息提示, JOptionPane.INFORMATION_MESSAGE); jblName=new JLabel(账户姓名: +account.getName); jblMsg.setText(余额: +ac