一 . 创建一个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 quotaMoney) {
this.cardId = cardId;
this.userName = userName;
this.passWord = passWord;
this.quotaMoney = 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;
}
}
二 . 通过主函数调用方法
public static void main(String[] args) {
//1.准备系统需要的容器对象,用于储存账户对象
ArrayList<Account> accounts = new ArrayList<>();
//2.准备系统的首页:登记 开户
showMain(accounts);
}
三 . 首页方法
public static void showMain(ArrayList<Account> accounts) {
System.out.println("====================欢迎进入首页====================");
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("请输入您想做的操作:");
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.out.println("您当前输入的操作指令不被支持!");
}
}
}
四 . 用户登录方法
/**
* 完成用户登录
*
* @param accounts 账户的集合对象
*/
private static void login(ArrayList<Account> accounts, Scanner sc) {
//必须系统中存在账户才可以登录
if (accounts.isEmpty()) {
//没有账户
System.out.println("当前系统中无任何账户,您需要先注册!");
return;
//直接结束方法
}
while (true) {
//2.让用户键盘录入卡号
System.out.println("请您输入登录的卡号:");
String cardId = sc.next();
//根据卡号查询账户对象
Account acc = getAccountByCardId(cardId, accounts);
//3.判断账户对象是否存在,存在说明卡号没问题
if (acc != null) {
//4.让用户继续输入密码
System.out.println("请您输入登录的密码:");
String password = sc.next();
//5.判断密码是否正确
if (acc.getPassWord().equals(password)) {
//密码正确,登陆成功
//展示登录系统后的操作页面
System.out.println("恭喜您," + acc.getUserName() + "先生/女士成功进入系统,您的卡号是:" + acc.getCardId());
//展示操作页面
showUserCommand(sc, acc, accounts);
return;
//继续结束登录方法
} else {
//登陆失败
System.out.println("您的密码有误,请确认!");
}
} else {
System.out.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.注销账户");
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(accounts, acc, sc);
break;
case 5:
//修改密码
updataPassWord(acc, sc);
return;
//结束当前操作的方法
case 6:
//退出
System.out.println("欢迎下次光临!!!");
return;
//结束当前操作的方法
case 7:
//注销账户
//从当前集合抹掉当前用户对象即可
accounts.remove(acc);
System.out.println("销户成功了!!!");
return;
//结束当前操作的方法
default:
System.out.println("您输入的指令有误!");
}
}
}
六 . 修改密码方法
/**
* @param acc
*/
private static void updataPassWord(Account acc, Scanner sc) {
System.out.println("====================修改密码====================");
while (true) {
System.out.println("请您输入确认密码");
String okPassword = sc.next();
//判断密码是否正确
if (acc.getPassWord().equals(okPassword)) {
//可以输入新密码
System.out.println("请您输入新密码:");
String newPassWord = sc.next();
System.out.println("请您输入新密码:");
String okNewPassWord = sc.next();
if (newPassWord.equals(okNewPassWord)) {
//修改账户对象的密码为新密码
acc.setPassWord(newPassWord);
return;
//直接结束方法9
} else {
System.out.println("您两次输入的密码不一致");
}
} else {
System.out.println("当前输入密码不正确!!!");
}
}
}
七 . 转账方法
/**
* 转账
*
* @param accounts
* @param acc
* @param sc
*/
private static void transferMoney(ArrayList<Account> accounts, Account acc, Scanner sc) {
//判断系统中是否有两个用户及以上
if (accounts.size() < 2) {
System.out.println("对不起,系统中无其他账户,您不可以转账!");
return;
}
//2.判断自己账户中是否有钱
if (acc.getMoney() == 0) {
System.out.println("对不起,您自己都没有钱,就别转帐了");
return;
}
//3.开始转账逻辑
System.out.println("请你输入对方账户卡号:");
String cardId = sc.next();
Account account = getAccountByCardId(cardId, accounts);
//判断这个账户对象是否存在,存在说明对方卡号输入正确
if (account != null) {
//判断这个账户对象是否是当前登陆的自己账户
if (acc.getCardId().equals(acc.getCardId())) {
//正在给自己转账
System.out.println("您不可以给自己转账");
} else {
//确认对方的姓氏
String name = "*" + account.getUserName().substring(1);
System.out.println("请您确认【" + name + "】的姓氏");
String preName = sc.next();
//判断
if (account.getUserName().startsWith(preName)) {
//真正开始转账
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.getUserName() + "转账多少" + money);
showAccount(acc);
return;
}
} else {
System.out.println("对不起,您认证的信息有误!");
}
}
} else {
System.out.println("对不起,您输入的转账卡号有问题");
}
}
八 . 取钱方法
/**
* 取钱
*
* @param acc
* @param sc
*/
private static void drawMoney(Account acc, Scanner sc) {
System.out.println("====================取款操作====================");
//1.判断他的账户是否足够100
if (acc.getMoney() >= 100) {
while (true) {
System.out.println("请您输入取款的金额:");
double money = sc.nextDouble();
//2.判断这个金额是否超过当前限额
if (money > acc.getQuotaMoney()) {
System.out.println("您当次取款金额超过每次限额,不要取那么多,每次最多取:" + acc.getQuotaMoney());
} else {
//3.判断当前余额是否足够你取钱
if (acc.getMoney() >= money) {
//钱够,可以取钱
acc.setMoney(acc.getMoney() - money);
System.out.println("恭喜您,取钱" + money + "成功!!!当前账户余额还剩:" + acc.getMoney());
return;
//取钱后结束方法
} else {
System.out.println("当前余额不足!!!");
}
}
}
} else {
System.out.println("您自己的金额没有超过100,就别取了!!!");
}
}
九 . 存钱方法
/**
* 存钱
*
* @param acc
* @param sc
*/
private static void depositMoney(Account acc, Scanner sc) {
System.out.println("====================存款操作====================");
System.out.println("请您输入存款的金额:");
double money = sc.nextDouble();
//直接把金额修改到账户用户的money属性
acc.setMoney(acc.getMoney() + money);
System.out.println("存款完成!!!");
showAccount(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
* @param sc
*/
private static void register(ArrayList<Account> accounts, Scanner sc) {
//2.键盘录入 姓名 密码 确认密码
System.out.println("请您输入开户名称");
String name = sc.next();
String password = "";
while (true) {
System.out.println("请您输入开户密码");
password = sc.next();
System.out.println("请您输入确认密码");
String okPassword = sc.next();
//判断两次输入的密码是否一致
if (okPassword.equals(password)) {
break;
} else {
System.out.println("两次输入密码必须一致!!!");
}
}
System.out.println("请您输入当次限额:");
Double quotaMoney = sc.nextDouble();
//3.生成账户的卡号,卡号是8位数,而且不能与其他卡号重复
String cardId = createCardId(accounts);
//4.创建一个账户对象封装账户的信息
Account account = new Account(cardId, name, password, quotaMoney);
//5.把账户对象添加到集合中去
accounts.add(account);
System.out.println("恭喜您!开户成功!您的卡号是:" + account.getCardId() + ",请妥善保管");
}
十二 . 随机生成卡号
public static String createCardId(ArrayList<Account> accounts) {
while (true) {
//生成8位随机的数字代表卡号
StringBuilder cardId = new StringBuilder();
Random r = new Random();
for (int i = 0; i < 8; i++) {
cardId.append(r.nextInt(10));
}
//判断卡号是否重复
Account acc = getAccountByCardId(cardId.toString(), accounts);
if (acc == null) {
//说明当前卡号没有重复
return cardId.toString();
}
}
}
十三 . 确认账户是否重复
public static Account getAccountByCardId(String cardId, ArrayList<Account> accounts) {
for (Account acc : accounts) {
if (acc.getCardId().equals(cardId)) {
return acc;
}
}
return null;
//查无此账户,说明此账户没有重复
}