学生管理系统升级版:
User:
JavaBean
App:
业务逻辑
Admin_Log - Word_Game
User – JavaBean
package com.adminlog.StudentSystemUpgrade; public class User { private String username; private String password; private String personID; private String phoneNumber; public User() { } public User(String username, String password, String personID, String phoneNumber) { this.username = username; this.password = password; this.personID = personID; this.phoneNumber = phoneNumber; } /** * 获取 * @return username */ public String getUsername() { return username; } /** * 设置 * @param username */ public void setUsername(String username) { this.username = username; } /** * 获取 * @return password */ public String getPassword() { return password; } /** * 设置 * @param password */ public void setPassword(String password) { this.password = password; } /** * 获取 * @return personID */ public String getPersonID() { return personID; } /** * 设置 * @param personID */ public void setPersonID(String personID) { this.personID = personID; } /** * 获取 * @return phoneNumber */ public String getPhoneNumber() { return phoneNumber; } /** * 设置 * @param phoneNumber */ public void setPhoneNumber(String phoneNumber) { this.phoneNumber = phoneNumber; } }
App – 业务逻辑
package com.adminlog.StudentSystemUpgrade; import java.util.ArrayList; import java.util.Random; import java.util.Scanner; public class App { public static void main(String[] args) { ArrayList<User> list = new ArrayList<>(); Scanner sc = new Scanner(System.in); while (true) { System.out.println("欢迎来到学生管理系统"); System.out.println("请选择操作:\n1. 登录\n2. 注册\n3. 忘记密码\n4. 退出系统"); String choose = sc.next(); switch (choose) { case "1" -> login(list); case "2" -> regist(list); case "3" -> forgetPassword(list); case "4" -> { System.out.println("正在退出···"); System.exit(0); } default -> System.out.println("您的输入有误,请重新输入!"); } } } // 忘记密码 private static void forgetPassword(ArrayList<User> list) { Scanner sc = new Scanner(System.in); System.out.println("请输入用户名:"); String username = sc.next(); boolean flag = contains(list, username); if (!flag) { System.out.println("当前用户" + username + "未注册,请先注册!"); return; } // 键盘录入身份证号码和手机号码 System.out.println("请输入身份证号码:"); String personID = sc.next(); System.out.println("请输入手机号:"); String phoneNumber = sc.next(); // 需要将用户对象通过索引先获取出来。 int index = findIndex(list,username); User user = list.get(index); // 比较用户对象中的手机号码和身份证号码是否相同 if (!(user.getPersonID().equalsIgnoreCase(personID)&&user.getPhoneNumber().equals(phoneNumber))){ System.out.println("身份证号码或手机号码有误,不能修改密码"); // 结束方法 return; } // 当代码执行到这里,表示所有的数据全部验证成功,直接修改即可 String password; while (true) { System.out.println("请输入新的密码:"); password = sc.next(); System.out.println("请再次输入密码:"); String againPassword = sc.next(); if (password.equals(againPassword)){ System.out.println("两次密码输入一致"); break; }else { System.out.println("两次密码输入不一致,请重新输入:"); continue; } } // 直接修改即可 user.setPassword(password); System.out.println("密码修改成功!"); } // 忘记密码:通过索引进行身份证号和手机号码是否相同比较 private static int findIndex(ArrayList<User> list, String username) { for (int i = 0; i < list.size(); i++) { User user = list.get(i); if (user.getUsername().equals(username)){ return i; } } return -1; } // 注册用户 private static void regist(ArrayList<User> list) { // 1. 键盘录入用户名 Scanner sc = new Scanner(System.in); String username; while (true) { System.out.println("请输入用户名:"); username = sc.next(); // 先验证格式是否正确,节约资源 // 判断用户名长度 boolean flag1 = checkUsername(username); if (!flag1) { System.out.println("用户名格式不满足条件,需要重新输入"); continue; } // 校验用户名是否唯一 // username在集合中判断是否存在 boolean flag2 = contains(list, username); if (flag2) { // 如果返回true,表示用户名在集合中已存在,无法注册,需要重新输入 System.out.println("用户名" + username + "已存在,请重新输入!"); } else { // 不存在,当前用户名可用,继续录入下面的其他数据 System.out.println("用户名" + username + "可用"); break; } } // 2. 键盘录入密码 键盘输入密码两次,两次一致才可以进行注册 String password; while (true) { System.out.println("请输入注册用户密码:"); password = sc.next(); System.out.println("确认密码:"); String againPassword = sc.next(); if (!password.equals(againPassword)) { System.out.println("两次密码不一致,请重新输入!"); continue; } else { System.out.println("两次密码一致,继续录入其他数据"); break; } } // 3. 键盘录入身份证号码 不能以0开头 String personID; while (true) { System.out.println("请输入身份证号码:"); personID = sc.next(); boolean flag = checkPersionID(personID); if (flag) { System.out.println("身份证号码满足要求"); break; } else { System.out.println("身份证号码格式有误,请重新输入"); continue; } } // 4. 录入手机号码 要求:1.长度为11位 2. 不能以0开头 3. 必须都是数字 String phoneNumber; while (true) { System.out.println("请输入手机号码:"); phoneNumber = sc.next(); boolean flag = checkPhoneNumber(phoneNumber); if (flag) { System.out.println("手机号码格式正确"); break; } else { System.out.println("手机号码格式有误,请重新输入!"); continue; } } // 用户名,密码,身份证号码,手机号码放到用户对象中 User u = new User(username, password, personID, phoneNumber); // 把用户对象添加集合中 list.add(u); System.out.println("注册成功"); printList(list); } // 输出类 private static void printList(ArrayList<User> list) { for (int i = 0; i < list.size(); i++) { User user = list.get(i); /*System.out.println("用户名:"+user.getUsername()+"\n密码:"+user.getPassword()+ "\n身份证号:"+user.getPersonID()+"\n手机号码:"+user.getPhoneNumber());*/ System.out.println(user.getUsername() + ", " + user.getPassword() + ", " + user.getPersonID() + ", " + user.getPhoneNumber()); } } // 手机号校验 private static boolean checkPhoneNumber(String phoneNumber) { // 要求:1.长度为11位 2. 不能以0开头 3. 必须都是数字 // 1.长度为11位 if (phoneNumber.length() != 11) { return false; } // 2. 不能以0开头 /*char c = phoneNumber.charAt(0); if (c == '0') { return false; }*/ if (phoneNumber.startsWith("0")) { return false; } // 3. 必须都是数字 for (int i = 0; i < phoneNumber.length(); i++) { char c = phoneNumber.charAt(i); if (!(c >= '0' && c <= '9')) { return false; } } // 当循环结束后,表示每一个字符都在0~9之间 return true; } // 身份证号码校验 private static boolean checkPersionID(String personID) { // 是否为18位() if (personID.length() != 18) { return false; } // 不能以0开头 // startsWith方法,判断首位字符是否为所输入数据,若是则返回true反之false boolean flag = personID.startsWith("0"); // char c = personID.charAt(0); if (flag) { return false; } // 前17位必须都是数字 for (int i = 0; i < personID.length() - 1; i++) { char c = personID.charAt(i); // 如果有一个字符不在0~9之间,那么直接返回false if (!(c >= '0' && c <= '9')) { return false; } } // 2023年4月2日 - 17点53分 // 最后一位可以是数字,也可以是大写X或小写x char endChar = personID.charAt(personID.length() - 1); if ((endChar >= '0' && endChar <= '9') || (endChar == 'X') || (endChar == 'x')) { return true; } else { return false; } } // 登录 private static void login(ArrayList<User> list) { Scanner sc = new Scanner(System.in); for (int i = 0; i < 3; i++) { System.out.println("请输入用户名:"); String username = sc.next(); // 判断用户名是否存在 boolean flag = contains(list, username); if (!flag) { System.out.println("用户名:" + username + "未注册,请先注册再登录!"); return; } System.out.println("请输入密码:"); String password = sc.next(); while (true) { String rightCode = getCode(); System.out.print("验证码:\t" + rightCode); System.out.println("请输入验证码:"); String code = sc.next(); if (rightCode.equalsIgnoreCase(code)) { System.out.println("验证码正确"); break; } else { System.out.println("验证码错误,请重新输入!"); continue; } } // 验证用户名和密码是否正确 // 集合中是否包含用户名和密码 // 定义一个方法验证用户名和密码是否正确 // 封装思想的应用: // 将一些零散的数据封装成一个对象 User userInfo = new User(username, password, null, null); boolean result = checkUserInfo(list, userInfo); if (result) { System.out.println("登陆成功,可以使用管理系统"); break; } else { System.out.println("登陆失败,用户名或密码错误"); if (i == 2) { System.out.println("账户" + username + "已被锁定,请联系Admin_Log管理员进行处理"); return; } else { System.out.println("用户名或密码错误,还剩下" + (2 - i) + "此机会"); } } } } // 用户名和密码校验 private static boolean checkUserInfo(ArrayList<User> list, User userInfo) { for (int i = 0; i < list.size(); i++) { User user = list.get(i); if (user.getUsername().equals(userInfo.getUsername()) && user.getPassword().equals(userInfo.getPassword())){ return true; } } return false; } // 用户名是否重复校验 private static boolean contains(ArrayList<User> list, String username) { // 循环遍历集合,得到每一个用户对象 // 使用用户对象中的用户名进行比较 for (int i = 0; i < list.size(); i++) { User user = list.get(i); String rightUsername = user.getUsername(); if (rightUsername.equals(username)) { return true; } } // 如果循环结束,表示集合中所有用户已遍历完毕,若还没有一样的,则返回false return false; } // 用户名命名规则校验: 3<用户名长度长度<15 用户名需为字母+数字格式 private static boolean checkUsername(String username) { int usernameLen = username.length(); if (usernameLen < 3 || usernameLen > 15) { return false; } // 执行到这里表示用户名长度符合 // 继续校验:只能是字母加数字的组合,不能是纯数字 for (int i = 0; i < username.length(); i++) { char c = username.charAt(i); if (!((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9'))) { return false; } } // 执行到此,表示用户名满足两个要求:1. 长度符合 2. 命名符合(字母+数字) // 继续校验:不能是纯数字 int count = 0; for (int i = 0; i < username.length(); i++) { char c = username.charAt(i); if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) { count++; break; } } return count > 0; } // 生成一个验证码 private static String getCode() { // 1. 创建一个集合添加所有大写和小写字母 ArrayList<Character> list = new ArrayList<>(); for (int i = 0; i < 26; i++) { list.add((char) ('a' + i)); list.add((char) ('A' + i)); } // 2. 随机抽取4个字符 StringBuilder sb = new StringBuilder(); Random r = new Random(); for (int i = 0; i < 4; i++) { // 获取随机索引 int index = r.nextInt(list.size()); // 利用随机索引获取随机字符 char c = list.get(index); // 将随机字符添加到sb中 sb.append(c); } // 3. 将随机数字添加到末尾 // 范围:0~9 int number = r.nextInt(10); sb.append(number); // 4. 如果要修改字符串中的内容 // 先把字符串编程字符数组,在数组中修改,然后再创建一个新的字符串 char[] arr = sb.toString().toCharArray(); // 用最后一个索引和随机索引进行交换 int randomIndex = r.nextInt(arr.length); // 最大索引指向的元素和随机索引指向的元素进行交换 char temp = arr[randomIndex]; arr[randomIndex] = arr[arr.length - 1]; arr[arr.length - 1] = temp; return new String(arr); } }