Java 复习笔记 -学生管理系统进阶篇


学生管理系统进阶版

一,需求部分

(一)需求

为学生管理系统书写一个登陆、注册、忘记密码的功能。

只有用户登录成功之后,才能进入到学生管理系统中进行增删改查操作。

(二)分析

1,登录界面

System.out.println("-------------欢迎来到学生管理系统-------------");
System.out.println("请选择操作:1登录 2注册 3忘记密码");

2,用户类

属性:用户名、密码、身份证号码、手机号码

3,注册功能

1,用户名需要满足以下要求:
验证要求:

  • 用户名唯一
  • 用户名长度必须在3~15位之间
  • 只能是字母加数字的组合,但是不能是纯数字

2,密码键盘输入两次,两次一致才可以进行注册。

3,身份证号码需要验证。
验证要求:

  • 长度为18位
  • 不能以0为开头
  • 前17位,必须都是数字
  • 最为一位可以是数字,也可以是大写X或小写x

4,手机号验证。
验证要求:

  • 长度为11位
  • 不能以0为开头
  • 必须都是数字

4,登录功能

1,键盘录入用户名

2,键盘录入密码

3,键盘录入验证码

验证要求:

  • 用户名如果未注册,直接结束方法,并提示:用户名未注册,请先注册

  • 判断验证码是否正确,如不正确,重新输入

  • 再判断用户名和密码是否正确,有3次机会

5,忘记密码

1,键盘录入用户名,判断当前用户名是否存在,如不存在,直接结束方法,并提示:未注册

2,键盘录入身份证号码和手机号码

3,判断当前用户的身份证号码和手机号码是否一致,如果一致,则提示输入密码,进行修改;如果不一致,则提示:账号信息不匹配,修改失败。

6,验证码规则

  • 长度为5

  • 由4位大写或者小写字母和1位数字组成,同一个字母可重复

  • 数字可以出现在任意位置

  • 比如:aQa1K

二,实现部分

(一)登录界面

要为学生管理系统编写一个登录页面,你可以按照以下代码示例进行操作:

import java.util.Scanner;

public class LoginSystem {
    
    
    public static void main(String[] args) {
    
    
        Scanner input = new Scanner(System.in);

        System.out.println("-------------欢迎来到学生管理系统-------------");
        System.out.println("请选择操作:1登录 2注册 3忘记密码");

        int choice = input.nextInt();
        switch (choice) {
    
    
            case 1:
                login();
                break;
            case 2:
                register();
                break;
            case 3:
                forgetPassword();
                break;
            default:
                System.out.println("无效的选择");
                break;
        }
    }

    public static void login() {
    
    
        // TODO: 实现登录逻辑
    }

    public static void register() {
    
    
        // TODO: 实现注册逻辑
    }

    public static void forgetPassword() {
    
    
        // TODO: 实现忘记密码逻辑
    }
}

在上述代码中,我们首先使用Scanner类创建一个接收用户输入的对象input。然后打印欢迎信息和操作选项。接下来,根据用户的选择,使用switch语句调用相应的方法,即login()register()forgetPassword()

你可以在login()register()forgetPassword()方法中实现登录、注册和忘记密码的具体逻辑。根据实际需求,可以使用数据库或文件来存储和验证用户信息。这些方法留给你自己来实现。

(二)编写方法实现注册功能

你可以按照以下代码示例来编写注册方法:

public static void register() {
    
    
    Scanner input = new Scanner(System.in);

    System.out.print("请输入用户名:");
    String username = input.nextLine();

    // 校验用户名
    if (!validateUsername(username)) {
    
    
        System.out.println("用户名不符合要求,请重新注册");
        return;
    }

    System.out.print("请输入密码:");
    String password1 = input.nextLine();

    System.out.print("请再次输入密码:");
    String password2 = input.nextLine();

    // 校验密码
    if (!validatePassword(password1, password2)) {
    
    
        System.out.println("两次输入的密码不一致,请重新注册");
        return;
    }
    
    System.out.print("请输入身份证号码:");
    String idNumber = input.nextLine();
    
    // 校验身份证号码
    if (!validateIdNumber(idNumber)) {
    
    
        System.out.println("身份证号码不符合要求,请重新注册");
        return;
    }
    
    System.out.print("请输入手机号:");
    String phoneNumber = input.nextLine();
    
    // 校验手机号
    if (!validatePhoneNumber(phoneNumber)) {
    
    
        System.out.println("手机号码不符合要求,请重新注册");
        return;
    }

    // 注册成功
    System.out.println("注册成功");
}

