公众号:全干开发 。 专注分享简洁但高质量的动图技术文章!
回顾
在上节内容中,我们实现了用户开户的功能createAccount
public void start(){
System.out.println("===欢迎您进入到了ATM系统===");
System.out.println("1、用户登录");
System.out.println("2、用户开户");
System.out.println("请选择:");
int command = sc.nextInt();
switch (command) {
case 1:
//用户登录 TODO
// login() 等待开发的功能!
break;
case 2:
//用户开户
createAccount();
start();
break;
default:
System.out.println("操作错误!");
start();
}
}
现在,我们要实现另一个核心功能:用户登录。登录后,用户还可以进行转账等一些列操作,这也是我们要完善的功能。
用户登录
我们先来看一下用户登录的login功能
登录的流程大致如下:
- 如果系统没有任何账户对象,则不允许登录
- 让用户输入登录的卡号,先判断卡号是否正确,如果不正确要给出提示
- 如果卡号正确,再让用户输入账户密码,如果密码不正确要给出提示;如果密码也正确,则给出登录成功的提示
private void login(){
System.out.println("===欢迎您登录系统===");
// 如果系统中没有账户,直接退出
if(accounts.size()==0){
System.out.println("抱歉,当前系统没有账户,请先创建!");
return;
}
// 系统中存在账户,开始进行登录操作
while (true) {
System.out.println("请您输入卡号!");
String cardId = sc.next();
// 根据卡号获取用户对象
Account acc = getAccountByCardId(cardId);
if(acc == null){
System.out.println("卡号输入错误!请重新输入");
}else{
// 卡号存在,输入密码
while (true) {
System.out.println("请输入密码");
String password = sc.next();
// 判断用户输入的密码与账户对象中储存的密码是否一致
if(password.equals(acc.getPassWord())){
System.out.println("恭喜您"+acc.getUserName()+"您登录成功!您的卡号是:" + cardId);
// TODO: 登录后的其他操作,如转账等等....
}else {
System.out.println("密码输入错误");
}
}
}
}
}
现在,我们在start中执行这个方法即可
public void start(){
// ...省略...
switch (command) {
case 1:
//用户登录
login();
// 用户操作完,重新进入系统首页
start();
break;
case 2:
//用户开户
createAccount();
// 开户完,重新进入系统首页
start();
break;
default:
System.out.println("操作错误!");
// 输入错误重新进入开始页
start();
}
}
账户操作
框架搭建
用户登录成功,我们需要进入账户处理界面
我们定义一个showUserCommand方法来实现
// 登录成功后的操作
private void showUserCommand(){
while (true) {
System.out.println(loginAcc.getUserName() + "您可以选择如下功能进行账户处理========");
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:
//查询操作
break;
case 2:
//存款
break;
case 3:
//取款
break;
case 4:
//转账
break;
case 5:
//密码修改
break;
case 6:
//退出
break;
case 7:
//注销账户
break;
default:
System.out.println("您的操作有误!请重新输入");
}
}
}
这里的loginAcc是我们储存的用户登录成功后的账户信息,详细的代码如下:
public class ATM {
private ArrayList<Account> accounts = new ArrayList<>();
private Account loginAcc; // 储存登录成功后的用户信息
// .....
// 用戶登录
private void login(){
// .....
// 判断用户输入的密码与账户对象中储存的密码是否一致
if(password.equals(acc.getPassWord())){
loginAcc = acc;
System.out.println("恭喜您"+acc.getUserName()+"您登录成功!您的卡号是:" + cardId);
// 登录后的其他操作,如转账等等....
// 展示用户操作界面
showUserCommand();
}else {
System.out.println("密码输入错误");
}
// .....
}
// 登录成功后的操作
private void showUserCommand(){
while (true) {
System.out.println(loginAcc.getUserName() + "您可以选择如下功能进行账户处理========");
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:
//查询操作
break;
case 2:
//存款
break;
case 3:
//取款
break;
case 4:
//转账
break;
case 5:
//密码修改
break;
case 6:
//退出
break;
case 7:
//注销账户
break;
default:
System.out.println("您的操作有误!请重新输入");
}
}
}
}
现在,我们逐个完善showUserCommand中的方法即可
查询操作
在上述代码中,我们使用了loginAcc储存了登录用户的信息,我们创建个query方法,用于展示loginAcc对象中储存的信息
private void showLoginAccount(){
System.out.println("卡号:" + loginAcc.getCardId());
System.out.println("姓名:" + loginAcc.getUserName());
System.out.println("性别:" + loginAcc.getSex());
System.out.println("余额:" + loginAcc.getMoney());
System.out.println("每次取现额度:" + loginAcc.getLimit());
}
我们在showUserCommand()方法中执行下
private void showUserCommand(){
while (true) {
// ....
int command = sc.nextInt();
switch (command){
case 1:
//查询操作
showLoginAccount();
break;
// ....
case 7:
//注销账户
break;
default:
System.out.println("您的操作有误!请重新输入");
}
}
}
退出操作
退出操作,不需要执行额外的方法,我们只要能回到登录页即可。退出前我们进行简单的提示即可
private void showUserCommand(){
while (true) {
// ...
switch (command){
// ...
case 6:
//退出
System.out.println(loginAcc.getUserName() + "您已经成功退出");
break;
// ...
}
}
}
注意,当用户输出6后,break会结束switch语句,但无法跳出while循环,switch会重新执行。
所以,我们需要把break改成return结束当前程序。
private void showUserCommand(){
while (true) {
// ...
switch (command){
// ...
case 6:
//退出
System.out.println(loginAcc.getUserName() + "您已经成功退出");
breturn;
// ...
}
}
}
现在,我们就跳出了showUserCommand()程序,回到了login方法里。
private void login(){
// ...
// 系统中存在账户,开始进行登录操作
while (true) {
// ...
if(acc == null){
System.out.println("卡号输入错误!请重新输入");
}else{
// 卡号存在,输入密码
while (true) {
// ...
showUserCommand();
// ...
}
}
}
}
同样的,我们需要结束login方法中的while循环,回到start方法中
private void login(){
// ...
// 系统中存在账户,开始进行登录操作
while (true) {
// ...
if(acc == null){
System.out.println("卡号输入错误!请重新输入");
}else{
// 卡号存在,输入密码
while (true) {
// ...
showUserCommand();
// ...
return;
}
}
}
}
我们测试下:
存款及取款
存款
我们定义depositMoney的存款方法,在showUserCommand()的switch 中执行。
这次骚一点,我们用编译器的快捷键帮我们生成方法。在switch中直接执行depositMoney,然后点击【alt+enter】键就可以自动帮我们创建好这个方法了!
private void depositMoney() {
System.out.println("==存钱操作==");
System.out.println("请您输入存款金额:");
double money = sc.nextDouble();
loginAcc.setMoney( loginAcc.getMoney()+ money);
System.out.println("您已经存入"+money + "元,当前账户余额" + loginAcc.getMoney());
}
取款
private void showUserCommand(){
while (true) {
// ...
int command = sc.nextInt();
switch (command){
case 1:
//查询操作
showLoginAccount();
break;
case 2:
//存款
depositMoney();
break;
case 3:
//取款
drawMoney();
break;
// ...
}
}
}
private void drawMoney() {
System.out.println("==取钱操作==");
// 1、判断账户余额是否达到了100元,如果不够100,不让用户取钱
if(loginAcc.getMoney() < 100){
System.out.println("您的账户不足100,不能取钱");
return;
}
// 2、让用户输入金额
while (true) {
System.out.println("请输入取款金额");
double money = sc.nextDouble();
// 3.判断账户余额是否足够
if(loginAcc.getMoney()>= money){
// 钱是足够的
// 判断当前取款金额是否超出了限额
if(money>loginAcc.getLimit()){
System.out.println("超出限额!");
}else {
loginAcc.setMoney(loginAcc.getMoney()-money);
System.out.println("取款成功!剩余:" + loginAcc.getMoney());
break;
}
}else {
System.out.println("账户余额不足!您的余额是:" + loginAcc.getMoney());
}
}
}
转账
private void showUserCommand(){
while (true) {
// ...
int command = sc.nextInt();
switch (command){
// ...
case 4:
//转账
transferMoney();
break;
// ...
}
}
}
private void transferMoney() {
System.out.println("==用户转账==");
// 1 系统中是否存在其他账户
if(accounts.size() < 2){
System.out.println("当前系统只有一个账户,无法转账");
return;
}
// 2 判断自己的账户是否有钱
if(loginAcc.getMoney() == 0){
System.out.println("您没钱!别转了!");
return;
}
while (true) {
// 3 开始转账
System.out.println("请输出对方卡号");
String cardId = sc.next();
// 4 判断账号是否正确
Account acc = getAccountByCardId(cardId);
if(acc==null){
System.out.println("输入的卡号不对");
}else {
//5 账户存在,确认姓名
String name = "*" + acc.getUserName().substring(1);
System.out.println("请输入:"+name+"的姓氏");
String preName = sc.next();
// 判断姓氏是否正确
if(acc.getUserName().startsWith(preName)){
// 认证通过,开始转账
System.out.println("请输入转账金额");
double money = sc.nextDouble();
// 6 判断是否超出自己的金额
if(loginAcc.getMoney() >=money){
//转给对方了
//变更自己的账户余额
loginAcc.setMoney(loginAcc.getMoney()-money);
//更新对方的余额
acc.setMoney(acc.getMoney() + money);
return;
}else {
System.out.println("账户余额不足");
}
}else {
System.out.println("输入的姓名有有误");
}
}
}
}