您的位置:首页 > 编程语言 > Java开发

用java实现一个单线程基于控制台和以文件为数据存储并加上一点MVC思想的ATM

2017-04-18 12:46 573 查看
java实现一个单线程基于控制台和以文件为数据存储并加上MVC思想的ATM
分享前个星期做的ATM,万事万物都有缺陷,只有更好,没有最好,以后再优化更好。
代码千变万化,一个可能实现的ATM代码,部分代码如下:
package com.lanqiao.date1704011.atm5;

import java.util.Scanner;

//需求2: ATM 初始要求:卡默认100000
//录入:银行卡号,取多少钱,密码
//异常:如果卡号不对 1234-123456-1234AB
//钱数:100 - 30000
//密码:6
//打印出来:当前取多少 还剩多少
//-----------
//取款次数 金额
//1     150.00
//2     1000.00

/**
* @Description: 系统管理类
* @author forwardLiao
* @date 2017年4月11日 下午12:18:30
* @version V1.0
*/
public class Manager {
static Scanner in = new Scanner(System.in);
private String cardNo = "";// 记录卡号

UserDao userDao = null;
LogsDao logsDao = null;

{
userDao = UserDao.getUserDao();
}
public Manager() {
}

public void mainMenu() {
userDao.readUserInfo();
System.out.println("==========欢迎进入ATM==========");
cardInputMenu();// 卡号输入界面
passwordInputMenu();// 密码输入界面
buzMenu();// ATM主业务界面
}

private void buzMenu() {

while (true) {
System.out.println("==========ATM业务页面==========");
System.out.println("1.取款\t2.存款\t3.查询记录");
System.out.println("4.打印凭条\t0.退出系统");
System.out.println("请选择您要进行的业务:");
int sel = in.nextInt();
switch (sel) {
case 0:
endMenu();// 结束选择界面
break;
case 1:
withdrawMenu();// 取款数界面
break;
case 2:
depositMenu();// 存款界面
break;
case 3:
readFileLogs();// 显示所有存取款记录界面
break;
case 4:
print();// 打印当前用户本次所有取款记录
break;
default:
System.out.println("该模块未实现!");
break;
}
}

}

// 用户下次登录时,选择查询,能在控制台显示之前的取款信息
private void readFileLogs() {
logsDao = LogsDao.getLogsDao();

logsDao.readLogs();//该句是每次把日记从文件中取出,存到内存中,性能可能不好,但可实现更新记录。

System.out.println("==========管理员专用功能:显示所有用户所有存取款记录界面==========");
logsDao.showTradeLogs();

System.out.println("========普通用户专用功能:显示当前账号交易的所有交易信息========");
StringBuffer s = logsDao.getTradeLogById(cardNo);
System.out.println(s);
}

private void print() {
System.out.println("==========打印凭条界面==========");
System.out.println("该模块未实现!");
}

private void endMenu() {
System.out.println("==========结束界面==========");
String userSel = "";

do {
System.out.println("是否继续交易:(y|n)");
userSel = in.next();
if (userSel.equals("n")) {
showRecord();
mainMenu();
break;
} else {
buzMenu();
}
} while (true);

}

private void depositMenu() {
System.out.println("==========存款界面==========");
System.out.println("该模块未实现!");
}

private void withdrawMenu() {
System.out.println("==========取款界面==========");

int money;
String userSel = "";
do {
System.out.println("请输入您的取款数:");
money = in.nextInt();
if (verifyMoney(money)) {
System.out.println("是否继续取款:(y|n)");
userSel = in.next();
if (userSel.equals("n")) {
break;
}
}
} while (true);

}

private void passwordInputMenu() {
System.out.println("===密码输入界面===");

int pwd;
do {
System.out.println("请输入您的密码:");
pwd = in.nextInt();
} while (!verifyPwd(pwd));

}

private void cardInputMenu() {
System.out.println("===卡号输入界面===");

do {
System.out.println("请输入您的卡号:");
cardNo = in.next();
} while (!verifyCardNO(cardNo));

}

// 验证取钱数
private boolean verifyMoney(int money) {
User
c958
u = userDao.getUser(cardNo);
boolean flag = false;
try {
if (money < 100 || money > 30000) {// 验证取钱额度
flag = false;
throw new Exception("取钱数不合理!");
} else {
if (money % 100 == 0) {
u.getAccount().withdraw(money);
flag = true;
} else {
flag = false;
throw new Exception("请整取钱数!");
}
}
} catch (Exception e) {
flag = false;
System.out.println(e.getMessage());
}
return flag;
}

// 验证密码
private boolean verifyPwd(int pwd) {
boolean flag = false;
String s = "";
s = String.valueOf(pwd);

try {
if (s.length() != 6) {// 验证密码长度
flag = false;
throw new Exception("密码长度不合理!");
} else {
if (userDao.getPwd(cardNo).equals(s)) {
flag = true;// 卡号位数正确并且存在该银行卡号
System.out.println("密码正确!");
} else {
flag = false;
throw new Exception("密码不正确!");
}
}
} catch (Exception e) {
System.out.println(e.getMessage());
}

return flag;
}

// 验证卡号
private boolean verifyCardNO(String cardNo) {
boolean flag = false;

try {
if (cardNo.length() != 16) {// 验证卡号长度
flag = false;
throw new Exception("卡号长度不合理!");
} else {
if (userDao.getId(cardNo) != "") {
flag = true;
System.out.println("银行卡号正确!");// 卡号位数正确并且存在该银行卡号
} else {
flag = false;
throw new Exception("卡号" + cardNo + "不存在!");
}
}
} catch (Exception e) {
System.out.println(e.getMessage());
}

return flag;
}

// 显示剩余余额记录
public void showRecord() {
User u = userDao.getUser(cardNo);
System.out.println("本次交易成功,请收回你的银行卡,剩余余额 "
+ u.getAccount().getBalance());
System.out.println();
}
}

