用java实现一个单线程基于控制台和以文件为数据存储并加上一点MVC思想的ATM
2017-04-18 12:46
573 查看
java实现一个单线程基于控制台和以文件为数据存储并加上MVC思想的ATM
分享前个星期做的ATM,万事万物都有缺陷,只有更好,没有最好,以后再优化更好。
代码千变万化,一个可能实现的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 + "]"; } }实验截图:
文件更新图:
相关文章推荐
- 将后台数据读取到前台的EXCEL文件中去,用javascript实现,asp.net,javacript(发一个原创)
- Java io将文本数据存储到一个文件中
- 基于ini配置文件实现多维数组数据的按行存储和读取
- 基于Spring3 MVC实现基于form表单上传Excel文件,批量导入数据!
- 结合Java实现的一个腾讯空间备份器谈谈MVC思想在Swing桌面项目中的应用
- java 实现一个基于控制台的 扫雷 游戏
- 一个将数据文件转换成excel文件打印的java实现方法的代码片断(Struts+poi)
- 基于Spring3 MVC实现基于form表单上传Excel文件,批量导入数据时,报错:Unable to recognize OLE stream !
- MVC 编程思想实例 (基于java,jdbc操作mysql数据库实现登陆注册)
- 基于Spring3 MVC实现批量导出数据成Excel文件!
- JDBC基于MVC架构项目实例-实现对MySQL数据表的增删改查、调用数据表中的存储过程和函数
- 用groovy简化java反射编写一个基于行数据对象的自动生成excel文件对象的工具
- 2.1、Spring Web MVC是什么 Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职
- 用Windows的文件映射机制,实现大批量数据的快速存储
- 以XML文件存储配置数据的技术实现,c++
- Java.NET --一个基于Java的Microsoft.NET框架的实现
- [原创] 不仅拥有XmlDocument一样简单的XML操作方法,并且实现数据文件安全存储功能——XmlEDocument
- 不仅拥有XmlDocument一样简单的XML操作方法,并且实现数据文件安全存储功能——XmlEDocument
- JAVA实现:给出洗牌的一个算法,并将洗好的牌存储在一个整形数组里
- [原创]实现基于文件存储的Session类