public static boolean validateUsername(String username) {
    
    
    // 校验用户名是否唯一
    // TODO: 根据实际需求,编写判断用户名是否唯一的代码

    // 校验用户名长度
    int length = username.length();
    if (length < 3 || length > 15) {
    
    
        return false;
    }

    // 校验用户名是否是字母加数字的组合,但不能是纯数字
    if (!username.matches("^(?=.*[a-zA-Z])(?=.*\\d)[a-zA-Z\\d]+$") || username.matches("^\\d+$")) {
    
    
        return false;
    }

    return true;
}

public static boolean validatePassword(String password1, String password2) {
    
    
    // 校验两次输入的密码是否一致
    return password1.equals(password2);
}

public static boolean validateIdNumber(String idNumber) {
    
    
    // 校验身份证号码长度和开头是否满足要求
    if (idNumber.length() != 18 || idNumber.startsWith("0")) {
    
    
        return false;
    }

    // 校验前17位是否都是数字
    String idNumber17 = idNumber.substring(0, 17);
    if (!idNumber17.matches("^\\d{17}$")) {
    
    
        return false;
    }

    // 校验最后一位是否是数字或大写X或小写x
    String lastChar = idNumber.substring(17);
    if (!lastChar.matches("^\\d|[Xx]$")) {
    
    
        return false;
    }

    return true;
}

public static boolean validatePhoneNumber(String phoneNumber) {
    
    
    // 校验手机号码长度和开头是否满足要求
    if (phoneNumber.length() != 11 || phoneNumber.startsWith("0")) {
    
    
        return false;
    }

    // 校验是否都是数字
    if (!phoneNumber.matches("^\\d+$")) {
    
    
        return false;
    }

    return true;
}

在上述代码中,我们首先使用Scanner类创建一个接收用户输入的对象input。然后,通过validateUsername()方法来校验用户名是否符合要求。在该方法中,我们首先需要根据实际需求编写判断用户名是否唯一的代码。然后,校验用户名长度是否在3~15位之间,以及是否是字母加数字的组合,但不能是纯数字。

接着,通过validatePassword()方法来校验两次输入的密码是否一致。

然后,通过validateIdNumber()方法来校验身份证号码是否符合要求。在该方法中,我们首先校验身份证号码的长度和开头是否满足要求,然后校验前17位是否都是数字,最后一位是否是数字或大写X或小写x。

最后,通过validatePhoneNumber()方法来校验手机号码是否符合要求。在该方法中,我们校验手机号码的长度和开头是否满足要求,以及是否是纯数字。

如果所有的校验都通过,则输出注册成功的提示信息。

需要注意的是,上述代码中的校验逻辑只是简单示例,实际开发中,你可能需要根据具体需求来进行更严格和完善的校验。例如,可以使用正则表达式、外部库、数据库等来实现更复杂的校验逻辑。

(三)编写方法实现登录功能

你可以按照以下代码示例来编写登录方法:

public static void login() {
    
    
    String username = "admin"; // 假设已注册的用户名为admin
    String password = "123456"; // 假设密码为123456
    String verificationCode = "aQa1K"; // 假设验证码为aQa1K

    Scanner input = new Scanner(System.in);
    int attempts = 3; // 登录尝试次数

    while (attempts > 0) {
    
    
        System.out.print("请输入用户名:");
        String inputUsername = input.nextLine();

        // 判断用户名是否正确
        if (!inputUsername.equals(username)) {
    
    
            System.out.println("用户名未注册,请先注册");
            return;
        }

        System.out.print("请输入密码:");
        String inputPassword = input.nextLine();

        System.out.print("请输入验证码:");
        String inputVerificationCode = input.nextLine();

        // 判断验证码是否正确
        if (!inputVerificationCode.equals(verificationCode)) {
    
    
            System.out.println("验证码不正确,请重新输入");
            continue;
        }

        // 判断用户名和密码是否正确
        if (inputUsername.equals(username) && inputPassword.equals(password)) {
    
    
            System.out.println("登录成功");
            return;
        } else {
    
    
            attempts--;
            System.out.println("用户名或密码错误,剩余尝试次数:" + attempts);
        }
    }

    System.out.println("登录失败,已达到最大尝试次数");
}

