目录
一、内容简介
二、基本流程
三、具体步骤
1.定义Account类
2.菜单栏
3.账户注册
(1)根据卡号查询账户信息
(2)生成随机卡号
(3)注册账户
4.账户登录
(1)验证码
(2)登录
5.账户展示界面
6.用户操作
(1)查询账户
(2)存款
(3)取款
(4)转账
(5)修改密码
(6)退出登录
(7)注销账户
四、代码实现
五、效果展示
1.账户注册
2.账户登录
3.用户操作界面
(1)查询
(2)存款
(3)取款
(4)转账
(5)修改密码
(6)注销账户
(7)登录【西门吹雪】的账号
模拟实现ATM的基本功能,包括注册账号、存款、取款、转账、查询、注销账号等功能。
- 定义Account类。
- 注册账户。
- 账户登录。
在正式开始之前,我们需要定义Account类的ArraysList集合,存放用户信息。
//创建Account类型的集合
ArrayList accounts=new ArrayList<>();
Account类中包含用户名、金额、密码、ID、单次取款限额等属性,并提供相应的getter()、setter()方法。
class Account {
private String cardId;//id
private String username;//用户名
private double Money;//金额
private double Limitmoney;//单次取款限额
private String Password;//密码
public String getPassword() {
return Password;
}
public void setPassword(String password) {
Password = password;
}
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 double getMoney() {
return Money;
}
public void setMoney(double money) {
Money = money;
}
public double getLimitmoney() {
return Limitmoney;
}
public void setLimitmoney(double limitmoney) {
Limitmoney = limitmoney;
}
}
public static void menu(){
System.out.println("=================================欢迎您来到九州银行===================================");
System.out.println("1.账户注册");
System.out.println("2.账户登录");
System.out.println("请您选择:");
}
- 这个功能是为了使生成的随机卡号不重复,如果找到,返回相应的账户信息;如果没找到,返回null。
- 这个功能在后续的实现中会多次用到,故单独拿出来,作为一个方法。
/**
* 根据卡号获取账户信息
* @param cardid 卡号
* @param accounts 集合
*/
private static Account getAccountBycardid(String cardid, ArrayList accounts) {
for (int i = 0; i < accounts.size(); i++) {
Account account= accounts.get(i);
if(cardid.equals(account.getCardId()))
return account;
}
return null;
}
}
生成16位的随机卡号并不困难,关键在于不重复。
在这里,用到了3.(1)的功能,每生成一个卡号就判断返回值是否为null,如果不是,代表已经有了该卡号存在,需要重新生成;如果是,说明该卡号不存在,生成成功。
/**
* 得到随机卡号
* @param accounts 集合
* @return 卡号
*/
private static String getCardid(ArrayList accounts) {
Random ran=new Random();
while (true) {
String cardid="";
for (int i = 0; i < 16; i++) {
cardid+=ran.nextInt(10);
}
if(getAccountBycardid(cardid,accounts)==null)
return cardid;
}
}
每成功注册一个账户不要忘记添加到集合中。
/**
* 账户注册
* @param accounts 集合
* @param sca 扫描器
*/
private static void registerAccount(ArrayList accounts, Scanner sca) {
//创建账户对象
Account acc=new Account();
//输入用户名
System.out.println("请您输入用户名:");
String name=sca.next();
acc.setUsername(name);
//输入密码
while (true) {
System.out.println("请您输入密码:");
String password=sca.next();
System.out.println("请您再次输入密码:");
String okpassword=sca.next();
if(password.equals(okpassword))
{
acc.setPassword(password);
break;
}
else {
System.out.println("您两次输入的密码不一致,请您重新输入!");
}
}
//输入单次限额
System.out.println("请您输入单次限额:");
double limitmoney=sca.nextDouble();
acc.setLimitmoney(limitmoney);
//随机生成唯一的卡号
String Cardid=getCardid(accounts);
acc.setCardId(Cardid);
System.out.println("恭喜您,账户注册成功!");
System.out.println("尊敬的 【"+acc.getUsername()+"】 先生/女士您好,您的卡号是:"
+acc.getCardId()+" 请您妥善保管!");
accounts.add(acc);//添加账户到集合中
}
随机生成4位数字和字母(包含大小写)作为登录验证码。
/**
* 获取验证码
* @return 验证码
*/
private static String getCode() {
Random ran=new Random();
String add="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
String code="";
for (int i = 0; i < 4; i++) {
int index=ran.nextInt(add.length());
code+=add.charAt(index);
}
return code;
}
首先,判断集合中账户的数目,为0时不能登录,需要先注册。
其次,根据用户输入的卡号查询是否有相应的账户信息,如果没有,让用户重新输入。
/**
* 账户登录
* @param accounts 集合
* @param sca 扫描器
*/
private static void loginAccount(ArrayList accounts, Scanner sca) {
//判断此时系统中有无账户
if(accounts.size()==0)
{
System.out.println("当前系统中暂无账户,请您先注册后再登录!");
return;
}
while (true) {
System.out.println("请您输入您的卡号:");
String ID= sca.next();
Account acc=getAccountBycardid(ID,accounts);
if(acc==null)
{
System.out.println("您输入的卡号无效,请您重新输入!");
}
else {
while (true) {
System.out.println("请您输入密码");
String passWord=sca.next();
String Code=getCode();
System.out.println("验证码:"+Code);
System.out.println("请您输入验证码:");
String add=sca.next();
if(passWord.equals(acc.getPassword()))
{
if(Code.equalsIgnoreCase(add))
{
System.out.println("恭喜您,登录成功!");
showAccount(acc,sca,accounts);
return;
}
else {
System.out.println("验证码错误,请您重新输入!");
}
}
else {
System.out.println("您输入的密码有误,请您重新输入!");
}
}
}
}
}
/**
* 账户展示界面
* @param acc 用户登录的账户
* @param sca 扫描器
* @param accounts 集合
*/
private static void showAccount(Account acc, Scanner sca, ArrayList 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 input=sca.nextInt();
switch(input)
{
case 1:
//查询
inquire(acc);
break;
case 2:
//存款
deposit(acc,sca);
break;
case 3:
//取款
withdrawal(acc,sca);
break;
case 4:
//转账
transferAccounts(acc,accounts,sca);
break;
case 5:
//修改密码
changePassword(acc,sca);
return;
case 6:
//退出登录
exit();
return;
case 7:
//注销账户
if(unsubscribe(accounts,acc,sca))
return;
else
break;
}
}
}
/**
* 查询账户
* @param acc 当前登录的账户
*/
private static void inquire(Account acc) {
System.out.println("======================================查询账户======================================");
System.out.println("卡号:"+acc.getCardId());
System.out.println("户主:"+acc.getUsername());
System.out.println("余额:"+acc.getMoney());
System.out.println("单次限额:"+acc.getLimitmoney());
}
/**
* 存款
* @param acc 当前登录的账户
* @param sca 扫描器
*/
private static void deposit(Account acc, Scanner sca) {
System.out.println("=======================================存款========================================");
System.out.println("请您输入存款金额");
double money=sca.nextDouble();
acc.setMoney(acc.getMoney()+money);
System.out.println("存款成功!您当前余额为:"+acc.getMoney()+"元");
}
/**
* 取款
* @param acc 当前登录的账户
* @param sca 扫描器
*/
private static void withdrawal(Account acc, Scanner sca) {
System.out.println("=======================================取款========================================");
if(acc.getMoney()==0)
{
System.out.println("您当前账户没有余额,请先存款吧!");
return;
}
while (true) {
System.out.println("请您输入取款金额:");
double money=sca.nextDouble();
if(money>acc.getLimitmoney())
{
System.out.println("您当前输入的金额大于单次取款限额,请您重新输入:");
}
else{
if(money>acc.getMoney())
System.out.println("您当前输入的金额大于余额,请您重新输入:");
else {
acc.setMoney(acc.getMoney()-money);
System.out.println("取款成功,您当前余额为:"+acc.getMoney()+"元");
return;
}
}
}
}
/**
* 转账
* @param acc 当前登录的账户
* @param accounts 集合
* @param sca 扫描器
*/
private static void transferAccounts(Account acc, ArrayList accounts, Scanner sca) {
System.out.println("======================================转账=========================================");
if(accounts.size()<2)
{
System.out.println("当前系统中只有1个账户,请您在注册后再转账!");
return;
}
while (true) {
System.out.println("请您输入对方卡号:");
String ID=sca.next();
if(ID.equals(acc.getCardId()))
{
System.out.println("您输入的是自己的卡号,请您重新输入!");
}
else{
Account otheracc=getAccountBycardid(ID,accounts);
if(otheracc==null)
{
System.out.println("系统查无此人,请您重新输入!");
}
else{
while (true) {
//验证身份
String authenName=authenticate(ID,accounts);
System.out.println("请您输入【"+authenName+"】的完整姓名,以验证身份:");
String inputName=sca.next();
if(inputName.equals(otheracc.getUsername()))
{
System.out.println("输入正确,身份验证成功!");
while (true) {
System.out.println("请您输入转账金额:");
double money=sca.nextDouble();
if(money>acc.getMoney())
{
System.out.println("您输入的金额大于您的余额,您当前最多可转账 "+acc.getMoney()+" 元!");
System.out.println("请您重新输入转账金额!");
}
else {
acc.setMoney(acc.getMoney()-money);
otheracc.setMoney(otheracc.getMoney()+money);
System.out.println("转账成功,您当前的余额为:"+acc.getMoney()+"元!");
return;
}
}
}
else {
System.out.println("输入错误,请您重新输入!");
}
}
}
}
}
}
转账中的authenticate()方法是将待转账用户的姓名隐藏,让转账的用户输入,以验证身份。
比如,张三给李四转账,authenticate()方法就会返回李*,让张三输入完整的姓名。
/**
* 验证身份
* @param id 输入的卡号
* @param accounts 集合
* @return 张**,隐藏的对方的姓名
*/
private static String authenticate(String id, ArrayList accounts) {
Account otherUser=getAccountBycardid(id,accounts);
String name=otherUser.getUsername();
int flag=name.length();
if(flag==2)
return name=name.replace(name.substring(1),"*");
if(flag==3)
return name=name.replace(name.substring(1),"**");
else
return name=name.replace(name.substring(2),"**");
}
这个方法不是太准确,是根据姓名的长度来区分的:
- 姓名长度为2,默认以第一个字符为姓。
- 姓名长度为3,默认以第一个字符为姓。
- 姓名长度为4,默认前两个字符为姓。
/**
* 修改密码
* @param acc 当前登录的账户
* @param sca 扫描器
*/
private static void changePassword(Account acc, Scanner sca) {
System.out.println("=====================================修改密码=======================================");
while (true) {
System.out.println("请您输入原密码:");
String code=sca.next();
if(code.equals(acc.getPassword()))
{
while (true) {
System.out.println("请您输入新密码:");
String password=sca.next();
System.out.println("请您再次输入新密码:");
String okpassword=sca.next();
if(password.equals(okpassword))
{
acc.setPassword(okpassword);
System.out.println("密码修改成功!");
return;
}
else {
System.out.println("您两次输入的密码不一致,请您重新输入!");
}
}
}
else {
System.out.println("密码错误,请您重新输入!");
}
}
}
/**
* 退出登录
*/
private static void exit() {
System.out.println("=====================================退出登录=======================================");
System.out.println("退出成功!");
return;
}
如果账户中余额大于0,不能注销账户!
/**
* 注销账户
* @param accounts 集合
* @param acc 当前登录的账户
* @param sca 扫描器
*/
private static boolean unsubscribe(ArrayList accounts,Account acc, Scanner sca) {
System.out.println("======================================注销账户======================================");
if(acc.getMoney()>0)
{
System.out.println("您当前账户中还有余额 "+acc.getMoney()+" 元,不能注销账户!");
return false;
}
System.out.println("您确定要注销账户吗? 是/否");
String input=sca.next();
switch(input)
{
case "是":
accounts.remove(acc);
System.out.println("注销账户成功!");
return true;
}
return false;
}
除了上述的主要功能,还有一些小细节需要注意,在完整代码中已经用注释写出。
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;
public class ATM02 {
public static void main(String[] args) {
//创建Account类型的集合
ArrayList accounts=new ArrayList<>();
Scanner sca=new Scanner(System.in);
while (true) {
menu();
int input=sca.nextInt();
switch(input)
{
case 1:
//账户注册
registerAccount(accounts,sca);
break;
case 2:
//账户登录
loginAccount(accounts,sca);
break;
default:
System.out.println("您输入的命令有误,请您重新输入!");
}
}
}
public static void menu(){
System.out.println("=================================欢迎您来到九州银行===================================");
System.out.println("1.账户注册");
System.out.println("2.账户登录");
System.out.println("请您选择:");
}
/**
* 账户登录
* @param accounts 集合
* @param sca 扫描器
*/
private static void loginAccount(ArrayList accounts, Scanner sca) {
//判断此时系统中有无账户
if(accounts.size()==0)
{
System.out.println("当前系统中暂无账户,请您先注册后再登录!");
return;
}
while (true) {
System.out.println("请您输入您的卡号:");
String ID= sca.next();
Account acc=getAccountBycardid(ID,accounts);
if(acc==null)
{
System.out.println("您输入的卡号无效,请您重新输入!");
}
else {
while (true) {
System.out.println("请您输入密码");
String passWord=sca.next();
String Code=getCode();
System.out.println("验证码:"+Code);
System.out.println("请您输入验证码:");
String add=sca.next();
if(passWord.equals(acc.getPassword()))
{
if(Code.equalsIgnoreCase(add))
{
System.out.println("恭喜您,登录成功!");
showAccount(acc,sca,accounts);
return;
}
else {
System.out.println("验证码错误,请您重新输入!");
}
}
else {
System.out.println("您输入的密码有误,请您重新输入!");
}
}
}
}
}
/**
* 获取验证码
* @return 验证码
*/
private static String getCode() {
Random ran=new Random();
String add="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
String code="";
for (int i = 0; i < 4; i++) {
int index=ran.nextInt(add.length());
code+=add.charAt(index);
}
return code;
}
/**
* 账户展示界面
* @param acc 用户登录的账户
* @param sca 扫描器
* @param accounts 集合
*/
private static void showAccount(Account acc, Scanner sca, ArrayList 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 input=sca.nextInt();
switch(input)
{
case 1:
//查询
inquire(acc);
break;
case 2:
//存款
deposit(acc,sca);
break;
case 3:
//取款
withdrawal(acc,sca);
break;
case 4:
//转账
transferAccounts(acc,accounts,sca);
break;
case 5:
//修改密码
changePassword(acc,sca);
return;
case 6:
//退出登录
exit();
return;
case 7:
//注销账户
if(unsubscribe(accounts,acc,sca))
return;
else
break;
}
}
}
/**
* 转账
* @param acc 当前登录的账户
* @param accounts 集合
* @param sca 扫描器
*/
private static void transferAccounts(Account acc, ArrayList accounts, Scanner sca) {
System.out.println("======================================转账=========================================");
if(accounts.size()<2)
{
System.out.println("当前系统中只有1个账户,请您在注册后再转账!");
return;
}
while (true) {
System.out.println("请您输入对方卡号:");
String ID=sca.next();
if(ID.equals(acc.getCardId()))
{
System.out.println("您输入的是自己的卡号,请您重新输入!");
}
else{
Account otheracc=getAccountBycardid(ID,accounts);
if(otheracc==null)
{
System.out.println("系统查无此人,请您重新输入!");
}
else{
while (true) {
//验证身份
String authenName=authenticate(ID,accounts);
System.out.println("请您输入【"+authenName+"】的完整姓名,以验证身份:");
String inputName=sca.next();
if(inputName.equals(otheracc.getUsername()))
{
System.out.println("输入正确,身份验证成功!");
while (true) {
System.out.println("请您输入转账金额:");
double money=sca.nextDouble();
if(money>acc.getMoney())
{
System.out.println("您输入的金额大于您的余额,您当前最多可转账 "+acc.getMoney()+" 元!");
System.out.println("请您重新输入转账金额!");
}
else {
acc.setMoney(acc.getMoney()-money);
otheracc.setMoney(otheracc.getMoney()+money);
System.out.println("转账成功,您当前的余额为:"+acc.getMoney()+"元!");
return;
}
}
}
else {
System.out.println("输入错误,请您重新输入!");
}
}
}
}
}
}
/**
* 验证身份
* @param id 输入的卡号
* @param accounts 集合
* @return 张**,隐藏的对方的姓名
*/
private static String authenticate(String id, ArrayList accounts) {
Account otherUser=getAccountBycardid(id,accounts);
String name=otherUser.getUsername();
int flag=name.length();
if(flag==2)
return name=name.replace(name.substring(1),"*");
if(flag==3)
return name=name.replace(name.substring(1),"**");
else
return name=name.replace(name.substring(2),"**");
}
/**
* 注销账户
* @param accounts 集合
* @param acc 当前登录的账户
* @param sca 扫描器
*/
private static boolean unsubscribe(ArrayList accounts,Account acc, Scanner sca) {
System.out.println("======================================注销账户======================================");
if(acc.getMoney()>0)
{
System.out.println("您当前账户中还有余额 "+acc.getMoney()+" 元,不能注销账户!");
return false;
}
System.out.println("您确定要注销账户吗? 是/否");
String input=sca.next();
switch(input)
{
case "是":
accounts.remove(acc);
System.out.println("注销账户成功!");
return true;
}
return false;
}
/**
* 修改密码
* @param acc 当前登录的账户
* @param sca 扫描器
*/
private static void changePassword(Account acc, Scanner sca) {
System.out.println("=====================================修改密码=======================================");
while (true) {
System.out.println("请您输入原密码:");
String code=sca.next();
if(code.equals(acc.getPassword()))
{
while (true) {
System.out.println("请您输入新密码:");
String password=sca.next();
System.out.println("请您再次输入新密码:");
String okpassword=sca.next();
if(password.equals(okpassword))
{
acc.setPassword(okpassword);
System.out.println("密码修改成功!");
return;
}
else {
System.out.println("您两次输入的密码不一致,请您重新输入!");
}
}
}
else {
System.out.println("密码错误,请您重新输入!");
}
}
}
/**
* 取款
* @param acc 当前登录的账户
* @param sca 扫描器
*/
private static void withdrawal(Account acc, Scanner sca) {
System.out.println("=======================================取款========================================");
if(acc.getMoney()==0)
{
System.out.println("您当前账户没有余额,请先存款吧!");
return;
}
while (true) {
System.out.println("请您输入取款金额:");
double money=sca.nextDouble();
if(money>acc.getLimitmoney())
{
System.out.println("您当前输入的金额大于单次取款限额,请您重新输入:");
}
else{
if(money>acc.getMoney())
System.out.println("您当前输入的金额大于余额,请您重新输入:");
else {
acc.setMoney(acc.getMoney()-money);
System.out.println("取款成功,您当前余额为:"+acc.getMoney()+"元");
return;
}
}
}
}
/**
* 查询账户
* @param acc 当前登录的账户
*/
private static void inquire(Account acc) {
System.out.println("======================================查询账户======================================");
System.out.println("卡号:"+acc.getCardId());
System.out.println("户主:"+acc.getUsername());
System.out.println("余额:"+acc.getMoney());
System.out.println("单次限额:"+acc.getLimitmoney());
}
/**
* 退出登录
*/
private static void exit() {
System.out.println("=====================================退出登录=======================================");
System.out.println("退出成功!");
return;
}
/**
* 存款
* @param acc 当前登录的账户
* @param sca 扫描器
*/
private static void deposit(Account acc, Scanner sca) {
System.out.println("=======================================存款========================================");
System.out.println("请您输入存款金额");
double money=sca.nextDouble();
acc.setMoney(acc.getMoney()+money);
System.out.println("存款成功!您当前余额为:"+acc.getMoney()+"元");
}
/**
* 账户注册
* @param accounts 集合
* @param sca 扫描器
*/
private static void registerAccount(ArrayList accounts, Scanner sca) {
//创建账户对象
Account acc=new Account();
//输入用户名
System.out.println("请您输入用户名:");
String name=sca.next();
acc.setUsername(name);
//输入密码
while (true) {
System.out.println("请您输入密码:");
String password=sca.next();
System.out.println("请您再次输入密码:");
String okpassword=sca.next();
if(password.equals(okpassword))
{
acc.setPassword(password);
break;
}
else {
System.out.println("您两次输入的密码不一致,请您重新输入!");
}
}
//输入单次限额
System.out.println("请您输入单次限额:");
double limitmoney=sca.nextDouble();
acc.setLimitmoney(limitmoney);
//随机生成唯一的卡号
String Cardid=getCardid(accounts);
acc.setCardId(Cardid);
System.out.println("恭喜您,账户注册成功!");
System.out.println("尊敬的 【"+acc.getUsername()+"】 先生/女士您好,您的卡号是:"
+acc.getCardId()+" 请您妥善保管!");
accounts.add(acc);//添加账户到集合中
}
/**
* 得到随机卡号
* @param accounts 集合
* @return 卡号
*/
private static String getCardid(ArrayList accounts) {
Random ran=new Random();
while (true) {
String cardid="";
for (int i = 0; i < 16; i++) {
cardid+=ran.nextInt(10);
}
if(getAccountBycardid(cardid,accounts)==null)
return cardid;
}
}
/**
* 根据卡号获取账户信息
* @param cardid 卡号
* @param accounts 集合
*/
private static Account getAccountBycardid(String cardid, ArrayList accounts) {
for (int i = 0; i < accounts.size(); i++) {
Account account= accounts.get(i);
if(cardid.equals(account.getCardId()))
return account;
}
return null;
}
}
class Account {
private String cardId;//id
private String username;//用户名
private double Money;//金额
private double Limitmoney;//单次取款限额
private String Password;//密码
public String getPassword() {
return Password;
}
public void setPassword(String password) {
Password = password;
}
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 double getMoney() {
return Money;
}
public void setMoney(double money) {
Money = money;
}
public double getLimitmoney() {
return Limitmoney;
}
public void setLimitmoney(double limitmoney) {
Limitmoney = limitmoney;
}
}
注销掉【孤独求败】的账号后我们发现再次使用他原有的账号已经无法登录。
刚才【孤独求败】给【西门吹雪】转账的3000元已成功到账。