package com.lanqiao.date1704011.atm5;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;

/**
* @Description: 该类用来访问数据文件,该类为单例模式
* @author forwardLiao
* @date 2017年4月9日 下午9:31:29
* @version V1.0
*/
public class UserDao {
private static UserDao userDao = null;
public static Map<String, User> map = null;

// 用户信息文件路径
public static final String PATH_USER_INFO = "D:\\WorkSpace\\MyATM\\src\\com\\lanqiao\\date1704011\\atm5\\account.txt";

{
map = new HashMap<String, User>();
}

private UserDao() {
//readUserInfo();
}

/**
* @Description:提供共有静态方法获取UserDao单例对象
* @return UserDao对象的引用
*/
public static UserDao getUserDao() {
if (userDao == null) {
userDao = new UserDao();
}
return userDao;
}

/**
* @Description:获取指定账号余额
* @param inputId
* @return double
*/
public double getBalance(String inputId) {
String id = this.getId(inputId);
System.out.println("hello" + id);
return map.get(id).getAccount().getBalance();
}

/**
* @Description:获取指定账号名字
* @param inputId
* @return String
*/
public String getName(String inputId) {
String id = this.getId(inputId);
return map.get(id).getName();
}

/**
* @Description:获取指定账号密码
* @param inputId
* @return String
*/
public String getPwd(String inputId) {
String id = this.getId(inputId);
return String.valueOf(map.get(id).getPwd());
}

/**
* @Description:获取指定账号用户
* @param inputId
* @return User
*/
public User getUser(String inputId) {
String id = this.getId(inputId);
return map.get(id);
}

/**
* @Description: 通过指定id获取是否存在账号id
* @param inputId
* @return String
*/
public String getId(String inputId) {
Iterator<Entry<String, User>> it = map.entrySet().iterator();
String id = "";
while (it.hasNext()) {
Entry<String, User> entry = it.next();
id = entry.getKey();
if (id.equals(inputId)) {
break;
}
}
return id;
}

/**
* @Description:从文件中获取用户的账号信息并存到map集合中去。
* @param
* @return
*/
public void readUserInfo() {
try (BufferedReader br = new BufferedReader(new FileReader(
PATH_USER_INFO));) {
String s = "";
int count = 0;
System.out.println("============这是从更新文件中取出的用户信息============");
while ((s = br.readLine()) != null) {
s = s.replace("|", ",");
String[] v = s.split(",");
String id = v[0];
String name = v[1];
count++;
// 跳过表头,不存入map集合
if (count == 1) {
String pwd = v[2];
String balance = v[3];
String a = id.concat(name).concat(pwd).concat(balance);
a.replace(" ", "");
System.out.println(a);
continue;
}

int pwd = Integer.parseInt(v[2]);
double balance = Double.parseDouble(v[3]);
User user = new User(name, new Account(id, balance), pwd);
System.out.println(id + "\t\t" + name + "\t" + pwd + "\t"
+ balance);
map.put(id, user);
}
} catch (IOException e) {
e.printStackTrace();
}
}

/**
* @Description: 根据指定参数改变对应账号的余额
* @param inputId,balance
* @return boolean
*/
public boolean writeUserInfo(String inputId, double balance) {
try (BufferedWriter bw = new BufferedWriter(new FileWriter(
PATH_USER_INFO));) {

Iterator<Entry<String, User>> it = map.entrySet().iterator();
String head = "账号\t\t\t\t|用户|\t密码|\t余额\n";
bw.write(head);
while (it.hasNext()) {
Entry<String, User> entry = it.next();
User u = entry.getValue();
String id = entry.getKey();
String name = u.getName();
int pwd = u.getPwd();
double ban2 = u.getAccount().getBalance();
if (inputId.equals(id)) {
double ban1 = balance;// 就改变这个数据,其他都不变
String str = id + "|" + name + "|" + pwd + "|" + ban1
+ "\n";
bw.write(str);
continue;
}
String str = id + "|" + name + "|" + pwd + "|" + ban2 + "\n";
bw.write(str);
}

} catch (IOException e) {
e.printStackTrace();
}
return true;
}
}

