JavaSE——基础小项目-模拟ATM系统(项目主要目标、技术选型、架构搭建、具体实现、完整代码注释)

目录

项目主要目标

技术选型

面向对象编程

使用集合容器

程序流程控制

使用常见API

系统架构搭建与欢迎页设计

Account

ATM

Test

用户开户功能实现

录入账户名称与性别

录入账户密码与取现额度

生成新卡号

存入账户

登录功能实现

登录后操作实现

退出账户

存款、取款功能实现

存款功能

取款功能

转账功能实现

销户、密码修改操作实现

销户

密码修改

查询账户操作实现


文末附带完整源码链接

项目主要目标

  1. 系统架构搭建、欢迎页设计
  2. 开户功能实现
  3. 登录功能实现
  4. 操作页展示、查询账户、退出账户
  5. 存款、取款功能实现
  6. 转账功能实现
  7. 销户功能实现
  8. 用户密码修改

技术选型

面向对象编程

每个账户都是一个账户对象:所以需要设计账户类Account,月用于创建账户对象封装账户信息。ATM同样是一个对象,需要设计ATM类,代表ATM管理系统,负责对账户的处理。

使用集合容器

ATM管理类中需要提供一个容器用于存储系统全部账户对象的信息,我们选ArrayList集合。

程序流程控制

需要结合分支、循环、跳转关键字等程序流程控制的知识,用来控制系统的业务流程。

使用常见API

登录信息的内容比较,数据的分析,处理等都需要常用API来解决,如使用String。

系统架构搭建与欢迎页设计

系统架构搭建

  1. 定义一个账户类Account,至少需要包含(卡号、姓名、性别、密码、余额、每次取现额度)
  2. 定义一个ATM类,用来代表ATM系统,负责提供所有的业务需求,比如:展示ATM的系统欢迎页、开通帐户、转账......
  3. 定义一个测试类TeSt,负责对我们开发的ATM系统进行测试。

系统欢迎页

==欢迎进入月亮银行ATM系统==

1.用户登录

2.用户开户

请选择您要操作的命令:

Account

package user.ATMTest;

public class Account {
    private String userName;  //姓名
    private String cardId; //卡号
    private char sex;  //性别
    private String passWord; //密码
    private double money; //余额
    private double limit; //每次取现额度

    public Account() {
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getCardId() {
        return cardId;
    }

    public void setCardId(String cardId) {
        this.cardId = cardId;
    }

    public char getSex() {
        return sex;
    }

    public void setSex(char sex) {
        this.sex = sex;
    }

    public String getPassWord() {
        return passWord;
    }

    public void setPassWord(String passWord) {
        this.passWord = passWord;
    }

    public double getMoney() {
        return money;
    }

    public void setMoney(double money) {
        this.money = money;
    }

    public double getLimit() {
        return limit;
    }

    public void setLimit(double limit) {
        this.limit = limit;
    }
}

ATM

package user.ATMTest;

import java.util.ArrayList;
import java.util.Scanner;

public class ATM {
    private ArrayList<Account> accounts = new ArrayList<>(); //创建一个ArrayList集合用来存储所有账户

    //设计欢迎页,它是一个功能,所以把它写在方法里
    private Scanner sc = new Scanner(System.in);

    public void start(){
        while(true){
            System.out.println("==欢迎进入月亮银行ATM系统==");
            System.out.println("1.用户登录");
            System.out.println("2.用户开户");
            System.out.println("请选择您要操作的命令");
            int command = sc.nextInt();
            switch (command){
                case 1:
                    break;
                case 2:
                    break;
                default:
                    System.out.println("您输入的操作有误,请重新输入!");
            }
        }
    }


}

Test

package user.ATMTest;

public class Test {
    public static void main(String[] args) {
        ATM atm = new ATM(); //创建一个ATM对象,用来代表ATM系统,负责供应所有的业务需求

        //调用ATM对象的start方法,测试启动系统
        atm.start();
    }
}

用户开户功能实现

  • 也就是新增一个账户,往系统的账户集合中添加一个账户对象。

账户的要求

