首页 > 代码库 > 模拟银行自动终端系统

模拟银行自动终端系统

本系统模拟银行用户使用ATM机开户、查询、存款、取款功能,要求使用java语言编程实现。

二. 项目功能要求: 

项目开始运行显示主菜单为:  

 

银行自助终端系统 

****************************  

0.------开户

1.------查询  

2.------存款  

3.------取款  

4.------退出 

**************************** 

请选择你要执行的功能: 

此时,用户可以通过键盘输入选择自己要实现的功能,如果输入不是0,1,2,3,4,则系统提示: 

你选择的菜单不存在!

请重新选择: 

要求用户重新输入数据进行菜单选择!  

 

当用户输入0时,则进入查询功能:系统提示: 

**************************** 

你选择的为开户功能 

请输入你的姓名: 

此时用户需要输入姓名,输入完毕后系统提示:

请输入你的身份证号: 

此时用户需要输入18位身份证号,输入完毕如果验证未通过要求继续输入,直到验证通过后系统提示:

请输入你的密码: 

此时用户需要输入6位纯数字密码,输入完毕如果验证未通过要求继续输入,验证通过后系统提示:

开户成功,谢谢使用! 

 

银行自助终端系统 

****************************  

0.------开户

1.------查询  

2.------存款  

3.------取款  

4.------退出 

**************************** 

请选择你要执行的功能: 

 

当用户输入1时,则进入查询功能:系统提示: 

**************************** 

你选择的为查询功能 

请输入你要查询的卡号: 

此时用户需要输入查询的卡号,系统对卡号进行检测,如果卡号不存在,则提示: 你输入的卡号不存在,请重新输入: 

请输入你要查询的卡号:

要求重新输入卡号,当用户输入正确卡号后,则提示:

请输入你的密码: 

此时用户需要输入6位纯数字密码,输入完毕如果验证未通过要求继续输入(最多3次),验证通过后系统将显示当前用户账号信息并进入主菜单:

你查询的账号信息为: 

****************************** 

姓名  身份证号    卡号   金额 

张三丰 420106198410112062 111111   12800.0  

 

银行自助终端系统 

****************************  

0.------开户

1.------查询  

2.------存款  

3.------取款  

4.------退出 

**************************** 

请选择你要执行的功能: 

 

当用户输入2时,则进入存款功能:系统提示: 

**************************** 

你选择的为存款功能 

请输入你要存款的卡号: 

此时用户需要输入存款的卡号,系统对卡号进行检测,如果卡号不存在,则提示: 

你输入的卡号不存在,请重新输入: 

请输入你要存款的卡号: 

要求重新输入卡号,当用户输入正确卡号后,则提示:

请输入你的密码: 

此时用户需要输入6位纯数字密码,输入完毕如果验证未通过要求继续输入(最多3次),验证通过后系统将显示当前用户账号信息并进入主菜单: 

你要存款的账号信息为: 

****************************** 

姓名  身份证号     卡号  金额 

张三丰 420106198410112062 111111  12800.0 

请输入你要存入的金额: 

此时要求用户输入存款金额,系统对金额进行判断,如果输入的数据小于等于0,则提示: 

你输入的数据无效,系统将自动退出!谢谢使用  

 

银行自助终端系统 

****************************  

0.------开户

1.------查询  

2.------存款  

3.------取款  

4.------退出 

**************************** 

请选择你要执行的功能: 

如果用户输入数据合法,系统提示存款成功,并回到主菜单: 

存款成功,谢谢使用!  

 

银行自助终端系统 

****************************  

0.------开户

1.------查询  

2.------存款 

3.------取款  

4.------退出 

**************************** 

请选择你要执行的功能: 

数据将存入用户账号,如果用户再次进行数据查询,则能看到已经改变后的账户金额。 (说明:本系统使用文件进行数据存储,因此如果用户重新启动程序,数据将从文件中读取重新初始化到内存!此功能选做,可参考对象的序列化和反序列化或JSON) 

 

当用户输入3时,则进入取款功能:系统提示: 

**************************** 

你选择的为取款功能 请输入你要取款的卡号: 

此时用户需要输入取款的卡号,系统对卡号进行检测,如果卡号不存在,则提示: 

你输入的卡号不存在,请重新输入: 

请输入你要取款的卡号: 

要求重新输入卡号,当用户输入正确卡号后,则提示:

