目录
一. ATM系统功能介绍
大家都应该去过银行的ATM机上取过钱,每次取钱的时候,首先需要用户把卡插入机器,然后机器会自动读取你的卡号,由用户输入密码,如果密码校验通过,就会进入ATM机的主操作界面:有查询、取款、存款、转账等业务功能,用户选择哪个功能就执行对应预先设定好的程序。
由于没有图形化界面编程,所以我们是做不出界面效果的,但是我们可以在控制台模拟ATM机的各项功能。
如下图所示:运行程序时,进入登录界面,在此界面可以登录、或者开户。
-
在登录界面,如果用户录入1就进入用户登录的功能:如下图所示:
-
在登录界面,如果用户录入2就进入用户开户的功能:如下图所示
-
需要用到的技术方面(都是java基础) :
-
分析开发流程
首先我们来分析一下,开发这个ATM系统的流程:
-
由于每一个账户都包含一些个人信息,比如:卡号、姓名、性别、密码、余额、每次取现额度等等。所以,首先可以设计一个Account类,用来描述账户对象需要封装那些数据。
-
紧接着,定义一个ATM类,用来表示ATM系统,负责提供所有的业务需求。
比如:展示ATM系统的欢迎页面、开户、登录、转账等功能。
-
最后,定义一个测试类Test,负责启动我们开发好的ATM系统,进行测试。
二、项目架构搭建、欢迎界面设计
第一步:先来完成Account类的编写
public class Account {
private String cardId;
private String userName;
private String password;
private String gender;
private double money;
private double limit;
public Account() {
}
public Account(String cardId, String userName, String password, String gender, double money, double limit) {
this.cardId = cardId; //卡号
this.userName = userName; //用户名
this.password = password; //密码
this.gender = gender; //性别
this.money = money; //余额
this.limit = limit; //限额
}
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 String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
public double getLimit() {
return limit;
}
public void setLimit(double limit) {
this.limit = limit;
}
}
第二步:编写一个ATM类,负责对每一个账户对象进行管理
public class ATM {
//创建一个存储账户对象的集合;后面每开一个账户,就往集合中添加一个账户对象
private ArrayList<Account> accounts = new ArrayList<>();
//添加一个测试账户,方便之后使用
accounts.add(new Account("12345678", "test1", "123123", "男", 100, 10000));
}
第三步:在ATM类中,编写欢迎界面
public class ATM {
public static void main(String[] args) {
ArrayList<Account> accounts = new ArrayList<>();
accounts.add(new Account("12345678", "test1", "123123", "男", 100, 10000));
while (true) {
System.out.println("---欢迎来到ATM---");
System.out.println("请输入以下选项");
System.out.println("1.登录");
System.out.println("2.开户");
System.out.println("3.退出");
Scanner scanner = new Scanner(System.in);
int choose = scanner.nextInt();
switch (choose) {
case 1:
login(accounts);
break;
case 2:
addAccount(accounts);
break;
case 3:
System.out.println("退出成功");
return;
}
}
}
三、开户功能实现
分析 :
-
1、创建一个账户对象,用于封装用户的开户信息
-
2、需要用户输入自己的开户信息,赋值给账户对象
-
输入账户名,设置给账户对象
-
输入性别,如果性别是
'男'
或者'女'
,将性别设置给账户对象;否则重新录入性别知道录入正确为止。 -
输入账户、并且输入两次密码,只有两次密码相同,才将账户和密码设置给账户对象。
-
输入提现限额,并且设置给账户对象
-
-
3、输出开户成功,的提示语句。
/**
* 开户
*
* @param accounts
*/
public static void addAccount(ArrayList<Account> accounts) {
Scanner scanner = new Scanner(System.in);
//输入用户名
System.out.println("请输入用户名");
String userName = scanner.next();
//处理密码问题
String password;
while (true) {
System.out.println("请输入密码");
password = scanner.next();
System.out.println("请确认密码");
String password1 = scanner.next();
if (password1.equals(password)) {
break;
} else {
System.out.println("输入错误,请再次输入");
}
}
//输入性别
System.out.println("请输入性别");
String gender = scanner.next();
System.out.println("请输入限额");
double limit = scanner.nextDouble();
//生成卡号
String cardId = "";
Random random = new Random();
for (int i = 0; i < 8; i++) {
int c = random.nextInt(10);
cardId += c;
}
//封装数据,打包成一个Account对象
Account account = new Account(cardId, userName, gender, password, 0, limit);
accounts.add(account);
System.out.println("开户成功,你的卡号是:" + cardId);
}
四、登录功能
分析 :
-
1、判断系统中是否存在账户对象,存在才能登录,如果不存在,我们直接结束登录操作
-
2、输入登录的卡号,并判断卡号是否存在
-
3、如果卡号不存在,直接给出提示
-
4、如果卡号存在,接着输入用户密码,并判断密码是否正确
-
5、如果密码也正确,则登录成功,并且记录当前的登录账户
/**
* 登录功能
*
* @param accounts
*/
public static void login(ArrayList<Account> accounts) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入卡号");
String cardId = scanner.next();
System.out.println("请输入密码");
String password = scanner.next();
Account loginAccount = null;
for (int i = 0; i < accounts.size(); i++) {
Account account = accounts.get(i);
if (account.getCardId().equals(cardId) && account.getPassword().equals(password)) {
loginAccount = account;
}
}
if (loginAccount == null) {
System.out.println("登录失败");
} else {
System.out.println("登陆成功,欢迎" + loginAccount.getUserName());
showUserMenu(loginAccount,accounts);
}
}
五、展示二级菜单界面
分析:
代码:
/**
* 二级菜单
*/
public static void showUserMenu(Account loginAccount,ArrayList<Account> accounts) {
while (true) {
System.out.println("---欢迎使用ATM---");
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.注销账户");
Scanner scanner = new Scanner(System.in);
int choose = scanner.nextInt();
switch (choose) {
case 1:
showUserInfo(loginAccount);
break;
case 2:
addMoney(loginAccount);
break;
case 3:
drawMoney(loginAccount);
break;
case 4:
transferMoney(loginAccount,accounts);
break;
case 5:
boolean result = updatePassword(loginAccount);
if (result==true){
return; //结束二级菜单到一级菜单重新登陆
}else {
break;
}
case 6:
System.out.println("退出成功");
return;
case 7:
result = loginOut(loginAccount,accounts);
if (result){
return;
}{
break;
}
}
}
}
六、二级菜单子功能实现
(具体实现代码可能没有完全按照分析中的写,自己写的还有一些不严谨也不完美的地方,仅供参考)
以下的所有功能都是方法呈现
1.查询账户
分析 :
代码:
/**
* 显示用户信息
*
* @param loginAccount
*/
public static void showUserInfo(Account loginAccount) {
System.out.println("----用户信息----");
System.out.println("姓名是:" + loginAccount.getUserName());
System.out.println("卡号是:" + loginAccount.getCardId());
System.out.println("密码是:" + loginAccount.getPassword());
System.out.println("性别是:" + loginAccount.getGender());
System.out.println("余额是:" + loginAccount.getMoney());
System.out.println("限额是:" + loginAccount.getLimit());
}
2.存款
分析 :
- 键盘录入要存入的金额
- 在原有余额的基础上,加上存入金额,得到新的余额
- 再将新的余额设置给当前账户对象
代码 :
/**
* 存款功能
*
* @param loginAccount
*/
public static void addMoney(Account loginAccount) {
System.out.println("请将钱放入卡槽中");
Scanner scanner = new Scanner(System.in);
System.out.println("请输入你要存的的金额");
double addMoney = scanner.nextDouble();
loginAccount.setMoney(loginAccount.getMoney() + addMoney);
System.out.println("存入成功,余额为:" + loginAccount.getMoney());
}
3.取款
分析 :
-
1、判断账户余额是否达到了100元,如果不够100元,就不让用户取钱了
-
2、让用户输入取款金额
-
3、判断账户余额是否足够
-
如果余额足够, 继续判断当前取款金额是否超过了每次限额
-
如果超过限额,提示“每次只能取xxx限额的钱”
-
如果不超过限额,则在当前余额上减去取钱的金额,得到新的余额
并将新的余额设置给账户对象。
-
-
如果余额不足,提示“你的余额不足,你的账户余额是xxx元”
-
代码 :
/**
* 取钱
* @param loginAccount
*/
public static void drawMoney(Account loginAccount){
System.out.println("请输入取款金额");
Scanner scanner = new Scanner(System.in);
int drawMorey = scanner.nextInt();
if (drawMorey>loginAccount.getMoney()){
System.out.println("余额不足,当前余额为:"+loginAccount.getMoney());
return;
}
if (drawMorey>loginAccount.getLimit()){
System.out.println("取款金额超过限额"+loginAccount.getLimit()+"当前余额为:"+loginAccount.getMoney());
return;
}
loginAccount.setMoney(loginAccount.getMoney()-drawMorey);
System.out.println("取款成功,当前余额为:"+loginAccount.getMoney());
}
4.转账
分析 :
-
1、判断系统中是否存在其他账户
-
2、判断自己的账户中是否有钱
-
3、真正开始转账了,输入对方卡号
-
4、判断对方卡号是否正确啊?
-
5、如果卡号正确,就继续让用户输入姓氏, 并判断这个姓氏是否正确?
-
如果姓氏不正确,给出提示“对不起,您姓氏有问题,转账失败!”
-
-
6、如果姓氏正确,继续判断这个转账金额是否超过自己的余额。
-
如果转账金额超过余额,给出提示“对不起,余额不足,转账失败!”
-
-
7、如果对方卡号存在、姓氏匹配、余额足够,就完成真正的转账操作
-
获取当前自己账户的余额,减去转账金额,就可以得到自己账户新的余额,
并将新的余额,设置给当前账户
-
并且获取对方的账户余额,加上转账金额,就可以得到对方账户新的余额,
并将新的余额,设置给对方账户
-
给出提示:“您转账成功了~~~”
-
代码 :
/**
* 转账
* @param loginAccount
* @param accounts
*/
public static void transferMoney(Account loginAccount,ArrayList<Account> accounts){
Scanner scanner = new Scanner(System.in);
System.out.println("请输入转款金额");
int transferMoney = scanner.nextInt();
if (transferMoney>loginAccount.getMoney()){
System.out.println("余额不足,当前余额为:"+loginAccount.getMoney());
return;
}
if (transferMoney>loginAccount.getLimit()){
System.out.println("转款金额超过限额"+loginAccount.getLimit());
return;
}
System.out.println("请输入对方卡号");
String cardId = scanner.next();
Account destAccount = null;
for (int i = 0; i < accounts.size(); i++) {
if (accounts.get(i).getCardId().equals(cardId)){
destAccount=accounts.get(i);
break;
}
}
if (destAccount==null){
System.out.println("卡号错误");
return;
}else {
//自己减钱
loginAccount.setMoney(loginAccount.getMoney()-transferMoney);
//目标账号加钱
destAccount.setMoney(destAccount.getMoney()+transferMoney);
System.out.println("转账成功,当前账户余额为:"+loginAccount.getMoney());
}
5.修改密码
分析 :
-
1、提醒用户输入当前密码
-
2、认证当前密码是否正确
-
如果认证密码错误,提示“您当前输入的密码不正确~~”;重新输入密码,再次认证密码是否正确。
-
-
3、如果认证密码正确,开始修改密码,修改密码时需要用户输入2次新密码
-
4、判断2次 密码是否一致
-
如果两次密码一致,就将新密码设置给当前账户对象,密码修改成功
-
如果两次密码不一直,则给出提示“您输入的2次密码不一致~~”;重新输入新密码,并确认密码。
-
代码 :
/**
* 修改密码
* @param loginAccount
* @return
*/
public static boolean updatePassword(Account loginAccount){
Scanner scanner = new Scanner(System.in);
//1.提示用户输入原密码
System.out.println("请输入原密码");
String updatePassword = scanner.next();
if (!loginAccount.getPassword().equals(updatePassword)){
System.out.println("原密码输入错误,请重新尝试");
return false;
}
//2.输入修改后的密码
System.out.println("请输入新密码");
String newPassword1 = scanner.next();
System.out.println("请重新输入密码");
String newPassword2 = scanner.next();
if (!newPassword1.equals(newPassword2)){
System.out.println("两次密码输入不一致,请重新尝试");
return false;
}else {
loginAccount.setPassword(newPassword1);
System.out.println("密码修改成功");
return true;
}
}
- 这个是使用在二级菜单中加入了一个判断,如果返回值是true就退出
6.退出
分析 :
- 直接在二级菜单中return
7.注销
分析 :
-
1、先确认是否需要注销账户,让用户输入y或者n
-
如果输入y,表示确认
-
如果输入n,表示取消注销操作
-
-
2、输入y后,继续判断当前用户的账户是否有钱
-
如果账户有钱,提示:“对不起,您的账户中存钱金额,不允许销”
-
如果账户没有钱,则把当前账户对象,从系统的集合中删除,完成注销。
-
代码 :
/**
* 注销功能
* @param loginAccount
* @param accounts
* @return
*/
public static boolean loginOut(Account loginAccount,ArrayList<Account> accounts){
if (loginAccount.getMoney()>0){
System.out.println("你的账户还有余额,注销失败");
return false;
}
accounts.remove(loginAccount);
System.out.println("账户删除成功");
return true;
}
- 这个是使用在二级菜单中加入了一个判断,如果返回值是true就退出