1.创建Account对象
/**
* 账户类-用于创建对象
*/
public class Account {
private String cardId;//卡号
private String userName;//用户名
private String passWord;//密码
private double money;//账户余额
private double quotaMoney;//每次取现额度
//无参构造器
public Account() {
}
//有参构造器
public Account(String cardId, String userName, String passWord, double money, double quotaMoney) {
this.cardId = cardId;
this.userName = userName;
this.passWord = passWord;
this.money = money;
this.quotaMoney = quotaMoney;
}
//定义getter 和 setter方法
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;
}
}
2.具体实现
/**
* ATM系统的入口类
*/
public class ATMSystem {
public static void main(String[] args) {
//定义一个集合容器,用来存储内容
ArrayList<Account> accounts=new ArrayList<>();
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来把操作分开
switch (command){
case 1:
//用户登录操作
login(accounts,sc);
break;
case 2:
//用户注册操作
register(accounts,sc);
break;
default:
System.out.println("对不起,您输入的操作命令不存在!!");
}
}
}
/**
* 登录功能的实现
* @param accounts 接收的账户集合
* @param sc 扫描器
*/
public static void login(ArrayList<Account> accounts, Scanner sc) {
System.out.println("===================系统登录操作=================");
//判断账户集合中是否存在账户
if (accounts.size()==0){
System.out.println("对不起,当前系统中,无任何账号,请先开户,再来登录~~");
return;
}
//正式登录
while (true) {
System.out.println("请您输入登录卡号");
String cardId=sc.next();
//根据卡号,查询有无账号
Account acc=getAccountByCardId(cardId,accounts);
if (acc!=null){
//让用户输入密码
while (true) {
System.out.println("请您输入登录密码:");
String passWord=sc.next();
if (acc.getPassWord().equals(passWord)){
//登录成功了
System.out.println("恭喜您"+acc.getUserName()+"先生/女士进入系统,您的卡号是:"+acc.getCardId());
//查询,存款,取款
showUserCommand(acc,sc,accounts);
return;//干掉登录方法
}else {
System.out.println("对不起,您输入的密码有误~~~");
}
}
}else {
System.out.println("对不起,系统中不存在该账号卡号~~");
}
}
}
/**
* 登录之后的操作页
* @param sc
*/
public static void showUserCommand(Account acc,Scanner sc,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:
//取款
drawMoney(acc,sc);
break;
case 4:
//转账
transferMoney(sc,acc,accounts);
break;
case 5:
//修改密码
updatePassWord(sc,acc);
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
*/
public 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 sc 扫描器
* @param acc 当前账户对象
*/
public static void updatePassWord(Scanner sc, Account acc) {
System.out.println("=====================用户修改操作==================");
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 okNewPassWord=sc.next();
if(newPassWord.equals(okNewPassWord)){
//2次密码正确,可以修改了
acc.setPassWord(newPassWord);
System.out.println("恭喜您,您密码修改成功");
return;
}else {
System.out.println("您输入的2次密码不一致~~");
}
}
}else {
//密码错误
System.out.println("您输入的密码不正确!");
}
}
}
/**
* 转账功能
* @param sc 扫描器
* @param acc 自己的账户系统
* @param accounts 全部账户集合
*/
public static void transferMoney(Scanner sc, Account acc, ArrayList<Account> accounts) {
System.out.println("=====================用户转账操作==================");
if (accounts.size()<2){
System.out.println("当前系统中,不足2个账户,不能进行转账,请去开户吧~~~");
return;
}
//判断自己的账户是否有钱
if(acc.getMoney()==0){
System.out.println("余额不足,无法转账");
return;
}
//真正开始转账
while(true) {
System.out.println("请您输入对方账号的卡号");
String cardId=sc.next();
//这个卡号不能是自己的卡号
if(cardId.equals(acc.getCardId())){
System.out.println("对不起,您不能给自己转账");
continue;
}
//判断卡号是否存在
Account accountByCardId = getAccountByCardId(cardId, accounts);
if (accountByCardId==null){
System.out.println("对不起,您输入的账号不存在~~~");
}else {
//这个账号对象存在了,继续认证他的姓氏
String userName=accountByCardId.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);
accountByCardId.setMoney(accountByCardId.getMoney()+money);
System.out.println("转账成功!您的账户还剩余:"+acc.getMoney());
return;
}
}
}else {
System.out.println("对不起,您输入的信息有误!");
}
}
}
}
/**
* 取钱功能
* @param acc 当前账户信息
* @param sc 扫描器
*/
public static void drawMoney(Account acc, Scanner sc) {
System.out.println("=====================用户取钱操作==================");
if (acc.getMoney()<100){
System.out.println("对不起,当前账户中不足100元,不能取钱");
return;
}
while (true) {
System.out.println("请输入取款金额:");
double Money = sc.nextDouble();
//判断金额是否满足要求
if(Money>acc.getQuotaMoney()){
System.out.println("对不起,您当前取款金额超过每次限额,每次最多可取:"+acc.getQuotaMoney());
}else {
if(Money>acc.getMoney()){
System.out.println("余额不足");
}else {
System.out.println("恭喜您,取钱"+Money+"元,成功!");
acc.setMoney(acc.getMoney()-Money);
showAccount(acc);
return;
}
}
}
}
/**
* 存款
* @param acc 当前用户对象
* @param sc 扫描器
*/
public 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
*/
public 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 接收的账户集合
*/
public static void register(ArrayList<Account> accounts,Scanner sc){
System.out.println("=====================系统开户操作==================");
//1.创建一个账户对象,用于后期封装账户信息
Account account=new Account();
System.out.println("请您输入账户用户名:");
String userName=sc.next();
account.setUserName(userName);
//2.录入当前这个账号的信息,注入到账户对象中去
while (true) {
System.out.println("请您输入账户密码:");
String passWord=sc.next();
System.out.println("请您输入确认密码:");
String okPassWord=sc.next();
//用于判断输入的两次密码,是否一致
if(okPassWord.equals(passWord)){
account.setPassWord(okPassWord);
break;
}else {
System.out.println("对不起,您输入的2次密码不一致,请重新输入~");
}
}
//输入账户每次的限额
System.out.println("请您输入账户单次限额:");
double quotaMoney=sc.nextDouble();
account.setQuotaMoney(quotaMoney);
//为用户分配卡号,随机分配一个8位且不重复的卡号
String cardId=getRandomCardId(accounts);
account.setCardId(cardId);
//把账户对象添加到账户集合中
accounts.add(account);
System.out.println("恭喜您,"+userName+"先生/女士,您开户成功,您的卡号是:"+cardId+",请您妥善保管!");
}
/**
* 为账号生成8位与其他账号卡号不同的号码
* @return
*/
public static String getRandomCardId(ArrayList<Account> accounts) {
Random r=new Random();
while (true) {
String cardId="";
//随机生成8位的账号
for (int i=0;i<8;i++){
cardId+=r.nextInt(10);
}
//判断8位的卡号是否与ATM系统中的账号是否相同
Account accountByCardId = getAccountByCardId(cardId, accounts);
if (accountByCardId==null){
return cardId;
}
}
}
/**
* 查找系统中是否存在相同的卡号
* @param cardId 卡号
* @param accounts 全部账号对象
* @return 账号对象|null
*/
public static Account getAccountByCardId(String cardId,ArrayList<Account> accounts){
for (int i = 0; i < accounts.size(); i++) {
Account account = accounts.get(i);
if(account.getCardId().equals(cardId)){
return account;
}
}
return null;
}
}