哈喽,我又来啦!好久没更新了,最近在复习Java基础,然后做了一个简单的ATM系统,可以实现开户,登录,查询,存款,取款,转账,修改密码,注销等简单的功能。
下面附上代码
首先是一个账户的实体类这里就没啥解释的了。
package ATM;
/**
* @author 小于小于, 一条咸鱼
* @date 2022/7/19 15:17
*/
public class Account {
private String cardId;
private String userName;
private String passWord;
private double money;
private double quotaMoney;
public String getCardId() {
return cardId;
}
public void setCardId(String cardId) {
this.cardId = cardId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
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 getQuotaMoney() {
return quotaMoney;
}
public void setQuotaMoney(double quotaMoney) {
this.quotaMoney = quotaMoney;
}
}
接下来才是重头戏,我把所有方法都写在一个类里了,因为简单的做一个控制台程序主要是他的编程思路。
ATMSystem类
package ATM;
import org.omg.CORBA.ACTIVITY_COMPLETED;
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;
/**
* @author 小于小于, 一条咸鱼
* @date 2022/7/19 15:17
*/
public class ATMSystem {
public static void main(String[] args) {
//2、定义一个集合容器,负责以后存储全部的账户对象,进行相关的业务操作
ArrayList<Account> accounts = new ArrayList<>();
//3.系统页面展示
Scanner sc = new Scanner(System.in);
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 :
//用户登录操作
login(accounts,sc);
break;
case 2 :
//用户开户操作
register(accounts,sc);
break;
default :
System.err.println("对不起,您输入的操作命令不存在~~~");
}
}
}
/**
* 登录功能
*
* @param accounts 全部账户对象
* @param sc 扫描器
*/
private static void login(ArrayList<Account> accounts, Scanner sc) {
System.out.println("===============系统登录操作====================");
//判断账户集合中是否存在账户,如果不存在账户,登录功能不能进行
if (accounts.size() == 0) {
System.out.println("对不起,当前系统中,无任何账户,请先开户,再来登录~~~");
return;
}
//2.正式进入登录操作
while (true) {
System.out.println("请您输入登录卡号");
String cardId = sc.next();
//3.判断卡号是否存在:根据卡号去账户集合中查询账户对象
Account acc = getAccountByCardId(cardId,accounts);
if (acc != null) {
while (true) {
//说明卡号存在
//4.判断用户密码,认证密码
System.out.println("请输入密码:");
String passWord = sc.next();
//判断当前账户对象的密码是否与用户输入的密码一致
if (acc.getPassWord().equals(passWord)){
//登录成功。
System.out.println("恭喜您," +acc.getUserName()+"先生/女士进入系统,您的卡号是:" + acc.getCardId());
//....查询 转账 取款 ...
showUserCommand(sc,acc,accounts);
return;//干掉登录方法
}else {
System.err.println("对不起,您输入的密码有误,请重新输入~");
}
}
}else {
System.err.println("对不起,系统中不存在该账户卡号~~·");
}
}
}
/**
* 展示登录后的操作页
*/
private static void showUserCommand(Scanner sc,Account acc,ArrayList<Account> accounts) {
while (true) {
System.out.println("=============用户操作页===============");
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 :
//查询账户
showAccount(acc);
break;
case 2 :
//存款
depositMoney(acc,sc);
break;
case 3 :
//取款
dropMoney(sc,acc);
break;
case 4 :
//转账
transforMoney(acc, sc, accounts);
break;
case 5 :
//修改密码
updatePassWord(acc, sc);
return;
case 6 :
//退出系统
System.out.println("退出成功~ 欢迎下次光临");
return;
case 7 :
//注销账户
if(deleteAccount(acc, sc,accounts)){
return;//销户成功,回到首页
}else {
break;//没有销户
}
default :
System.out.println("对不起,您输入的命令有误,请重新输入!");
}
}
}
/**
* 删除账户
*
* @param acc 当前账户
* @param sc 扫描器
* @param accounts 所有账户集合
*/
private static boolean deleteAccount(Account acc, Scanner sc, ArrayList<Account> accounts) {
System.out.println("==================用户销户======================");
System.out.println("您真的要跑路???y/n");
String rs = sc.next();
switch (rs){
case "y":
//真正的销户
if (acc.getMoney() > 0) {
System.out.println("您账户中还有钱,不能销户!");
}else {
accounts.remove(acc);
System.out.println("您的账户销户完成~~~");
return true;
}
break;
default:
System.out.println("当前账户继续保留~~算你识相~");
}
return false;
}
/**
* 修改密码
*
* @param acc 当前登录账户对象
* @param sc 扫描器
*/
private static void updatePassWord(Account acc, Scanner sc) {
System.out.println("==================用户密码修改======================");
//1.判断密码是否正确’
while (true) {
System.out.println("请您输入当前密码:");
String passWord = sc.next();
if (acc.getPassWord().equals(passWord)) {
while (true) {
//密码正确
System.out.println("请您输入新密码~");
String newPassword = sc.next();
System.out.println("请您输入新密码~");
String okPassword = sc.next();
if (newPassword.equals(okPassword)){
//2次密码一样,可以修改
acc.setPassWord(okPassword);
System.out.println("恭喜您密码修改成功");
return;
}else {
System.out.println("您输入的2次密码不一样~~~");
}
}
} else {
System.out.println("您输入的密码不正确!!!");
}
}
}
/**
* 转账
*
* @param acc 自己的账户
* @param sc 扫描器
* @param accounts 全部账户集合
*/
private static void transforMoney(Account acc, Scanner sc, ArrayList<Account> accounts) {
System.out.println("================用户转账操作===================");
//1.判断是否足够两个账户
if (accounts.size() < 2) {
System.out.println("当前系统,不足两个账户,你要转账给鬼啊,赶紧去开户");
return;
}
//2.开始转账
if (acc.getMoney() == 0){
System.out.println("小穷鬼,你自己都没钱,还想转账!");
return;
}
while (true) {
//3.开始转账
System.out.println("输入对方账户的卡号:");
String cardID = sc.next();
//这个卡号不能是自己的卡号
if (cardID.equals(acc.getCardId())) {
System.out.println("你是多闲,自己给自己转钱!");
continue;
}
//判断这个卡号是存在的,根据这个卡号去查询对方账户对象
Account account = getAccountByCardId(cardID,accounts);
if (account == null){
System.out.println("对不起,您输入的这个账号不存在~~~");
}else {
// 这个账号对象存在,继续认证他的姓氏
String userName = account.getUserName();
String tip = "*" + userName.substring(1);
System.out.println("请您输入["+tip+"]他的姓氏");
String preName = sc.next();
//认证姓氏是否正确
if(userName.startsWith(preName)){
//认证通过,真正开始转账
while (true) {
System.out.println("请您输入转账金额");
double money = sc.nextDouble();
//判断余额是否足够
if (money > acc.getMoney()) {
System.out.println("对不起,您余额不足,您最多可以转账:" + acc.getMoney());
}else {
//余额够了
acc.setMoney(acc.getMoney() - money);
account.setMoney(account.getMoney() + money);
System.out.println("转账成功!您的账户还剩余:" + acc.getMoney());
System.out.println("恭喜"+account.getUserName()+"收到"+acc.getUserName()+"的转账"+money+"元。" + "你现在有"+account.getMoney() + money+"元");
return;
}
}
} else {
System.out.println("对不起,您输入的信息有误");
}
}
}
}
/**
* 取钱
*
* @param sc 扫描器
* @param acc 当前账户对象
*/
private static void dropMoney(Scanner sc, Account acc) {
System.out.println("============用户取钱操作================");
//1.加判断是否足够100元
if (acc.getMoney() <= 100){
System.out.println("对不起,小穷鬼,你的账户没钱,赶紧去存钱!!!");
return;
}
//2.提示用户输入取款金额
while (true) {
System.out.println("请您输入取款金额:");
double money = sc.nextDouble();
//3.判断这个金额是否满足要求。
if(money > acc.getQuotaMoney()){
System.out.println("对不起,您当前的取款金额超过每次取款限额!每次最多可以取:" + acc.getQuotaMoney());
} else {
// 没有超过当前限额
//4.判断是否超过了账户的总金额
if (money > acc.getMoney()){
System.out.println("没钱,去的太多了!");
}else {
//可以取钱了
System.out.println("恭喜你取钱" + money + "元,成功!");
//更新余额
acc.setMoney(acc.getMoney() - money);
//取钱结束
showAccount(acc);
return;
}
}
}
}
/**
* 存款功能
*
* @param acc 当前账户对象
* @param sc 扫描器
*/
private static void depositMoney(Account acc, Scanner sc) {
System.out.println("===========用户存钱操作==============");
System.out.println("请您输入存款金额:");
double money = sc.nextDouble();
//更新账户余额: 原来的钱 + 新存入的钱
acc.setMoney(acc.getMoney() + money);
System.out.println("恭喜您,存钱成功,当前账户信息如下:");
showAccount(acc);
}
/**
* 展示账户信息
*
* @param acc acc
*/
private static void showAccount(Account acc) {
System.out.println("==============当前账户信息如下================");
System.out.println("卡号:" + acc.getCardId());
System.out.println("户主:" + acc.getUserName());
System.out.println("余额:" + acc.getMoney());
System.out.println("限额:" + acc.getQuotaMoney());
}
/**
* 用户开户功能
*
* @param accounts 接收的账户功能
*/
private static void register(ArrayList<Account> accounts,Scanner sc) {
System.out.println("==============系统开户操作==================");
//1.创建一个账户对象,用于后期封装用户信息。
Account account = new Account();
//2.录入当前这个账户的信息,注入到账户对象中去
System.out.println("请您输入账户用户名:");
String userName = sc.next();
account.setUserName(userName);
while (true) {
System.out.println("请您输入账户密码:");
String password = sc.next();
System.out.println("请您确认密码:");
String okPassword = sc.next();
if (password.equals(okPassword)){
//密码认真通过,可以注入给账户对象
account.setPassWord(okPassword);
break;
}else {
System.err.println("对不起,您输入的2次密码不一样,请重新输入~~~");
}
}
System.out.println("请您输入账户当次限额:");
double quotaMoney = sc.nextDouble();
account.setQuotaMoney(quotaMoney);
//为账户随机一个17位与其他账户卡号不能重复的号码(独立功能,独立成方法)。
String cardId = getRandomCardId(accounts);
account.setCardId(cardId);
//3.把账户对象添加到账户集合中去。
accounts.add(account);
System.out.println("恭喜您," + userName + "先生/女士,您开户成功,您的卡号是:" + cardId + ",请您妥善保管您的卡号!");
}
/**
* 为账户生成17位与其他账户卡号不同的号码
*
* @return
*/
private static String getRandomCardId(ArrayList<Account> accounts) {
//1.生成17位数字
Random rand = new Random();
while (true) {
String cardId = "";
for (int i = 0; i < 17; i++) {
cardId += rand.nextInt(10);
}
//2.判断这个17位卡号是否与其他账户的卡号重复
//根据这个卡号去查询账户对象
Account acc = getAccountByCardId(cardId,accounts);
if (acc == null) {
// 说明cardId 此时没有重复,这个卡号是一个新卡号了,可以使用这个卡号作为新注册账号的卡号
return cardId;
}
}
}
/**
* 根据卡号查询出一个账户对象出来
*
* @param cardId 卡号
* @param accounts 全部账户的集合
* @return 账户对象 | null
*/
private static Account getAccountByCardId(String cardId,ArrayList<Account> accounts){
for (int i = 0; i < accounts.size(); i++) {
Account acc = accounts.get(i);
if (acc.getCardId().equals(cardId)) {
return acc;
}
}
return null;
}
}