在上述代码中,我们首先定义了已注册的用户名admin、密码123456和验证码aQa1K。然后使用Scanner类创建一个接收用户输入的对象input。接下来,使用while循环来控制登录尝试次数,初始值为3。

在循环中,首先要求用户输入用户名,然后判断用户名是否正确。如果用户名未注册,则直接结束方法,并提示用户先进行注册。如果用户名正确,则要求用户输入密码和验证码。

接着,判断验证码是否正确。如果验证码不正确,则重新要求用户输入验证码,并继续下一次循环。如果验证码正确,则判断用户名和密码是否正确。如果用户名和密码都正确,则登录成功并结束方法。如果用户名或密码不正确,则尝试次数减1,并提示剩余尝试次数。

当尝试次数减到0时,循环结束,并提示登录失败。

这个示例只是简单地演示了登录方法的逻辑,实际开发中,你还需要结合具体需求来实现更完整和安全的登录功能。例如,可以使用数据库来存储和验证用户信息,使用加密算法对密码进行加密等。

(四)编写方法实现忘记密码功能

public static void forgetPassword() {
    
    
    Scanner input = new Scanner(System.in);

    System.out.print("请输入用户名:");
    String username = input.nextLine();

    // 判断用户名是否存在
    if (!userMap.containsKey(username)) {
    
    
        System.out.println("未注册");
        return;
    }

    System.out.print("请输入身份证号码:");
    String idNumber = input.nextLine();

    System.out.print("请输入手机号码:");
    String phoneNumber = input.nextLine();

    UserInfo userInfo = userMap.get(username);

    // 判断身份证号码和手机号码是否一致
    if (userInfo.getIdNumber().equals(idNumber) && userInfo.getPhoneNumber().equals(phoneNumber)) {
    
    
        System.out.print("请输入新密码:");
        String newPassword = input.nextLine();

        // 修改密码
        userInfo.setPassword(newPassword);

        System.out.println("密码修改成功");
    } else {
    
    
        System.out.println("账号信息不匹配,修改失败");
    }
}

public static void registerUser(String username, String password, String idNumber, String phoneNumber) {
    
    
    UserInfo userInfo = new UserInfo(username, password, idNumber, phoneNumber);
    userMap.put(username, userInfo);
}

static class UserInfo {
    
    
    private String username;
    private String password;
    private String idNumber;
    private String phoneNumber;

    public UserInfo(String username, String password, String idNumber, String phoneNumber) {
    
    
        this.username = username;
        this.password = password;
        this.idNumber = idNumber;
        this.phoneNumber = phoneNumber;
    }

    public String getUsername() {
    
    
        return username;
    }

    public String getPassword() {
    
    
        return password;
    }

    public void setPassword(String password) {
    
    
        this.password = password;
    }

    public String getIdNumber() {
    
    
        return idNumber;
    }

    public String getPhoneNumber() {
    
    
        return phoneNumber;
    }
}

(五)编写生成验证码方法

public static void generateCaptcha() {
    
                      
    StringBuilder captcha = new StringBuilder();        
    Random random = new Random();                       
                                                        
    // 生成4位字母                                           
    for (int i = 0; i < 4; i++) {
    
                           
        char letter = (char) (random.nextInt(26) + 'a');
        captcha.append(letter);                         
    }                                                   
                                                        
    // 生成1位数字                                           
    captcha.append(random.nextInt(10));                 
                                                        
    System.out.println("验证码为:" + captcha.toString());   
}                                                       

(六)集成代码,实现系统

package net.army.java.studentmanger;

import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import java.util.Scanner;

