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~9cardId += data;}//判断cardId中存储的卡号是否与其他账户的卡号重复了//这里定义了一个方法,用来查询当前卡号是否存在账户,如果有就返回账户,无则返回nullAccount 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课程

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

每日学习总结20240306

每日总结 20240306 1. 断言测试判断 #include <iostream> #include <assert.h> #include <cassert> #include <stdio.h>#define STR_OK "[\x1b[1;32m OK \x1b[0m]" #define STR_FAIL "[\x1b[1;31mFAIL\x1b[0m]"…

Open3D 生成空间3D椭圆点云

目录 一、算法原理二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法原理 设椭圆在 X O Y XOY XO

vue3+ts项目创建 使用npm create vue@latest

npm create vuelatest相关创建代码&#xff1a;

短视频矩阵系统技术开发商--支持技术资质核验(自研独立saas框架开发)

短视频矩阵系统是一种能够帮助用户快速制作、发布和推广短视频的系统。 &#x1f347;&#x1f347;它通常包括以下部分&#xff1a; 短视频矩阵系统#短视频矩阵系统源头#短视频矩阵系统源头开发#短视频矩阵系统软件#短视频矩阵系统技术#2024互联网风口项目短视频矩阵系统带动…

【AI视野·今日NLP 自然语言处理论文速览 第八十三期】Wed, 6 Mar 2024

AI视野今日CS.NLP 自然语言处理论文速览 Wed, 6 Mar 2024 Totally 74 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers MAGID: An Automated Pipeline for Generating Synthetic Multi-modal Datasets Authors Hossein Aboutalebi, …

贪心 Leetcode 968 监控二叉树

监控二叉树 Leetcode 968 学习记录自代码随想录 给定一个二叉树&#xff0c;我们在树的节点上安装摄像头。 节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。 计算监控树的所有节点所需的最小摄像头数量。 要点&#xff1a;1.想到优先覆盖叶子节点&#xff0c…

css-通用样式按钮加号

1.实现 2.代码 html <div class"addF">&#xff0b;</div> css .addF{width:40px;font-size:25px;font-weight:600;background-color:rgb(64, 158, 255);text-align:center;color:white;height:34px;border-radius:3px;line-height:34px; }

【漏洞复现】-用友CRM系统存在逻辑漏洞直接登录后台

免责声明&#xff1a; 本文内容为学习笔记分享&#xff0c;仅供技术学习参考&#xff0c;请勿用作违法用途&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。任何个人和组织利用此文所提供的信息而造成的直接或间接后果和损失&#xff0c;…

航天民芯一级代理 MT3608 MT3608L 升压转换器 1.2MHZ

MT3608/MT3608L是恒定频率的6引脚SOT23电流模式升压转换器&#xff0c;适用于小型、低功耗应用。MT3608在1.2MHz&#xff0c;允许使用微小、低成本的频率高度不超过2mm的电容器和电感器。内部软启动可实现较小的浪涌电流和延长电池寿命。MT3608具有自动切换到脉冲的功能轻负载下…

Echarts 配置项 series 中的 data 是多维度

文章目录 需求分析 需求 如下图数据格式所示&#xff0c;现要求按照该格式进行绘制折线图 分析 在绘制折线图时&#xff0c;通常我们的 series 中的 data 数据是这样的格式 option {title: {text: Stacked Area Chart},tooltip: {trigger: axis,axisPointer: {type: cross…

uniapp+vue3+vites使用lime-echart问题记录

问题记录 1.vue3使用echarts,H5和微信小程序兼容问题 1.vue3使用echarts,H5和微信小程序兼容问题 问题描述&#xff0c;正常使用echarts&#xff0c;H5正常&#xff0c;小程序报错 报错信息如下 解决方案&#xff1a; 注意要点一&#xff1a;vue3需要使用esm文件 地址&#x…

TOMCAT多实例及调优

一、JVM相关理论 &#xff08;一&#xff09;JVM组成 1.JVM组成部分 类加载子系统: 使用Java语言编写.java Source Code文件&#xff0c;通过javac编译成.class Byte Code文件。class loader类加载器将所需所有类加载到内存&#xff0c;必要时将类实例化成实例 运行时数据区…

streamlit学习-如何播放HLS视频(streamlit嵌入html)

streamlit学习-如何播放HLS视频 一.效果二.直播环境搭建(仅供演示)1.生成m3u82.搭建http服务器(支持跨域)3.验证hls(VLC播放 http://localhost:8000/playlist.m3u8) 三.streamlit demo 本文演示了streamlit如何实现hls直播[streamlit中嵌入html] 一.效果 二.直播环境搭建(仅供演…

ipv6一致性测试-icmpv6测试步骤

ICMPv6测试步骤 测试配置 防火墙接口1地址 2017:28::6/64 防火墙接口1的MAC地址 00:0C:29:D9:AD:9E 测试主机1地址 2017:28::5/64 测试主机1的网关 2017:28::6 防火墙接口2地址 2017:29::5/64 防火墙接口2的MAC地址 00:0C:29:D9:AD:A8 测试主机2地址 2017:29::5/64 测试主机2的…

Docker前后端项目部署

目录 一、搭建项目部署的局域网 二、redis安装 三、MySQL安装 四、若依后端项目搭建 4.1 使用Dockerfile自定义镜像 五、若依前端项目搭建 一、搭建项目部署的局域网 搭建net-ry局域网&#xff0c;用于部署若依项目 docker network create net-ry --subnet172.68.0.0/1…

VGW在 Windows 平台上局域网就绪的旁路由器程序

在查阅本篇文章之前可以查看下&#xff0c;本人前两年写的关于VGW软件路由器的文章 Linux 平台上面单网卡 TUN/TAP实现局域网其它设备上网_linux 物理网卡与tun同网段-CSDN博客 VGW软件路由器是一个工作IEEE以太网&#xff08;L2&#xff09;链路层的路由器程序&#xff0c;它…

C++进阶之路---继承(一)

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C从入门到精通》 《LeedCode刷题》 键盘敲烂&#xff0c;年薪百万&#xff01; 一、继承的概念及定义 1.继承的概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0…

LeetCode 刷题 [C++] 第98题.验证二叉搜索树

题目描述 给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。 题目分析 由题…

二级水平导航菜单栏的实现

1. 这个是本人设计的一带一路的二级水平导航栏HTML代码&#xff1b; 这里最后实现的效果是鼠标悬停在导航栏上面&#xff0c;就会显示下面的4个部分页面&#xff0c;这里只是以评论热 点作为例子&#xff0c;其他的类似&#xff1b; 2.首先要设计DIV&#xff0c;然后利用无…

Android 消息恢复 - 如何在 Android 上检索已删除的短信

最新调查显示&#xff0c;手机每天发送和接收的短信数以亿计&#xff0c;尤其是Android智能手机。但与此同时&#xff0c;Android消息丢失也每天都在发生。因此&#xff0c;如何恢复Android手机上已删除的短信对于那些在设备中保存了一些重要信息的人来说似乎非常重要。 在这里…