目录
技术点分析
面向对象编程:
每个用户账户都是一个对象:所以需要设计账户类Account用于创建账户对象封装账户信息
使用集合容器:
系统需要提供一个容器用于存储这些账户对象的信息,选择用ArrayList集合
程序流程控制:
结合分支、循环、跳转关键词等相关操作控制程序的业务逻辑
使用常见的API:
登录信息比较,业务数据的分析,处理等都需要用到String等常用API解决
系统准备、首页设计
package com.deng.hello;
/*账户类
* */
public class Account {
private String carId;//卡号
private String userName;//账户
private String passWord;//密码
private double money;//余额
private double quotaMoney;//取款额度
public Account() {
}
public Account(String carId, String userName, String passWord, double quotaMoney) {
this.carId = carId;
this.userName = userName;
this.passWord = passWord;
this.money = money;
this.quotaMoney = quotaMoney;
}
public String getCarId() {
return carId;
}
public void setCarId(String carId) {
this.carId = carId;
}
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;
}
}
准备内容分析:
每个用户的账户信息都是一个对象,需要提供账户类
需要准备一个容器,用于存储系统全部账户对象信息
首页只需包含:登录和注册两个功能
实现步骤:
定义账户类,用于后期创建账户对象封装用户的账户信息
账户类中的信息至少需要包含(卡号、姓名、密码、余额、取款额度)
需要准备一个ArrayList的集合,用于存储系统用户的账户对象
需要展示首页包含的2个功能:开户功能、登录账户
用户首页功能的实现
import java.util.ArrayList;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
//准备账户信息存储的对象集合
ArrayList<Account> accounts = new ArrayList<>();
//首页功能实现
showMain(accounts);
}
public static void showMain(ArrayList<Account> accounts) {
System.out.println("============欢迎进入首页=============");
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("请输入您要进行的操作:");
System.out.println("1、登录");
System.out.println("2、开户");
System.out.println("请输入您的指令:");
int command = sc.nextInt();
switch (command){
case 1:
//登录
break;
case 2:
//开户
break;
default:
System.out.println("您输入的指令有误!");
break;
}
}
}
}
用户开户功能的实现
用户开户功能的实现
定义方法完成开户
键盘录入姓名、密码、确认密码(保证两次密码一致)
生成账户卡号,卡号必须由系统自动生成8位数字(必须保证卡号是唯一的)
创建Account账户类对象用于封装账户信息(姓名、密码、卡号等)
吧Account账户类对象存入集合accounts中
/**
* 开户功能实现
*
* @param accounts
* @param sc
*/
public static void register(ArrayList<Account> accounts, Scanner sc) {
System.out.println("=============用户开户功能=============");
String password;
System.out.println("请输入您的开户名:");
String name = sc.next();
while (true) {
System.out.println("请输入您的开户密码:");
password = sc.next();
System.out.println("请再次确认您的密码:");
if (password.equals(sc.next())) {
break;
} else {
System.out.println("两次输入的密码不一致!");
}
}
//系统生成用户卡号,8位数字,账户id唯一
String Id = createCarId(accounts);
System.out.println("请您输入单次取款额度:");
double quotaMoney = sc.nextDouble();
//将用户的信息封装成对象放进集合
//Account(String carId, String userName, String passWord, double quotaMoney)
accounts.add(new Account(Id, name, password, quotaMoney));
System.out.println("恭喜您开户成功!您的卡号是:" + Id);
}
用户登录功能实现
用户登录功能实现
定义方法
让用户键盘输入卡号,根据卡号查询账户对象
如果没有找到账户对象,说明卡号不存在,提示继续输入卡号
如果找到账户对象,说明卡号存在,继续输入密码
如果密码不正确,提示继续输入密码
如果密码正确,提示登录成功
/**
* 登录功能的实现
*
* @param accounts
* @param sc
*/
public static void login(ArrayList<Account> accounts, Scanner sc) {
System.out.println("============登录页面=============");
//先判断系统中是否有账户的存在
if (accounts.size()==0){
System.out.println("当前系统不存在账户,请先注册一个吧~~~");
return;//直接结束方法
}
while (true) {
System.out.println("请输入卡号:");
String Id = sc.next();
Account account = getAccountByCarId(accounts, Id);//查询卡号,返回账户对象
//判断卡号是否正确
if (account!=null){
//判断密码是否正确
while (true) {
System.out.println("请输入密码:");
if (account.getPassWord().equals(sc.next())){
System.out.println("登录成功!");
}
else {
System.out.println("密码错误!");
}
}
}
else {
System.out.println("当前卡号不存在!");
}
}
}
用户操作页设计、查询账户、退出账户等功能
用户操作页设计、查询账户、退出账户等功能
用户登录成功后,需要进入用户操作页
查询就是直接展示当前登录成功的账户对象信息
退出账户是需要返回首页的
功能页面
1、查询
2、存款
3、取款
4、转账
5、修改密码
6、退出
7、销户
package com.deng.hello;
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
//准备账户信息存储的对象集合
ArrayList<Account> accounts = new ArrayList<>();
//首页功能实现
showMain(accounts);
}
public static void showMain(ArrayList<Account> accounts) {
System.out.println("============欢迎进入首页=============");
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("请输入您要进行的操作:");
System.out.println("1、登录");
System.out.println("2、开户");
System.out.println("请输入您的指令:");
int command = sc.nextInt();
switch (command) {
case 1:
//登录
login(accounts, sc);
break;
case 2:
//开户
register(accounts, sc);
break;
default:
System.out.println("您输入的指令有误!");
break;
}
}
}
/**
* 登录功能的实现
*
* @param accounts
* @param sc
*/
public static void login(ArrayList<Account> accounts, Scanner sc) {
System.out.println("============登录页面=============");
//先判断系统中是否有账户的存在
if (accounts.size() == 0) {
System.out.println("当前系统不存在账户,请先注册一个吧~~~");
return;//直接结束方法
}
while (true) {
System.out.println("请输入卡号:");
String Id = sc.next();
Account account = getAccountByCarId(accounts, Id);//查询卡号,返回账户对象
//判断卡号是否正确
if (account != null) {
//判断密码是否正确
while (true) {
System.out.println("请输入密码:");
if (account.getPassWord().equals(sc.next())) {
System.out.println("登录成功!");
//展示操作页面
showUserCommand(account, sc);//account是当前的账户对象
return;//继续结束方法
} else {
System.out.println("密码错误!");
}
}
} else {
System.out.println("当前卡号不存在!");
}
}
}
/**
* 功能页展示
*
* @param account
*/
public static void showUserCommand(Account account, Scanner sc) {
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();
switch (command) {
case 1:
//查询
showAccount(account);
break;
case 2:
//存款
break;
case 3:
//取款
break;
case 4:
//转账
break;
case 5:
//修改密码
break;
case 6:
//退出
System.out.println("欢迎下次光临~~~");
return;//结束方法
case 7:
//销户
break;
}
}
}
/**
* 查询当前账户
*
* @param account
*/
private static void showAccount(Account account) {
System.out.println("=============当前账户信息============");
System.out.println("账户名称:" + account.getUserName());
System.out.println("卡号:" + account.getCarId());
System.out.println("余额:" + account.getMoney());
System.out.println("取款额度:" + account.getQuotaMoney());
}
/**
* 开户功能实现
*
* @param accounts
* @param sc
*/
public static void register(ArrayList<Account> accounts, Scanner sc) {
System.out.println("=============用户开户功能=============");
String password;
System.out.println("请输入您的开户名:");
String name = sc.next();
while (true) {
System.out.println("请输入您的开户密码:");
password = sc.next();
System.out.println("请再次确认您的密码:");
if (password.equals(sc.next())) {
break;
} else {
System.out.println("两次输入的密码不一致!");
}
}
//系统生成用户卡号,8位数字,账户id唯一
String Id = createCarId(accounts);
System.out.println("请您输入单次取款额度:");
double quotaMoney = sc.nextDouble();
//将用户的信息封装成对象放进集合
//Account(String carId, String userName, String passWord, double quotaMoney)
accounts.add(new Account(Id, name, password, quotaMoney));
System.out.println("恭喜您开户成功!您的卡号是:" + Id);
}
/**
* 系统生成用户卡号
*
* @param accounts
*/
public static String createCarId(ArrayList<Account> accounts) {
Random r = new Random();
while (true) {
String numCar = "";
//随机生成8位数字卡号
for (int i = 0; i < 8; i++) {
int num = r.nextInt(10);
numCar += num;
}
//判断卡号是否唯一
Account account = getAccountByCarId(accounts, numCar);
if (account == null) {
//证明卡号不重复
return numCar;
}
}
}
/**
* 根据卡号查询账户对象
*
* @param accounts
* @param numCar
*/
public static Account getAccountByCarId(ArrayList<Account> accounts, String numCar) {
for (int i = 0; i < accounts.size(); i++) {
if (accounts.get(i).getCarId().equals(numCar)) {
return accounts.get(i);
}
}
return null;
}
}
用户存款功能实现
存款就是拿当前的账户对象
然后让用户输入存款金额
调用setMoney方法将账户余额修改:当前账户对象.setMoney(存款金额)+ 余额
存钱后查询一下账户信息,确认是否存钱成功
/**
* 存款功能实现
* @param sc
* @param account
*/
public static void depositMoney(Scanner sc,Account account) {
System.out.println("===============存款功能=================");
System.out.println("请输入您要存款的金额:");
double money = sc.nextDouble();
//需要修改账户余额
account.setMoney(account.getMoney()+money);
//查询账户信息,确认是否存款成功
showAccount(account);
}
用户取款功能实现
取款先判断账户是否有钱
有钱则拿到自己的账户对象
然后让用户输入取款金额
判断取款是否超过取款额度,以及余额是否足够
满足要求则修改取款后的账户余额
/**
* 取款功能的实现
*
* @param account
* @param sc
*/
public static void drawMoney(Account account, Scanner sc) {
System.out.println("==========取款页面============");
if (account.getMoney() < 100) {
System.out.println("当前余额不足100元,取不了钱!");
}
else {
while (true) {
System.out.println("请输入需要取款的金额:");
double money = sc.nextDouble();
//余额够不够
if (money > account.getMoney()) {
System.out.println("当前余额不足!");
}
//有没有超过取款额度
else {
if (money > account.getQuotaMoney()) {
System.out.println("您取款的" + money + "超过了取款额度" + account.getQuotaMoney());
}
else {
System.out.println("取款成功!");
account.setMoney(account.getMoney()-money);
System.out.println("取款成功!"+"账户剩余:"+account.getMoney());
break;
}
}
}
}
}
用户转账功能实现
转账功能需要判断系统中是否有2个账户对象及以上
判断自己的账户是否有钱
输入对方卡号,判断账户是否存在
验证对方账户是否是自己要转账的账户(姓氏验证)
满足以上要求则进行转账,修改当前账户金额和对方账户金额
/**
* 转账功能的实现
*
* @param accounts
* @param account
* @param sc
*/
public static void transferMoney(ArrayList<Account> accounts, Account account, Scanner sc) {
//先判断系统是否存在不少于两个的账户对象
System.out.println("===============转账页面=================");
if (accounts.size() < 2) {
System.out.println("对不起,系统中没有其他账户,不可以转账!");
return;
}
//判断自己的账户是否有钱
if (account.getMoney() == 0) {
System.out.println("对不起,你的账户没钱,不能进行转账!");
return;
}
//开始转账
while (true) {
System.out.println("请输入您要转账给对方的卡号:");
String Id = sc.next();
Account account1 = getAccountByCarId(accounts, Id);//获取转账卡号的账户对象
//判断此账户是否存在
if (account1 != null) {
//账户存在
//不能转账给自己
if (account.getCarId() == account1.getCarId()) {
System.out.println("对不起,您不能转账给自己!");
} else {
//对方账户确认
String name = "*" + account1.getUserName().substring(1);
System.out.println("请输入[" +name+"]的姓氏:");
String preName = sc.next();
//判断开始的姓氏是否一样
if (account1.getUserName().startsWith(preName)){
System.out.println("请输入您要转账的金额:");
double money = sc.nextDouble();
//判断余额是否足够进行转账
if (money > account.getMoney()) {
System.out.println("当前账户余额不足,转账失败!您最多可以转"+account.getMoney()+"元!");
} else {
account.setMoney(account.getMoney()-money);
account1.setMoney(account1.getMoney()+money);
System.out.println("恭喜您成功转账"+money+"元给["+account1.getUserName()+"]账户");
showAccount(account);//查看当前账户信息
return;
}
}
else {
System.out.println("对不起,验证失败!");
}
}
} else {
System.out.println("对不起,您输入的卡号有误!");
}
}
}
用户修改密码和销户功能实现
修改密码就是把当前对象的密码使用set方法进行更新
修改完密码后退回首页
销户就是从集合中删除当前对象并返回首页
/**
* 修改密码功能的实现
* @param account
* @param sc
*/
public static void updatePassWord(Account account, Scanner sc) {
System.out.println("===============修改密码=================");
while (true) {
System.out.println("请输入正确的密码:");
String okPassword = sc.next();
//判断密码是否正确
if (okPassword.equals(account.getPassWord())){
while (true) {
System.out.println("请输入新的密码:");
String newPassword = sc.next();
System.out.println("请再次输入新的密码:");
if (newPassword.equals(sc.next())){
account.setPassWord(newPassword);//修改密码
System.out.println("密码修改成功!");
return;//退出方法
}else {
System.out.println("两次输入的密码不一致!");
}
}
}else {
System.out.println("当前输入的密码不正确!");
}
}
}
完整代码
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
//准备账户信息存储的对象集合
ArrayList<Account> accounts = new ArrayList<>();
//首页功能实现
showMain(accounts);
}
/**
* 首页功能实现
*
* @param accounts
*/
public static void showMain(ArrayList<Account> accounts) {
System.out.println("============欢迎进入首页=============");
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("请输入您要进行的操作:");
System.out.println("1、登录");
System.out.println("2、开户");
System.out.println("请输入您的指令:");
int command = sc.nextInt();
switch (command) {
case 1:
//登录
login(accounts, sc);
break;
case 2:
//开户
register(accounts, sc);
break;
default:
System.out.println("您输入的指令有误!");
break;
}
}
}
/**
* 登录功能的实现
*
* @param accounts
* @param sc
*/
public static void login(ArrayList<Account> accounts, Scanner sc) {
System.out.println("============登录页面=============");
//先判断系统中是否有账户的存在
if (accounts.size() == 0) {
System.out.println("当前系统不存在账户,请先注册一个吧~~~");
return;//直接结束方法
}
while (true) {
System.out.println("请输入卡号:");
String Id = sc.next();
Account account = getAccountByCarId(accounts, Id);//查询卡号,返回账户对象
//判断卡号是否正确
if (account != null) {
//判断密码是否正确
while (true) {
System.out.println("请输入密码:");
if (account.getPassWord().equals(sc.next())) {
System.out.println("登录成功!");
//展示操作页面
showUserCommand(accounts, account, sc);//account是当前的账户对象
return;//继续结束方法
} else {
System.out.println("密码错误!");
}
}
} else {
System.out.println("当前卡号不存在!");
}
}
}
/**
* 功能页展示
*
* @param account
*/
public static void showUserCommand(ArrayList<Account> accounts, Account account, Scanner sc) {
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();
switch (command) {
case 1:
//查询
showAccount(account);
break;
case 2:
//存款
depositMoney(sc, account);
break;
case 3:
//取款
drawMoney(account, sc);
break;
case 4:
transferMoney(accounts, account, sc);
//转账
break;
case 5:
//修改密码
updatePassWord(account, sc);
return;//结束方法
case 6:
//退出
System.out.println("欢迎下次光临~~~");
return;//结束方法
case 7:
//销户
//抹去当前的账户对象
accounts.remove(account);
System.out.println("销户成功!");
return;
}
}
}
/**
* 修改密码功能的实现
*
* @param account
* @param sc
*/
public static void updatePassWord(Account account, Scanner sc) {
System.out.println("===============修改密码=================");
while (true) {
System.out.println("请输入正确的密码:");
String okPassword = sc.next();
//判断密码是否正确
if (okPassword.equals(account.getPassWord())) {
while (true) {
System.out.println("请输入新的密码:");
String newPassword = sc.next();
System.out.println("请再次输入新的密码:");
if (newPassword.equals(sc.next())) {
account.setPassWord(newPassword);//修改密码
System.out.println("密码修改成功!");
return;//退出方法
} else {
System.out.println("两次输入的密码不一致!");
}
}
} else {
System.out.println("当前输入的密码不正确!");
}
}
}
/**
* 转账功能的实现
*
* @param accounts
* @param account
* @param sc
*/
public static void transferMoney(ArrayList<Account> accounts, Account account, Scanner sc) {
//先判断系统是否存在不少于两个的账户对象
System.out.println("===============转账页面=================");
if (accounts.size() < 2) {
System.out.println("对不起,系统中没有其他账户,不可以转账!");
return;
}
//判断自己的账户是否有钱
if (account.getMoney() == 0) {
System.out.println("对不起,你的账户没钱,不能进行转账!");
return;
}
//开始转账
while (true) {
System.out.println("请输入您要转账给对方的卡号:");
String Id = sc.next();
Account account1 = getAccountByCarId(accounts, Id);//获取转账卡号的账户对象
//判断此账户是否存在
if (account1 != null) {
//账户存在
//不能转账给自己
if (account.getCarId() == account1.getCarId()) {
System.out.println("对不起,您不能转账给自己!");
} else {
//对方账户确认
String name = "*" + account1.getUserName().substring(1);
System.out.println("请输入[" + name + "]的姓氏:");
String preName = sc.next();
//判断开始的姓氏是否一样
if (account1.getUserName().startsWith(preName)) {
System.out.println("请输入您要转账的金额:");
double money = sc.nextDouble();
//判断余额是否足够进行转账
if (money > account.getMoney()) {
System.out.println("当前账户余额不足,转账失败!您最多可以转" + account.getMoney() + "元!");
} else {
account.setMoney(account.getMoney() - money);
account1.setMoney(account1.getMoney() + money);
System.out.println("恭喜您成功转账" + money + "元给[" + account1.getUserName() + "]账户");
showAccount(account);//查看当前账户信息
return;
}
} else {
System.out.println("对不起,验证失败!");
}
}
} else {
System.out.println("对不起,您输入的卡号有误!");
}
}
}
/**
* 取款功能的实现
*
* @param account
* @param sc
*/
public static void drawMoney(Account account, Scanner sc) {
System.out.println("==========取款页面============");
if (account.getMoney() < 100) {
System.out.println("当前余额不足100元,取不了钱!");
} else {
while (true) {
System.out.println("请输入需要取款的金额:");
double money = sc.nextDouble();
//余额够不够
if (money > account.getMoney()) {
System.out.println("当前余额不足!");
}
//有没有超过取款额度
else {
if (money > account.getQuotaMoney()) {
System.out.println("您取款的" + money + "超过了取款额度" + account.getQuotaMoney());
} else {
System.out.println("取款成功!");
account.setMoney(account.getMoney() - money);
System.out.println("取款成功!" + "账户剩余:" + account.getMoney());
break;
}
}
}
}
}
/**
* 存款功能实现
*
* @param sc
* @param account
*/
public static void depositMoney(Scanner sc, Account account) {
System.out.println("===============存款页面=================");
System.out.println("请输入您要存款的金额:");
double money = sc.nextDouble();
//需要修改账户余额
account.setMoney(account.getMoney() + money);
//查询账户信息,确认是否存款成功
showAccount(account);
}
/**
* 查询当前账户
*
* @param account
*/
private static void showAccount(Account account) {
System.out.println("=============当前账户信息============");
System.out.println("账户名称:" + account.getUserName());
System.out.println("卡号:" + account.getCarId());
System.out.println("余额:" + account.getMoney());
System.out.println("取款额度:" + account.getQuotaMoney());
}
/**
* 开户功能实现
*
* @param accounts
* @param sc
*/
public static void register(ArrayList<Account> accounts, Scanner sc) {
System.out.println("=============用户开户功能=============");
String password;
System.out.println("请输入您的开户名:");
String name = sc.next();
while (true) {
System.out.println("请输入您的开户密码:");
password = sc.next();
System.out.println("请再次确认您的密码:");
if (password.equals(sc.next())) {
break;
} else {
System.out.println("两次输入的密码不一致!");
}
}
//系统生成用户卡号,8位数字,账户id唯一
String Id = createCarId(accounts);
System.out.println("请您输入单次取款额度:");
double quotaMoney = sc.nextDouble();
//将用户的信息封装成对象放进集合
//Account(String carId, String userName, String passWord, double quotaMoney)
accounts.add(new Account(Id, name, password, quotaMoney));
System.out.println("恭喜您开户成功!您的卡号是:" + Id);
}
/**
* 系统生成用户卡号
*
* @param accounts
*/
public static String createCarId(ArrayList<Account> accounts) {
Random r = new Random();
while (true) {
String numCar = "";
//随机生成8位数字卡号
for (int i = 0; i < 8; i++) {
int num = r.nextInt(10);
numCar += num;
}
//判断卡号是否唯一
Account account = getAccountByCarId(accounts, numCar);//根据卡号查询账户对象
//如果账户对象不为空则证明系统已经存在该卡号了,需要重新生成随机卡号
if (account == null) {
//账户对象为证明卡号不存在系统,是唯一的卡号,返回系统随机生成的卡号
return numCar;
}
}
}
/**
* 根据卡号查询账户对象
*
* @param accounts
* @param numCar
*/
public static Account getAccountByCarId(ArrayList<Account> accounts, String numCar) {
for (int i = 0; i < accounts.size(); i++) {
if (accounts.get(i).getCarId().equals(numCar)) {
return accounts.get(i);
}
}
return null;
}
}