请输入你的密码: 

此时用户需要输入6位纯数字密码,输入完毕如果验证未通过要求继续输入(最多3次),验证通过后系统将显示当前用户账号信息并进入主菜单: 

你要取款的账号信息为: 

****************************** 

姓名  身份证号     卡号  金额 

张三丰420106198410112062  111111  12800.0 

请输入你要取款的金额: 

此时要求用户输入取款金额,系统对金额进行判断,如果输入的数据小于0或大于账号总金额,则提示: 

你输入的数据无效,系统将自动退出!谢谢使用  

 

银行自助终端系统 

****************************  

0.------开户

1.------查询  

2.------存款  

3.------取款  

4.------退出 

**************************** 

请选择你要执行的功能: 

如果用户输入数据合法,系统提示取款成功,并回到主菜单: 

取款成功,谢谢使用!  

 

银行自助终端系统 

****************************  

0.------开户

1.------查询  

2.------存款  

3.------取款  

4.------退出 

**************************** 

请选择你要执行的功能: 

数据将从用户账号扣出,如果用户再次进行数据查询,则能看到已经改变后的账户金额。

 

当用户输入4时,系统将退出。

 

三.设计要求

(一)包一:com.bank.unionpay 表示银联,在该包下添加:

1. 表示银行卡的接口,包含查询余额,存款,取款等抽象方法。

2. 表示ATM机的抽象类,使用银行卡类型的对象作为参数,实现查询余额,存款,取款等实例方法,添加开户为抽象方法。

3. 表示四大银行的枚举类型:包含ABC,ICBC,CCB,BOC;分别代表农行,工行,建行,中行。

 

(二)包二:com.bank.abc 表示农行,在该包下添加:

1. 以单例模式定义银行类,包含属性:银行类型(枚举类型,常量=ABC),银行名称(String),银行卡列表(集合)等。

2. 定义银行卡的实现类-储蓄卡,包含属性:银行类型(枚举类型=ABC),姓名,身份证号,卡号,密码,余额;实现查询余额,存款,取款等方法。

3. 定义ATM机的子类,包含属性:银行类型(枚举类型,常量=ABC),实现开户方法,其中:只能开办储蓄卡,卡号为6位随机数字,自动产生。新开户的银行卡添加到银行的银行卡列表中。

4. 定义储蓄卡的子类-信用卡,增加属性:透支额度,重写取款方法,控制最大取款金额不能大于余额+透支额度的和。

 

(三)包三:com.bank.test 表示测试,在该包下添加带main方法的测试类,实现项目要求的模拟ATM机的功能。

 

以下功能选做:

以单态模式实现工商银行,在测试类中默认添加多张银行卡,在农行的ATM机上实现跨行查询和存取款功能。

