文章目录
前言
需求:模拟ATM系统
一、系统构架搭建、欢迎页设计
分析:
1、定义一个账户类Account,至少需要包含(卡号、姓名、性别、密码、余额、每次取现额度)
2、定义一个ATM类,用来代表ATM系统,负责提供所有的业务需求,比如:展示ATM系统的系统欢迎页、开通账户、转账
3、定义一个测试类Demo,负责对我们开发的ATM系统进行测试
系统欢迎页设计
在ATM类中设计一个方法start(),方法里面负责展示欢迎界面
展示页面功能部分代码
//展示页面
public void start(){
while (true) {
System.out.println("=========ATM系统=========");
System.out.println("1、用户登录");
System.out.println("2、用户开户");
System.out.println("请选择您要操作的命令");
String command = sc.next();
switch (command){
//用户登录
case "1":
break;
//用户开户
case "2":
break;
default:
System.out.println("命令错误,请重新输入");
}
}
}
二、开户功能实现
用户开户功能
分析:
1、定义一个开户方法:creatAccount
2、在方法里创建一个Account账户对象,负责封装用户的账户信息(姓名、性别、密码、卡号等)
3、卡号需要由系统自动生成(卡号要求是8位数字,且不能重复)
4、把账户对象存入到账户集合中去
5、提示开户成功
用户开户功能部分代码
//用户开户
private void creatAccount(){
//1、创建一个Account对象
Account account = new Account();
System.out.println("++++++++++系统开户操作++++++++++");
//2、输入用户的开户信息,赋值给账户对象
System.out.println("请输入用户名");
String name = sc.next();
//将信息存入account中
account.setUserName(name);
//3、存入用户性别
while (true) {
System.out.println("请输入性别男/女");
char sex = sc.next().charAt(0); // 获取一串字符串,提取第一个字符
//判断
if(sex == '男' || sex == '女'){
account.setSex(sex); //将信息存入account中
break;
}else{
System.out.println("性别有误,请重新输入男/女");
}
}
//两次确认用户密码,并存入密码
while (true) {
System.out.println("请输入您的账户密码");
String userPassWord = sc.next();
System.out.println("请输入您的确认密码");
String okUserPassWord = sc.next();
if(userPassWord.equals(okUserPassWord)){
account.setPassWord(userPassWord); //将信息存入account中
break;
}else{
System.out.println("两次密码不一样,请重新输入");
}
}
//用户取现额度
while (true) {
System.out.println("请输入账户限额");
double limit1 = sc.nextDouble();
if(limit1 >= 0) {
account.setLimit(limit1);
break;
}else{
System.out.println("取现额度非法,请重新设置取现额度");
}
}
//自动为用户生成一个8位的卡号且卡号不能重复
//3、把Account对象存入ATM集合中去
accounts.add(account);
System.out.println("恭喜您," + account.getUserName() + "开户成功,您的卡号是:" + account.getIdCard());
}
为新开户的账号生成一个新卡号
需求:
1、新卡号要求是一个8位的数字,且不能与其他账户对象的卡号重复
2、新卡号得到后,需要赋值给当前账户对象
系统随机生成卡号部分代码
//返回一个八位数字的卡号,且不能重复
private String creatIdCard(){
Random r = new Random();
while (true) {
String IdCard = "";
for(int i = 0 ; i < 8 ; i++){
int data = r.nextInt(10);
IdCard += data;
}
//根据卡号查找用户,找到重新生成,查无此人存入account对象中
Account acc = getAccountByCardId(IdCard);
if(acc == null){
// 查无此人,随机生成的号码可以使用,返回生成的卡号
return IdCard;
}
}
}
//根据卡号查找用户
private Account getAccountByCardId(String idCard){
Account account = new Account();
//获取集合对象中idCard的值
for(int i = 0 ; i < accounts.size() ; i++){
account = accounts.get(i);
if(account.getIdCard().equals(idCard)){
return account;
}
}
return null; // 查无此人
}
三、登录功能实现
登录功能实现部分代码
//用户登录
private void login(){
Scanner sc = new Scanner(System.in);
String okPassWord = "";
System.out.println("++++++++++系统登录操作++++++++++");
if(accounts.size() == 0){
//系统中一个用户都没有
System.out.println("系统中没有用户,请先开户");
return;
}
//系统中有用户
Account acc = null;
while (true) {
System.out.println("输入登录卡号:");
String idCard = sc.next();
//调用卡号查找用户功能
acc = getAccountByCardId(idCard);
if(acc == null){
System.out.println("卡号错误,请重新输入");
return;
}
//卡号正确,获取用户密码
okPassWord = acc.getPassWord();
break; // 结束循环
}
while (true) {
System.out.println("输入账户密码:");
String passWord = sc.next();
if(passWord.equals(okPassWord)){
System.out.println("登录成功");
//卡号密码验证通过,进入系统操作页面
break;
}else{
System.out.println("密码错误,请重新输入");
}
}
}
四、操作页展示、查询账户、退出账户
操作页设计、查询账户、退出账户功能
操作页面设计部分代码
//展示系统操作页面
private void showUserCommand(Account account){
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("++++++++++系统操作页面++++++++++");
System.out.println("欢迎" + account.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、注销账户");
System.out.println("请选择您要进行的操作:");
int command = sc.nextInt();
switch (command){
case 1:
//查询账户
showLoginAccount();
break;
case 2:
//存款
break;
case 3:
//取款
break;
case 4:
//转账
break;
case 5:
//修改密码
break;
case 6:
//退出
System.out.println(acc.getUserName() + "退出操作系统");
return; //结束当前方法 AAAAAAAAAAAAAAAAAAAA
case 7:
//注销账户
break;
default:
System.out.println("非法操作");
}
}
}
查询账户部分代码
//展示登录后的查询信息功能
private void showLoginAccount(){
System.out.println("++++++++++ 当前您的账户信息如下: ++++++++++");
System.out.println("卡号" + acc.getIdCard());
System.out.println("户主" + acc.getUserName());
System.out.println("性别" + acc.getSex());
System.out.println("余额" + acc.getMoney());
System.out.println("每次取现额度" + acc.getLimit());
}
退出账户功能部分代码
case 6:
//退出
System.out.println(acc.getUserName() + "退出操作系统");
return; //结束当前方法 AAAAAAAAAAAAAAAAAAAA
五、存款、取款功能实现
分析
取款功能部分代码
//展示登录后的取款功能
private void drawMoney(){
while (true) {
System.out.println("==取款操作==");
//账户余额>=100,才可以取款
if(acc.getMoney() >= 100){
System.out.println("取款金额:");
double money = sc.nextDouble();
// 判断取款金额是否大于账户余额,取款金额不能大于当次取款限额
if(acc.getMoney() >= money){
if(money <= acc.getLimit()) {
//更新当前登录的账户余额
acc.setMoney(acc.getMoney() - money);
System.out.println("取款成功," + "当前余额:" + acc.getMoney());
break; //结束当前循环 BBBBBBBBBBBBBBBBBB
}else{
System.out.println("取款金额大于当次取款限额,无法取款" + "当前取款限额:" + acc.getLimit());
}
}else{
System.out.println("您的余额小于取款金额" + "当前余额:" + acc.getMoney());
}
}else{
System.out.println("您的余额不足100,无法操作" + "当前余额:" + acc.getMoney());
return;
}
}
}
存款功能部分代码
//展示登陆后的存款功能
private void depositMoney(){
System.out.println("==存钱操作==");
System.out.println("存款金额:");
double money = sc.nextDouble();
//更新当前登录的账户余额
acc.setMoney(acc.getMoney() + money);
System.out.println("存钱成功," + "当前余额:" + acc.getMoney());
}
六、转账功能实现
分析
转账功能部分代码
//展示登录后的转账功能
private void transferMoney(){
System.out.println("==用户转账操作==");
//判断当前系统用户是否大于2
if(accounts.size() < 2){
System.out.println("当前系统只有一个账户,无法进行转账");
return;
}
//判断账户中是否有钱
if(acc.getMoney() == 0){
System.out.println("账户余额不足");
return;
}
//开始转账
while (true) {
System.out.println("请输入对方卡号");
String id = sc.next();
//判断卡号是否存在
Account ac = getAccountByCardId(id);
if(ac == null){
System.out.println("对方卡号不存在,退出转账服务");
return;
}else{
//对方账户存在,认证对方户主的姓氏
String name = "*" + ac.getUserName().substring(1); //前面加一个*,先获取用户名,然后调用String方法,从第二个字符开始截取
System.out.println("请您输入" + name + "姓氏");
String okName = sc.next();
//判断姓氏是否正确
if(ac.getUserName().startsWith(okName)){
while (true) {
//认证通过
System.out.println("请您输入转账给对方的金额:");
double money = sc.nextDouble();
// 判断金额是否没有超过自己的金额
if(acc.getMoney() >= money){
if(money <= acc.getLimit()){
//转账操作,本人账户情况
acc.setMoney(acc.getMoney() - money);
//对方账户情况
ac.setMoney(ac.getMoney() + money);
return; // 结束当前方法 CCCCCCCCCCCCCCCCCCC
}else{
System.out.println("当次转账金额大于限制金额,请重新转账" + "当前账户限制金额:" + acc.getLimit() );
}
}else{
System.out.println("余额不足,无法转账给对方");
}
}
}else{
System.out.println("认证姓氏有问题,请重新输入");
}
}
}
}
七、销户功能实现
分析
销户功能部分代码
//展示登陆后的销户操作
private boolean deleteAccount(){
boolean rs = false;
System.out.println("==销户操作==");
//判断当前用户是否还有余额
if(acc.getMoney() != 0){
System.out.println("当前账号剩余余额:" + acc.getMoney() + "无法销户");
return rs;
}else{
System.out.println("请问你是否要销户y/n:");
String command = sc.next();
switch (command){
case "y":
//二次确认销户
rs = true;
accounts.remove(acc);
System.out.println("销户成功");
return rs;
case "n":
//取消销户
return rs;
default:
System.out.println("非法操作");
}
return rs;
}
}
八、用户密码修改
分析
用户密码修改部分代码
//展示登录后的密码修改操作
private void updatePassWord(){
while (true) {
System.out.println("==修改密码操作==");
System.out.println("请您输入当前密码:");
String nowPassWord = sc.next();
//如果当前密码正确,进行修改
if(nowPassWord.equals(acc.getPassWord())){
System.out.println("请输入新的密码:");
String passWord1 = sc.next();
System.out.println("二次确认新密码:");
String passWord2 = sc.next();
if(passWord2.equals(passWord1)){
//替换原来密码,并回到欢迎界面
acc.setPassWord(passWord1); //赋值给当前对象密码
System.out.println("修改密码成功");
return;
}else{
System.out.println("两次密码输入错误");
}
}else{
System.out.println("当前密码错误,请重新输入");
}
}
}
ATM.java
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;
public class ATM {
//存储Account对象
private ArrayList<Account> accounts = new ArrayList<>();
//记住登录后的用户账户
private Account acc = null;
Scanner sc = new Scanner(System.in);
//展示页面
public void start(){
while (true) {
System.out.println("=========ATM系统=========");
System.out.println("1、用户登录");
System.out.println("2、用户开户");
System.out.println("请选择您要操作的命令");
String command = sc.next();
switch (command){
//用户登录
case "1":
login(); // AAAAAAAAAAAAAAAAAAA
break;
//用户开户
case "2":
creatAccount();
break;
default:
System.out.println("命令错误,请重新输入");
}
}
}
//用户登录
private void login(){
Scanner sc = new Scanner(System.in);
String okPassWord = "";
System.out.println("++++++++++系统登录操作++++++++++");
if(accounts.size() == 0){
//系统中一个用户都没有
System.out.println("系统中没有用户,请先开户");
return;
}
//系统中有用户
while (true) {
System.out.println("输入登录卡号:");
String idCard = sc.next();
//调用卡号查找用户功能
acc = getAccountByCardId(idCard);
if(acc == null){
System.out.println("卡号错误,请重新输入");
return;
}
//卡号正确,获取用户密码
okPassWord = acc.getPassWord();
System.out.println("输入账户密码:");
String passWord = sc.next();
if(passWord.equals(okPassWord)){
System.out.println("登录成功");
//卡号密码验证通过,进入系统操作页面
showUserCommand(acc);
return; //跳出并结束当前方法,返回登录界面 AAAAAAAAAAAAA
}else{
System.out.println("密码错误,请重新输入");
}
}
}
//用户开户
private void creatAccount(){
//1、创建一个Account对象
Account account = new Account();
System.out.println("++++++++++系统开户操作++++++++++");
//2、输入用户的开户信息,赋值给账户对象
System.out.println("请输入用户名");
String name = sc.next();
//将信息存入account中
account.setUserName(name);
//3、存入用户性别
while (true) {
System.out.println("请输入性别男/女");
char sex = sc.next().charAt(0); // 获取一串字符串,提取第一个字符
//判断
if(sex == '男' || sex == '女'){
account.setSex(sex); //将信息存入account中
break;
}else{
System.out.println("性别有误,请重新输入男/女");
}
}
//两次确认用户密码,并存入密码
while (true) {
System.out.println("请输入您的账户密码");
String userPassWord = sc.next();
System.out.println("请输入您的确认密码");
String okUserPassWord = sc.next();
if(userPassWord.equals(okUserPassWord)){
account.setPassWord(userPassWord); //将信息存入account中
break;
}else{
System.out.println("两次密码不一样,请重新输入");
}
}
//用户取现额度
while (true) {
System.out.println("请输入账户限额");
double limit1 = sc.nextDouble();
if(limit1 >= 0) {
account.setLimit(limit1);
break;
}else{
System.out.println("取现额度非法,请重新设置取现额度");
}
}
//自动为用户生成一个8位的卡号且卡号不能重复
String id = creatIdCard();
//将卡号存入对象中
account.setIdCard(id);
//3、把Account对象存入ATM集合中去
accounts.add(account);
System.out.println("恭喜您," + account.getUserName() + "开户成功,您的卡号是:" + account.getIdCard());
}
//返回一个八位数字的卡号,且不能重复
private String creatIdCard(){
Random r = new Random();
while (true) {
String IdCard = "";
for(int i = 0 ; i < 8 ; i++){
int data = r.nextInt(10);
IdCard += data;
}
//根据卡号查找用户,找到重新生成,查无此人存入account对象中
Account acc = getAccountByCardId(IdCard);
if(acc == null){
// 查无此人,随机生成的号码可以使用,返回生成的卡号
return IdCard;
}
}
}
//根据卡号查找用户
private Account getAccountByCardId(String idCard){
Account account = new Account();
//获取集合对象中idCard的值
for(int i = 0 ; i < accounts.size() ; i++){
account = accounts.get(i);
if(account.getIdCard().equals(idCard)){
return account;
}
}
return null; // 查无此人
}
//展示系统操作页面
private void showUserCommand(Account account){
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("++++++++++系统操作页面++++++++++");
System.out.println("欢迎" + account.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、注销账户");
System.out.println("请选择您要进行的操作:");
int command = sc.nextInt();
switch (command){
case 1:
//查询账户
showLoginAccount();
break;
case 2:
//存款
depositMoney();
break;
case 3:
//取款
drawMoney(); // BBBBBBBBBBBBBBBBBBBBBBB
break;
case 4:
//转账
transferMoney(); // CCCCCCCCCCCCCCCCC
break;
case 5:
//修改密码
updatePassWord();
return; // 结束当前方法
case 6:
//退出
System.out.println(acc.getUserName() + "退出操作系统");
return; //结束当前方法 AAAAAAAAAAAAAAAAAAAA
case 7:
//注销账户
boolean rs = deleteAccount();
if(rs){
//rs为true,销户成功,回到欢迎页
return;
}else {
// rs为false,销户失败
break;
}
default:
System.out.println("非法操作");
}
}
}
//展示登录后的查询信息功能
private void showLoginAccount(){
System.out.println("++++++++++ 当前您的账户信息如下: ++++++++++");
System.out.println("卡号:" + acc.getIdCard());
System.out.println("户主:" + acc.getUserName());
System.out.println("性别:" + acc.getSex());
System.out.println("余额:" + acc.getMoney());
System.out.println("每次取现额度:" + acc.getLimit());
}
//展示登陆后的存款功能
private void depositMoney(){
System.out.println("==存钱操作==");
System.out.println("存款金额:");
double money = sc.nextDouble();
//更新当前登录的账户余额
acc.setMoney(acc.getMoney() + money);
System.out.println("存钱成功," + "当前余额:" + acc.getMoney());
}
//展示登录后的取款功能
private void drawMoney(){
while (true) {
System.out.println("==取款操作==");
//账户余额>=100,才可以取款
if(acc.getMoney() >= 100){
System.out.println("取款金额:");
double money = sc.nextDouble();
// 判断取款金额是否大于账户余额,取款金额不能大于当次取款限额
if(acc.getMoney() >= money){
if(money <= acc.getLimit()) {
//更新当前登录的账户余额
acc.setMoney(acc.getMoney() - money);
System.out.println("取款成功," + "当前余额:" + acc.getMoney());
break; //结束当前循环 BBBBBBBBBBBBBBBBBB
}else{
System.out.println("取款金额大于当次取款限额,无法取款" + "当前取款限额:" + acc.getLimit());
}
}else{
System.out.println("您的余额小于取款金额" + "当前余额:" + acc.getMoney());
}
}else{
System.out.println("您的余额不足100,无法操作" + "当前余额:" + acc.getMoney());
return;
}
}
}
//展示登录后的转账功能
private void transferMoney(){
System.out.println("==用户转账操作==");
//判断当前系统用户是否大于2
if(accounts.size() < 2){
System.out.println("当前系统只有一个账户,无法进行转账");
return;
}
//判断账户中是否有钱
if(acc.getMoney() == 0){
System.out.println("账户余额不足");
return;
}
//开始转账
while (true) {
System.out.println("请输入对方卡号");
String id = sc.next();
//判断卡号是否存在
Account ac = getAccountByCardId(id);
if(ac == null){
System.out.println("对方卡号不存在,退出转账服务");
return;
}else{
//对方账户存在,认证对方户主的姓氏
String name = "*" + ac.getUserName().substring(1); //前面加一个*,先获取用户名,然后调用String方法,从第二个字符开始截取
System.out.println("请您输入" + name + "姓氏");
String okName = sc.next();
//判断姓氏是否正确
if(ac.getUserName().startsWith(okName)){
while (true) {
//认证通过
System.out.println("请您输入转账给对方的金额:");
double money = sc.nextDouble();
// 判断金额是否没有超过自己的金额
if(acc.getMoney() >= money){
if(money <= acc.getLimit()){
//转账操作,本人账户情况
acc.setMoney(acc.getMoney() - money);
//对方账户情况
ac.setMoney(ac.getMoney() + money);
return; // 结束当前方法 CCCCCCCCCCCCCCCCCCC
}else{
System.out.println("当次转账金额大于限制金额,请重新转账" + "当前账户限制金额:" + acc.getLimit() );
}
}else{
System.out.println("余额不足,无法转账给对方");
}
}
}else{
System.out.println("认证姓氏有问题,请重新输入");
}
}
}
}
//展示登陆后的销户操作
private boolean deleteAccount(){
boolean rs = false;
System.out.println("==销户操作==");
//判断当前用户是否还有余额
if(acc.getMoney() != 0){
System.out.println("当前账号剩余余额:" + acc.getMoney() + "无法销户");
return rs;
}else{
System.out.println("请问你是否要销户y/n:");
String command = sc.next();
switch (command){
case "y":
//二次确认销户
rs = true;
accounts.remove(acc);// 从集合中移除当前登录账户的对象
System.out.println("销户成功");
return rs;
case "n":
//取消销户
return rs;
default:
System.out.println("非法操作");
}
return rs;
}
}
//展示登录后的密码修改操作
private void updatePassWord(){
while (true) {
System.out.println("==修改密码操作==");
System.out.println("请您输入当前密码:");
String nowPassWord = sc.next();
//如果当前密码正确,进行修改
if(nowPassWord.equals(acc.getPassWord())){
System.out.println("请输入新的密码:");
String passWord1 = sc.next();
System.out.println("二次确认新密码:");
String passWord2 = sc.next();
if(passWord2.equals(passWord1)){
//替换原来密码,并回到欢迎界面
acc.setPassWord(passWord1); //赋值给当前对象密码
System.out.println("修改密码成功");
return;
}else{
System.out.println("两次密码输入错误");
}
}else{
System.out.println("当前密码错误,请重新输入");
}
}
}
}
Demo.java
import java.util.Random;
import java.util.Scanner;
public class Demo {
public static void main(String[] args) {
ATM atm = new ATM();
//ATM页面
atm.start();
/*
账户1: 账户2:
申 深
男 男
111111 222222
5000 0.0
限制金额:
2000 2000
*/
}
}
Account.java
public class Account {
//卡号
private String idCard;
//用户名
private String userName;
//性别
private char sex;
//密码
private String passWord;
//余额
private double money;
//限额
private double limit;
//构造器
public Account(String idCard, String userName, char sex, String passWord, double money, double limit) {
this.idCard = idCard;
this.userName = userName;
this.sex = sex;
this.passWord = passWord;
this.money = money;
this.limit = limit;
}
public Account() {
}
public String getIdCard() {
return idCard;
}
public void setIdCard(String idCard) {
this.idCard = idCard;
}
public String getUserName() {
return userName + (sex == '男' ? "先生" : "女士");
}
public void setUserName(String userName) {
this.userName = userName;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
public String getPassWord() {
return passWord;
}
public void setPassWord(String passWord) {
this.passWord = passWord;
}
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;
}
}