资源描述
BAM 银行账户管理系统(银行账户管理系统(ATM 管理系统)管理系统)本系统采用 JAVA 语言并在 eclipse 环境下编写测试完成,涉及类的概念,以及面向对象的几大特性(继承,封装,多态,抽象),也有异常处理机制,采用集合(更好)存储账户数据,基本可以满足大多数 BAM 系统的相关实现,且代码内标注大量注释,读者可以很轻松地理解相关逻辑,大家可以开心参考。系统简介:系统简介:特点:采用窗口界面风格,而不是传统的命令行、控制台运作模式特点:采用窗口界面风格,而不是传统的命令行、控制台运作模式1、JAVA 类的面相对象的应用,拥有异常处理机制,不会因为输入错误而导致程序崩溃2、主要有 7 个类,即Account(账户类)SaveAccount(储蓄账户类):不能透支CreditAccount(信用账户类):可以透支Bank(银行类)ATMOpenAccountFrame(开户窗口页面)ATMLoginFrame(登录窗口页面)ATMMainFrame(操作窗口页面)带有完善的相关信息提示弹出窗口带有完善的相关信息提示弹出窗口 见下面截图见下面截图 类的具体属性级行为见代码 3、各个类之间的相互关系,涉及继承、封装、多态、抽象,在多态中又涉及重载和重 写,请读者注意相关联系(关注注释)4、可以实现数据保存功能,数据将保存在文件中(即当你注册了一个账户,下次再登 陆系统时,可以实现与上次最后的操作相衔接)5、账户号自动生成,比较符合现实 6、主要功能有:1.开户 2.查询账户余额 3.存款 4.取款 5.转账(一个账户到另一个账户)等 7、运行时界面简示1.1.初始界面(账户登录)初始界面(账户登录)2.账户登录后界面账户登录后界面 3.相关信息提示一览(只列举一部分)相关信息提示一览(只列举一部分)1、查询:2、存款:3、取款:4、转账:4、用户开户界面:、用户开户界面:注意事项:注意事项:1、本系统采用的编程环境是 JDK1.7,jer7。所以,运行代码需要保持电脑上所装的JDK 为 1.7 以上版本,如有报错,只需换个高一点的版本即可。注意:第一次装 JDK,要配置环境变量(请查阅相关资料,比较简单)2、本系统代码涉及到包,所以如果报名不一致就会报错,解决方法:修改一下包名即可3、建议把各个类写在同一个包下面,且每一个类单独写一个 java 文件,如下图: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 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.accountType=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)this.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;public void setBalance(double balance)this.balance=balance;/*存款存款*/public void deposit(double money)balance+=money;/*取款(取款方式由账户类型决定,所以设为抽象方法,相应的取款(取款方式由账户类型决定,所以设为抽象方法,相应的 Account 类应设为类应设为抽象类)抽象类)*/public abstract void withdraw(double money);SavingAccount 类类package com.qx;import javax.swing.JOptionPane;/*储蓄账户类储蓄账户类*/public class SavingAccount extends Account/构造函数构造函数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(对不起,账户余额不足!对不起,账户余额不足!);*/JOptionPane.showMessageDialog(null,对不起,账户余额不足!对不起,账户余额不足!,信息提示信息提示,JOptionPane.ERROR_MESSAGE);elsebalance-=money;CresitAccount 类类package com.qx;import javax.swing.JOptionPane;/*信用账户类,增加一个信用额度信用账户类,增加一个信用额度ceiling属性属性*/public class CreditAccount extends Accountprivate int ceiling;/构造函数构造函数public CreditAccount()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 ceiling)this.ceiling=ceiling;/实现父类的实现父类的withdraw()public void withdraw(double money)if(balance+ceiling)money)/*System.out.println(对不起,已超出您的信用额度!对不起,已超出您的信用额度!);*/JOptionPane.showMessageDialog(null,对不起,已超出您的信用对不起,已超出您的信用额度!额度!,信息提示信息提示,JOptionPane.ERROR_MESSAGE);elsebalance-=money;Bank 类类package com.qx;import java.io.BufferedReader;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 javax.swing.JOptionPane;/*Bank 类*编写 Bank 类,属性:1.当前所有的账户对象的集合,存放在数组中2.当前账户数量方法:1.用户开户,需要的参数:id,密码,密码确认,姓名,身份证号码,账户类型,返回新创建的 Account对象的账号,提示:用 s1.equals(s2)可以比较 s1,s2 两个字符串的值是否相等.账户类型是一个整数,为 0 的时候表示储蓄账户,为 1 的时候表示信用账户2.用户登录,参数:id,密码 返回登录账户的账号3.用户存款,参数:id,存款数额,返回 void4.用户取款,参数:id,取款数额,返回 void5.查询余额,参数:id,返回该账户的余额 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;BufferedReader 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 SavingAccount(Long.parseLong(str0),str1.toString(),str2.toString(),str3.toString(),str4.toString(),Double.parseDouble(str5);accountsList.add(savingAcc);elseAccount creditAcc=new CreditAccount(Long.parseLong(str0),str1.toString(),str2.toString(),str3.toString(),str4.toString(),Double.parseDouble(str5),5000);accountsList.add(creditAcc);number+;id+;s=bufReader.readLine();catch(NumberFormatException e)/TODO Auto-generated catch blocke.printStackTrace();catch(FileNotFoundException e)/TODO Auto-generated catch blocke.printStackTrace();catch(IOException e)/TODO Auto-generated catch blocke.printStackTrace();finallytry if(bufReader!=null)bufReader.close();catch(IOException e)/TODO Auto-generated catch blocke.printStackTrace();/getXxx,setXxxpublic List getAccounts()return accountsList;public void setAccounts(List accounts)this.accountsList=accounts;public int getNumber()return number;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.equals(passwd2)/若一致,再判断账户类型(根据 type 的值)if(type.equals(1)/可令开始余额为 10,信用额度为 5000account=new CreditAccount(id,passwd1,name,personId,type,10,5000);elseaccount=new SavingAccount(id,passwd1,name,personId,type,10);/将账户存入账户集合 accountsList 中accountsList.add(account);JOptionPane.showMessageDialog(null,开户成功!,信息提示,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;/此时开户成功elseJOptionPane.showMessageDialog(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(new File(path,account.txt);for(Iterator iterator=accountsList.iterator();iterator.hasNext();)/若存在账户Account acc=(Account)iterator.next();/写入账户信息到 account.txtbufWriter.write(acc.id+,);bufWriter.write(acc.getPassword()+,);bufWriter.write(acc.getName()+,);bufWriter.write(acc.getPersonId()+,);bufWriter.write(acc.getAccountType()+,);bufWriter.write(Double.toString(acc.getBalance();bufWriter.newLine();bufWriter.flush();/清空缓存中的内容 catch(IOException e)/TODO Auto-generated catch blocke.printStackTrace();finallytry if(bufWriter!=null)bufWriter.close();catch(IOException e)/TODO Auto-generated catch blocke.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.getPassword()account=acc;break;elsebreak;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=acc;break;elsebreak;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(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;import javax.swing.JLabel;import javax.swing.JOptionPane;import javax.swing.JPanel;import javax.swing.JTextField;public class ATMLoginFrame extends JFrameprivate JLabel jblCardNo,jblPasswd;private JTextField jtfCardNo,jtfPasswd;private JButton jbOk,jbCancel,jbOpenAccount;private JPanel jp1,jp2,jp3,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 JPanel();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);/取消默认管理器,设置为 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);/不能最大化/使用匿名内部类给 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.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););jbOpenAccount.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 java.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.JOptionPane;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 Bank 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();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=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);/使用匿名内部类给查询按钮注册监听器jbQuery.addActionListener(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(余额:+account.getBalance(););/给取款按钮注册监听器jbWithdraw.addActionListener(new ActionListener()public void actionPerformed(ActionEvent arg0)String s=JOptionPane.showInputDialog(请输入取款金额:);double money=Double.parseDouble(s.equals()?0:s);bank.withdraw(account,money);/*JOptionPane.showMessageDialog(null,取款成功!,信息提示,JOptionPane.INFORMATION_MESSAGE);*/jblName=new JLabel(账户姓名:+account.getName();jblMsg.setText(余额:+account.getBalance(););/给转账按钮注册监听器jbTransfer.addActionListener(new ActionListener()public void actionPerformed(ActionEvent e)String sId=JOptionPane.showInputDialog(请输入要转账的卡号:);long id2=Long.parseLong(sId);Account account2=bank.verifyAccount(id2);if(account2!=null)String sNum=JOptionPane.showInputDialog(请输入您要转入账户的金额:);double money=Double.parseDouble(sNum.equals()?0:sNum);if(money=account.balance)bank.transferAccount(account,account2,money);JOptionPane.showMessageDialog(null,转账成功!,信息提示,JOptionPane.INFORMATION_MESSAGE);elseJOptionPane.showMessageDialog(null,抱歉,您账户没有足够的金额!请查看后重新选择输入!,信息提示,JOptionPane.ERROR_MESSAGE);elseJOptionPane.showMessageDialog(null,抱歉,没有找到您要转入的账户信息!请核对后重新选择输入!,信息提示,JOptionPane.ERROR_MESSAGE);jblName=new JLabel(账户姓名:+account.getName();jblMsg.setText(余额:+account.getBalance(););/给退卡按钮注册监听器jbCancel.addActionListener(new ActionListener()public void actionPerformed(ActionEvent e)bank.saveAccountDate();dispose();/关闭窗口);ATMOpenAccountFrame 类类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;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swing.JTextField;public class ATMOpenAccountFrame extends JFrameprivate JLabel jlOpenPasswd1,jlOpenPasswd2,jlName,jlPersonId,jlType;private JTextField jtOpenPasswd1,jtOpenPasswd2,jtName,jtPersonId,jtType;private JButton jbOK;private JPanel jp1,jp2,jp3,jp4,jp5,jp6;private Bank bank;public ATMOpenAccountFrame()bank=new Bank();/实例化所有组件jlOpenPasswd1=new JLabel(账户密码:);jlOpenPasswd2=new JLabel(确认密码:);jlName=new JLabel(账户姓名:);jlPersonId=new JLabel(身份证号:);jlType=new JLabel(账户类型(0.储蓄 1.信用):);jtOpenPasswd1=new JTextField(20);jtOpenPasswd2=new JTextField(20);jtName=new JTextField(2
展开阅读全文