package com.bank.unionpay;public abstract class Atm {        //成员变量    private Card card;        //成员方法    public abstract String kaihu();}package com.bank.unionpay;//定义接口类型的cardpublic interface Card {                //抽象方法    void cunkuan(double cun);        void qukuan(double qu);        void chaxunyue();}package com.bank.unionpay;public enum Fourbank {        ABC("中国农业银行"),ICBC("中国工商银行"),CCB("中国建设银行"),COB("中国银行");        private final String name;            public String getName() {        return name;    }     //构造方法不能加修饰符     Fourbank(String name)    {        this.name = name;    }}
package com.bank.abc;import java.util.Random;import com.bank.unionpay.Atm;import com.bank.unionpay.Fourbank;public class AbcAtm extends Atm {        //定义农行属性的ATM机    private final static Fourbank bank1 = Fourbank.ABC;        //定义开户方法,随机生成六位数账户    @Override    public String kaihu() {        // 随机生成六位数的账户        String zh = "";        Random ran = new Random();        for (int i = 0; i < 6; i++) {            zh += ran.nextInt(10);        }        return zh;    }}package com.bank.abc;//单例模式定义银行类import java.util.ArrayList;import java.util.List;import com.bank.unionpay.Fourbank;public class Bank {    // 定义银行类型以及银行卡的list集合    private Fourbank type;    private String abcname;    private List<Chuxuka> card;    // 构造方法    private Bank() {        abcname = "中国农业银行";        type = Fourbank.ABC;        card = new ArrayList<>();        card.add(new Chuxuka("张潇", "370321199411301111", "111111", "666666", 2000));        card.add(new Xinyongka("张三", "370321199999999999", "222222", "666666", 2000));    }    // 构造唯一的Bank实例    private static Bank abc = new Bank();    // 构造获取唯一Bank实例的方法    public static Bank getBack() {        return abc;    }    // getter和setter方法    public Fourbank getType() {        return type;    }    public void setType(Fourbank type) {        this.type = type;    }    public String getAbcname() {        return abcname;    }    public void setAbcname(String abcname) {        this.abcname = abcname;    }    public List<Chuxuka> getCard() {        return card;    }    public void setCard(List<Chuxuka> card) {        this.card = card;    }}package com.bank.abc;import java.io.Serializable;import com.bank.unionpay.Card;import com.bank.unionpay.Fourbank;public class Chuxuka implements Card, Serializable {    // 定义储蓄卡类的成员变量    private Fourbank type1 = Fourbank.ABC;// 定义储蓄卡的类型为农行    private String name; // 定义持卡者姓名    private String personid; // 定义持卡者身份证号码    private String cardid; // 定义储蓄卡卡号    private String mima; // 定义储蓄卡的密码    private double yue; // 定义储蓄卡的余额    private double touzhi = 0; // 定义储蓄卡无法透支(透支额度为0)    // 重写存款和取款的方法    @Override    public void cunkuan(double cun) {        yue += cun;    }    @Override    public void qukuan(double qu) {        if (qu <= yue) {            yue -= qu;            System.out.println("取款成功,谢谢使用!");        } else            System.out.println("您输入的取款金额有误,无法完成本次取款,系统将自动退出,谢谢使用!");    }    // 构造方法    public Chuxuka(String name, String personid, String cardid, String mima, double yue) {        super();        this.name = name;        this.personid = personid;        this.cardid = cardid;        this.mima = mima;        this.yue = yue;    }    // 以下是getter和setter方法区    public double getTouzhi() {        return touzhi;    }    public void setTouzhi(double touzhi) {        this.touzhi = touzhi;    }    @Override    public void chaxunyue() {        System.out.println(yue);    }    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 getCardid() {        return cardid;    }    public void setCardid(String cardid) {        this.cardid = cardid;    }    public String getMima() {        return mima;    }    public void setMima(String mima) {        this.mima = mima;    }    public double getYue() {        return yue;    }    public void setYue(double yue) {        this.yue = yue;    }    @Override    public String toString() {        return name + "," + personid + "," + cardid + "," + mima + "," + yue;    }}package com.bank.abc;public class Xinyongka extends Chuxuka {        //定义信用卡继承储蓄卡    //重写成员变量,定义信用卡的透支额度为10000元    private double touzhi = 10000;        //重写取款方法        public void qukuan(double qu) {        if(qu<=getYue()+touzhi)        {            setYue(getYue() - qu);            System.out.println("取款成功,谢谢使用!");        }        else            System.out.println("您输入的取款金额有误,无法完成本次取款,系统将自动退出,谢谢使用!");    }    public double getTouzhi() {        return touzhi;    }    public void setTouzhi(double touzhi) {        this.touzhi = touzhi;    }        //构造方法    public Xinyongka(String name, String personid, String cardid, String mima, double yue) {                super(name,  personid,cardid, mima,  yue);    }}
package com.bank.text;/** * @author 张伟 * 2016.10.07 * 模拟银行自动终端系统 */import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.util.List;import java.util.Scanner;import com.bank.abc.AbcAtm;import com.bank.abc.Bank;import com.bank.abc.Chuxuka;public class BankText {    public static void main(String[] args) throws Exception {        // 实例化abcATM        AbcAtm abcatm = new AbcAtm();        // 获取Bank实例并初始化银行卡的LIST集合        Bank bank = Bank.getBack();                List<Chuxuka> cards = bank.getCard();                //应用对象的序列化获取存储的cards        try {            ObjectInputStream in = new ObjectInputStream(new FileInputStream("e:/Bank/bank.obj"));            List<Chuxuka> card = (List<Chuxuka>) in.readObject();            cards = card;            in.close();        } catch (Exception e1) {            e1.printStackTrace();        }                        for (int s = 1; s > 0; s++) {                                    // 菜单提示            System.out.println("银行自助终端系统\n**********************");            System.out.println("0------开户\n1------查询\n2------存款\n3------取款\n4------退出");            System.out.print("**********************\n请选择您要执行的功能:");            Scanner sc = new Scanner(System.in);            while (true) {                // 等待选择                int resoult = sc.nextInt();                // 选择判断                if (resoult == 0) {                    System.out.println("\n**********************\n您选择的为开户功能");                    System.out.print("请输入您的姓名:");                    Scanner sc1 = new Scanner(System.in);                    while (true) {                        // 等待输入                        String name = sc1.nextLine();                        // 定义汉字的正则表达式                        String regex = "[\\u4E00-\\u9FA5]+";                        // 判断输入的name是否合法                        if (name.matches(regex) && name.length() >= 2 && name.length() <= 4) {                            System.out.print("请输入您的身份证号:");                            Scanner sc2 = new Scanner(System.in);                            while (true) {                                String shenfenzheng = sc2.nextLine();                                // 定义身份证的正则表达式                                String regex1 = "\\d{17}[0-9a-zA-Z]";                                // 判断身份证是否合法                                if (shenfenzheng.matches(regex1)) {                                    System.out.print("请输入六位数字密码:");                                    Scanner sc3 = new Scanner(System.in);                                    while (true) {                                        String regex2 = "[0-9]{6}";                                        String mima = sc3.nextLine();                                        if (mima.matches(regex2)) {                                            String sss = abcatm.kaihu();                                            cards.add(new Chuxuka(name, shenfenzheng, sss, mima, 0));                                            System.out.println("您的账户为:" + sss);                                            System.out.println("开户成功,谢谢使用!");                                            // System.out.println(bank.getCard());                                            break;                                        } else {                                            System.out.print("密码输入不合法,请重新输入:");                                        }                                    }                                    break;                                } else {                                    System.out.print("您输入的身份证号不合法,请重新输入:");                                }                            }                            break;                        } else {                            System.out.print("您输入的姓名不合法,请重新输入:");                        }                    }                    break;                }                else if (resoult == 1) {                    System.out.println("\n**********************\n您选择的为查询功能");                    System.out.print("请输入您要查询的卡号:");                    Scanner sc1 = new Scanner(System.in);                    for (int i = 1; i > 0; i++)// 如果输入的卡号存在,则使i<0,执行完全部操作后退出循环完成当前查询,否则,无限循环,直至卡号输入正确为止                    {                        // 等待输入需要查询的卡号                        String cardID = sc1.nextLine();                        for (int ii = 0; ii < cards.size(); ii++) {                            if (cards.get(ii).getCardid().equals(cardID)) {                                System.out.print("请输入您的密码:");                                Scanner sc2 = new Scanner(System.in);                                for (int j = 0; j < 3; j++)// 设置输入密码的最高次数                                {                                    String mima = sc2.nextLine();                                    if (mima.equals(cards.get(ii).getMima())) {                                        // 密码输入正确后显示所有银行卡信息并终止当前查询                                        System.out.println("您要查询的账号信息为:\n**********************");                                        System.out.println("姓名:" + cards.get(ii).getName());                                        System.out.println("身份证号:" + cards.get(ii).getPersonid());                                        System.out.println("卡号:" + cards.get(ii).getCardid());                                        System.out.println("余额:" + cards.get(ii).getYue() + "\n");                                        i = -1;                                        break;                                    } else {                                        if (j < 2)                                            System.out.print("密码输入错误,请重新输入:");                                        else {                                            // 密码连续输入错误,终止当前查询                                            System.out.println("对不起,您已经没有了输入机会");                                            i = -1;                                            break;                                        }                                    }                                }                            } else if (ii < cards.size() - 1) {                            }                            else {                                System.out.print("您输入的卡号不存在,请重新输入:");                            }                        }                    }                    break;                }                else if (resoult == 2) {                    System.out.print("\n**********************\n您选择的为存款功能\n请输入您要存款的卡号:");                    Scanner sc1 = new Scanner(System.in);                    for (int i = 1; i > 0; i++)// 如果输入的卡号存在,则使i<0,执行完全部操作后退出循环完成当前存款,否则,无限循环,直至卡号输入正确为止                    {                        // 等待输入需要存款的卡号                        String cardID = sc1.nextLine();                        for (int ii = 0; ii < cards.size(); ii++) {                            if (cards.get(ii).getCardid().equals(cardID)) {                                i = -1;                                System.out.print("请输入您的密码:");                                Scanner sc2 = new Scanner(System.in);                                for (int j = 0; j < 3; j++)// 设置输入密码的最高次数                                {                                    String mima = sc2.nextLine();                                    if (mima.equals(cards.get(ii).getMima())) {                                        // 密码输入正确后显示银行卡的当前信息                                        System.out.println("您要存款的账号信息为:\n**********************");                                        System.out.println("姓名:" + cards.get(ii).getName());                                        System.out.println("身份证号:" + cards.get(ii).getPersonid());                                        System.out.println("卡号:" + cards.get(ii).getCardid());                                        System.out.println("余额:" + cards.get(ii).getYue() + "\n");                                        // 提醒输入存款金额完成存款功能                                        System.out.print("请输入您的存款金额:");                                        Scanner sc3 = new Scanner(System.in);                                        double cun = sc3.nextDouble();                                        if (cun > 0) {                                            cards.get(ii).setYue(cards.get(ii).getYue() + cun);                                            System.out.println("存款成功,谢谢使用!");                                        } else                                            System.out.println("您输入的金额无效,无法完成本次存款,系统将自动退出,谢谢使用");                                        break;                                    } else {                                        if (j < 2)                                            System.out.print("密码输入错误,请重新输入:");                                        else                                            // 密码连续输入错误,终止当前功能                                            System.out.println("对不起,您已经没有了输入机会");                                    }                                }                            } else if (ii < cards.size() - 1) {                            } else {                                System.out.print("您输入的卡号不存在,请重新输入:");                            }                        }                    }                    break;                }                else if (resoult == 3) {                    System.out.print("\n**********************\n您选择的为取款功能\n请输入您要取款的银行卡号:");                    Scanner sc1 = new Scanner(System.in);                    for (int i = 1; i > 0; i++)// 如果输入的卡号存在,则使i<0,执行完全部操作后退出循环完成当前取款,否则,无限循环,直至卡号输入正确为止                    {                        // 等待输入需要取款的卡号                        String cardID = sc1.nextLine();                        for (int ii = 0; ii < cards.size(); ii++) {                            if (cards.get(ii).getCardid().equals(cardID)) {                                i = -1;                                System.out.print("请输入您的密码:");                                Scanner sc2 = new Scanner(System.in);                                for (int j = 0; j < 3; j++)// 设置输入密码的最高次数                                {                                    String mima = sc2.nextLine();                                    if (mima.equals(cards.get(ii).getMima())) {                                        // 密码输入正确后显示银行卡的当前信息                                        System.out.println("您要取款的账号信息为:\n**********************");                                        System.out.println("姓名:" + cards.get(ii).getName());                                        System.out.println("身份证号:" + cards.get(ii).getPersonid());                                        System.out.println("卡号:" + cards.get(ii).getCardid());                                        System.out.println("余额:" + cards.get(ii).getYue());                                        System.out.println("透支额度:" + cards.get(ii).getTouzhi());                                        // 提醒输入取款金额完成取款功能                                        System.out.print("请输入您的取金额:");                                        Scanner sc3 = new Scanner(System.in);                                        double qu = sc3.nextDouble();                                        cards.get(ii).qukuan(qu);                                        break;                                    } else {                                        if (j < 2)                                            System.out.print("密码输入错误,请重新输入:");                                        else                                            // 密码连续输入错误,终止当前功能                                            System.out.println("对不起,您已经没有了输入机会");                                    }                                }                            } else if (ii < cards.size() - 1) {                            } else {                                System.out.print("您输入的卡号不存在,请重新输入:");                            }                        }                    }                    break;                }                else if (resoult == 4) {                    System.out.println("\n**********************\n感谢您的使用,请取好您的卡片,再见");                    s = -1;                    // 保存所有数据并退出                    File file = new File("e:/Bank");                    if (!file.exists()) {                        file.mkdirs();                    }                    try {                        ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("e:/Bank/bank.obj"));                        out.writeObject(cards);                        out.close();                        System.out.println("数据保存完成...");                                            } catch (Exception e) {                        e.printStackTrace();                    }                    break;                }                else                    System.out.print("\n您选择的菜单不存在,请重新选择:");            }        }    }}

 技术分享

技术分享

技术分享

技术分享

 

 技术分享

 

模拟银行自动终端系统