目录
一、系统准备、首页设计
ATM框架案例:
框架代码:
import java.util.ArrayList;
import java.util.Scanner;
public class ATMSystem {
public static void main(String[] args){
ArrayList<Account> accounts = new ArrayList<>();
while (true) {
System.out.println("===========黑马程序员系统===========");
System.out.println("1、账户登陆");
System.out.println("2、账户开户");
Scanner sc = new Scanner(System.in);
System.out.println("请输入您的选择:");
int command = sc.nextInt();
switch (command){
case 1:
//用户登陆
break;
case 2:
//用户开户
break;
default:
System.out.println("您输入的操作命令错误!!");
}
}
}
}
用户开户功能案例:
小技巧:
创建方法时,可以使用快捷键alt+回车自动生成创建方法的框架。
暴露问题:
在使用死循环时,注意到,使用break,结束死循环,或者使用别的结束死循环。
用户登陆功能的实现:
代码部分:
/**
* 用户登陆功能
* @param accounts
* @param sc
*/
private 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 = getAccountByCard(cardId,accounts);
if (acc != null){
System.out.println("请您输入登陆密码:");
String passWord = sc.next();
if(acc.getPassWord().equals(passWord)){
System.out.println("恭喜您账户登陆成功!账户:" + acc.getUserName());
break;
}else{
System.out.println("读不起,您输入的密码有误!!");
}
}
}
}
收获:
1、卫语句可以把我们的视线从多层嵌套的异常处理中解放出来,集中精力处理真正的业务代码,且能够使得代码结构更为清晰可读。即输入return代表结束目前所在的方法。
2、独立的功能最好单独独立成一个方法
用户操作页设计、查询账户、退出账户功能:
代码如下:方法代码的展示
/**
* 用户操作页界面方法
* @param sc
* @param acc
*/
private static void showAccount(Scanner sc, Account acc) {
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();
while (true) {
switch(command){
case 1:
shouAccount(acc);//展示当前账户信息。
break;
case 2:
break;
case 3:
break;
case 4:
break;
case 5:
break;
case 6:
System.out.println("退出当前的账户!!!");
return;//干掉所在的这个方法,即所在的方式是展示账户的这个方法。
case 7:
break;
default:
System.out.println("您输入的操作有误,请重新输入!!!");
}
}
}
/**
* 账户信息查看
* @param acc
*/
private static void shouAccount(Account acc) {
System.out.println("用户名:" + acc.getUserName());
System.out.println("用户余额:" + acc.getMoney());
System.out.println("用户账号:" + acc.getCardId());
System.out.println("用户限额:" + acc.getQuotamoney());
}
用户存款案例:
存钱方法代码如下:
/**
* 用户存钱方法
* @param acc
* @param sc
*/
private static void pushMoney(Account acc, Scanner sc) {
System.out.println("================存钱界面操作==============");
System.out.println("请您输入存款多少:");
double money = sc.nextDouble();
acc.setMoney(acc.getMoney()+money);//对帐户的余额进行存款处理。
System.out.println("恭喜您存款成功,账户信息通过如下进行查询!!");
shouAccount(acc);//存钱后账户信息展示。
}
取款功能案例:
取款方法代码如下:
/**
* 用户取钱方法
* @param acc
* @param sc
*/
private static void getMoney(Account acc, Scanner sc) {
System.out.println("================取钱界面操作==============");
if(acc.getMoney() < 100){
System.out.println("您当前的余额不足100,不能够进行取钱操作。");
return;//干掉用户取钱的方法
}
System.out.println("请输入您的取钱多少:");
double money = sc.nextDouble();
if(money < acc.getMoney()){
System.out.println("您的账户总金额不足,请您重新选择取款金额。");
}else if(money > acc.getQuotamoney()){
System.out.println("您当前的取款金额超出总金额,请重新输入。");
}else{
System.out.println("恭喜您取款成功!");
acc.setMoney(acc.getMoney()-money);
System.out.println("您的账户信息如下所示");
shouAccount(acc);
return;//干掉取钱的方法回到用户操作界面页
}
}
用户转账功能案例:
代码如下:
/**
* 账户转账方法
* @param acc
* @param sc
* @param accounts
*/
private static void tranformMoney(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;
}
//3、输入对方的账号
while (true) {
System.out.println("请您输入对方账户的卡号:");
String cardid = sc.next();
//4、判断是否自己的账户
if(cardid.equals(acc.getCardId())){
System.out.println("对不起,您不能转账给自己!!!");
// continue;
}
//判断卡号的存在
Account account = getAccountByCard(cardid,accounts);
if(account == null){
System.out.println("对不起,您输入的对方账户不存在");
}else{
//如果对象存在,继续进行转账,并进行姓氏的验证
String userName = account.getUserName();
String tip = "*" + userName.substring(1);//subtring 是截取从索引1到最后。前后进行拼接
System.out.println("请你输入[" +tip+ "]的姓氏");
String preName = sc.next();
//验证姓氏是否正确
while (true) {
if(userName.equals(preName)){
//认证通过,开始转账
System.out.println("请您输入转账金额:");
double money = sc.nextDouble();
//判断金额是否足够
if(money > acc.getMoney()){
System.out.println("对不起,您的账户余额不足!!!");
}else{
acc.setMoney(acc.getMoney()-money);
account.setMoney(account.getMoney()+money);
System.out.println("转账成功,您的余额:" +acc.getMoney());
return;
}
}else {
System.out.println("对不起,您输入的信息有误!");
}
}
}
}
}
收获:
String tip = " " + userName.substring(1);//subtring 是截取从索引1到最后。前后进行拼接
密码修改、销户功能实现:
参考代码:
个人代码:
/**
* 注销账户
* @param acc
* @param sc
* @param accounts
*/
private static boolean deleteAccount(Account acc, Scanner sc, ArrayList<Account> accounts) {//使用布尔类型来对界面进行选择,如果销户成功则返回到登陆界面,如果未销户成功则继续但回到账户操作界面
System.out.println("您是否注销账户? Y/N");
String command = sc.next();
//指令判断
if(command == "Y"){
if(acc.getMoney() > 0){
System.out.println("您的账户目前还存在余额,提取后再注销!!!");
return true;
}
accounts.remove(acc);
System.out.println("您的账户已被注销!!!");
}else{
System.out.println("您的账户依旧保留!!!");
}
return false;
}
收获:
可以创建布尔类型的方法,通过返回布尔值对主函数的部分进行分类的操作使用。
总结:
整体代码如下:
package com.heimait;
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;
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("===========黑马程序员系统===========");
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
* @param sc
*/
private 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 = getAccountByCard(cardId, accounts);
if (acc != null){
while (true) {
System.out.println("请您输入登陆密码:");
String passWord = sc.next();
if(acc.getPassWord().equals(passWord)){
System.out.println("恭喜您账户登陆成功!账户:" + acc.getUserName());
//进入登陆账户成功的界面当中
showAccount(sc,acc,accounts);
return;
}else{
System.out.println("读不起,您输入的密码有误!!");
}
}
}
}
}
/**
* 用户操作页界面方法
* @param sc
* @param acc
* @param accounts
*/
private static void showAccount(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:
shouAccount(acc);//用户账户信息展示。
break;
case 2:
//用户存钱
pushMoney(acc,sc);
break;
case 3:
//用户取钱
getMoney(acc,sc);
break;
case 4:
//转账处理
tranformMoney(acc,sc,accounts);
break;
case 5:
updatePassword(acc,sc,accounts);
return;
case 6:
System.out.println("退出当前的账户!!!");
return;//干掉所在的这个方法,即所在的方式是展示账户的这个方法。
case 7:
boolean bool = deleteAccount(acc,sc,accounts);
if(bool){
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("您是否注销账户? Y/N");
String command = sc.next();
//指令判断
if(command == "Y"){
if(acc.getMoney() > 0){
System.out.println("您的账户目前还存在余额,提取后再注销!!!");
return true;
}
accounts.remove(acc);
System.out.println("您的账户已被注销!!!");
}else{
System.out.println("您的账户依旧保留!!!");
}
return false;
}
/**
* 修改密码方法
* @param acc
* @param sc
* @param accounts
*/
private static void updatePassword(Account acc, Scanner sc, ArrayList<Account> accounts) {
System.out.println("=============用户操作页===========");
System.out.println("请输入您的原始密码:");
String passWord = sc.next();
//1、判断这个密码是否正确
if(acc.getPassWord().equals(passWord)){
//密码正确
//2、输入新密码
while (true) {
System.out.println("请您输入新的密码:");
String newPassword = sc.next();
System.out.println("请您再次输入新的密码:");
String okPassword = sc.next();
if(newPassword.equals(okPassword)){
System.out.println("恭喜您密码修改成功!");
acc.setPassWord(newPassword);
return;//干掉当前的方法
}else{
System.out.println("您输入的两次密码不一致~~");
}
}
}else{
System.out.println("对不起,您输入的密码不正确!!!");
}
}
/**
* 账户转账方法
* @param acc
* @param sc
* @param accounts
*/
private static void tranformMoney(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;
}
//3、输入对方的账号
while (true) {
System.out.println("请您输入对方账户的卡号:");
String cardid = sc.next();
//4、判断是否自己的账户
if(cardid.equals(acc.getCardId())){
System.out.println("对不起,您不能转账给自己!!!");
// continue;
}
//判断卡号的存在
Account account = getAccountByCard(cardid,accounts);
if(account == null){
System.out.println("对不起,您输入的对方账户不存在");
}else{
//如果对象存在,继续进行转账,并进行姓氏的验证
String userName = account.getUserName();
String tip = "*" + userName.substring(1);//subtring 是截取从索引1到最后。前后进行拼接
System.out.println("请你输入[" +tip+ "]的姓氏");
String preName = sc.next();
//验证姓氏是否正确
if(userName.equals(preName)){
//认证通过,开始转账
while (true) {
System.out.println("请您输入转账金额:");
double money = sc.nextDouble();
//判断金额是否足够
if(money > acc.getMoney()){
System.out.println("对不起,您的账户余额不足!!!");
}else{
acc.setMoney(acc.getMoney()-money);
account.setMoney(account.getMoney()+money);
System.out.println("转账成功,您的余额:" +acc.getMoney());
return;
}
}
}else {
System.out.println("对不起,您输入的信息有误!");
}
}
}
}
/**
* 用户取钱方法
* @param acc
* @param sc
*/
private static void getMoney(Account acc, Scanner sc) {
System.out.println("================取钱界面操作==============");
if(acc.getMoney() < 100){
System.out.println("您当前的余额不足100,不能够进行取钱操作。");
return;//干掉用户取钱的方法
}
System.out.println("请输入您的取钱多少:");
double money = sc.nextDouble();
if(money > acc.getMoney()){
System.out.println("您的账户总金额不足,请您重新选择取款金额。");
}else if(money > acc.getQuotamoney()){
System.out.println("您当前的取款金额超出总金额,请重新输入。");
}else{
System.out.println("恭喜您取款成功!");
acc.setMoney(acc.getMoney()-money);
System.out.println("您的账户信息如下所示");
shouAccount(acc);
return;//干掉取钱的方法回到用户操作界面页
}
}
/**
* 用户存钱方法
* @param acc
* @param sc
*/
private static void pushMoney(Account acc, Scanner sc) {
System.out.println("================存钱界面操作==============");
System.out.println("请您输入存款多少:");
double money = sc.nextDouble();
acc.setMoney(acc.getMoney()+money);//对帐户的余额进行存款处理。
System.out.println("恭喜您存款成功,账户信息通过如下进行查询!!");
shouAccount(acc);//存钱后账户信息展示。
return;
}
/**
* 账户信息查看
* @param acc
*/
private static void shouAccount(Account acc) {
System.out.println("用户名:" + acc.getUserName());
System.out.println("用户余额:" + acc.getMoney());
System.out.println("用户账号:" + acc.getCardId());
System.out.println("用户限额:" + acc.getQuotamoney());
}
/**
* 用户开户的实现
* @param accounts 接收账户的集合
*/
private static void register(ArrayList<Account> accounts,Scanner sc) {
Account account = new Account();
//对数组中的用户名生成
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(okpassword.equals(password)){
account.setPassWord(password);
break;//结束死循环
}else{
System.out.println("您输入的两次密码不正确,请再次输入!!");
}
}
//对数组中的限额生成
System.out.println("请您设置每次提取的限额:");
double qutoaMoney = sc.nextDouble();
account.setQuotamoney(qutoaMoney);
//对数组中的卡号生成
String cardId = getRandomCardId(accounts);
account.setCardId(cardId);
//将新生成的数组对象添加到数组类中去
accounts.add(account);
System.out.println("恭喜您"+username+"开户成功!"+"您的卡号:" +cardId);
}
/**
* 生成8位随机的卡号
* @param accounts
* @return
*/
private static String getRandomCardId(ArrayList<Account> accounts) {
while (true) {
Random r = new Random();
String randomNumber = "";
for (int i = 0; i < 8; i++) {
randomNumber += r.nextInt(10);
}
//判断是否重复
Account acc = getAccountByCard(randomNumber,accounts);
if(acc == null){//验证查询是否存在,即唯一账号。
return randomNumber;
}
}
}
/**
* 检验生成的卡号是否唯一
* @param randomNumber 生成的8位随机卡号
* @param accounts Account类的对象
* @return 返回acc 或者null
*/
private static Account getAccountByCard(String randomNumber, ArrayList<Account> accounts) {
//获取Account类中元素
for (int i = 0; i < accounts.size(); i++) {
Account acc = accounts.get(i);
if(acc.getCardId().equals(randomNumber)){
return acc;//提示卡号
}
}
return null;//查询账户是否存在
}
}