1、账户类与首页设计
系统准备分析:
- 每个用户的账号信息都是一个对象,需要提供账户类。
- 需要准备一个容器,用于存储系统全部账号对象信息。
- 首页只需包含:登录、注册2个功能。
实现步骤:
- 定义账户类,用于后期创建用户对象封装用户的账户信息
- 用户类中的信息至少需要包含(卡号、姓名、密码、余额、取现额度)
- 需要准备一个ArrayList的集合,用户存储系统用户的账号对象
- 需要展示欢迎页面包含2个功能:开户和登录
账户类:
/*
账户类
*/
public class Account {
/*
成员变量私有
*/
private String cardNumber;//卡号
private String userName;//姓名
private String passWord;//密码
private double money;//余额
private double quotaMoney;//取现额度
public String getCardNumber() {
return cardNumber;
}
public void setCardNumber(String cardNumber) {
this.cardNumber = cardNumber;
}
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 double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
public double getQuotaMoney() {
return quotaMoney;
}
public void setQuotaMoney(double quotaMoney) {
this.quotaMoney = quotaMoney;
}
}
首页设计:
/*
首页设计
*/
public static void main(String[] args) {
//1、定义账户类,用于后期创建账户对象封装用户的账户信息
//2、定义一个集合,存储系统用户的账户对象
ArrayList<Account> accounts = new ArrayList<>();
//3、登录和注册功能
Scanner sc = new Scanner(System.in);
System.out.println("--------欢迎来到ATM系统--------");
while (true){
System.out.println("1、用户登录:");
System.out.println("2、用户注册:");
System.out.println("请您选择操作1/2:");
int operation = sc.nextInt();//operation:操作
switch (operation){
case 1:
//定义一个用户登录的方法
logIN(accounts,sc);
break;
case 2:
//定义一个用户注册的方法(alt加回车自动生成方法。)
signIn(accounts,sc);
break;
default:
System.out.println("对不起,您输入的操作命令有误,请重新输入-");
}
}
}
2、用户注册功能实现
分析:
- 开户功能其实就是往系统集合容器中存入一个新的账户对象信息
实现步骤:
- 定义一个注册的方法:signIn:private static void signIn(ArrayList<Account> accounts, Scanner sc)
- 键盘录入姓名、密码、确认密码(密码要保持一致)
- 生成账户卡号,卡号必须由系统自动生成8位数字(保证卡号的唯一性)
- 创建Account账户类对象用于封装账户信息(姓名、密码、卡号)
- 把Account账户类对象存入到集合accounts中去
/**
* 用户注册的方法
* @param accounts 接收的账户集合
* @param sc
*/
private static void signIn(ArrayList<Account> accounts, Scanner sc) {
System.out.println("--------欢迎进入ATM注册界面--------");
Account account = new Account();//新建一个账户
System.out.println("请您输入您的姓名:");
account.setUserName(sc.next());
while (true){
System.out.println("请您输入您的密码:");
String passWord = sc.next();
System.out.println("请您再次确认密码:");
String okPassWord = sc.next();
if (passWord.equals(okPassWord)){
account.setPassWord(okPassWord);//两次密码一样了,把密码加到账户中去
break;
}else{
System.out.println("您输入的两次密码不一致,请重新输入。");
}
}
System.out.println("请您设置当日取现额度:");
account.setQuotaMoney(sc.nextDouble());
//为账户随机一个8位且与其他账户的卡号不重复的号码。(独立功能,独立成方法)。
String cardNumber = getRandomCardNumber(accounts);
account.setCardNumber(cardNumber);
accounts.add(account);//把这个对象放到集合里去
System.out.println("恭喜您," + account.getUserName() + "先生/女士,您开户成功,你的卡号是:" + cardNumber + ",请你妥善保管卡号!");
}
/**
*随机生成一个8位号码方法
* @param accounts
* @return
*/
private static String getRandomCardNumber(ArrayList<Account> accounts) {
Random r = new Random();
while (true) {
//1、生成八位数字
String cardNumber = "";
for (int i = 0; i < 8; i++) {
cardNumber += r.nextInt(10);
}
//2、判断这8位数字有没有跟账户类集合里的卡名重复
//根据这个卡号,去查询账户对象
Account account = getAccountByCardNumber(cardNumber, accounts);
if (account == null) {
//说明卡号没有重复,说明这个卡号能使用,把这个卡号返回
return cardNumber;
}
}
}
/**
*根据卡号查出一个账户对象出来
* @param cardNumber 卡号
* @param accounts 全部账户的集合
* @return
*/
private static Account getAccountByCardNumber(String cardNumber,ArrayList<Account> accounts){
for (int i = 0; i < accounts.size(); i++) {
Account account = accounts.get(i);
if (account.getCardNumber().equals(cardNumber)){
return account;
}
}
return null;//代表查无此账号
}
3、用户登录功能实现
分析:
- 定义登录方法:private static void logIN(ArrayList<Account> accounts, Scanner sc)
- 让用户键盘录入卡号,根据卡号查询账户对象
- 如果没有找到账户对象,说明卡号不存在,提示继续输入卡号
- 如果找到了账户对象,说明卡号存在,继续输入密码
- 如果密码不正确,提示继续输入密码
- 如果密码正确,提示登录成功。
/**
* 用户登录的方法
* @param accounts 全部账户对象的集合
* @param sc 扫描器
*/
private static void logIN(ArrayList<Account> accounts, Scanner sc) {
System.out.println("----------欢迎您进入ATM系统登录界面----------");
//1、判断系统中有没有账户
if (accounts.size() > 0 ){
//1、进入登陆界面
while (true){
System.out.println("请输入您的卡号:");
String userCardNumber = sc.next();
//判断卡号是否存在
Account account = getAccountByCardNumber(userCardNumber,accounts);
if (account != null){//说明卡号存在
while (true) {
System.out.println("请输入您的密码:");
String UserPassWord = sc.next();
//判断密码正不正确。
if (account.getPassWord().equals(UserPassWord)){
System.out.println("欢迎您:" + account.getUserName() + "先生/女士。" +"您的卡号为:"+ account.getCardNumber());
//进入操作页面:查询。。。存款等等。。。。(方法)
operationInterface(account,accounts,sc);
return; // 干掉登录方法
}else{
System.out.println("您输入的密码不正确,请重新输入");
}
}
}else{
System.out.println("您输入的卡号不存在,请重新输入");
}
}
}else{
System.out.println("系统里还没有账户,先去注册账户吧");
}
}
4、用户操作页面设计、查询账户、退出账户功能实现
需求分析:
- 用户登录成功之后,需要进入用户操作界面
- 查询就是直接展示当前登录成功的账户对象信息
- 退出账户是需要回到首页
/**
* 用户操作页面
* @param account 现在登录的这个账户
* @param accounts
* @param sc
*/
private static void operationInterface(Account account, ArrayList<Account> accounts, Scanner sc) {
System.out.println("--------欢迎您进入银行ATM用户操作界面--------");
while (true){
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 operation = sc.nextInt();
switch (operation){
case 1:
queryAccount(account);
break;
case 2:
depositMoney(account,sc);
break;
case 3:
drawMoney(account,sc);
break;
case 4:
transferAccounts(accounts,account,sc);
break;
case 5:
changePassword(account,sc);
return;//退出这个方法,回到登录界面去(因为改了密码,需要重新登录)
case 6:
System.out.println("退出成功,欢迎下次光临!");
return;//退出这个方法了,干掉用户登陆后操作页,回到首页
case 7:
unsubscribe(accounts,account,sc);
return;//退出这个方法了,干掉用户登陆后操作页,回到首页
default:
System.out.println("对不起,您输入的操作有误,请重新输入。");
}
}
}
/**
* 1、查询功能
* @param account 当前账户对象
*/
private static void queryAccount(Account account) {
System.out.println("欢迎您进入ATM用户详情界面");
System.out.println("您的账户信息如下:");
System.out.println("卡号:" + account.getCardNumber());
System.out.println("姓名:" + account.getUserName());
System.out.println("余额:" + account.getMoney());
System.out.println("当次取现额度:" + account.getQuotaMoney());
}
}
5、用户存取钱
存钱分析:
- 存钱就是拿到当前账户对象。
- 然后用户输入存款的金额。
- 调用用户对象的setMoney方法将账户余额修改成存钱后的余额。
/**
* 2、存款
* @param account 当前账户对象
* @param sc 扫描器
*/
private static void depositMoney(Account account,Scanner sc) {
System.out.println("欢迎您进入ATM用户存款界面");
System.out.println("请你输入存款的金额:");
double money = sc.nextDouble();
account.setMoney(account.getMoney()+money);
System.out.println("恭喜您,存款成功!您的账户信息如下:");
queryAccount(account);
}
取钱分析:
- 取款需要先判断账户是否有钱
- 有钱则拿到自己账户对象
- 然后让用户输入取款金额
- 判断取款金额是否超出当日限额,以及余额是否足够
- 满足要求则调用账户对象的setMoney方法完成金额修改
/**
* 3、取款
* @param account 当前账户对象
* @param sc
*/
private static void drawMoney(Account account, Scanner sc) {
System.out.println("欢迎您进入ATM用户取款界面");
//先判断账户是否有100元,不足100元不能进行取款
if (account.getMoney() < 100){
System.out.println("对不起,您的账户余额不足100元,先去存钱吧!");
return;//退出取款的方法,回到了用户操作界面
}
//进行取款
while (true){
System.out.println("请您输入取款的金额:");
double drawMoney = sc.nextDouble();
if (drawMoney > account.getQuotaMoney()){
System.out.println("对不起,您的取款金额超出取现额度。您的取款额度为:" + account.getQuotaMoney());
}else{
//满足取款额度的条件,再判断余额是否够
if (drawMoney>account.getMoney()){
System.out.println("对不起,您的余额不足。");
}else{
account.setMoney(account.getMoney()-drawMoney);
System.out.println("取款成功!您账户还有" + account.getMoney() + "多钱。");
return;//取钱结束,要退出这个方法
}
}
}
}
6、转账功能
需求分析:
- 转账功能需要判断系统中是否由2个账户对象及以上
- 同时还要判断自己账户是否有钱
- 接下来需要输入对方卡号,判断对方账户是否存在
- 对方账户存在还需要认证对方户主的姓氏
- 满足要求则可以把自己账户对象的金额修改到对方的账户对象上
/**
* 4、转账
* @param accounts 全部账户集合
* @param account 自己的账户对象
* @param sc
*/
private static void transferAccounts(ArrayList<Account> accounts, Account account, Scanner sc) {
System.out.println("欢迎您进入ATM用户转账界面");
//1、判断系统里是否有两个账户对象及以上
if (accounts.size() < 2) {
System.out.println("当前系统的账户不足2个,不能转账!");
return;//退出这个转账方法
}
//2、判断自己账户是否有钱(如果自己账户0块钱,就不要转账了)
if (account.getMoney()<0){
System.out.println("您自己账户都没钱了,就别转帐了!");
return;//退出这个转账方法
}
//3、开始转账
while (true){
//输入对方的卡号,判断是不是跟自己的一样,再判断账户是否存在
System.out.println("输入对方的卡号:");
String cardNumber = sc.next();
//这个卡号不能是自己的
if (cardNumber.equals(account.getCardNumber())){
System.out.println("您不可以给自己转账哦!");
continue;
}
//判断这个卡号是否存在
Account account1 = getAccountByCardNumber(cardNumber,accounts);
if (account1 != null){//说明这个卡号存在
//首先认证他的姓氏:
String str = "*" + account1.getUserName().substring(1);
System.out.println("请输入对方的姓氏确定" + str);
String lastName = sc. next();
//判断输入的姓氏对不对
if (account1.getUserName().startsWith(lastName)){//startsWith方法:判断姓名字符串的是不是以lastName字符开始
//可以进行转钱了。
while (true){
System.out.println("请你输入转账的金额:");
double transferAccountsMoney = sc.nextDouble();
//判断有没有这么多钱可以转
if (transferAccountsMoney>account.getMoney()){
System.out.println("您的账户没有那么多钱可以转账,您账户还有:" + account.getMoney());
}else{
//开始转账
account.setMoney(account.getMoney()-transferAccountsMoney);//转出
account1.setMoney(account1.getMoney()+transferAccountsMoney);//转入
System.out.println("转账成功,您的账户还有:" + account.getMoney());
return;
}
}
}
}else{
System.out.println("您输入的卡号不存在。");
}
}
}
7、用户修改密码和注销账户
/**
*5、修改密码
* @param account 当前登陆的账户对象
* @param sc
*/
private static void changePassword(Account account, Scanner sc) {
System.out.println("欢迎您进入ATM用户修改密码界面");
while (true){
System.out.println("请您输入当前的密码:");
String passWord = sc.next();
//判断当前密码是否正确
if (passWord.equals(account.getPassWord())){
while (true){
System.out.println("请输入您要修改的密码:");
String newPassWord = sc.next();
System.out.println("请再次输入您要修改的密码:");
String okNewPassWord = sc.next();
//判断两次输入的密码一样吗?
if (newPassWord.equals(okNewPassWord)){
account.setPassWord(okNewPassWord);//新密码赋给set方法
System.out.println("恭喜您修改密码成功!请重新登陆");
return;//退出修改密码方法
}else{
System.out.println("对不起,您输入的两次密码不一致,请重新输入。");
}
}
}else{
System.out.println("您好,密码输入错误,请重新输入。");
}
}
}
/**
* 7、销户
* @param accounts
* @param account
* @param sc
*/
private static void unsubscribe(ArrayList<Account>accounts,Account account, Scanner sc) {
System.out.println("欢迎您进入ATM用户销户界面");
System.out.println("您真的要销户吗?y/f");
String rs = sc.next();
switch (rs){
case "y":
if (account.getMoney()>0){
System.out.println("对不起,您的账户还有钱,不允许销户。");
}else{
accounts.remove(account);//从集合里直接删除account元素
System.out.println("您的账户已销户。");
return;
}
break;
default:
System.out.println("您的账户保留了。");
}
}