文章目录
1. 效果展示
2. 架构搭建
2.1 Test.java
负责对 ATM 系统进行测试
/**
* 测试类Test,负责对ATM系统进行测试
*/
public class Test {
public static void main(String[] args) {
// 1. 创建ATM类的一个对象
ATM atm=new ATM();
// 2. 调用ATM对象的start()方法
atm.start();
}
}
2.2 Account.java
负责定义账户信息
卡号、姓名、性别、密码、余额、限额
/**
* 账户类Account,负责定义账户信息
* 卡号、姓名、性别、密码、余额、限额
*/
public class Account {
private String cardId;
private String name;
private char sex;
private String password;
private double balance;
private double limit;
public String getCardId() {
return cardId;
}
public void setCardId(String cardId) {
this.cardId = cardId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
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 getBalance() {
return balance;
}
public void setBalance(double balance) {
this.balance = balance;
}
public double getLimit() {
return limit;
}
public void setLimit(double limit) {
this.limit = limit;
}
}
2.3 ATM.java
负责提供所有的 ATM 业务处理方法
2.3.0 导包准备
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;
public class ATM(){
private ArrayList<Account> accounts=new ArrayList<>(); // 账户列表
private Scanner scanner=new Scanner(System.in);
}
2.3.1 初始界面(欢迎界面)实现
/**
* ATM机的欢迎页面(初始界面)
* 本方法为无参方法,不接受任何参数。
* 无返回值,执行完毕后不返回任何结果。
*/
public void start() {
while(true){
System.out.println("===== 欢迎进入ATM系统 =====");
System.out.println("[1] 用户登录");
System.out.println("[2] 用户开户");
System.out.println("[0] 退出系统");
System.out.print("请选择:");
// 获取用户输入
switch (scanner.nextInt()) {
case 1:
this.login(); // 用户登录
break;
case 2:
this.creatAccount(); // 用户开户
break;
case 0: // 用户退出
System.out.println("欢迎下次使用!");
return;
default: // 非法输入
System.out.println("输入有误,请重新输入!");
}
}
}
2.3.2 开户功能实现
/** 功能:创建(开)账户 */
private void creatAccount(){
// 1.创建一个账户
Account account=new Account();
account.setBalance(0); // 新开账户余额默认为0
account.setLimit(5000); // 新开账户额度默认为5000
account.setCardId(creatCardId()); // 产生8位的开户卡号(不重复)
// 2.录入账户信息
System.out.println("-------- 开户界面 --------");
System.out.print("请输入开户名:");
account.setName(scanner.next());
while (true) {
System.out.print("请输入性别(男/女):");
account.setSex(scanner.next().charAt(0));
if (account.getSex()=='男'||account.getSex()=='女') {
break;
}else{
System.out.println("输入有误,请重新输入!");
}
}
while (true) {
System.out.print("请输入设置账户密码:");
account.setPassword(scanner.next());
System.out.print("请再次确认账户密码:");
if (!account.getPassword().equals(scanner.next())) { // 两次密码输入不一致
System.out.println("两次密码输入不一致,请重新设置密码!");
}else{
break;
}
}
// 3.添加到账户列表
this.accounts.add(account);
System.out.println("你已开户成功,卡号为"+account.getCardId());
}
/** 功能:返回8位的随机卡号,且与账户列表已有卡号不重复 */
private String creatCardId(){
String cardId="";
Random random=new Random();
while(true){
// 1.随机生成8位数字的卡号
for (int i = 0; i < 8; i++) {
cardId+=random.nextInt(10); // 0-9
}
if(this.getAccountByCardId(cardId)==null){ // 生成的卡号不重复
return cardId;
}
}
}
/**
* 根据卡号获取对应的账户信息。
* 遍历所有账户,查找卡号匹配的账户并返回。
*
* @param cardId 卡号,用于查找对应的账户。
* @return Account 对象,如果找到匹配的账户则返回该账户,否则返回null。
*/
private Account getAccountByCardId(String cardId){
for (Account account : accounts) { // 遍历所有账户
if (account.getCardId().equals(cardId)) { // 判断当前账户的卡号是否与传入的卡号匹配
return account;
}
}
return null; // 账户列表中无该卡号对应的账户
}
2.3.3 登录功能实现
/**
* 登录功能的实现。
* 该方法不需要参数,也不返回任何值。
*/
private void login(){
if (this.accounts.isEmpty()) {
System.out.println("系统暂无用户!");
return;
}
// 1.输入卡号
System.out.println("-------- 登录界面 --------");
Account accountLogin = null;
while (true) { // 检查卡号是否输入正确
System.out.print("请输入卡号:");
accountLogin = this.getAccountByCardId(scanner.next());
if (accountLogin ==null) {
System.out.println("卡号不存在,请重新输入!");
}else{
break;
}
}
// 2.输入密码
while(true){
System.out.print("请输入密码:");
if (accountLogin.getPassword().equals(scanner.next())) {
System.out.println("登录成功!");
break;
} else {
System.out.println("密码错误,请重新输入!");
}
}
// 3.登录成功后,进入主菜单界面
this.mainMenu(accountLogin);
}
2.3.4 主菜单界面实现
/**
* 主菜单界面逻辑处理。
* 该方法用于展示主菜单,并根据用户选择执行相应的操作。
* @param accountLogin 登录用户账户信息,用于在主菜单中根据账户状态提供不同的功能选项。
*/
private void mainMenu(Account accountLogin){
while(true){
System.out.println("--------- 主界面 ---------");
System.out.println(accountLogin.getName()+"用户你好!");
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("[0] 退出当前界面");
System.out.print("请选择: ");
switch (scanner.nextInt()) {
case 1:
this.show(accountLogin); // 查询当前账户信息
break;
case 2:
this.deposit(accountLogin); // 存款业务
break;
case 3:
this.withdraw(accountLogin); // 取款业务
break;
case 4:
this.transferMoney(accountLogin); // 转账业务
break;
case 5:
this.changePassword(accountLogin); // 密码修改
break;
case 6: // 注销当前账户
if(this.deleteAccount(accountLogin)){ // 注销成功
return;
}else{ // 注销失败
break;
}
case 0:
System.out.println("你已成功退出当前页面!"); // 退出当前界面
return;
default:
System.out.println("输入有误!"); // 输入有误
}
}
}
2.3.5 查询业务实现
/**
* 展示账户信息
* @param accountLogin 账户登录信息对象,包含账户的基本信息
* 该方法不返回任何值
*/
private void show(Account accountLogin){
// 打印账户信息的标题
System.out.println("-------- 账户信息 --------");
// 打印账户的基本信息
System.out.println("卡号:"+accountLogin.getCardId());
System.out.println("姓名:"+accountLogin.getName());
System.out.println("性别:"+(accountLogin.getSex()=='男'?"男":"女")); // 根据性别字段打印性别信息
System.out.println("余额:"+accountLogin.getBalance()+"¥");
System.out.println("限额:"+accountLogin.getLimit()+"¥");
}
2.3.6 存款业务实现
/**
* 为账户进行存款操作。
* @param accountLogin 用户的账户对象,用于执行存款操作的登录账户。
*/
private void deposit(Account accountLogin) {
System.out.println("-------- 存款界面 --------");
double money=0;
while(true){
System.out.print("请输入存款金额:");
money=scanner.nextDouble();
if (money<=0) {
System.out.println("输入有误,请重新输入!");
}else{
accountLogin.setBalance(accountLogin.getBalance()+money);
System.out.println("已成功存款"+money+"元,当前可用余额为"+accountLogin.getBalance()+"元");
break;
}
}
}
2.3.7 取款业务实现
/**
* 取款操作函数
* @param accountLogin 用户的账户对象,用于进行取款操作和余额查询
*/
private void withdraw(Account accountLogin) {
System.out.println("-------- 取款界面 --------");
double money=0;
while(true){
System.out.print("请输入取款金额:");
money=scanner.nextDouble();
if (money<=0) { // 判断输入的取款金额是否合法
System.out.println("输入有误,请重新输入!");
}else if(money>accountLogin.getBalance()) { // 判断账户余额是否足够进行取款
System.out.println("余额不足,请重新输入!");
}else if(money>accountLogin.getLimit()){ // 判断是否超过账户限额
System.out.println("超过账户限额,请重新输入!");
}else{ // 执行取款操作,更新账户余额
accountLogin.setBalance(accountLogin.getBalance()-money);
System.out.println("已成功取款"+money+"元,当前可用余额为"+accountLogin.getBalance()+"元");
break; // 取款成功后退出循环
}
}
}
2.3.8 转账业务实现
/**
* 实现转账功能。
* 该方法用于将登录账户内的资金转移到其他账户。
* @param accountLogin 登录账户,用于资金转移的起始账户。
*/
private void transferMoney(Account accountLogin) {
System.out.println("-------- 转账界面 --------");
// 1.判断ATM系统中的账户数目是否大于1
if(this.accounts.size()<2){
System.out.println("ATM系统暂无其他账户,无法进行转账!");
return;
}
// 2.输入转账账户的卡号并验证
Account accountTransfer = null;
String cardId="";
while(true) {
System.out.print("请输入转账账户的卡号:");
cardId = scanner.next();
if (cardId.length() != 8) { // 卡号长度检验
System.out.println("卡号长度有误,请重新输入!");
continue;
}
if (cardId.equals(accountLogin.getCardId())) {
System.out.println("不能给自己转账!");
} else {
accountTransfer = this.getAccountByCardId(cardId);
if (accountTransfer == null) {
System.out.println("卡号不存在,请重新输入!");
} else {
break;
}
}
}
// 3.输入转账金额并验证后,进行转账
double money=0;
while(true){
System.out.print("请输入转账金额:");
money=scanner.nextDouble();
if (money<=0) { // 判断输入的转账金额是否合法
System.out.println("输入有误,请重新输入!");
}else if(money>accountLogin.getBalance()) { // 判断账户余额是否足够进行转账
System.out.println("余额不足,请重新输入!");
} else if(money>accountLogin.getLimit()){ // 判断是否超过账户限额
System.out.println("超过账户限额,请重新输入!");
}else{ // 可以进行转账
accountTransfer.setBalance(accountTransfer.getBalance()+money);
accountLogin.setBalance(accountLogin.getBalance()-money);
System.out.println("已成功向卡号为"+accountTransfer.getCardId()+"的用户转账"+money+"元");
System.out.println("当前可用余额为"+accountLogin.getBalance()+"元");
break;
}
}
}
2.3.9 密码修改实现
/**
* 更改账户密码的方法。
* @param accountLogin 登录账户的信息,用于标识需要更改密码的账户。
* @return 无返回值。
*/
private void changePassword(Account accountLogin) {
System.out.println("-------- 修改密码界面 --------");
String password="";
// 1.输入新密码并验证
while(true){
System.out.print("请输入新密码:");
password = scanner.next();
if (password.isEmpty()) { // 密码不能为空
System.out.println("密码不能为空,请重新输入!");
continue;
}
if (password.equals(accountLogin.getPassword())) { // 密码不能与原密码相同
System.out.println("新密码不能与原密码相同,请重新输入!");
continue;
}
break;
}
// 2.输入确认密码并验证后,修改原密码
while(true){
System.out.print("请再次确认新密码:");
if(!password.equals(scanner.next())){ // 两次密码不一致
System.out.println("两次密码不一致,请重新输入!");
continue;
}else{ // 密码一致,修改原密码
accountLogin.setPassword(password);
System.out.println("密码修改成功!");
break;
}
}
}
2.3.10 注销当前账务实现
/**
* 注销账户。
* @param accountLogin 账户登录信息,用于标识要删除的账户。
* @return 返回一个布尔值,表示账户是否成功删除。
*/
private boolean deleteAccount(Account accountLogin) {
System.out.println("-------- 注销账户界面 --------");
String choice="";
while(true){
System.out.print("是否确认注销当前账户(y/n):");
choice=scanner.next();
if(!choice.equals("y")&&!choice.equals("n")){
System.out.println("输入有误,请重新输入!");
continue;
}
if (choice.equals("y")) {
if(accountLogin.getBalance()>0){ // 账户中有存款,不允许注销
System.out.println("该账户中还有存款,不允许注销!");
return false;
}else{ // 账户中没有存款,允许注销
this.accounts.remove(accountLogin);
System.out.println("该账户注销成功!");
return true;
}
}else{
System.out.println("已取消注销!");
return false;
}
}
}