ATM系统
系统分析
每个用户的账户信息都是一个对象,需要提供账户类
需要准备一个容器,用于存储全部账户对象信息
首页只需包含:登录和注册2个功能
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;
}
}
ublic class ATMSytem {
public static void main(String[] args) {
// 1.准备系统需要的容器对象,用于存储账户对象
ArrayList<Account> accounts = new ArrayList<>();
// 2.准备系统的首页:登录 开户
showMain(accounts);
}
public static void showMain(ArrayList accounts) {
System.out.println("+++++++++++欢迎进入首页++++++++++");
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("请您输入您想要做的操作");
System.out.println("1.登录");
System.out.println("2.开户");
int command = sc.nextInt();
switch (command) {
case 1:
// 登录
userLogin(accounts, sc);
break;
case 2:
// 开户
register(accounts, sc);
break;
default:
System.out.println("您当前输入的操作命令不被支持");
}
}
}
private static void userLogin(ArrayList accounts, Scanner sc) {
if(accounts.size() == 0) {
System.out.println("当前系统中无任何账户,您需要先注册");
return;
}
while (true) {
// 让用户键盘录入卡号,根据卡号查询账户对象
System.out.println("请您输入登录的卡号");
String cardId = sc.next();
// 根据卡号查询账户对象
Account acc = getAccoutByCardId(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(accounts,sc, acc);
return; // 继续结束登录方法
}else {
System.out.println("您的密码有误,请重新输入");
}
}
} else {
System.out.println("对不起,不存在该卡号的账户");
}
}
}
private static void showUserCommand(ArrayList<Account> accounts,Scanner sc, Account acc) {
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(accounts, acc, sc);
break;
case 5:
// 修改密码
changePassword(acc, sc);
break;
case 6:
// 退出
System.out.println("欢迎下次再来");
return; // 结束当前操作的方法
case 7:
// 注销账户
// 从当前集合中消除当前账户
accounts.remove(acc);
System.out.println("销户成功");
return;
default:
System.out.println("您输入了无效的选择");
}
}
}
private static void changePassword(Account acc, Scanner sc) {
System.out.println("===========修改密码==========");
while (true) {
System.out.println("请输入您当前密码");
String okPassword = sc.next();
if(acc.getPassWord().equals(okPassword)) {
while (true) {
System.out.println("请您输入新密码");
String newPassword = sc.next();
System.out.println("请您确认密码");
String okNewPassword = sc.next();
if(newPassword.equals(okNewPassword)) {
// 修改账户对象的密码为新密码
acc.setPassWord(newPassword);
return;
} else {
System.out.println("您两次输入的密码不一致");
}
}
}else {
System.out.println("当前输入的密码不正确");
}
}
}
private static void transferMoney(ArrayList<Account> accounts, Account acc, Scanner sc) {
// 判断系统中是否有2个账户及以上
if(accounts.size() < 2){
System.out.println("对不起,系统中无其他账户,不可转账");
}
if (acc.getMoney() == 0) {
System.out.println("您没有钱,没法进行转账");
}
while (true) {
System.out.println("请输入对方账号的卡号");
String cardId = sc.next();
Account account = getAccoutByCardId(cardId, accounts);
if(account != null) {
// 判断这个账户对象是否是当前登录的账账户
if(account.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(acc.getMoney()+money);
System.out.println("转账成功"+account.getUserName()+"转账"+acc.getMoney());
System.out.println("您的账户信息");
showAccount(acc);
return;
}
}else {
System.out.println("对不起,信息有误");
}
}
}else {
System.out.println("对不起,您输入的转账卡号有问题");
}
}
}
private static void drawMoney(Account acc, Scanner sc) {
System.out.println("========取款操作=========");
if(acc.getMoney() >= 100) {
while (true) {
System.out.println("请输入取款的金额");
double money = sc.nextDouble();
// 判断这个金额有没有超过当此限额
if(money > acc.getQuotaMoney()) {
System.out.println("您档次取款接超过每此限额,最多可以取"+acc.getQuotaMoney());
}else {
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");
}
}
// 存钱
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("存款完成"+acc.getMoney());
return;
}
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("++++++++用户开户功能++++++");
// 键盘录入 姓名 密码 确认密码
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)) {
System.out.println("请输入档次限额");
double quotaMoney = sc.nextDouble();
// 生成账户的卡号,卡号8位,且不能与其他账号重复
String cardId = createCardId(accounts);
// 创建一个账户对象封装账户的信息
Account account = new Account(cardId, name, password, quotaMoney);
// 把账户对象添加到集合中去
accounts.add(account);
System.out.println("恭喜您,开户成功:"+ account.getCardId());
break;
}else {
System.out.println("两次密码必须一致");
}
}
}
// 创建卡号
public static String createCardId(ArrayList<Account> accounts) {
while (true) {
String cardId = "";
Random r = new Random();
for (int i = 0; i < 8; i++) {
cardId += r.nextInt(10);
}
// 判断卡号是否重复
Account acc = getAccoutByCardId(cardId, accounts);
if(acc == null) {
return cardId;
}
}
}
// 根据卡号查询账户对象
public static Account getAccoutByCardId(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; // 查无此账户
}
}