一、ATM项目介绍
二、项目架构搭架、欢迎界面设计
我们先来分析一下,开发这个ATM系统的流程:
- 由于每一个账户都包含一些个人信息,比如:卡号、姓名、性别、密码、余额、每次取现额度等等,所以,首先可以设计一个Account类,用来描述账户对象需要封装那些数据。
- 紧接着,定义一个ATM类,用来表示ATM系统,负责提供所有的业务需求。比如:展示ATM系统的欢迎页面、开户、登录、转账等功能。
- 最后,定义一个测试类Test,负责启动我们开发好的ATM系统,进行测试
第一步:先完成Account类的编写
//首先可以设计一个Account类,来描述账户对象需要封装哪些数据。
public class Account {
private String cardId; //卡号
private String userName; //用户名
private char sex; //性别
private String password;//密码
private double money; //余额
private double limit; // 限额
public String getCardId() {
return cardId;
}
public void setCardId(String cardId) {
this.cardId = cardId;
}
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;
}
}
第二步:编写一个ATM类,负责对每一个账户对象进行管理
import java.util.ArrayList;
public class ATM {
//创建一个存储账户对象的集合;后面每开一个账户,就往集合中添加一个账户对象
private ArrayList<Account> accounts = new ArrayList<>();
}
第三部:在ATM类中,编写欢迎界面
import java.util.ArrayList;
import java.util.Scanner;
public class ATM {
//创建一个存储账户对象的集合;后面每开一个账户,就往集合中添加一个账户对象
private ArrayList<Account> accounts = new ArrayList<>();
//为了后面键盘录入方便一点,先创建好一个Scanner对象
private Scanner sc = new Scanner(System.in);
/**启动ATM系统 展示欢迎界面 */
public void start(){
while (true) {
System.out.println("===欢迎您进入到了ATM系统===");
System.out.println("1、用户登录");
System.out.println("2、用户开户");
System.out.print("请选择:");
int command = sc.nextInt();
switch (command){
case 1:
// 用户登录
System.out.println("进入登录功能");
break;
case 2:
// 用户开户
System.out.println("进入开户功能");
break;
default:
System.out.println("没有该操作~~");
}
}
}
}
三、开户功能实现
1.创建一个账户对象,用于封装用户的开户信息
2.需要用户输入自己的开户信息,赋值给账户对象
- 输入账户名,设置给账户对象
- 输入性别,如果性别是‘男’或者"女',将性别设置给账户对象;否则重新录入性别直到录入正确为止。
- 输入账户、并且输入两次密码,只有两次密码相同,才将账户和密码设置给账户对象
- 输入提现限额,并且设置给账户对象
3.输出开户成功,的提示语句
/** 完成用户开户操作 */
private void createAccount() {
System.out.println("===系统开户操作===");
// 1、创建一个账户对象,用于封装用户的开户信息
Account acc = new Account();
// 2、需要用户输入自己的开户信息,赋值给账户对象
System.out.println("请您输入您的账户名称:");
String name = sc.next();
acc.setUserName(name);
while (true) {
System.out.println("请您输入您的性别:");
char sex = sc.next().charAt(0); // "男"
if(sex == '男' || sex == '女'){
acc.setSex(sex);
break;
}else {
System.out.println("您输入的性别有误~只能是男或者女~");
}
}
while (true) {
System.out.println("请您输入您的账户密码:");
String password = sc.next();
System.out.println("请您输入您的确认密码:");
String okPassword = sc.next();
// 判断2次密码是否一样。
if(okPassword.equals(password)){
acc.setPassword(okPassword);
break;
}else {
System.out.println("您输入的2次密码不一致,请您确认~~");
}
}
System.out.println("请您输入您的取现额度:");
double limit = sc.nextDouble();
acc.setLimit(limit);
// 重点:我们需要为这个账户生成一个卡号(由系统自动生成。8位数字表示,不能与其他账户的卡号重复)
//TODO 这里先留着,待会把生成卡号的功能写好,再到这里调用
// 3、把这个账户对象,存入到账户集合中去
accounts.add(acc);
System.out.println("恭喜您," + acc.getUserName() + "开户成功,您的卡号是:" + acc.getCardId());
}
四、生成卡号
第一步:先在ATM类中,写一个判断卡号是否存在的功能。
- 遍历存储Account对象的集合,得到每一个Account对象,获取对象的卡号
- 如果卡号存在,返回该卡号对应的Account对
- 如果卡号不存在 返回null
/** 根据卡号查询账户对象返回 accounts = [c1, c2, c3 ...]*/
private Account getAccountByCardId(String cardId){
// 遍历全部的账户对象
for (int i = 0; i < accounts.size(); i++) {
Account acc = accounts.get(i);
// 判断这个账户对象acc中的卡号是否是我们要找的卡号
if(acc.getCardId().equals(cardId)){
return acc;
}
}
return null; // 查无此账户,这个卡号不存在的
}
第二步:再在ATM类中,写一个生成卡号的功能
1.先随机产生8个[0,9]范围内的随机数,拼接成一个字符串
2.然后再调用getAccountByCardld方法,判断这个卡号字符串是否存在
3.判断生成的卡号是否存在
- 如果生成的卡号不存在,说明生成的卡号是有效的,把卡号返回
- 如果生成的卡号存在,说明生成的卡号无效,循环继续生产卡号
/** 返回一个8位 数字的卡号,而且这个卡号不能与其他账户的卡号重复 */
private String createCardId(){
while (true) {
// 1、定义一个String类型的变量记住8位数字作为一个卡号
String cardId = "";
// 2、使用循环,循环8次,每次产生一个随机数给cardId连接起来
Random r = new Random();
for (int i = 0; i < 8; i++) {
int data = r.nextInt(10); // 0 - 9
cardId += data;
}
// 3、判断cardId中记住的卡号,是否与其他账户的卡号重复了,没有重复,才可以做为一个新
卡号返回。
Account acc = getAccountByCardId(cardId);
if(acc == null){
// 说明cardId没有找到账户对象,因此cardId没有与其他账户的卡号重复,可以返回它做
为一个新卡号
return cardId;
}
}
}
五、登录功能
1.判断系统中是否存在账户对象,存在才能登录,如果不存在,我们直接结束登录操作
2.输入登录的卡号,并判断卡号是否存在
3.如果卡号不存在,直接给出提示
4.如果卡号存在,接着输入用户密码,并判断密码是否正确
5.如果密码也正确,则登录成功,并且记录当前的登录账户
private Account loginAcc; // 记住登录后的用户账户
/** 完成用户的登录操作 */
private void login(){
System.out.println("==系统登录==");
// 1、判断系统中是否存在账户对象,存在才能登录,如果不存在,我们直接结束登录操作
if(accounts.size() == 0){
System.out.println("当前系统中无任何账户,请先开户再来登录~~");
return; // 跳出登录操作。
}
// 2、系统中存在账户对象,可以开始进行登录操作了
while (true) {
System.out.println("请您输入您的登录卡号:");
String cardId = sc.next();
// 3、判断这个卡号是否存在啊?
Account acc = getAccountByCardId(cardId);
if(acc == null){
// 说明这个卡号不存在。
System.out.println("您输入的登录卡号不存在,请确认~~");
}else {
各位同学,在上面我们编写的欢迎界面,只是打印了进入了某某功能,但是没有调用对应的功能方法。
接下来我们调用对应的功能方法来实现对应的需求。
while (true) {
// 卡号存在了,接着让用户输入密码
System.out.println("请您输入登录密码:");
String passWord = sc.next();
// 4、判断密码是否正确
if(acc.getPassWord().equals(passWord)){
loginAcc = acc;
// 密码正确了,登录成功了
System.out.println("恭喜您," + acc.getUserName() + "成功登录了
系统,您的卡号是:" + acc.getCardId());
//TODO 把展示登录界面的功能写成一个方法,写好了再回来调用。
return; // 跳出并结束当前登录方法
}else {
System.out.println("您输入的密码不正确,请确认~~");
}
}
}
}
}
/**启动ATM系统 展示欢迎界面 */
public void start(){
while (true) {
System.out.println("===欢迎您进入到了ATM系统===");
System.out.println("1、用户登录");
System.out.println("2、用户开户");
System.out.println("请选择:");
int command = sc.nextInt();
switch (command){
case 1:
// 用户登录
this.login();
break;
case 2:
// 用户开户
this.createAccount();
break;
default:
System.out.println("没有该操作~~");
}
}
}
1万+

被折叠的 条评论
为什么被折叠?