/**
 * 功能:学生管理系统(注册、登录和忘记)
 * 日期:2023年09月02日
 * 作者:梁辰兴
 */

public class StudentManagementSystem {
    
    
    private static Map<String, User> userMap = new HashMap<>();
    private static String loggedInUser = null;
    private static int loginAttempts = 0;

    public static void main(String[] args) {
    
    
        Scanner input = new Scanner(System.in);

        while (true) {
    
    
            System.out.println("-------------欢迎来到学生管理系统-------------");
            System.out.println("请选择操作:1登录 2注册 3忘记密码");

            int choice = input.nextInt();
            input.nextLine(); // 清除输入缓冲区的换行符

            switch (choice) {
    
    
                case 1:
                    login();
                    break;
                case 2:
                    register();
                    break;
                case 3:
                    forgotPassword();
                    break;
                default:
                    System.out.println("无效的操作,请重新选择!");
            }
        }
    }

    public static void generateCaptcha() {
    
    
        StringBuilder captcha = new StringBuilder();
        Random random = new Random();

        // 生成4位字母
        for (int i = 0; i < 4; i++) {
    
    
            char letter = (char) (random.nextInt(26) + 'a');
            captcha.append(letter);
        }

        // 生成1位数字
        captcha.append(random.nextInt(10));

        System.out.println("验证码为:" + captcha.toString());
    }

    public static void login() {
    
    
        Scanner input = new Scanner(System.in);

        System.out.print("请输入用户名:");
        String username = input.nextLine();

        System.out.print("请输入密码:");
        String password = input.nextLine();

        generateCaptcha();
        System.out.print("请输入验证码:");
        String captcha = input.nextLine();

        if (!userMap.containsKey(username)) {
    
    
            System.out.println("用户名未注册,请先注册!");
            return;
        }

        if (!validateCaptcha(captcha)) {
    
    
            System.out.println("验证码错误,请重新输入!");
            return;
        }

        User user = userMap.get(username);
        if (user.getPassword().equals(password)) {
    
    
            loggedInUser = username;
            System.out.println("登录成功!");
        } else {
    
    
            loginAttempts++;
            if (loginAttempts < 3) {
    
    
                System.out.println("用户名或密码错误,请重新输入!");
            } else {
    
    
                System.out.println("登录失败次数过多,退出系统!");
                System.exit(0);
            }
        }
    }

    public static void register() {
    
    
        Scanner input = new Scanner(System.in);

        System.out.print("请输入用户名:");
        String username = input.nextLine();

        if (userMap.containsKey(username)) {
    
    
            System.out.println("用户名已存在,请重新输入!");
            return;
        }

        if (!validateUsername(username)) {
    
    
            System.out.println("用户名不符合要求,请重新输入!");
            return;
        }

        System.out.print("请输入密码:");
        String password1 = input.nextLine();

        System.out.print("请再次输入密码:");
        String password2 = input.nextLine();

        if (!password1.equals(password2)) {
    
    
            System.out.println("两次输入的密码不一致,请重新输入!");
            return;
        }

        System.out.print("请输入身份证号码:");
        String idCard = input.nextLine();

        if (!validateIdCard(idCard)) {
    
    
            System.out.println("身份证号码不符合要求,请重新输入!");
            return;
        }

        System.out.print("请输入手机号码:");
        String phoneNumber = input.nextLine();

        if (!validatePhoneNumber(phoneNumber)) {
    
    
            System.out.println("手机号码不符合要求,请重新输入!");
            return;
        }

        User user = new User(username, password1, idCard, phoneNumber);
        userMap.put(username, user);

        System.out.println("注册成功!");
    }

    public static void forgotPassword() {
    
    
        Scanner input = new Scanner(System.in);

        System.out.print("请输入用户名:");
        String username = input.nextLine();

        if (!userMap.containsKey(username)) {
    
    
            System.out.println("未注册的用户名,请先注册!");
            return;
        }

        User user = userMap.get(username);

        System.out.print("请输入身份证号码:");
        String idCard = input.nextLine();

        if (!user.getIdCard().equals(idCard)) {
    
    
            System.out.println("账号信息不匹配,修改失败!");
            return;
        }

        System.out.print("请输入手机号码:");
        String phoneNumber = input.nextLine();

        if (!user.getPhoneNumber().equals(phoneNumber)) {
    
    
            System.out.println("账号信息不匹配,修改失败!");
            return;
        }

        System.out.print("请输入新密码:");
        String newPassword = input.nextLine();

        user.setPassword(newPassword);
        System.out.println("密码修改成功!");
    }

