第十六天,综合之前的内容,做一个练习
18周 JAVA从入门到入土
一、练习
制作一个银行的管理页面,可以转账并生成交易记录:
package com.bank.entity;
public class User {
private String uuid;
private String mobile;
private String password;
private String cardno = "0-0-0-0";
private String identity;
private String name;
private double balance;
public User(String mobile, String password, String name) {
super();
this.mobile = mobile;
this.password = password;
this.name = name;
}
public User(String str) {
this(str.split("-")[0], str.split("-")[1], str.split("-")[2]);
}
public String getUuid() {
return uuid;
}
public void setUuid(String uuid) {
this.uuid = uuid;
}
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getCardno() {
return cardno;
}
public void setCardno(String cardno) {
this.cardno = cardno;
}
public String getIdentity() {
return identity;
}
public void setIdentity(String identity) {
this.identity = identity;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getBalance() {
return balance;
}
public void setBalance(double balance) {
this.balance = balance;
}
@Override
public String toString() {
StringBuilder str = new StringBuilder();
str.append("-------------------------------------\n");
str.append("用户姓名:\t" + name + "\n");
str.append("手机号码:\t" + mobile + "\n");
str.append("银行卡号:\t" + cardno.split("-")[0] + "-******-" + cardno.split("-")[3] + "\n");
str.append("身份证号:\t" + identity + "\n");
str.append("用户余额:\t" + balance + "\n");
str.append("-------------------------------------");
return str.toString();
}
}
package com.bank.dao;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.Properties;
import com.bank.entity.User;
public class UserDao {
private static UserDao myBankDao = new UserDao();
private UserDao() {
super();
}
public static UserDao getInstance() {
return myBankDao;
}
// 从用户库里搜索用户
public User searchFromUserLibrary(String mobile) {
try {
BufferedReader bufferedReader = new BufferedReader(new FileReader("file/userLibrary.txt"));
User user = null;
String row = "";
while ((row = bufferedReader.readLine()) != null) {
if (row.split("-")[0].equals(mobile)) {
user = new User(row);
}
}
bufferedReader.close();
return user;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
// 得到用户全部数据
public User getAllUserData(User user) {
try {
Properties property = new Properties();
property.load(new FileInputStream("file/userData/" + user.getMobile() + ".txt"));
user.setUuid(property.get("uuid").toString());
user.setCardno(property.get("cardno").toString());
user.setIdentity(property.get("identity").toString());
user.setBalance(Double.parseDouble(property.get("balance").toString()));
} catch (Exception e) {
e.printStackTrace();
}
return user;
}
public User getAllUserData(String mobile) {
return getAllUserData(searchFromUserLibrary(mobile));
}
// 用户产生信息
public String formateUserData(User user) {
StringBuilder str = new StringBuilder();
str.append("uuid=" + user.getUuid() + "\n");
str.append("cardno=" + user.getCardno() + "\n");
str.append("identity=" + user.getIdentity() + "\n");
str.append("balance=" + user.getBalance() + "\n");
return str.toString();
}
// 保存用户信息
public void saveUserData(User user) {
try {
BufferedWriter output = new BufferedWriter(new FileWriter("file/userData/" + user.getMobile() + ".txt"));
output.write(formateUserData(user));
output.close();
} catch (Exception e) {
e.printStackTrace();
}
}
// 加扣款
public User changeMoney(User user, double money, boolean isAdd) {
user.setBalance(user.getBalance() + money * (isAdd ? 1 : -1));
saveUserData(user);
return user;
}
// 加款
public User plusMoney(User user, double money) {
return changeMoney(user, money, true);
}
// 扣款
public User minusMoney(User user, double money) {
return changeMoney(user, money, false);
}
}
package com.bank.entity;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Record {
private String uuid;
private String senderMobile;
private String receiverMobile;
private double money;
private Date time;
private String simpletime;
private String way;
public Record(String uuid, String senderMobile, String receiverMobile, double money, Date time) {
super();
this.uuid = uuid;
this.senderMobile = senderMobile;
this.receiverMobile = receiverMobile;
this.money = money;
this.time = time;
this.simpletime = new SimpleDateFormat("yyyy-MM-dd").format(time);
}
public Record(String str) throws Exception {
this(str.split("#")[0], str.split("#")[1], str.split("#")[2], Double.parseDouble(str.split("#")[3]),
new SimpleDateFormat("yyyy-MM-dd").parse(str.split("#")[4]));
}
public Record(String str, String mobile) throws Exception {
this(str);
if (str.split("#")[1].equals(mobile)) {
this.way = "转出";
} else if (str.split("#")[2].equals(mobile)) {
this.way = "转入";
} else {
this.way = "无关";
}
}
public String getUuid() {
return uuid;
}
public void setUuid(String uuid) {
this.uuid = uuid;
}
public String getSenderMobile() {
return senderMobile;
}
public void setSenderMobile(String senderMobile) {
this.senderMobile = senderMobile;
}
public String getReceiverMobile() {
return receiverMobile;
}
public void setReceiverMobile(String receiverMobile) {
this.receiverMobile = receiverMobile;
}
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
public Date getTime() {
return time;
}
public void setTime(Date time) {
this.time = time;
}
public String getSimpaltime() {
return simpletime;
}
public void setSimpaltime(String simpaltime) {
this.simpletime = simpaltime;
}
public String getWay() {
return way;
}
public void setWay(String way) {
this.way = way;
}
@Override
public String toString() {
StringBuilder str = new StringBuilder();
str.append("---------------------------------------------------\n");
str.append("交易单号:\n" + uuid + "\n");
str.append("支付方手机号:\t" + senderMobile + "\n");
str.append("接收方手机号:\t" + receiverMobile + "\n");
str.append("转账金额:\t\t" + money + "\n");
str.append("转账时间:\t\t" + simpletime + "\n");
str.append("转账方式:\t\t" + way + "\n");
str.append("---------------------------------------------------");
return str.toString();
}
}
package com.bank.dao;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors;
import com.bank.entity.Record;
public class RecordDao {
private static RecordDao recordDao = new RecordDao();
private RecordDao() {
super();
}
public static RecordDao getInstance() {
return recordDao;
}
// 获取全部转账记录
public List<Record> getAllRecords(String mobile) {
try {
List<Record> list = new ArrayList<Record>();
BufferedReader input = new BufferedReader(new FileReader("file/recoverDetail.txt"));
String row = "";
while ((row = input.readLine()) != null) {
list.add(new Record(row, mobile));
}
input.close();
return list;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
// 获取相关转账记录
public List<Record> getMineRecords(String mobile) {
try {
List<Record> list = new ArrayList<Record>();
BufferedReader input = new BufferedReader(new FileReader("file/recoverDetail.txt"));
String row = "";
while ((row = input.readLine()) != null) {
if (row.split("#")[1].equals(mobile) || row.split("#")[2].equals(mobile)) {
list.add(new Record(row, mobile));
}
}
input.close();
return list;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
// 时间段合理化
public Date[] changeTime(Date[] arr) {
if (arr[1].before(arr[0])) {
Date min = arr[1];
arr[1] = arr[0];
arr[0] = min;
}
return arr;
}
// 按时间筛选转账记录
public List<Record> filterListByTime(List<Record> list, Date[] arr) {
return list.stream().filter(o -> (o.getTime().after(arr[0]) || o.getTime().equals(arr[0])))
.filter(o -> (o.getTime().before(arr[1]) || o.getTime().equals(arr[1]))).collect(Collectors.toList());
}
// 按金额筛选转账记录
public List<Record> filterListByMoney(List<Record> list, double minMoney, double maxMoney) {
return list.stream().filter(o -> o.getMoney() >= minMoney).filter(o -> o.getMoney() <= maxMoney)
.collect(Collectors.toList());
}
// 按方式筛选转账记录
public List<Record> filterListByWay(List<Record> list, String str) {
return list.stream().filter(o -> o.getWay().equals(str)).collect(Collectors.toList());
}
// 按时间排序
public List<Record> sortListByTime(List<Record> list, boolean flag) {
return list.stream().sorted((o1, o2) -> {
if (o1.getTime().before(o2.getTime())) {
return -1 * (flag ? 1 : -1);
}
if (o1.getTime().after(o2.getTime())) {
return 1 * (flag ? 1 : -1);
}
return 0;
}).collect(Collectors.toList());
}
// 按金额排序
public List<Record> sortListByMoney(List<Record> list, boolean flag) {
return list.stream().sorted((o1, o2) -> {
if (o1.getMoney() - o2.getMoney() > 0) {
return 1 * (flag ? 1 : -1);
}
if (o1.getMoney() - o2.getMoney() < 0) {
return -1 * (flag ? 1 : -1);
}
return 0;
}).collect(Collectors.toList());
}
// 打印转账记录
public void printList(String filter, List<Record> list, boolean isRecover, String adress) {
try {
BufferedWriter output = new BufferedWriter(new FileWriter(adress, !isRecover));
output.write(filter);
output.newLine();
for (Record record : list) {
output.write(record.toString());
output.newLine();
}
for (int i = 0; i < 3; i++) {
output.newLine();
}
output.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public void printList(String filter, List<Record> list, boolean isRecover) {
printList(filter, list, isRecover, "file/outputFile/list.txt");
}
// 交易记录产生信息
public String formateRecordData(Record record) {
return record.getUuid() + "#" + record.getSenderMobile() + "#" + record.getReceiverMobile() + "#"
+ record.getMoney() + "#" + record.getSimpaltime();
}
// 生成交易记录档案
public void writeRecord(Record record) {
try {
BufferedWriter output = new BufferedWriter(new FileWriter("file/recoverDetail.txt", true));
output.write(formateRecordData(record));
output.newLine();
output.close();
} catch (Exception e) {
e.printStackTrace();
}
}
// 生成一个交易记录
public Record newRecord(String senderMobile, String receiverMobile, double money) {
Record record = new Record(UUID.randomUUID().toString(), senderMobile, receiverMobile, money,
Calendar.getInstance().getTime());
record.setWay("转出");
writeRecord(record);
return record;
}
}
package com.bank.utils;
import java.text.SimpleDateFormat;
import java.util.Date;
public class ValidateUtil {
// 检查手机号码
public static boolean checkMobile(String mobile) {
try {
Long.parseLong(mobile);
} catch (Exception e) {
return false;
}
if ((mobile.length() != 11) || (mobile.charAt(0) != '1')) {
return false;
}
return true;
}
// 检查时间格式
public static Date checkTime(String time) {
Date date;
try {
date = new SimpleDateFormat("yyyy-MM-dd").parse(time);
} catch (Exception e) {
return null;
}
return date;
}
}
package com.bank.view;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Scanner;
import com.bank.dao.RecordDao;
import com.bank.dao.UserDao;
import com.bank.entity.Record;
import com.bank.entity.User;
import com.bank.utils.ValidateUtil;
@SuppressWarnings("resource")
public class MyBankAPP {
public static void main(String[] args) {
// 实例化dao
UserDao userDao = UserDao.getInstance();
RecordDao recordDao = RecordDao.getInstance();
User user;
// 登录页面
System.out.println("---欢迎进入手机银行---");
while (true) {
while (true) {
System.out.println("--------");
System.out.println("-1.登录");
System.out.println("-2.退出");
System.out.println("--------");
Integer opt = new Scanner(System.in).nextInt();
if (opt == 1) { // 登录
System.out.println("请输入手机号码:");
String mobile = new Scanner(System.in).next();
if (!ValidateUtil.checkMobile(mobile)) {
System.out.println("!!!请输入正确的手机号!!!");
continue;
}
user = userDao.searchFromUserLibrary(mobile);
if (user == null) {
System.out.println("该手机号未注册银行卡!");
continue;
}
int times = 3;
while (true) {
System.out.println("请输入账户密码:");
String password = new Scanner(System.in).next();
if (user.getPassword().equals(password)) {
System.out.println("登录成功!");
break;
}
times--;
if (times <= 0) {
System.out.println("登录失败!");
break;
}
System.out.println("密码错误,你还有" + times + "机会!");
}
if (times > 0) {
break;
} else {
continue;
}
} else if (opt == 2) { // 退出
System.out.println("正在退出程序...");
System.exit(0);
}
}
// 得到全部数据
user = userDao.getAllUserData(user);
List<Record> myRecordList = recordDao.getMineRecords(user.getMobile());
// 操作界面
while (true) {
System.out.println("-------------");
System.out.println("-1.个人数据");
System.out.println("-2.在线转账");
System.out.println("-3.转账记录");
System.out.println("-4.筛选账单");
System.out.println("-8.账号登出");
System.out.println("-9.退出程序");
System.out.println("-------------");
Integer opt = new Scanner(System.in).nextInt();
if (opt == 1) { // 个人数据
System.out.println(user);
} else if (opt == 2) { // 在线转账
System.out.println("请输入收款人手机号码:");
String receiverMobile = new Scanner(System.in).next();
if (!ValidateUtil.checkMobile(receiverMobile)) {
System.out.println("手机号码不正确!");
continue;
}
if (user.getMobile().equals(receiverMobile)) {
System.out.println("不能给自己转账!");
continue;
}
User receiver = userDao.searchFromUserLibrary(receiverMobile);
if (receiver == null) {
System.out.println("该手机号未注册银行卡!");
continue;
}
receiver = userDao.getAllUserData(receiver);
while (true) {
System.out.println("请输入转账金额:");
double money = new Scanner(System.in).nextDouble();
if (money <= 0) {
System.out.println("转账失败!");
break;
} else if (money > user.getBalance()) {
System.out.println("余额不足!账户余额:" + user.getBalance() + "元");
continue;
}
// 给己方扣款
user = userDao.minusMoney(user, money);
// 给对方加款
receiver = userDao.plusMoney(receiver, money);
// 产生交易记录
myRecordList.add(recordDao.newRecord(user.getMobile(), receiver.getMobile(), money));
// 交易结束
System.out.println("转账成功!");
break;
}
} else if (opt == 3) { // 转账记录
for (Record record : myRecordList) {
System.out.println(record);
}
} else if (opt == 4) { // 筛选账单
List<Record> filteredList = myRecordList;
// 按时间筛选
System.out.println("请选择交易时间:");
int i = 1;
Date[] dateArr = new Date[2];
while (i < 3) {
System.out.println("请输入第" + i + "个日期:");
String inputTime = new Scanner(System.in).next();
dateArr[i - 1] = ValidateUtil.checkTime(inputTime);
if (dateArr[i - 1] == null) {
System.out.println("输入有误,请重新输入:");
} else {
i++;
}
}
dateArr = recordDao.changeTime(dateArr);
filteredList = recordDao.filterListByTime(filteredList, dateArr);
if (filteredList.size() == 0) {
System.out.println("未检测到相关记录!");
continue;
}
// 按金额筛选
System.out.println("请输入金额范围");
System.out.println("请输入最小值(单笔最小为0元):");
double minMoney = new Scanner(System.in).nextDouble();
if (minMoney < 0 || minMoney > 2000) {
minMoney = 0;
System.out.println("最小金额设置失败,已默认0元");
}
System.out.println("请输入最大值(单笔最大为20000元):");
double maxMoney = new Scanner(System.in).nextDouble();
if (maxMoney < minMoney || maxMoney > 20000) {
maxMoney = 20000;
System.out.println("最大金额设置失败,已默认20000元");
}
filteredList = recordDao.filterListByMoney(filteredList, minMoney, maxMoney);
if (filteredList.size() == 0) {
System.out.println("未检测到相关记录!");
continue;
}
// 按方式筛选
System.out.println("请选择交易方式:");
System.out.println("-1.转入\t-2.转出\t-3.全部");
int way;
while (true) {
way = new Scanner(System.in).nextInt();
if (way == 1 || way == 2 || way == 3) {
break;
}
System.out.println("非法输入!请重新输入:");
}
String wayStr = "";
if (way == 1) {
wayStr = "转入";
filteredList = recordDao.filterListByWay(filteredList, wayStr);
} else if (way == 2) {
wayStr = "转出";
filteredList = recordDao.filterListByWay(filteredList, wayStr);
} else if (way == 3) {
wayStr = "全部";
}
if (filteredList.size() == 0) {
System.out.println("未检测到相关记录!");
continue;
}
// 排序方式
System.out.println("请选择排序方式:");
System.out.println("-1.时间\t-2.金额");
int sortWay;
while (true) {
sortWay = new Scanner(System.in).nextInt();
if (sortWay == 1 || sortWay == 2) {
break;
}
System.out.println("非法输入!请重新输入:");
}
System.out.println("请选择升序降序:");
System.out.println("-1.升序\t-2.降序");
int sortUpOrDown;
while (true) {
sortUpOrDown = new Scanner(System.in).nextInt();
if (sortUpOrDown == 1 || sortUpOrDown == 2) {
break;
}
System.out.println("非法输入!请重新输入:");
}
if (sortWay == 1) {
filteredList = recordDao.sortListByTime(filteredList, sortUpOrDown == 1 ? true : false);
} else if (sortWay == 2) {
filteredList = recordDao.sortListByMoney(filteredList, sortUpOrDown == 1 ? true : false);
}
// 整理筛选条件
StringBuilder filterStr = new StringBuilder();
filterStr.append("交易时间:\t\t");
filterStr.append(new SimpleDateFormat("yyyy/MM/dd").format(dateArr[0]));
filterStr.append(" - ");
filterStr.append(new SimpleDateFormat("yyyy/MM/dd").format(dateArr[1]));
filterStr.append("\n");
filterStr.append("交易金额:\t\t" + minMoney + " - " + maxMoney + "\n");
filterStr.append("交易方式:\t\t" + wayStr + "\n");
filterStr.append(
"排序方式:\t\t" + (sortWay == 1 ? "时间" : "金额") + (sortUpOrDown == 1 ? "升序" : "降序") + "\n");
// 是否打印账单
System.out.println("是否需要打印账单:");
System.out.println("-true.是\t-false.否");
boolean isPrintList = new Scanner(System.in).nextBoolean();
// 打印
if (isPrintList) {
System.out.println("是否覆盖文件内的数据:");
System.out.println("-true.是\t-false.否");
boolean isRecover = new Scanner(System.in).nextBoolean();
recordDao.printList(filterStr.toString(), filteredList, isRecover);
}
// 输出结果
System.out.println("---------------------筛选结果---------------------");
System.out.println(filterStr.toString());
for (Record record : filteredList) {
System.out.println(record);
}
if (isPrintList) {
System.out.println("交易记录已成功打印!");
}
} else if (opt == 8) { // 账号登出
System.out.println("正在登出账号...");
break;
} else if (opt == 9) { // 退出程序
System.out.println("正在退出程序...");
System.exit(0);
}
}
}
}
}
用户的账号密码:
用户的具体信息:
交易记录:
运行结果:
打印出来的清单:
操作完成后的用户信息:
操作完成后的交易记录: