设计一个银行系统 实现功能
    开户 登录 查询余额 存款 转账 取款 销户
    MVC.png

    银行的用户:Person类

    1. public class Person{
    2. //Person类只是包含一些属性 每一个对象 就好比是一个小容器 存储信息
    3. //这样可以增加可读性
    4. //这种类称为 POJO 或 JavaBean
    5. private String name;//姓名
    6. private String myNum;//身份证
    7. private String userNum;//账号
    8. private String password;//密码
    9. private Float myMoney;//余额
    10. public Person(){}
    11. public Person(String name,String myNum,String userNum,String password,Float myMoney){
    12. this.name = name;
    13. this.myNum = myNum;
    14. this.userNum = userNum;
    15. this.password = password;
    16. this.myMoney = myMoney;
    17. }
    18. public void setName(String name){
    19. this.name = name;
    20. }
    21. public void setMyNum(String myNum){
    22. this.myNum = myNum;
    23. }
    24. public void setUserNum(String userNum){
    25. this.userNum = userNum;
    26. }
    27. public void setPassword(String password){
    28. this.password = password;
    29. }
    30. public void setMyMoney(Float myMoney){
    31. this.myMoney = myMoney;
    32. }
    33. public String getName(){
    34. return this.name;
    35. }
    36. public String getUserNum(){
    37. return this.userNum;
    38. }
    39. public String getMyNum(){
    40. return this.myNum;
    41. }
    42. public String getPassword(){
    43. return this.password;
    44. }
    45. public Float getMyMoney(){
    46. return this.myMoney;
    47. }
    48. }

    银行系统:BankService类—->业务层

    1. public class BankService implements Serializable{
    2. private static long serialVersionUID = 4568794L;
    3. //这个类 都是负责处理业务逻辑的 需要底层数据的支持
    4. private BankDao dao = new BankDao();
    5. //银行的业务 ----> 业务层
    6. //这里只有业务逻辑 这里看不到任何关于数据的操作 比如数据从哪来 把数据存到哪
    7. //通过身份证号 判断该用户账号是否存在
    8. private boolean userIsExist(String myNum){
    9. Person p =dao.getPerson(myNum);
    10. if(p==null){
    11. return true;
    12. }
    13. return false;
    14. }
    15. //设计一个方法 用来登录银行系统
    16. public String login(String myNum,String userNum,String password){
    17. Person p = dao.getPerson(myNum);
    18. if(p!=null){
    19. if(p.getUserNum().equals(userNum) && p.getPassword().equals(password)){
    20. return "登录成功!";
    21. }
    22. }
    23. return "用户名或密码错误";
    24. }
    25. //开户
    26. public void setMyBox(String myNum){
    27. Person p = dao.getPerson(myNum);
    28. if(userIsExist(myNum)) {
    29. Scanner input = new Scanner(System.in);
    30. System.out.println("请您告诉我您的姓名:");
    31. String userName = input.nextLine();
    32. System.out.println("系统即将为您开户,请稍后!");
    33. String userNum = "";
    34. for (int i = 0; i < 6; i++) {
    35. userNum = userNum + (new Random().nextInt(10)) + "";
    36. }
    37. try {
    38. Thread.sleep(3000);
    39. } catch (Exception e) {
    40. e.printStackTrace();
    41. }
    42. System.out.println("您的账号为" + userNum + ",现在请您为您的账号设置密码");
    43. String password = input.nextLine();
    44. System.out.println("您是否需要往卡里存钱?是请按1,不是请按2");
    45. String value = input.nextLine();
    46. if (value.equals("1")) {
    47. System.out.println("请您输入您要存入的金额数:");
    48. String money = input.nextLine();
    49. Person newp = new Person(userName, myNum, userNum, password, Float.parseFloat(money));
    50. dao.addUserMag(newp);
    51. dao.updateBox(newp);
    52. try {
    53. Thread.sleep(3000);
    54. } catch (Exception e) {
    55. e.printStackTrace();
    56. }
    57. System.out.println("存入成功,您当前的余额为" + money + "元,请你保管好您的账号密码,切勿轻易交给他人使用,欢迎您下次光临!");
    58. } else {
    59. Person newp1 = new Person(userName, myNum, userNum, password, 0.0F);
    60. dao.addUserMag(newp1);
    61. dao.updateBox(newp1);
    62. System.out.println("您的账户已经创建完毕!当前的账户余额为0元,感谢您对我们的支持,欢迎下次光临!");
    63. }
    64. }else {
    65. System.out.println("账户已存在,创建失败!");
    66. }
    67. }
    68. //存钱 需要找到数据库中的文件 修改后 再重新将数据写入文件
    69. public void setMoney(String myNum,Float money) {
    70. Person p = dao.getPerson(myNum);
    71. p.setMyMoney(p.getMyMoney() + money);
    72. dao.updateBox(p);
    73. System.out.println("您已存入" + money + "元," + "您当前余额为" + p.getMyMoney() + "元!欢迎您下次光临!");
    74. }
    75. //取钱
    76. public void getMoney(String myNum,Float money) {
    77. Person p = dao.getPerson(myNum);
    78. if (p.getMyMoney() >= money) {
    79. p.setMyMoney(p.getMyMoney() - money);
    80. dao.updateBox(p);
    81. System.out.println("取款成功!您当前账户余额为:" + p.getMyMoney() + "元。");
    82. } else {
    83. System.out.println("对不起,您的账户余额不足!");
    84. }
    85. }
    86. //查询余额
    87. public void checkMoney(String myNum){
    88. Person p = dao.getPerson(myNum);
    89. System.out.println("您当前账户余额为:" + p.getMyMoney() + "元。");
    90. }
    91. //转账 转完账后集合后的数据要发生改变 然后再将改变的集合存入文件
    92. public void giveMoney(String myNum,String otherNum,Float money){
    93. Person outP = dao.getPerson(myNum);
    94. Person inP = dao.getPerson(otherNum);
    95. if(inP!=null){
    96. if(outP.getMyMoney()>=money){
    97. outP.setMyMoney(outP.getMyMoney()-money);
    98. inP.setMyMoney(inP.getMyMoney()+money);
    99. dao.updateBox(outP);
    100. dao.updateBox(inP);
    101. System.out.println("转账成功!您当前账户余额为:" + outP.getMyMoney() + "元。");
    102. }
    103. else{
    104. System.out.println("对不起,您的余额不足!");
    105. }
    106. }else{
    107. System.out.println("对不起,您的转账账户不存在!");
    108. }
    109. }
    110. //销户
    111. public void deleteMyBox(String myNum) {
    112. Person p = dao.getPerson(myNum);
    113. dao.deleteUserMag(p);
    114. System.out.println("销户成功!");
    115. }
    116. }

    操作数据:BankDao类 ——> 数据持久层

    1. public class BankDao {
    2. //Dao叫数据传输对象 作为一个层次--->持久层 只负责操作数据 即操作集合
    3. //dao的小弟负责读写数据
    4. private FileLoaderAndCommit flac = new FileLoaderAndCommit();
    5. //因为每一次调用登录方法 都要创建流管道 读取文件信息
    6. //而在内存中操作登录的业务 和文件不在一个地方 读取会很慢
    7. //缓存机制 创建一个map集合当缓存 将文件里的数据一次性全部读出来 这样系统只需访问集合里的元素即可 不需频繁的和文件 架设流管道
    8. //这样就不用每一个人登录时都要读一次文件
    9. private HashMap<String, Person> userBox = flac.loaderFile();//记录用户信息
    10. //String代表的是身份证号码 Person里记录的是用户的信息 这样每一个键就只对应一个人 方便查询
    11. //Person里存的是 姓名-身份证号-银行账号-密码-余额
    12. //返回 身份证号码 对应的Person信息
    13. public Person getPerson(String myNum) {
    14. return userBox.get(myNum);
    15. }
    16. //往集合中添加 Person
    17. public void addUserMag(Person person) {
    18. userBox.put(person.getMyNum(),person);
    19. }
    20. //删除集合中 身份证号码 对应的Person信息
    21. public void deleteUserMag(Person person) {
    22. userBox.remove(person.getMyNum());
    23. flac.commit(userBox);
    24. }
    25. //更新数据库
    26. public void updateBox(Person person) {
    27. //里面重复的数据会被覆盖
    28. userBox.put(person.getMyNum(), person);
    29. flac.commit(userBox);
    30. }
    31. }

    读写数据:FileLoaderAndCommit

    1. public class FileLoaderAndCommit {
    2. //这个类负责读写文件 即操作文件
    3. //从文件中读取用户数据 再将数据读入userBox中
    4. public HashMap<String,Person> loaderFile(){
    5. HashMap<String,Person> userBox = new HashMap<String,Person>();
    6. FileReader fr = null;
    7. BufferedReader br = null;
    8. try {
    9. //创建输入流 读取文件记录
    10. fr = new FileReader("E://test//userBox.txt");
    11. br = new BufferedReader(fr);
    12. String value = br.readLine();//一次读一行
    13. while(value!=null){
    14. //value分成五段 分别代表姓名 身份证号 银行卡号 密码 余额
    15. String[] userMsg = value.split("-");
    16. //创建对象
    17. Person p = new Person();
    18. p.setName(userMsg[0]);
    19. p.setMyNum(userMsg[1]);
    20. p.setUserNum(userMsg[2]);
    21. p.setPassword(userMsg[3]);
    22. p.setMyMoney(Float.parseFloat(userMsg[4]));
    23. //把对象放进集合里
    24. userBox.put(userMsg[1],p);
    25. value = br.readLine();
    26. }
    27. } catch (Exception e) {
    28. e.printStackTrace();
    29. }
    30. finally {
    31. try {
    32. if(fr!=null) {
    33. fr.close();
    34. }
    35. } catch (IOException e) {
    36. e.printStackTrace();
    37. }
    38. try {
    39. if(br!=null) {
    40. br.close();
    41. }
    42. } catch (IOException e) {
    43. e.printStackTrace();
    44. }
    45. }
    46. return userBox;
    47. }
    48. //将用户数据存入文件 commit 提交
    49. public void commit(HashMap<String,Person> userBox){
    50. FileWriter fw = null;
    51. BufferedWriter bw = null;
    52. try {
    53. fw = new FileWriter("E://test//userBox.txt");
    54. bw = new BufferedWriter(fw);
    55. Iterator<String> nums = userBox.keySet().iterator();
    56. while(nums.hasNext()){
    57. String num = nums.next();//获取到的身份证信息 再通过身份证信息对应到每个人的信息
    58. //将Person对象的真实数据拼接成字符串
    59. Person p = userBox.get(num);
    60. StringBuilder sb = new StringBuilder(p.getName());
    61. sb.append("-");
    62. sb.append(p.getMyNum());
    63. sb.append("-");
    64. sb.append(p.getUserNum());
    65. sb.append("-");
    66. sb.append(p.getPassword());
    67. sb.append("-");
    68. sb.append(p.getMyMoney());
    69. //将数据写入文件
    70. bw.write(sb.toString());
    71. //一个数据一行
    72. bw.newLine();
    73. bw.flush();
    74. }
    75. } catch (Exception e) {
    76. e.printStackTrace();
    77. }finally {
    78. try {
    79. if(fw!=null) {
    80. fw.close();
    81. }
    82. } catch (IOException e) {
    83. e.printStackTrace();
    84. }
    85. try {
    86. if(bw!=null) {
    87. bw.close();
    88. }
    89. } catch (IOException e) {
    90. e.printStackTrace();
    91. }
    92. }
    93. }
    94. }

    主方法:

    1. public static void main(String[] args){
    2. BankService bs = new BankService();
    3. Scanner input = new Scanner(System.in);
    4. System.out.println("欢迎光临xx银行!xx银行很高兴为您服务!");
    5. System.out.println("请问您是否有我们银行的银行卡? 是请按1 否请按2");
    6. String choose = input.nextLine();
    7. if(choose.equals("1")){
    8. System.out.println("请您输入您的身份证号码:");
    9. String myNum = input.nextLine();
    10. System.out.println("请您输入您的账号:");
    11. String userNum = input.nextLine();
    12. System.out.println("请您输入您的密码:");
    13. String password = input.nextLine();
    14. String msg = bs.login(myNum,userNum,password);
    15. System.out.println(msg);
    16. if(msg.equals("登录成功!")){
    17. System.out.println("请选择您要办理什么业务?");
    18. System.out.println("1.存钱\t2.取钱\t3.查询余额\t4.转账\t5.销户");
    19. String value = input.nextLine();
    20. switch (value){
    21. case "1":
    22. System.out.println("请输入您要存入的金额:");
    23. Float setMoney = Float.parseFloat(input.nextLine());
    24. bs.setMoney(myNum,setMoney);
    25. break;
    26. case "2":
    27. System.out.println("请输入您要取出的金额:");
    28. Float money = Float.parseFloat(input.nextLine());
    29. bs.getMoney(myNum,money);
    30. break;
    31. case "3":
    32. bs.checkMoney(myNum);
    33. break;
    34. case "4":
    35. System.out.println("请您告诉我您要转账人的身份证!");
    36. String otherNum = input.nextLine();
    37. System.out.println("请你输入转账金额:");
    38. Float giveMoney = Float.parseFloat(input.nextLine());
    39. bs.giveMoney(myNum,otherNum,giveMoney);
    40. break;
    41. case "5":
    42. bs.deleteMyBox(myNum);
    43. break;
    44. }
    45. }
    46. }else{
    47. System.out.println("感谢您选择我们银行,我们将竭尽全力为您提供优质的服务!");
    48. System.out.println("请输入您的身份证号码:");
    49. String myNum1 = input.nextLine();
    50. bs.setMyBox(myNum1);
    51. }
    52. }