ATM系统技术选型分析
技术点分析
- 面向对象编程:
每个用户账户都是一个对象:所以需要设计账户类Account用于创建账户对象封装账户信息 - 使用集合容器:
系统需要提供一个容器用于存储这些账户对象的信息,我们选ArrayList集合 - 程序流程控制:
需要结合分支、循环、跳转关键字等相关操作控制程序的业务逻辑 - 使用常见API
登录信息的内容比较,业务数据的分析,处理等都需要用到String等常用API来解决
系统准备、首页设计
系统准备内容分析
- 每个用户的账户信息都是一个对象,需要提供账户类
- 需要准备一个容器,用于存储系统全部账户对象信息
- 首页只需要包括:登录和注册2个功能
实现步骤
- 定义账户类,用于后期创建账户对象封装用户的账户信息
- 账户类中的信息至少需要包含(卡号、姓名、密码、余额、取现额度)
- 需要准备一个ArrayList的集合,用于存储系统用户的账户对象
- 需要展示欢迎页包含2个功能:开户功能、登录账户
用户开户功能实现
分析
开户功能其实就是往系统的集合容器中存入一个新的账户对象的信息
开户功能实现步骤
- 定义方法完成开户
- 键盘录入姓名、密码、确认密码(需保证两次密码一致)
- 生成账户卡号,卡号必须由系统自动生成8位数字(必须保证卡号的唯一)
- 创建Account账户类对象用于封装账户信息(姓名、密码、卡号)
- 把Account账户类对象存入到集合accounts中去
用户登录功能实现
分析
- 定义方法完成登录
- 让用户键盘录入卡号,根据卡号查询账户对象
- 如果没有找到了账户对象,说明卡号不存在,提示继续输入卡号
- 如果找到了账户对象,说明卡号存在,继续输入密码
- 如果密码不正确,提示继续输入密码
- 如果密码正确,提示登录成功!!!
用户操作页设计、查询账户、退出账户功能分析
- 用户登录成功后,需要进入用户操作页
- 查询就是直接展示当前登录成功的账户对象的信息
- 退出账户是需要回到首页的
用户存款功能实现
存款分析
- 存款就是拿到当前账户对象
- 然后让用户输入存款的金额
- 调用账户对象的setMoney方法将账户余额修改成存钱后的金额
- 存钱后需要查询一下账户信息,确认是否存钱成功了!
用户取款功能实现
取款分析
- 取款需要先判断账户是否有钱
- 有钱则拿到自己账户对象
- 然后让用户输入取款金额
- 判断取款金额是否超过了当次限额,以及余额是否足够
- 满足要求则调用账户对象的setMoney方法完成金额的修改
用户转账功能
分析
- 转账功能需要判断系统中是否有2个账户对象及以上
- 同时还要判断自己账户是否有钱
- 接下来需要输入对方卡号,判断对方账户是否存在
- 对方账户存在还需要认证对方户主的姓氏
- 满足要求则可以把自己账户对象的金额修改到对方账户对象中去
用户密码修改,销户功能实现
分析
- 修改密码就是把当前对象的密码属性使用set方法进行更新
- 销户是从集合对象中删除当前对象,并回到首页
package ATM;
/**
* 账户类
*/
public class Account {
private int id;
private String name;
private int password;
private double money;
private double maxMoney;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPassword() {
return password;
}
public void setPassword(int password) {
this.password = password;
}
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
public double getMaxMoney() {
return maxMoney;
}
public void setMaxMoney(double maxMoney) {
this.maxMoney = maxMoney;
}
public Account(int id, String name, int password, double money, double maxMoney) {
this.id = id;
this.name = name;
this.password = password;
this.money = money;
this.maxMoney = maxMoney;
}
public Account() {
}
}
package ATM;
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;
public class index {
public static void main(String[] args) {
System.out.println("================欢迎您进入到ATM系统===================");
ArrayList<Account> accounts = new ArrayList<>();
while (true) {
System.out.println("1.登录账户");
System.out.println("2.注册账户");
System.out.println("请您选择操作:");
Scanner sc = new Scanner(System.in);
int action = sc.nextInt();
if (action == 1) {
//登录
Login(accounts,sc);
} else if(action==2){
//开户
Regist(accounts, sc);
}else{
System.out.println("输入有误,请重新输入");
}
}
}
// 登录账户
public static void Login(ArrayList<Account> accounts, Scanner sc) {
System.out.println("================欢迎您进入到登录系统===================");
//必须系统中存在账户才可以登录
if(accounts.size()==0){
//没有任何账户
System.out.println("当前系统无任何账户,请先注册再登录!");
}else{
boolean idCheck=true;
while (idCheck) {
System.out.println("请您输入登录的卡号:");
int id=sc.nextInt();
//根据卡号查询账户对象
for (int i = 0; i < accounts.size(); i++) {
Account ac=accounts.get(i);
if(ac.getId()==id&&id<100000000){
idCheck=false;
boolean flag=true;
while (flag) {
System.out.println("请您输入登录的密码:");
int passWord=sc.nextInt();
//判断密码是否正确
if(ac.getPassword()==passWord){
//展示系统登录成功后的操作界面
System.out.println("欢迎您:"+ac.getName()+"先生/女士进入系统,您可开始办理您的业务了!");
Action(ac,sc,accounts);
flag=false;
}else{
System.out.println("您的密码输入错误,请重新输入!");
flag=true;
}
}
}
}
//判断账户对象是否存在,存在说明卡号没问题
if(idCheck||id>100000000){
System.out.println("卡号不存在,请确认!");
}
}
}
}
//用户操作界面
public static void Action(Account ac, Scanner sc, 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();
if(command==6){
System.out.println("欢迎下次继续光临!!");
break;
}
if(command==5){
Correct(ac,sc);
break;
}
if(command==7){
Logout(ac,accounts);
break;
}
switch (command){
case 1:
Query(ac);
break;
case 2:
Deposit(ac,sc);
break;
case 3:
WithDraw(ac,sc);
break;
case 4:
Transfer(ac,accounts,sc);
break;
}
}
}
//注销账户
public static void Logout(Account ac, ArrayList<Account> accounts) {
for (int i = 0; i < accounts.size(); i++) {
Account acc=accounts.get(i);
if(acc.getId()==ac.getId()){
accounts.remove(acc);
}
}
System.out.println("您的账户已经完成了销毁,您将不可以进行登录了!");
}
//修改密码
public static void Correct(Account ac, Scanner sc) {
while (true) {
System.out.println("请您输入当前密码认证:");
int pass=sc.nextInt();
if(pass==ac.getPassword()){
while (true) {
System.out.println("请您输入新密码:");
int newPass=sc.nextInt();
System.out.println("请您确认新密码:");
int okNewpass=sc.nextInt();
if(newPass==okNewpass){
ac.setPassword(okNewpass);
System.out.println("密码已经修改成功,请重新登录!");
break;
}else{
System.out.println("两次密码输入不一致!");
}
}
break;
}else{
System.out.println("您输入的密码有误,请重新确认密码!");
}
}
}
//转账
public static void Transfer(Account ac, ArrayList<Account> accounts, Scanner sc) {
if(ac.getMoney()==0){
System.out.println("您自己都没钱,就别转了吧!");
}else if(accounts.size()<2){
System.out.println("当前系统中没有其他账户可以转账,去注册一个账户吧!");
}else{
boolean idCheck=true;
boolean okLast=true;
while (idCheck||okLast) {
idCheck=true;
okLast=true;
System.out.println("请您输入对方卡号:");
int id=sc.nextInt();
for (int i = 0; i < accounts.size(); i++) {
Account acc=accounts.get(i);
if(acc.getId()==id){
idCheck=false;
String name=acc.getName().substring(1);
String lastName=acc.getName().substring(0,1);
System.out.println("请您确认[*"+name+"]的姓氏来确认!");
System.out.println("请输入对方的姓氏:");
String last=sc.next();
if(lastName.equals(last)){
while (true) {
okLast=false;
System.out.println("请您输入转账的金额(您最多可以转账:"+ac.getMoney()+"元):");
double money=sc.nextDouble();
if(money<=ac.getMoney()){
ac.setMoney(ac.getMoney()-money);
acc.setMoney(acc.getMoney()+money);
System.out.println("您已经完成转账!您当前还剩余:"+ac.getMoney());
break;
}else{
System.out.println("你不听话,没有这么多钱可以转!");
}
}
}else{
System.out.println("您输入对方的信息有误!");
break;
}
}
}
if (idCheck){
System.out.println("您输入的转账账号不存在!");
}
}
}
}
//取款
public static void WithDraw(Account ac, Scanner sc) {
System.out.println("================欢迎进入账户取款操作===================");
while (true) {
System.out.println("请您输入取钱的金额:");
double money=sc.nextDouble();
if(money<=ac.getMaxMoney()){
if(money<=ac.getMoney()){
ac.setMoney(ac.getMoney()-money);
System.out.println("您当前取钱完成,请拿走您的钱,当前剩余余额是:"+ac.getMoney());
break;
}else{
System.out.println("当前余额不足!当前余额是:"+ac.getMoney());
}
}else{
System.out.println("您当前取款金额超过了每次限额!");
}
}
}
//存款
public static void Deposit(Account ac, Scanner sc) {
System.out.println("================欢迎进入账户存款操作===================");
System.out.println("请您输入存款金额:");
double money=sc.nextDouble();
if(money>0){
ac.setMoney(ac.getMoney()+money);
}
Query(ac);
}
//查询账户信息
public static void Query(Account ac) {
System.out.println("================您当前账户详情信息如下===================");
System.out.println("卡号:"+ac.getId());
System.out.println("户主:"+ac.getName());
System.out.println("余额:"+ac.getMoney());
System.out.println("当次取现额度:"+ac.getMaxMoney());
}
//开户
public static void Regist(ArrayList<Account> accounts, Scanner sc) {
System.out.println("================欢迎您进入到开户操作===================");
System.out.println("请您输入账户名称:");
// 2.键盘录入 姓名 密码 确认密码
String name=sc.next();
int okPassword=0;
while(true){
System.out.println("请您输入账户密码:");
int password=sc.nextInt();
System.out.println("请您输入确认密码:");
okPassword=sc.nextInt();
if(password!=okPassword){
System.out.println("两次输入的密码不一致!");
}else{
break;
}
}
System.out.println("请您设置当次取现额度");
double maxMoney=sc.nextDouble();
int id=getAccountId(accounts);
//创建账户对象封装账户信息并把账户对象添加到集合中去
accounts.add(new Account(id,name,okPassword,0.0,maxMoney));
System.out.println("恭喜您,"+name+"先生/女士,您开户完成,您卡号是:"+id);
}
// 创建账户的卡号
public static int getAccountId(ArrayList<Account> accounts) {
// 生成8位随机的数字代表卡号
Random r = new Random();
int id=0;
//判断卡号是否重复
boolean flag=false;
while(!flag){
id=r.nextInt(100000000);
for (int i = 0; i < accounts.size(); i++) {
Account ac=accounts.get(i);
if(ac.getId()==id){
flag=true;
}
}
if(flag){
flag=false;
}else{
flag=true;
}
}
return id;
}
}