    public static boolean validateUsername(String username) {
    
    
        // 验证用户名的规则
        // 用户名唯一
        // 用户名长度必须在3~15位之间
        // 只能是字母加数字的组合,但是不能是纯数字
        if (userMap.containsKey(username)) {
    
    
            return false;
        }

        int length = username.length();
        if (length < 3 || length > 15) {
    
    
            return false;
        }

        boolean containsLetter = false;
        boolean containsDigit = false;

        for (char c : username.toCharArray()) {
    
    
            if (Character.isLetter(c)) {
    
    
                containsLetter = true;
            } else if (Character.isDigit(c)) {
    
    
                containsDigit = true;
            }
        }

        if (!containsLetter || !containsDigit) {
    
    
            return false;
        }

        if (containsDigit && !containsLetter && length == 1) {
    
    
            return false;
        }

        return true;
    }

    public static boolean validateIdCard(String idCard) {
    
    
        // 验证身份证号码的规则
        // 长度为18位
        // 不能以0为开头
        // 前17位,必须都是数字
        // 最后一位可以是数字,也可以是大写X或小写x
        if (idCard.length() != 18) {
    
    
            return false;
        }

        if (idCard.startsWith("0")) {
    
    
            return false;
        }

        String idCardDigits = idCard.substring(0, 17);
        String idCardLastDigit = idCard.substring(17);

        if (!idCardDigits.matches("\\d+")) {
    
    
            return false;
        }

        if (!idCardLastDigit.matches("[\\dXx]")) {
    
    
            return false;
        }

        return true;
    }

    public static boolean validatePhoneNumber(String phoneNumber) {
    
    
        // 验证手机号码的规则
        // 长度为11位
        // 不能以0为开头
        // 必须都是数字
        if (phoneNumber.length() != 11) {
    
    
            return false;
        }

        if (phoneNumber.startsWith("0")) {
    
    
            return false;
        }

        if (!phoneNumber.matches("\\d+")) {
    
    
            return false;
        }

        return true;
    }

    public static boolean validateCaptcha(String captcha) {
    
    
        // 验证码的规则
        // 长度为5
        // 由4位大写或者小写字母和1位数字组成,同一个字母可重复
        // 数字可以出现在任意位置
        if (captcha.length() != 5) {
    
    
            return false;
        }

        int digitCount = 0;
        int letterCount = 0;
        char lastChar = '\0';

        for (char c : captcha.toCharArray()) {
    
    
            if (Character.isDigit(c)) {
    
    
                digitCount++;
            } else if (Character.isLetter(c)) {
    
    
                letterCount++;
                if (c == lastChar) {
    
    
                    return false;
                }
                lastChar = c;
            } else {
    
    
                return false;
            }
        }

        if (digitCount == 0 || letterCount == 0) {
    
    
            return false;
        }

        return true;
    }

    static class User {
    
    
        private String username;
        private String password;
        private String idCard;
        private String phoneNumber;

        public User(String username, String password, String idCard, String phoneNumber) {
    
    
            this.username = username;
            this.password = password;
            this.idCard = idCard;
            this.phoneNumber = phoneNumber;
        }

        public String getUsername() {
    
    
            return username;
        }

        public String getPassword() {
    
    
            return password;
        }

        public void setPassword(String password) {
    
    
            this.password = password;
        }

        public String getIdCard() {
    
    
            return idCard;
        }

        public String getPhoneNumber() {
    
    
            return phoneNumber;
        }
    }
}

请注意,以上代码只是一个简单的示例,可能还有其他更复杂的验证规则需要根据实际需求进行实现和调整。

运行效果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_62617719/article/details/132641154
今日推荐