package com.lanqiao.date1704011.atm5;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
* @Description: 该类是数据访问对象,提供增删该查功能。
* @author forwardLiao
* @date 2017年4月10日 下午12:28:19
* @version V1.0
*/
// 文件格式:
// 账号|日期|存款金额|取款金额|余额
// 1111222233335555|2017年04月10日09:46:49|100000.0|100000.0|0.0
// 1111222233335555|2017年04月10日09:51:49|100000.0|100000.0|0.0
// 1111222233335555|2017年04月10日11:20:42|100000.0|100000.0|0.0
public class LogsDao {
// 存取款日记文件路径
public static final String PATH_TRADE_LOGS = "D:\\WorkSpace\\MyATM\\src\\com\\lanqiao\\date1704011\\atm5\\tradelogs.txt";

// 存放从文件中去出来的记录
List<String> list = null;

private static LogsDao logsDao = null;

{
list = new ArrayList<String>();
}

private LogsDao() {
}

/**
* @Description:获取单例对象
* @param 无
* @return LogsDao单例对象
*/
public static LogsDao getLogsDao() {
if (logsDao == null) {
logsDao = new LogsDao();
}
return logsDao;
}

/**
* @Description:显示指定用户交易的信息
* @param inputId
* @return 如果查到记录,返回指定用户所有的信息
*
*/
public StringBuffer getTradeLogById(String inputId) {
System.out.println("=====显示当前账号" + inputId + "交易的所有交易信息=====");
StringBuffer str = new StringBuffer();
for (String string : list) {
if (string.contains(inputId)) {
str.append(string + "\n");
}
}
return str;
}

/**
* @Description:显示所有用户的所有交易记录信息
*/
public void showTradeLogs() {
for (String string : list) {
System.out.println(string);
}
}

/**
* @Description:从文件中获取用户的账号信息并存到list集合中去。
* @param
* @return
*/
public void readLogs() {
try (BufferedReader br = new BufferedReader(new FileReader(
PATH_TRADE_LOGS));) {

/*再次把文件中数据读出来到list集合中,由于之前内存记录是上次读取出来的,
所以再次读时要把之前的内存中的记录删除掉。要保证显示数据唯一,list和map集合不一样*/
list.clear();

String s = "";
int count = 0;
while ((s = br.readLine()) != null) {
s = s.replace("|", ",");
String[] v = s.split(",");
count++;
// 跳过表头,不存入list集合
if (count == 1) {
continue;
}

s = "账号:" + v[0] + " " + v[1] + " 存款" + v[2] + "元,取款" + v[3]
+ "元,余额" + v[4] + "元";
// System.out.println(s);
list.add(s);
}
System.out.println("hello"+"读取记录成功!");
// System.out.println("文件读取成功并存到list的记录");
} catch (IOException e) {
e.printStackTrace();
}
}

/**
* @Description: 根据指定参数改变对应账号的余额,
* @param inputId
*            ,balance
* @return 如果写入记录正确,返回true,否则挂掉
*/
public boolean writeLogs(String inputId, String date, double inMoney,
double outMoney, double balance) {
try (BufferedWriter bw = new BufferedWriter(new FileWriter(
PATH_TRADE_LOGS, true));) {
String str = inputId + "|" + date + "|" + inMoney + "| "
+ outMoney + "|" + balance + "\n";
bw.write(str);
//"|\t   "
} catch (IOException e) {
e.printStackTrace();
}
return true;
}
}

