设计一个银行系统 实现功能
开户 登录 查询余额 存款 转账 取款 销户
银行的用户:Person类
public class Person{//Person类只是包含一些属性 每一个对象 就好比是一个小容器 存储信息//这样可以增加可读性//这种类称为 POJO 或 JavaBeanprivate String name;//姓名private String myNum;//身份证private String userNum;//账号private String password;//密码private Float myMoney;//余额public Person(){}public Person(String name,String myNum,String userNum,String password,Float myMoney){this.name = name;this.myNum = myNum;this.userNum = userNum;this.password = password;this.myMoney = myMoney;}public void setName(String name){this.name = name;}public void setMyNum(String myNum){this.myNum = myNum;}public void setUserNum(String userNum){this.userNum = userNum;}public void setPassword(String password){this.password = password;}public void setMyMoney(Float myMoney){this.myMoney = myMoney;}public String getName(){return this.name;}public String getUserNum(){return this.userNum;}public String getMyNum(){return this.myNum;}public String getPassword(){return this.password;}public Float getMyMoney(){return this.myMoney;}}
银行系统:BankService类—->业务层
public class BankService implements Serializable{private static long serialVersionUID = 4568794L;//这个类 都是负责处理业务逻辑的 需要底层数据的支持private BankDao dao = new BankDao();//银行的业务 ----> 业务层//这里只有业务逻辑 这里看不到任何关于数据的操作 比如数据从哪来 把数据存到哪//通过身份证号 判断该用户账号是否存在private boolean userIsExist(String myNum){Person p =dao.getPerson(myNum);if(p==null){return true;}return false;}//设计一个方法 用来登录银行系统public String login(String myNum,String userNum,String password){Person p = dao.getPerson(myNum);if(p!=null){if(p.getUserNum().equals(userNum) && p.getPassword().equals(password)){return "登录成功!";}}return "用户名或密码错误";}//开户public void setMyBox(String myNum){Person p = dao.getPerson(myNum);if(userIsExist(myNum)) {Scanner input = new Scanner(System.in);System.out.println("请您告诉我您的姓名:");String userName = input.nextLine();System.out.println("系统即将为您开户,请稍后!");String userNum = "";for (int i = 0; i < 6; i++) {userNum = userNum + (new Random().nextInt(10)) + "";}try {Thread.sleep(3000);} catch (Exception e) {e.printStackTrace();}System.out.println("您的账号为" + userNum + ",现在请您为您的账号设置密码");String password = input.nextLine();System.out.println("您是否需要往卡里存钱?是请按1,不是请按2");String value = input.nextLine();if (value.equals("1")) {System.out.println("请您输入您要存入的金额数:");String money = input.nextLine();Person newp = new Person(userName, myNum, userNum, password, Float.parseFloat(money));dao.addUserMag(newp);dao.updateBox(newp);try {Thread.sleep(3000);} catch (Exception e) {e.printStackTrace();}System.out.println("存入成功,您当前的余额为" + money + "元,请你保管好您的账号密码,切勿轻易交给他人使用,欢迎您下次光临!");} else {Person newp1 = new Person(userName, myNum, userNum, password, 0.0F);dao.addUserMag(newp1);dao.updateBox(newp1);System.out.println("您的账户已经创建完毕!当前的账户余额为0元,感谢您对我们的支持,欢迎下次光临!");}}else {System.out.println("账户已存在,创建失败!");}}//存钱 需要找到数据库中的文件 修改后 再重新将数据写入文件public void setMoney(String myNum,Float money) {Person p = dao.getPerson(myNum);p.setMyMoney(p.getMyMoney() + money);dao.updateBox(p);System.out.println("您已存入" + money + "元," + "您当前余额为" + p.getMyMoney() + "元!欢迎您下次光临!");}//取钱public void getMoney(String myNum,Float money) {Person p = dao.getPerson(myNum);if (p.getMyMoney() >= money) {p.setMyMoney(p.getMyMoney() - money);dao.updateBox(p);System.out.println("取款成功!您当前账户余额为:" + p.getMyMoney() + "元。");} else {System.out.println("对不起,您的账户余额不足!");}}//查询余额public void checkMoney(String myNum){Person p = dao.getPerson(myNum);System.out.println("您当前账户余额为:" + p.getMyMoney() + "元。");}//转账 转完账后集合后的数据要发生改变 然后再将改变的集合存入文件public void giveMoney(String myNum,String otherNum,Float money){Person outP = dao.getPerson(myNum);Person inP = dao.getPerson(otherNum);if(inP!=null){if(outP.getMyMoney()>=money){outP.setMyMoney(outP.getMyMoney()-money);inP.setMyMoney(inP.getMyMoney()+money);dao.updateBox(outP);dao.updateBox(inP);System.out.println("转账成功!您当前账户余额为:" + outP.getMyMoney() + "元。");}else{System.out.println("对不起,您的余额不足!");}}else{System.out.println("对不起,您的转账账户不存在!");}}//销户public void deleteMyBox(String myNum) {Person p = dao.getPerson(myNum);dao.deleteUserMag(p);System.out.println("销户成功!");}}
操作数据:BankDao类 ——> 数据持久层
public class BankDao {//Dao叫数据传输对象 作为一个层次--->持久层 只负责操作数据 即操作集合//dao的小弟负责读写数据private FileLoaderAndCommit flac = new FileLoaderAndCommit();//因为每一次调用登录方法 都要创建流管道 读取文件信息//而在内存中操作登录的业务 和文件不在一个地方 读取会很慢//缓存机制 创建一个map集合当缓存 将文件里的数据一次性全部读出来 这样系统只需访问集合里的元素即可 不需频繁的和文件 架设流管道//这样就不用每一个人登录时都要读一次文件private HashMap<String, Person> userBox = flac.loaderFile();//记录用户信息//String代表的是身份证号码 Person里记录的是用户的信息 这样每一个键就只对应一个人 方便查询//Person里存的是 姓名-身份证号-银行账号-密码-余额//返回 身份证号码 对应的Person信息public Person getPerson(String myNum) {return userBox.get(myNum);}//往集合中添加 Personpublic void addUserMag(Person person) {userBox.put(person.getMyNum(),person);}//删除集合中 身份证号码 对应的Person信息public void deleteUserMag(Person person) {userBox.remove(person.getMyNum());flac.commit(userBox);}//更新数据库public void updateBox(Person person) {//里面重复的数据会被覆盖userBox.put(person.getMyNum(), person);flac.commit(userBox);}}
读写数据:FileLoaderAndCommit
public class FileLoaderAndCommit {//这个类负责读写文件 即操作文件//从文件中读取用户数据 再将数据读入userBox中public HashMap<String,Person> loaderFile(){HashMap<String,Person> userBox = new HashMap<String,Person>();FileReader fr = null;BufferedReader br = null;try {//创建输入流 读取文件记录fr = new FileReader("E://test//userBox.txt");br = new BufferedReader(fr);String value = br.readLine();//一次读一行while(value!=null){//value分成五段 分别代表姓名 身份证号 银行卡号 密码 余额String[] userMsg = value.split("-");//创建对象Person p = new Person();p.setName(userMsg[0]);p.setMyNum(userMsg[1]);p.setUserNum(userMsg[2]);p.setPassword(userMsg[3]);p.setMyMoney(Float.parseFloat(userMsg[4]));//把对象放进集合里userBox.put(userMsg[1],p);value = br.readLine();}} catch (Exception e) {e.printStackTrace();}finally {try {if(fr!=null) {fr.close();}} catch (IOException e) {e.printStackTrace();}try {if(br!=null) {br.close();}} catch (IOException e) {e.printStackTrace();}}return userBox;}//将用户数据存入文件 commit 提交public void commit(HashMap<String,Person> userBox){FileWriter fw = null;BufferedWriter bw = null;try {fw = new FileWriter("E://test//userBox.txt");bw = new BufferedWriter(fw);Iterator<String> nums = userBox.keySet().iterator();while(nums.hasNext()){String num = nums.next();//获取到的身份证信息 再通过身份证信息对应到每个人的信息//将Person对象的真实数据拼接成字符串Person p = userBox.get(num);StringBuilder sb = new StringBuilder(p.getName());sb.append("-");sb.append(p.getMyNum());sb.append("-");sb.append(p.getUserNum());sb.append("-");sb.append(p.getPassword());sb.append("-");sb.append(p.getMyMoney());//将数据写入文件bw.write(sb.toString());//一个数据一行bw.newLine();bw.flush();}} catch (Exception e) {e.printStackTrace();}finally {try {if(fw!=null) {fw.close();}} catch (IOException e) {e.printStackTrace();}try {if(bw!=null) {bw.close();}} catch (IOException e) {e.printStackTrace();}}}}
主方法:
public static void main(String[] args){BankService bs = new BankService();Scanner input = new Scanner(System.in);System.out.println("欢迎光临xx银行!xx银行很高兴为您服务!");System.out.println("请问您是否有我们银行的银行卡? 是请按1 否请按2");String choose = input.nextLine();if(choose.equals("1")){System.out.println("请您输入您的身份证号码:");String myNum = input.nextLine();System.out.println("请您输入您的账号:");String userNum = input.nextLine();System.out.println("请您输入您的密码:");String password = input.nextLine();String msg = bs.login(myNum,userNum,password);System.out.println(msg);if(msg.equals("登录成功!")){System.out.println("请选择您要办理什么业务?");System.out.println("1.存钱\t2.取钱\t3.查询余额\t4.转账\t5.销户");String value = input.nextLine();switch (value){case "1":System.out.println("请输入您要存入的金额:");Float setMoney = Float.parseFloat(input.nextLine());bs.setMoney(myNum,setMoney);break;case "2":System.out.println("请输入您要取出的金额:");Float money = Float.parseFloat(input.nextLine());bs.getMoney(myNum,money);break;case "3":bs.checkMoney(myNum);break;case "4":System.out.println("请您告诉我您要转账人的身份证!");String otherNum = input.nextLine();System.out.println("请你输入转账金额:");Float giveMoney = Float.parseFloat(input.nextLine());bs.giveMoney(myNum,otherNum,giveMoney);break;case "5":bs.deleteMyBox(myNum);break;}}}else{System.out.println("感谢您选择我们银行,我们将竭尽全力为您提供优质的服务!");System.out.println("请输入您的身份证号码:");String myNum1 = input.nextLine();bs.setMyBox(myNum1);}}
