zoukankan      html  css  js  c++  java
  • 模拟银行自助终端系统(序列化和反序列化)

     

    模拟银行自助终端系统

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

    说明: 

    1.   对于数据输入异常,可使用java异常处理机制进行处理。 

    2.   评分将以功能实现与代码规范性相结合的方式进行考核。

    3.   如果对项目需求有疑问,可以随时以QQ留言方式联系我进行咨询。

    4.   国庆放假期间,每天都有老师在公司值班,10月4日是我在公司值班,10月7日正常上班,欢迎大家到公司来做项目。

    二. 项目功能要求: 

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

    银行自助终端系统 

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

    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机上实现跨行查询和存取款功能。

    ATM机抽象类:

    package com.bank.unionpay;
    
    public abstract class ATM {
        
        private Bankcard cardstyle;
    
         //开户
        public abstract void kaihu();
        
    }

    银行卡接口bankcard:

    package com.bank.unionpay;
    
    public interface Bankcard {
        //余额查询
        public void getyue();
        //存款
        public void cunKuan(double ck);
        //取款
        public boolean qukuan(double qk);
        
        
    
    }

    表示四大银行的枚举类型:

    package com.bank.unionpay;
    
    public enum Bankstyle {
        
        ABC("农业银行"),ICBC("工行"),CCB("建行"),BOC("中行");
        
    private final String name;
        
        public String getName()
        {
            return this.name;
        }
        
        //构造方法是私有的
        private Bankstyle(String name)
        {
            this.name=name;
        }
    
    }

    Atm机的子类:

    package com.bank.abc;
    
    
    import java.util.ArrayList;
    
    import java.util.List;
    import java.util.Map;
    import java.util.Random;
    import java.util.Scanner;
    
    import com.bank.unionpay.ATM;
    import com.bank.unionpay.Bankstyle;
    
    public class Atm_zilei extends ATM {
          //定义枚举的银行类型
        
        final  Bankstyle abc=Bankstyle.ABC;
        
        
         //开户方法
        @Override
        public void kaihu() {
            System.out.println("*********************
    您选择的功能为开户");
            System.out.print("请输入您的姓名:");
            Scanner sc1=new Scanner(System.in);
            Chuxucard cc=new Chuxucard();
            while(true){
            String str1=sc1.nextLine();
            //汉字的正则表达式
            String na="[\u4e00-\u9fa5]+";
            //判断输入的是不是汉字并且长度是不是在2-4之间的汉字
        
                if(str1.matches(na)&&str1.length()>=2&&str1.length()<=4)
                {
                    
                        System.out.println("姓名长度输入正确");
                        cc.setName(str1);
                    
                    break;
                }
                else
                {
                    System.out.println("输入的姓名不合法,请重新输入:");
                }
                
            }
    
            System.out.println("请输入你的身份证号:");
            Scanner sc2=new Scanner(System.in);
            while(true)
            {
            String str2=sc2.nextLine();
            //身份证的正则表达式
            String sfz="\d{17}[0-9a-zA-Z]";
            //判断输入的身份证号是否合法
            if(str2.matches(sfz))
            {
                System.out.println("身份证号格式输入正确!");
                cc.setShenfenzheng(str2);
                break;
            }
            else
            {
                System.out.println("身份证号输入不正确,请重新输入:");
            }
            }
            
            System.out.println("请输入你的密码:");
            Scanner sc3=new Scanner(System.in);
            while(true)
            {
            String str3=sc3.nextLine();
            //6位数汉字的正则表达式
            String mm="[0-9]{6}";
            //判断输入的密码是不是合法
            if(str3.matches(mm))
            {
                System.out.println("输入的密码合法");
                cc.setMima(Integer.parseInt(str3));
                break;
            }
            else
            {
                System.out.println("输入的密码不合法,请重新输入密码:");
            }
            }
             Random ra=new Random();
            
              
                //随即生成一个6位数的卡号
                StringBuilder sb=new StringBuilder();
                
                for(int i=0;i<6;i++)
                {
                     int in =ra.nextInt(9);
                     sb.append(in);
                }
                
                System.out.println("系统自动生成的卡号为:"+sb);
                
                cc.setCardNumber(sb.toString());
                Bank.getBank().ls.add(cc);
                
                
        }
    
       
        }
        

    单例模式定义一个银行类:bank:

    package com.bank.abc;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import com.bank.unionpay.Bankstyle;
    //单例模式
    public class Bank {
        //禁止外部访问构造方法
        
        private Bank()
        {
            
        }
        
        //内部产生唯一实例
        
        private static Bank bank=new Bank();
        //开放一个方法 给调用者返回这个实例
        public static Bank getBank()
        {
            return bank;
        }
        
        //银行名称
        private String name;
        //农行类型
        final Bankstyle abc=Bankstyle.ABC;
        //银行卡列表
        public List<Chuxucard> ls=new ArrayList<>();
        

    定义银行卡的子类储蓄卡:

    package com.bank.abc;
    
    import com.bank.unionpay.Bankcard;
    import com.bank.unionpay.Bankstyle;
    
    public class Chuxucard implements Bankcard {
        //银行类型
        final  Bankstyle abc=Bankstyle.ABC;
        //姓名
        private String name;
        //身份证号
        private String shenfenzheng;
        //卡号
        private String cardNumber;
        //密码
        private int mima;
        //余额
        private double yue;
        
        public double getYue() {
            return yue;
        }
    
        public void setYue(double yue) {
            this.yue = yue;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getShenfenzheng() {
            return shenfenzheng;
        }
    
        public void setShenfenzheng(String shenfenzheng) {
            this.shenfenzheng = shenfenzheng;
        }
    
        public String getCardNumber() {
            return cardNumber;
        }
    
        public void setCardNumber(String cardNumber) {
            this.cardNumber = cardNumber;
        }
    
        public int getMima() {
            return mima;
        }
    
        public void setMima(int mima) {
            this.mima = mima;
        }
    
        
        
    //存款
        @Override
        public void cunKuan(double ck) {
            
            yue+=ck;
           
            
    
        }
    @Override
        public String toString() {
            // TODO 自动生成的方法存根
            return "
    账户:姓名/ "+name+"卡号 /"+cardNumber+"身份证: /"+shenfenzheng+"密码: "+mima;
        }
    
        //取款
        @Override
        public  boolean qukuan(double  qk) {
            
                 if(qk<=yue)
                 {
                     yue-=qk;
                    return true;
                 }
                 else
                 {
                     System.out.println("余额不足");
                     return false;
                 }
             }
        //查询余额
        @Override
        public void getyue() {
        
            System.out.println("当前余额是:"+yue);
        }
    
        
            
    
        }

    定义一个测试类test01:

    
    

    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.Atm_zilei;
    import com.bank.abc.Bank;
    import com.bank.abc.Chuxucard;

    
    

    public class Test01 {

    
    

    public static void main(String[] args) throws Exception {
    // 反序列化对象
    for (Chuxucard temp : Bank.getBank().ls) {

    
    

    }
    try {
    ObjectInputStream in = new ObjectInputStream(new FileInputStream("D:/objectFile/objectFile.obj"));
    List<Chuxucard> cxc1 = (List<Chuxucard>) in.readObject();

    
    

    Bank.getBank().ls = cxc1;

    
    

    System.out.println(cxc1);

    
    

    in.close();
    } catch (Exception ee) {

    
    

    }

    
    

    Scanner sc = new Scanner(System.in);
    int i1 = 0;
    while (true) {
    // 选择功能
    System.out.println("银行自助终端系统");
    System.out.println("*********************");
    System.out.println("0----开户");
    System.out.println("1----查询");
    System.out.println("2----存款");
    System.out.println("3----取款");
    System.out.println("4----退出");
    System.out.println("*********************");
    System.out.println("请选择你要执行的功能:");
    int i = sc.nextInt();
    // 查询

    
    

    if (i == 0) {
    Atm_zilei atmzl = new Atm_zilei();
    atmzl.kaihu();

    
    

    continue;

    
    

    }
    // 存款

    
    

    else if (i == 1) {
    System.out.println("********************* 您选择的功能为查询 请输入你要查询的卡号:");
    // 输入卡号
    Scanner can = new Scanner(System.in);
    while (true) {
    String tri = can.nextLine();

    
    

    // 遍历集合中的卡号

    
    

    for (int ii = 0; ii < Bank.getBank().ls.size(); ii++) {
    // 判断集合中的卡号是不是和输入的卡号相等
    if (Bank.getBank().ls.get(ii).getCardNumber().equals(tri)) {
    System.out.println("卡号输入正确,请输入密码:");

    
    

    int tri1 = 0;
    while (true) {
    // 抛出密码的异常
    try {
    Scanner can1 = new Scanner(System.in);
    tri1 = can1.nextInt();

    
    

    } catch (Exception e) {
    System.out.println("密码输入格式错误,请重新输入密码:");
    continue;
    }
    // 判断输入的密码是不是和开户的密码一样
    if (tri1 == Bank.getBank().ls.get(ii).getMima()) {
    System.out.println("您查询的账号信息为: ********************");
    System.out.println("姓名:" + Bank.getBank().ls.get(ii).getName());
    System.out.println("身份证号:" + Bank.getBank().ls.get(ii).getShenfenzheng());
    System.out.println("卡号:" + Bank.getBank().ls.get(ii).getCardNumber());
    System.out.println("余额:" + Bank.getBank().ls.get(ii).getYue());

    
    

    break;
    } else {
    System.out.println("密码输入不正确,请重新输入:");
    i1++;

    
    

    if (i1 == 3) {
    System.out.println("您输入的密码次数已经超过3次,卡号与密码不匹配,请重新输入");
    break;
    }
    continue;
    }
    }
    break;

    
    

    }

    
    

    else if (Bank.getBank().ls.get(ii).getCardNumber().equals(tri) == false) {

    
    

    }

    
    

    else {
    System.out.println("卡号输入不正确,请重新输入:");
    continue;
    }

    
    

    }
    break;
    }

    
    

    }
    // 存款
    else if (i == 2) {
    System.out.println("********************* 您选择的功能为存款");
    System.out.println("请输入您要存款的卡号:");
    Scanner can = new Scanner(System.in);
    while (true) {
    String tri = can.nextLine();
    for (int ii = 0; ii < Bank.getBank().ls.size(); ii++) {
    // 判断卡号输入是不是一致
    if (Bank.getBank().ls.get(ii).getCardNumber().equals(tri)) {
    System.out.println("卡号输入正确,请输入密码:");
    Scanner can1 = new Scanner(System.in);
    while (true) {
    int tri1 = can1.nextInt();

    
    

    if (tri1 == Bank.getBank().ls.get(ii).getMima()) {
    System.out.println("您查询的账号信息为: ********************");
    System.out.println("姓名:" + Bank.getBank().ls.get(ii).getName());
    System.out.println("身份证号:" + Bank.getBank().ls.get(ii).getShenfenzheng());
    System.out.println("卡号:" + Bank.getBank().ls.get(ii).getCardNumber());
    System.out.println("余额:" + Bank.getBank().ls.get(ii).getYue());
    System.out.println("请输入您要存款的金额:");
    // 接受存款的数据
    Scanner scc = new Scanner(System.in);
    double db = scc.nextInt();
    if (db < 0) {
    System.out.println("您存款的数据无效,系统将自动退出!谢谢使用!");
    break;
    } else {

    
    

    Bank.getBank().ls.get(ii).cunKuan(db);

    
    

    System.out.println(
    "您的存款金额为:" + db + "当前余额为:" + Bank.getBank().ls.get(ii).getYue());

    
    

    }
    break;

    
    

    } else {
    System.out.println("密码输入不正确,请重新输入:");
    i1++;

    
    

    if (i1 == 3) {
    System.out.println("您输入的密码次数已经超过3次,卡号与密码不匹配,请重新输入");
    break;
    }
    continue;
    }
    }
    break;
    }

    
    

    else if (Bank.getBank().ls.get(ii).getCardNumber().equals(tri) == false) {

    
    

    }

    
    

    else {
    System.out.println("卡号输入不正确,请重新输入:");
    continue;
    }

    
    

    }
    break;
    }

    
    

    }
    // 取款
    else if (i == 3) {
    System.out.println("********************* 您选择的功能为取款 请输入您要取款的卡号:");

    
    

    Scanner can = new Scanner(System.in);
    while (true) {
    String tri = can.nextLine();
    for (int ii = 0; ii < Bank.getBank().ls.size(); ii++) {
    if (Bank.getBank().ls.get(ii).getCardNumber().equals(tri)) {
    System.out.println("卡号输入正确,请输入密码:");
    Scanner can1 = new Scanner(System.in);
    while (true) {
    int tri1 = can1.nextInt();

    
    

    if (tri1 == Bank.getBank().ls.get(ii).getMima()) {
    System.out.println("您查询的账号信息为: ********************");
    System.out.println("姓名:" + Bank.getBank().ls.get(ii).getName());
    System.out.println("身份证号:" + Bank.getBank().ls.get(ii).getShenfenzheng());
    System.out.println("卡号:" + Bank.getBank().ls.get(ii).getCardNumber());
    System.out.println("余额:" + Bank.getBank().ls.get(ii).getYue());
    System.out.println("请输入您要取款的金额:");
    // 接受取款的数据
    Scanner scc = new Scanner(System.in);

    
    

    double db = scc.nextInt();
    // 判断取款的金额是不是符合要求

    
    

    if (db < 0 || db > Bank.getBank().ls.get(ii).getYue()) {
    System.out.println("您取款的数据无效,系统将自动退出!谢谢使用!");
    break;
    } else {
    Bank.getBank().ls.get(ii).qukuan(db);

    
    

    System.out.println("取款成功,您的取款金额为:" + db + "余额为:"
    + Bank.getBank().ls.get(ii).getYue() + "谢谢使用!");

    
    

    break;
    }

    
    

    } else {
    System.out.println("密码输入不正确,请重新输入:");
    i1++;

    
    

    if (i1 == 3) {
    System.out.println("您输入的密码次数已经超过3次,卡号与密码不匹配,请重新输入");
    break;
    }
    continue;
    }
    }
    break;
    } else if (Bank.getBank().ls.get(ii).getCardNumber().equals(tri) == false) {

    
    

    }

    
    

    else {
    System.out.println("卡号输入不正确,请重新输入:");
    continue;
    }

    
    

    }

    
    

    break;
    }

    
    

    }
    // 退出系统
    else if (i == 4) {
    System.out.println("********************* 您已退出系统,谢谢使用!");

    
    

    File file = new File("D:/objectFile");
    if (!file.exists()) {
    file.mkdirs();
    }
    ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("D:/objectFile/objectFile.obj"));
    out.writeObject(Bank.getBank().ls);
    out.close();

    
    

    break;
    }

    
    

    else {
    System.out.println("您选择的菜单不存在!请重新选择:");
    }

    
    

    }

    
    

    }

    
    

    }

    
    
    
     

     

  • 相关阅读:
    关于项目架构设计的一些规范
    Repository 返回 IQueryable?还是 IEnumerable?
    EntityFramework DbContext 线程安全
    ASP.NET 页面禁止被 iframe 框架引用
    2015-写给明年现在的自己
    RESTful API URI 设计: 查询(Query)和标识(Identify)
    深入探讨:标签(Tag)的各种设计方案
    RESTful API URI 设计: 判断资源是否存在?
    iPhone 6/plus iOS Safari fieldset border 边框消失
    追根溯源:EntityFramework 实体的状态变化
  • 原文地址:https://www.cnblogs.com/diaozhaojian/p/5936875.html
Copyright © 2011-2022 走看看