  • 用户信息包含:姓名、性别、密码、每次取现额度、卡号。
  • 注意:卡号由系统生成,要求是8位的数字组成的(且卡号不能重复)

录入账户名称与性别

        //首先要创建一个账户对象,用来存储账户的信息
        Account acc = new Account();

        //让用户自己输入账户的信息

        //录入名称
        System.out.println("请输入您的账户名称:");
        String name = sc.next();
        acc.setUserName(name);

        //录入性别这里只能选择输入男或者女,可以写个循环
        while(true){
            System.out.println("请输入您的性别:");
            char sex = sc.next().charAt(0); //截取第一个字符
            if(sex == '男' || sex == '女'){
                acc.setSex(sex);
                break;
            }else {
                System.out.println("您输入的性别有误,只能是男或者女~");
            }
        }

录入账户密码与取现额度

        //录入账户密码,因为需要二次确认,所以也用循环
        while(true){
            System.out.println("请您设置您的账户密码:");
            String passWord = sc.next();
            System.out.println("请您输入您的确认密码:");
            String okPassWord = sc.next();
            //判断两次密码是否一致
            if(okPassWord.equals(passWord)){
                acc.setPassWord(passWord);
                break;
            }else {
                System.out.println("您输入的确认密码与第一次不一致,请重新设置密码。");
            }
        }

        //录入取现额度,这里只为模拟系统,不考虑由系统定初始取现额度或者计算取现额度
        System.out.println("请您输入您的取现额度:");
        double limit = sc.nextDouble();
        acc.setLimit(limit);

生成新卡号

为新开户的账户生成一个新卡号:

  • 新卡号的要求是一个8位的数字,且不能与其他账户对象的卡号重复。
  • 新卡号得到后,需要赋值给当前账户对象。
//生成随机新卡号,且不重复,可以定义一个方法createCardId
String newCardId = createCardId();
acc.setCardId(newCardId);
    private String createCardId(){
        while(true){
            //定义一个String类型的变量用来存储8位数字作为卡号
            String cardId = "";
            //循环8次
            Random r = new Random();
            for (int i = 0; i < 8; i++) {
                int data = r.nextInt(10); // 0~9
                cardId += data;

            }
            //判断cardId中存储的卡号是否与其他账户的卡号重复了
            //这里定义了一个方法,用来查询当前卡号是否存在账户,如果有就返回账户,无则返回null
            Account acc = getAccountByCardId(cardId);
            if(acc == null){
                return cardId;
            }
            //随机出来的新卡号与之前的账户重复则通过while循环重新生成卡号
        }
    }
    //根据卡号查询账户对象并返回
    private Account getAccountByCardId(String cardId) {
        for (int i = 0; i < accounts.size(); i++) {
            Account acc = accounts.get(i);
            //判断这个账户对象acc中的卡号是否与提供的卡号一致
            if(acc.getCardId().equals(cardId)){
                return acc;
            }
        //如果全都判断完了,则表示找不到这个账户
        }
        return null; //返回null值
    }

存入账户

//所有信息录入完毕,现在就把这个账户对象,放到账户集合中去
        accounts.add(acc);
        System.out.println("恭喜您," + acc.getUserName() + "开户成功,您的卡号是:" +             acc.getCardId());
//对Account类中的getUserName方法做一点小改动
public String getUserName() {
    return userName + (sex == '男' ? "先生" : "女士");
}

测试运行:

登录功能实现

用户登录功能要求:

