前言
随着网络时代的发展,ATM早已经普及,面对注册登录等的底层逻辑你是否熟悉呢?特此,书写ATM的运行逻辑,来帮助大家更好的理解.
1.ATM架构的搭建
首先我们应定义一个账户类,来管理账户数据.还需要一个atm类,创建方法对数据进行操作.最后需要一个测试类,来调试我们的代码. 1.创建账户类时,我们应运用封装思想,来让数据具有安全性,私有起来更便于操作.(可选中右键,快捷操作) 2.创建atm类时,会用arraylist在对数据进行统计. 3.建测试类,调用atm系统.
账户类
package com.heliu;
public class Account { private String cardID; private String userName; private char sex; private String passWord; private double money; private double limit;
public void setCardID(String cardID) {
this.cardID = cardID;
}
public void setUserName(String userName) {
this.userName = userName;
}
public void setSex(char sex) {
this.sex = sex;
}
public void setPassWord(String passWord) {
this.passWord = passWord;
}
public void setMoney(double money) {
this.money = money;
}
public void setLimit(double limit) {
this.limit = limit;
}
public String getCardID() {
return cardID;
}
public String getUserName() {
return userName+(sex =='男'?"先生":"女士");
}
public char getSex() {
return sex;
}
public String getPassWord() {
return passWord;
}
public double getMoney() {
return money;
}
public double getLimit() {
return limit;
}`
测试类
package com.heliu;
public class text {
public static void main(String[] args) {
/*创建ATM*/
ATM atm = new ATM();
atm.start();
}
}
用户界面的设计
package com.heliu;
import java.security.PrivateKey;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Random;
import java.util.Scanner;
public class ATM {
private Scanner sc =new Scanner(System.in);
private Account loginAcc;
private ArrayList<Account> accounts = new ArrayList<>();
/*欢迎界面*/
public void start(){
while(true){
System.out.println("欢迎来到ATM");
System.out.println("1.用户登录");
System.out.println("2.用户开户");
System.out.println("3.退出");
int comand = sc.nextInt();
switch (comand){
case 1:
login();
break;
//用户登录
case 2:
creatAccount();
break;
case 3:
return;
default:
System.out.println("没有该操作!");
}
}
}
2.开户功能
在使用atm系统时,首先应该账户登录,所以我们需要一段代码来来完成账户的注册. 1.首先创建一个方法来建立名字,性别,密码. 2.利用随机数,生成八位卡号 3.
/*开户*/
private void creatAccount(){
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(okpassWord);
break;
}else{
System.out.println("密码不一致");
}
}
System.out.println("请您输入您的取现额度");
double limit = sc.nextDouble();
acc.setLimit(limit);
String newCard = createCardId();
accounts.add(acc);
acc.setCardID(newCard);
System.out.println("恭喜您,开户成功!"+acc.getUserName()+"开户成功,您的卡号是"+acc.getCardID()+"您的取现额度是"+acc.getLimit());
}
//生成卡号
private String createCardId(){
while (true) {
String cardId = "";
Random r =new Random();
for (int i = 0; i < 8; i++) {
int data = r.nextInt(10);
cardId += data;
}
Account acc =getAccountByCardId(cardId);
if(acc ==null){
return cardId;
}
}
}
//检测密码
private Account getAccountByCardId(String cardId){
for (int i = 0; i < accounts.size(); i++) {
Account acc = accounts.get(i);
if(acc.getCardID().equals(cardId)){
return acc;
}
}
return null;
}
}
2.登录操作
进行一切操作的基础,那就是首先要登录.在欢迎那个界面走向的登陆,属于同一个独立的逻辑,所以要写成一个新方法. 1.首先要判断是否创立账户
System.out.println("==用户登录==");
if(accounts.size()==0){
System.out.println("系统无账户,请先开户!");
return;
}
2.有之则进入登陆系统. 既要判断账号的有无null, 同时还要探测密码是否正确,通过equals比较 当错误时又要重新返回,所以需要一个死循环.
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)){
loginAcc = acc;
System.out.println("恭喜您登陆成功"+acc.getUserName()+"您的卡号是"+acc.getCardID());
showUserComand();
return;//跳出当前并结束登录
}else{
System.out.println("您输入的密码不正确");
}
}
}
3.登录后的一系列操作
当进入后,设计一系列功能,因为是多个分支,所以需要switch分支来进行.最后再对各个功能创建新方法
private void showUserComand(){
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.注销账户");
System.out.println("请选择");
int command = sc.nextInt();
switch (command){
case 1:
showloginAccount();
//查询账户
break ;
case 2:
//存款
depositMoney();
break ;
case 3:
drawMoney();
break ;
case 4:
transfeMoney();
break ;
case 5:
updatePassWord();
return;
case 6:
System.out.println(loginAcc.getUserName()+"您退出系统成功");
return;
case 7:
//注销
if(deleteAccount()){
return;
}else {
}
default:
System.out.println("您当前选择的操作是不存在的");
``
}
}
}
同时登陆完成后,需要展示用户信息.
private void showloginAccount(){
System.out.println("您的信息如下");
System.out.println("卡号"+loginAcc.getCardID());
System.out.println("姓名"+loginAcc.getUserName());
System.out.println("性别"+loginAcc.getSex());
System.out.println("余额"+loginAcc.getMoney());
System.out.println("每次取现额度"+loginAcc.getLimit());
;
}
4.存取款功能的实现
当新建一个账户后,空空如也.这时我们需要新建两个方法,分别实现存取款的操作. 首先是存款操作.
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("取款操作");
if(loginAcc.getMoney()>100){
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());
}
}else{
System.out.println("余额不足,您的余额是"+loginAcc.getMoney());
}
}else{
System.out.println("余额不足100");
return;
}
}
5.转账功能
转账呢,首先要自己有钱吧? 首先要有两个账户吧? 有优先判定 最重要的是,转账还有账户认证, 截取函数substring来避开第一位,同时第一位成为*. 姓氏判断startsWith进行核查 最后完成验证,才可以进行操作.
private void transfeMoney() {
System.out.println("用户转账");
if(accounts.size()<2){
System.out.println("只有一个账户,无法转账");
return;
}
if (loginAcc.getMoney() ==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 {
String name ="*"+acc.getUserName().substring(1);
System.out.println("请您输入["+name+"]姓氏");
String preName = sc.next();
if(acc.getUserName().startsWith(preName)){
while (true) {
System.out.println("请输入转账金额");
double money = sc.nextDouble();
if(loginAcc.getMoney()>=money){
loginAcc.setMoney(loginAcc.getMoney()-money);
acc.setMoney(acc.getMoney()+money);
System.out.println("恭喜您,转账成功!");
return;
//可以转
}else{
System.out.println("余额不足,最多可以转"+loginAcc.getMoney());
}
}
}else{
System.out.println("对不起,您认证的形式有问题");
}
}
}
}
7.销户操作
销户很重要,首先要确认是否销户.~! 其次销户不能有存款,从账户删掉.用remove函数 新建方法, 销户是否完成,通过布尔类型来决定返回值 销户成功后,回到欢迎页!
private boolean deleteAccount() {
System.out.println("进行销户");
System.out.println("请您确认销户");
System.out.println("y表示确定");
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;
}
}
8.密码修改
为确保用户账号安全,可以通过最重要的密码修改,来保护账户. 密码修改应该慎重,所以修改密码需要输入两次,函数比较 当原密码或者新密码错误时,又需要重新进行,又需要一个死循环.
private void updatePassWord() {
System.out.println("账户密码修改");
while (true) {
System.out.println("请您输入当前密码");
String passWord = sc.next();
if(loginAcc.getPassWord().equals(passWord)){
while (true) {
System.out.println("请您输入新密码");
String newPassWorad = sc.next();
System.out.println("请您再次输入确认密码");
String okPassWorad = sc.next();
if(okPassWorad.equals(newPassWorad)){
loginAcc.setPassWord(okPassWorad);
System.out.println("恭喜您,修改密码成功");
return;
}else{
System.out.println("两次密码输入不一致");
}
}
}else{
System.out.println("您当前密码输入不正确");
}
}
}
至此,atm基本操作已完成