image.png

    1. package com.itheima.ATM;
    2. import java.util.ArrayList;
    3. import java.util.Random;
    4. import java.util.Scanner;
    5. /**
    6. * ATM系统入口类
    7. */
    8. public class ATMSystem {
    9. public static void main(String[] args) {
    10. // 1.定义一个账户类(面向对象编程)
    11. // 2. 定义一个集合容器,负责以后存储全部的账户对象,进行相关的业务操作
    12. ArrayList<Account> accounts = new ArrayList<>(); // 里面存储的是Account类的对象
    13. // 展示系统的首页
    14. while (true) {
    15. System.out.println("===============黑马ATM系统====================");
    16. System.out.println("1.账户登录");
    17. System.out.println("2.账户开户");
    18. Scanner sc = new Scanner(System.in);
    19. System.out.println("请选择你的操作:");
    20. int command = sc.nextInt();
    21. switch (command){
    22. case 1:
    23. // 用户登录操作
    24. login(accounts,sc);// 自己定义一个方法要接所有的账户集合和让用户输入的扫描器Scanner对象sc
    25. break; // 这里的break跳出switch分支,跳到while循环,刚开始的地方
    26. case 2:
    27. // 用户账户开户
    28. // 目前还没有register方法,按alt + enter键自动创建方法
    29. register(accounts,sc); // register注册的意思,
    30. break;
    31. default:
    32. System.out.println("你输入的操作命令不正确"); // 这里应该定义一个死循环,让用户一直输入(选中要循环的部分,按ctrl + alt + t)
    33. }
    34. }
    35. }
    36. private static void login(ArrayList<Account> accounts, Scanner sc) {
    37. System.out.println("==================系统登录操作==================");
    38. // 1.判断账户集合中是否存在账户,如果不存在账户,登录功能不能进行
    39. if (accounts.size() == 0){ // 当输入里面的元素长度为0时代表里面没有账户对象,
    40. System.out.println("对不起,当前系统中,无任何账户,请先开户,再来登录");
    41. return; // return这里单独使用是:结束方法 (卫语言风格)
    42. }
    43. // 2.正式进入登录操作
    44. while (true) {
    45. System.out.println("请您输入登录卡号: ");
    46. String cardId = sc.next();
    47. // 3.判断卡号是否存在,根据卡号去账户集合中查询账户对象
    48. Account acc = getAccountByCardId(cardId, accounts);
    49. if (acc != null) {
    50. // 卡号存在的
    51. // 4.让用户输入密码,认证密码
    52. System.out.println("请您输入登录密码;");
    53. String passWord = sc.next();
    54. // 判断当前账户对象的密码是否与用户输入的密码一致
    55. if (acc.getPassword().equals(passWord)){
    56. System.out.println("恭喜你," + acc.getUserName() + "先生/女士进入系统,您的卡号是:" + acc.getCardId());
    57. // 代码走到上面,代表登录成功, // 现在要做的事查询 转账 取款 。。。
    58. // 展示登录后的操作页
    59. showUserCommand(sc,acc);// 由于定义的方法要用到扫描器Scanner,所以现在要在方法中定义形参,所以在调用方法时也要传入形参
    60. return; //这里加return干掉登录方法,结束当前login登录方法
    61. }else {
    62. System.out.println("你输入的密码有误");
    63. }
    64. }else {
    65. System.out.println("对不起,系统中不存在该账户卡号~~"); // 应该定义一个死循环,如果用户输入错误即让用户一直输入卡号
    66. }
    67. }
    68. }
    69. /**
    70. * 展示登录后的操作页
    71. */
    72. private static void showUserCommand(Scanner sc,Account acc) {
    73. while (true) {
    74. System.out.println("=====================用户操作页=========================");
    75. System.out.println("1.查询账户");
    76. System.out.println("2.存款");
    77. System.out.println("3.取款");
    78. System.out.println("4.转账");
    79. System.out.println("5.修改密码");
    80. System.out.println("6.退出");
    81. System.out.println("7.注销账户");
    82. System.out.println("请选择");
    83. int command = sc.nextInt();
    84. switch (command) {
    85. case 1:
    86. // 查询账户(展示当前登录的账户信息) // 让用户传参,将用户对象传下来
    87. showAccount(acc); // 展示当前用户的方法, 将acc作为实参传进去
    88. break;
    89. case 2:
    90. // 存款
    91. break;
    92. case 3:
    93. // 取款
    94. break;
    95. case 4:
    96. // 转账
    97. break;
    98. case 5:
    99. // 修改密码
    100. break;
    101. case 6:
    102. // 退出
    103. System.out.println("退出成功,欢迎下次光临");
    104. return; // 用return方法,跳出当前方法
    105. case 7:
    106. // 注销账户
    107. break;
    108. // 定义一个默认情况,就是当上面所有的case都不满足时:就执行default语句
    109. default:
    110. System.out.println("你输入的命令有误,请您重新输入"); // 这个时候要定义一个死循环如果用户输入错误,让用户一直输入
    111. }
    112. }
    113. }
    114. /**
    115. * 展示账户信息
    116. * @param acc
    117. */
    118. private static void showAccount(Account acc) {
    119. System.out.println("===================当前账户的信息如下=================");
    120. System.out.println("卡号:" + acc.getCardId());
    121. System.out.println("户主:" + acc.getUserName());
    122. System.out.println("余额:" + acc.getMoney());
    123. System.out.println("限额:" + acc.getQuotaMoney());
    124. }
    125. // 该方法是private方法,只能在本类中使用(在这里,使用private也没关系,就在这个ATMSystem类访问
    126. /**
    127. *
    128. * @param accounts
    129. * @param sc // 由于下面要用到ScannerAPI,但是在新方法中创对象占内存,所以定义方法时,设置Scanner类 的传参即可使用该类的方法
    130. */
    131. private static void register(ArrayList<Account> accounts,Scanner sc) {
    132. System.out.println("===================系统开户操作=======================");
    133. // 1.创建一个账户对象,用于后期封装账户信息
    134. Account account = new Account();
    135. // 2.录入当前这个账户的信息,注入到账户对象中去
    136. System.out.println("请输入账户用户名:");
    137. String userName = sc.next();
    138. account.setUserName(userName); // 使用自己定义的Account类的方法
    139. while (true) {
    140. System.out.println("请输入你的密码:");
    141. String passWord = sc.next();
    142. System.out.println("请输入确认密码:");
    143. String okPassword = sc.next();
    144. if (passWord.equals(okPassword)){
    145. // 密码认证通过,可以注入给账户对象
    146. account.setPassword(okPassword);
    147. break; // 每次定义死循环一定要结束它,要不然后面写不了语句会报错Unreachable statement 无法到达的语句
    148. }else {
    149. System.out.println("对不起你输入的2次密码不一致,请重新确认"); // 为了让用户输入正确,将要循环的部分加入while死循环
    150. }
    151. }
    152. System.out.println("请你输入账户当次的限额"); // 死循环后面一定要写break要不然,这里会报错Unreachable statement
    153. double quotaMoney = sc.nextDouble(); // .nextDouble输入的是浮点型
    154. account.setQuotaMoney(quotaMoney);
    155. // 为账户随机一个8为且与其他账户的卡号不重复的号码,(独立功能,独立成方法)
    156. String cardId = getRandomCardid(accounts);//getRandomCardid是自己创建的方法
    157. account.setCardId(cardId); // 将新生成的cardID(不重复的) 传入这个account类中
    158. // 3.把账户对象添加到账户集合中去
    159. accounts.add(account);
    160. System.out.println("恭喜你," + userName + "先生/女士,您开户成功,您的卡号是:" + cardId + ",请您妥善保管卡号");
    161. }
    162. private static String getRandomCardid(ArrayList<Account> accounts) { // 为了避免不重复,可以将集合容器传入进形参
    163. Random r = new Random();
    164. while (true) {
    165. // 1.先生成8位数字
    166. String cardId = ""; // 定义一个容器,将每次遍历后的随机数字存在这个变量中
    167. // Random r = new Random(); // 定义了死循环后,这个随机数的对象就可以放到外面去,避免占用堆内存
    168. for (int i = 0; i < 8; i++) {
    169. cardId += r.nextInt(10);// 定义随机数的范围是0-9
    170. }
    171. // 2.判断这个这个8位的卡号是否与其他账户的卡号重复
    172. // 根据整个卡号去查询账户的对象
    173. Account acc = getAccountByCardId(cardId, accounts); // 这里的cardId是传入随机生成的
    174. if (acc == null){ // 如果为null则代表这个卡号没有重复,这个卡号是一个新卡号,可以使用这个卡号作为新注册账户的卡号
    175. return cardId; // 如果没有acc != null代表,卡号重复了,要使用死循环,再次生成新的卡号,再搜索
    176. }
    177. }
    178. }
    179. /**
    180. * 根据卡号查询出一个账户对象出来
    181. * cardId 卡号
    182. * accounts 全部账户的集合
    183. * 账户对象 | null
    184. */
    185. private static Account getAccountByCardId(String cardId,ArrayList<Account> accounts){ // 这里的cardID是自己定义的形参
    186. for (int i = 0; i < accounts.size(); i++) {
    187. Account acc = accounts.get(i); // acc变量是用来存储集合中遍历出来的对象, 遍历出来的对象都可以使用account对象的方法get
    188. if (acc.getCardId().equals(cardId)){
    189. // 如果传入的卡号cardId与账户类的卡号一样,则返回该账户
    190. return acc;
    191. }
    192. }
    193. // 当遍历整个集合中的对象的卡号都不一样是:代表没有该卡号
    194. return null; // 查无此账户
    195. }
    196. }
    1. // 账户类,用来set赋值和get取值
    2. package com.itheima.ATM;
    3. /**
    4. * 账户类
    5. */
    6. public class Account {
    7. /**
    8. * 成员变量,私有
    9. */
    10. private String cardId;
    11. private String userName; // 用户名
    12. private String password; // 密码
    13. private double money; // 账户余额
    14. private double quotaMoney; // 每次提取的额度 // quota是定额的意思
    15. public String getCardId() {
    16. return cardId;
    17. }
    18. public void setCardId(String cardId) {
    19. this.cardId = cardId;
    20. }
    21. public String getUserName() {
    22. return userName;
    23. }
    24. public void setUserName(String userName) {
    25. this.userName = userName;
    26. }
    27. public String getPassword() {
    28. return password;
    29. }
    30. public void setPassword(String password) {
    31. this.password = password;
    32. }
    33. public double getMoney() {
    34. return money;
    35. }
    36. public void setMoney(double money) {
    37. this.money = money;
    38. }
    39. public double getQuotaMoney() {
    40. return quotaMoney;
    41. }
    42. public void setQuotaMoney(double quotaMoney) {
    43. this.quotaMoney = quotaMoney;
    44. }
    45. }