  1. 如果系统没有任何账户对象,则不允许登录。
  2. 让用户输入登录的卡号,先判断卡号是否正确,如果不正确要给出提示。
  3. 如果卡号正确,再让用户输入账户密码,如果密码不正确要给出提示,如果密码也正确,则给出登录成功的提示。
    //完成用户登录操作
    private void login() {
        System.out.println("==月亮银行ATM系统登录界面==");
        //判断系统中是否存在账户对象,如果不存在,则直接结束登录操作
        if(accounts.size() == 0){
            System.out.println("当前系统中无任何账户,请先开户再来登录~");
            return; //结束当前方法
        }

        //系统中存在账户对象,可以开始进行登录
        while(true){
            System.out.println("请您输入您的登录卡号:");
            String cardId = sc.next();
            //判断这个卡号是否存在
            Account acc = getAccountByCardId(cardId);
            if(acc == null){
                //账户不存在
                System.out.println("您输入的登录卡号不存在,请确认!");
            }else{
                //账户存在
                //开始输入密码,需要验证密码,所以嵌套一层循环
                while(true){
                    System.out.println("请您输入登录密码:");
                    String passWord = sc.next();
                    //验证密码
                    if(acc.getPassWord().equals(passWord)){
                        //密码正确,登录成功
                        System.out.println("恭喜您" + acc.getUserName() + "成功登陆了系统,您的卡号是:" + acc.getCardId());
                    }else{
                        System.out.println("您输入的密码不正确,请确认!");
                    }
                }
            }
        }
    }

测试运行:

1.测试登录时系统中无任何账户

2.开户

3.测试登录时账户卡号输入不正确

4.测试登录时密码输入不正确

5.测试登录成功 

登录后操作实现

登录成功后,我们创建一个用来记录当前登录的账户的对象

    //创建一个记录登录后的账户的对象
    private Account loginAcc;

接着就是写登录后的操作界面:

    private void showUserCommand() {
        while(true){
            System.out.println("====" + loginAcc.getUserName() + ",您可以选择如下功能进行账户的处理====");
            System.out.println("1.查询账户");
            System.out.println("2.存款");
            System.out.println("3.取款");
            System.out.println("4.转账");
            System.out.println("5.密码修改");
            System.out.println("6.退出");
            System.out.println("7.注销当前账户");
            int command = sc.nextInt();
            switch (command){
                case 1:
                    //查询当前账户
                    break;
                case 2:
                    //存款
                    break;
                case 3:
                    //取款
                    break;
                case 4:
                    //转账
                    break;
                case 5:
                    //密码修改
                    break;
                case 6:
                    //退出
                    break;
                case 7:
                    //注销当前账户
                    break;
                default:
                    System.out.println("您选择的操作不存在,请确认!");
            }
        }
    }

把它放在登录操作完成之后:

测试运行:

开始完善所有的功能

退出账户

测试运行:

存款、取款功能实现

用户存款功能

  • 用户为自己的账户存钱,存钱后更新账户的余额即可。

用户取款功能

  • 用户从自己的账户中取钱,取钱的要求:
  1. 需要先判断账户的余额是否大于>100元,如果够,让用户输入取款金额。
  2. 需要判断取款金额是否超过了当次限额,以及余额是否足够。

存款功能

    private void depositMoney() {
        System.out.println("==月亮银行-存钱操作==");
        System.out.println("请您输入存款金额:");
        double money = sc.nextDouble();

        //更新当前登录账户的余额
        loginAcc.setMoney(loginAcc.getMoney() + money); //注意这里要将原本的余额加上存款的数额
        System.out.println("恭喜您,成功存款" + money + "元,存钱后账户余额为:" + loginAcc.getMoney()+ "元");
    }

取款功能

    private void drawMoney() {
        System.out.println("==月亮银行-取钱操作==");
        //1.判断当前账户余额是否达到了100元,如果不满100元,就不允许取款
        if(loginAcc.getMoney() < 100){
            System.out.println("您的账户余额不足100元,不允许取钱~");
            return;
        }

        //2.余额大于100了,让用户输入取款余额
        while(true){
            System.out.println("请您输入取款金额:");
            double money = sc.nextDouble();

            //判断账户余额是否足够
            if(loginAcc.getMoney() >= money){
                //账户余额够
                //再判断取款金额是否超过了每次限额
                if(money > loginAcc.getLimit()){
                    System.out.println("您当前取款金额超过了每次限额,您每次最多可取:" + loginAcc.getLimit());
                }else{
                    //到这里所有条件都满足了,可以开始更新账户余额
                    loginAcc.setMoney(loginAcc.getMoney() - money);
                    System.out.println("您成功取款" + money + "元成功,取款后账户余额为:" + loginAcc.getMoney() + "元");
                    break;
                }
            }else{
                //账户余额不够
                System.out.println("余额不足,您的账户当前余额为:" + loginAcc.getMoney()+ "元");
            }
        }
    }

测试运行:

1.测试存款

2.测试取款金额不满100

3.测试取款金额超过每次限额

4.测试取款

转账功能实现

用户转账功能