package com.lanqiao.date1704011.atm5;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;

/**
* @Description: 账号类
* @author forwardLiao
* @date 2017年4月11日 下午12:29:52
* @version V1.0
*/
public class Account {
private String cardNo;// 银行卡号
private double balance = 100000.00;// 余额
private List<String> logs;// 取款日志

public Account(String cardNo, double balance) {
super();
this.cardNo = cardNo;
this.balance = balance;
logs = new LinkedList<>();
}

// 从当前余额中减去金额。
public boolean withdraw(double leftMoney) throws Exception {
if (leftMoney >= balance) {
throw new Exception("您的账号余额不足");
}
balance -= leftMoney;
System.out.println("取款成功!");

// 更新文件account.txt信息
UserDao ud = UserDao.getUserDao();
ud.writeUserInfo(cardNo, balance);

// 记录日志到内存list列表中
String logStr = Account.currentTime() + "取款 " + leftMoney + "元, 余额:"
+ balance;
this.logs.add(logStr);

// 记录日记写到文件tradelogs.txt中去
LogsDao ld = LogsDao.getLogsDao();
ld.writeLogs(cardNo, Account.currentTime(), 0.0, leftMoney, balance);

return true;
}

/**
* 当前系统操作时间
*/
public static String currentTime() {
//String pattern = "yyyy年MM月dd日 HH:ss:mm";//显示时间会有错误!
Date nowTime = new Date();
String pattern = "G yyyy年MMMd日E HH时mm分ss秒z";
SimpleDateFormat SDF = new SimpleDateFormat(pattern);
String timePattern = SDF.format(nowTime);
return timePattern;
}

/**
* 输出取款日志
*/
public String showLog() {

StringBuffer sbf = new StringBuffer();

for (String str : logs) {
sbf.append(str);
}

return sbf.toString();
}

public String getCardNo() {
return cardNo;
}

public double getBalance() {
return balance;
}

public List<String> getLogs() {
return logs;
}

public void setLogs(List<String> logs) {
this.logs = logs;
}

@Override
public String toString() {
return "Account [cardNo=" + cardNo + ", balance=" + balance + ", logs="
+ logs + "]";
}
}
实验截图:


文件更新图:




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