  • 把钱转给别人,转账前需要判断:
  1. 自己账户是否有钱,系统中是否有其他账户。
  2. 接下来让用户输入对方卡号,判断对方账户是否存在,账户如果存在,还需要认证对方账户的户主姓氏。

测试运行:

1.测试系统账户数量不足

2.测试转账时不足100元

3.测试转账卡号不存在

4.测试姓氏验证不通过

5.测试转账金额超过自身余额

6.测试转账成功

销户、密码修改操作实现

销户

  • 销户就是从系统中删除当前账户,销户的要求:
  1. 首先要询问用户是否确定要销户,如果不确定,则回到操作界面。
  2. 如果确定,要判断用户的账户中是否有钱,有则不允许销户,并回到操作界面。
  3. 如果没钱,则完成销户,并回到欢迎页。
    //销户操作,因为要返回操作界面或者回到欢迎页,所以可以将方法写成boolean类型
    private boolean deleteAccount() {
        System.out.println("==月亮银行-销户操作==");
        //让用户确认销户
        System.out.println("您确认要销户吗?y/n");
        String command = sc.next();
        switch (command){
            case "y":
                //确定销户
                //判断用户账户中是否还有余额
                if(loginAcc.getMoney() == 0){
                    //没有余额,可以进行销户操作
                    accounts.remove(loginAcc);
                    System.out.println("您好,您的账户已成功注销~");
                    return true;
                }else{
                    //账户中还有钱
                    System.out.println("对不起,您的账户中还有余额,不允许销户!");
                    return false;
                }
            default:
                //不进行销户
                System.out.println("已取消销户操作。");
                return false;
        }
    }

测试运行:

1.测试取消销户操作

2.测试销户不成功

3.测试成功销户

密码修改

  • 更改账户的密码,修改密码的要求:
  1. 需要先认证用户当前的密码
  2. 认证通过后,需要让用户输入两次新密码
  3. 两次密码一样,则更新账户密码,并回到欢迎界面

    private void updatePassWord() {
        System.out.println("==月亮银行-账户密码修改操作==");
        while(true){
            //1.提醒用户认证当前密码
            System.out.println("请您输入当前账户的密码:");
            String passWord = sc.next();

            //2.验证密码是否正确
            if(loginAcc.getPassWord().equals(passWord)){
                //验证通过
                //开始修改密码
                while(true){
                    System.out.println("请您输入新密码:");
                    String newPassWord = sc.next();

                    System.out.println("请您再次输入密码:");
                    String okPassWord = sc.next();

                    //判断两次密码是否一致
                    if(okPassWord.equals(newPassWord)){
                        //一致,对账户的密码进行修改
                        loginAcc.setPassWord(newPassWord);
                        System.out.println("您的密码已修改成功,请重新登陆~");
                        return;
                    }else{
                        //两次密码不一致
                        System.out.println("您输入的两次密码不一致,请重新设置新密码。");
                    }
                }
            }else{
                //密码验证不通过
                System.out.println("您当前输入的密码不正确!请重试");
            }
        }
    }

测试运行:

1.测试密码验证不通过

2.测试二次密码确认

查询账户操作实现

将账户的信息输出即可。

    private void selectUser() {
        System.out.println("====月亮银行ATM系统====");
        //账户姓名这里不带敬语
        System.out.println("账户姓名:" + loginAcc.getUserName().replace("先生","  ").replace("女士","  "));
        System.out.println("账户卡号:" + loginAcc.getCardId());
        System.out.println("性别:" + loginAcc.getSex());
        System.out.println("账户余额:" + loginAcc.getMoney() + "元");
        System.out.println("每次取现额度:" + loginAcc.getLimit() + "元");
        System.out.println("密码:********");
        int flag = 0; //用于控制显示密码
        while (true) {
            System.out.println("------------------------------------------");
            System.out.println("您可选择如下操作:");
            System.out.println("1.显示密码");
            System.out.println("2.退出");
            int command = sc.nextInt();
            switch (command){
                case 1:
                    if(flag == 0){
                        System.out.println("密码:" + loginAcc.getPassWord());
                        flag++;
                    }else{
                        System.out.println("密码已显示");
                    }
                    break;
                case 2:
                    return;
            }
        }
    }

测试运行:

 完结撒花,完整的源代码——InsCode - 让你的灵感立刻落地


END


学习自:黑马程序员——JavaSE课程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/435740.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python基础(11)《Allure报告中的组件用法》

使用 官方教程&#xff1a;https://docs.qameta.io/allure 入门 想要看到allure报告&#xff0c;需要做2个步骤&#xff1a; 1、pytest执行时关联allure&#xff1a;pytest命令带上--alluredir 结果存放目录或--alluredir结果存放目录&#xff1b; 2、打开执行报告&#xff…

通过勒索病毒攻击案例,思考勒索病毒攻击现象与趋势

前言 2019年针对企业的勒索病毒攻击越来越多&#xff0c;仿佛全球都在被勒索&#xff0c;基本上每天都会有关于勒索病毒攻击的案例被曝光&#xff0c;勒索病毒攻击已经成为全球最大的网络安全威胁&#xff0c;同时也被国际刑警组织认定为全球危害最大的网络犯罪组织活动&#…

nginx代理参数proxy_pass

proxy_pass参数用于配置反向代理&#xff0c;指定客户端请求被转发到后端服务器&#xff0c;后端地址可以是域名、ip端口URI 代理后端报错提示本地找不到CSS文件、JavaScript文件或图片 例如&#xff1a; nginx &#xff1a;10.1.74.109 后端服务&#xff1a;http://10.1.74.…

钡铼技术R40工业路由器连接智慧交通助力城市智慧化建设

随着信息技术与交通行业的深度融合&#xff0c;智慧交通作为智慧城市的重要组成部分&#xff0c;正在全球范围内加速推进。在此进程中&#xff0c;钡铼技术推出的R40工业路由器以其独特的4G WiFi一体化设计&#xff0c;成为连接智慧交通各环节&#xff0c;助力城市智慧化建设的…

C++小记 -链表

链表 文章目录 链表链表基础理论链表的类型单链表双链表循环链表 链表的存储方式链表的定义链表的操作添加节点删除节点 性能分析构建链表删除节点&#xff08;内存泄漏的坑&#xff09;1.直接移除2.使用虚拟头结点3.delete指针后&#xff0c;要将指针置为NULL&#xff01;&…

[晓理紫]每日论文分享(有中文摘要,源码或项目地址)--大模型

专属领域论文订阅 VX关注{晓理紫}&#xff0c;每日更新论文&#xff0c;如感兴趣&#xff0c;请转发给有需要的同学&#xff0c;谢谢支持 如果你感觉对你有所帮助&#xff0c;请关注我&#xff0c;每日准时为你推送最新论文。 》》 由于精力有限&#xff0c;今后就不在CSDN上更…

selenium-java 通过配置xml文件并发运行类或者方法

1、打开idea允许某个class类&#xff0c;可以在控制台看到运行路径的下的配置文件如下图&#xff1a; 2、将路径复制到本地路径中找到temp-testng-customsuite.xml文件 3、复制该文件到项目的根目录下&#xff0c;可以修改文件名称&#xff0c;如下图 4、如图所示&#xff0c;通…

37、VMware虚拟机分配的对外访问IP地址修改为静态

99、VMware虚拟机分配的对外访问IP地址修改为静态 一、前言二、修改IP分配策略1、打开网卡配置文件&#xff08;配置文件ens33表示所在主机网卡名称&#xff09;2、信息修改3、查看网卡ip4、刷新网络服务5、验证&#xff08;ping下百度看看网络是否正常&#xff09; 一、前言 …

【vue.js】文档解读【day 2】 | 计算属性

如果阅读有疑问的话&#xff0c;欢迎评论或私信&#xff01;&#xff01; 本人会很热心的阐述自己的想法&#xff01;谢谢&#xff01;&#xff01;&#xff01; 文章目录 计算属性计算属性 vs 方法可计算属性Getter不应有副作用避免直接修改计算属性值 计算属性 我们已经学习…

[Redis]——数据一致性,先操作数据库,还是先更新缓存?

目录 一、操作缓存和数据库时有三个问题需要考虑&#xff1a; 1.删除缓存还是更新缓存&#xff1f; 2.如何保证缓存与数据库的操作同时成功或失效 3.先操作缓存还是先操作数据库&#xff08;多线程并发问题&#xff09; 二、 缓存更新的最佳策略 一、操作缓存和数据库时有…

el-table 插入单选并进行校验

<template><div><el-form :model"list" ref"ruleForm"><el-table :data"list.tableData" style"width: 100%"><el-table-column prop"time" label"日期" width"180"><…

深入理解swap交换分区理解及扩存

一、什么是swap交换分区? 定义&#xff1a;Swap space交换空间&#xff0c;是虚拟内存的表现形式。系统为了应付一些需要大量内存的应用&#xff0c;而将磁盘上的空间做内存使用&#xff0c;当物理内存不够用时&#xff0c;将其中一些暂时不需要的数据交换到交换空间&#xf…

windows无界鼠标,多机共享一套键鼠

原因 当前使用一台笔记本和一个台式机。用起来很麻烦。想要找到共享键鼠的方案。找到了无界鼠标这个软件。 安装 在两台电脑上都安装powertoy应用。 https://github.com/microsoft/PowerToys csdn下载 安装完成后找到无界鼠标打开 配置 多台电脑配置相同的key,刷新识别设…

1.JavaWebJava基础加强[万字长文]-Junit、反射、注解核心知识点梳理

导语&#xff1a; 一、Junit单元测试 1.Junit测试概述 2.Junit使用步骤 3.Junit_Before&After 二、反射 1.反射概述 2.反射获取字节码Class对象的三种方式 3.Class对象功能概述 4.Class对象功能_获取Field 5.Class对象功能_获取Constructor 6.Class对象功能_获取…

关于制作一个Python小游戏(三)

目录 前言: 在前面我们已经了解过了关于制作pygame的使用和在里面游戏中的简单操作的内容了,今天我们主要讲的就是关于敌机的出现和如何去操控游戏中英雄飞机和敌机的出现 1.敌机的设计: 1.1敌机出场的实现: 1.1.1游戏启动后,每个一秒钟出现一架敌方飞机 1.1.2每架敌机向屏…

机器人期刊:Science Robotics and IEEE Transactions

文章目录 1. Science Robotics (出版商 AAAS)2. IEEE Transactions on RoboticsReference1. Science Robotics (出版商 AAAS) https://www.science.org/journal/scirobotics 2. IEEE Transactions on Robotics

来,我们把LangChain了解一下

目录 LangChain简介 LangChain Experssion Language 常见API key申请 LangChain简介 最近要学的东西可太多了&#xff0c;好的&#xff0c;我们先来看看LangChain是什么东西&#xff0c;咱就是说开干吧&#xff1a; pip install langchain Get started吧&#xff1a;Get …

基于 EfficientNetV2 实现判别MNIST 手写模型分类

pytorch深度学习项目实战100例 的学习记录 我的环境&#xff1a; 白票大王&#xff1a; google colab 用其他的话&#xff0c;其实实现也行&#xff0c;但是让小白来重环境来开始安装的话&#xff0c;浪费时间 论文速读 EfficientNetV2是由 Google Research&#xff0c;Br…

(3)(3.3) MAVLink高延迟协议

文章目录 前言 1 配置 2 说明 3 消息说明 前言 ArduPilot 支持 MAVLink 高延迟协议(MAVLink High Latency)。该协议专为卫星或 LoRA 等低带宽或高成本链路而设计。 在此协议中&#xff0c;每 5s 只发送一次 HIGH_LATENCY2 MAVLink 信息。对 MAVLink 命令或请求&#xff08…

Java常用类库:Math类

在Java编程语言中&#xff0c;java.lang.Math类提供了一系列用于执行基本数学运算的静态方法。这些方法允许你执行各种数学计算&#xff0c;如三角函数、指数函数、对数函数、取整函数等。在本教程中&#xff0c;我们将介绍Math类的常用方法及其用法。 常用方法 以下是Math类…