JAVA项目(一) | 手撕学生管理系统

个人主页

文章专栏

嘻嘻嘻,插播一个最近喜欢看的羽坛运动员~
在这里插入图片描述

需求文档

需求:

采取控制台的方式去书写学生管理系统

分析:

初始菜单:

"-------欢迎来到黑马学生管理系统-------"
"1:添加学生"
"2: 删除学生"
"3:修改学生"
"4:查询学生"
"5:退出"
"请输入您的选择"

学生类:

属性:id,姓名,年龄,家庭住址

添加功能:

键盘录入每一个学生信息并添加,需要满足以下要求:

  • id唯一

删除功能:

键盘录入要删除的学生的id,需要满足以下要求:

  • id存在删除
  • id不存在,需要 提示不存在,并回到初始菜单

修改功能:

键盘录入需要修改的学生id,需要满足以下要求

  • id存在,继续录入其他信息
  • id不存在,需要提示不存在,并回到初始菜单

查询功能:

打印所有的学生信息,需要满足以下条件

  • 如果没有学生信息,提示:当前无学生信息,请添加后再查询

  • 如果有学生信息,需要按照以下格式输出。(不用过于纠结对齐的问题)

    id         姓名    年龄    家庭住址
    chen001    张三    17      南京
    chen002    李四    18      北京
    chen003    王五    19      上海
    chen004    赵六    18      广州
    

代码实现

代码部分

Java Bean 类

package StudentSystem;

public class Student {
    private String id;
    private String name;
    private int age;
    private String address;


    public Student() {
    }

    public Student(String id, String name, int age, String address) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.address = address;
    }

    /**
     * 获取
     * @return id
     */
    public String getId() {
        return id;
    }

    /**
     * 设置
     * @param id
     */
    public void setId(String id) {
        this.id = id;
    }

    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取
     * @return age
     */
    public int getAge() {
        return age;
    }

    /**
     * 设置
     * @param age
     */
    public void setAge(int age) {
        this.age = age;
    }

    /**
     * 获取
     * @return address
     */
    public String getAddress() {
        return address;
    }

    /**
     * 设置
     * @param address
     */
    public void setAddress(String address) {
        this.address = address;
    }

    public String toString() {
        return "Student{id = " + id + ", name = " + name + ", age = " + age + ", address = " + address + "}";
    }
}

package StudentSystem;

import java.util.ArrayList;
import java.util.Scanner;

public class studentSystem {
    public static void main(String[] args) {
        ArrayList<Student> list = new ArrayList<>();

        while (true) {
            System.out.println("----------欢迎来到黑马学生管理系统------------");
            System.out.println("1.添加学生");
            System.out.println("2.删除学生");
            System.out.println("3.修改学生");
            System.out.println("4.查询学生");
            System.out.println("5.退出");
            System.out.println("请输入你的选择:");
            Scanner sc = new Scanner(System.in);
            String choose = sc.next();
            switch (choose) {
                case "1"->addStudent(list);
                case "2"->deleteStudent(list);
                case "3"->updateStudent(list);
                case "4"->findStudent(list);
                case "5"->{
                    System.out.println("退出");
                    System.exit(0);//停止jvm虚拟机
                }
                default->System.out.println("没有这个选项");
            }
        }
    }
    //添加学生的代码逻辑
    public static void addStudent(ArrayList<Student> list){
        //空参构造
        Student s = new Student();
        System.out.println("添加学生");
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入学生的id:");
        String id = sc.next();
        // 问题 1:修正 contains 方法调用,创建 Student 对象传入
        Student tempStudent = new Student();
        tempStudent.setId(id);
        boolean flag = contains(list, tempStudent);
        if (flag) {
            System.out.println("id重复,请重新输入");
            return;
        } else {
            System.out.println("id不重复");
            s.setId(id);
        }

        System.out.println("请输入学生的姓名:");
        // 问题 2:正常使用 sc.next() 获取输入
        String name = sc.next();
        s.setName(name);

        System.out.println("请输入学生的年龄:");
        int age = sc.nextInt();
        s.setAge(age);

        System.out.println("请输入学生的家庭住址:");
        String gender = sc.next();
        s.setAddress(gender);
        //将学生对象添加到集合中
        list.add(s);
        System.out.println("添加学生成功");

    }
    //删除学生的代码逻辑
    public static void deleteStudent(ArrayList<Student> list){
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入你要删除的学生的id:");
        String id = sc.next();
        int index = getIndex(list,id);
        if(index>=0){
            list.remove(index);
            System.out.println("删除学生成功");
        }else{
            System.out.println("该信息不存在,请重新输入");
        }
    }
    //修改学生的代码逻辑
    public static void updateStudent(ArrayList<Student> list){
        System.out.println("修改学生");
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入你要修改的学生的id:");
        String id = sc.next();
        int index = getIndex(list,id);
        if(index>=0){
            Student s = list.get(index);

            System.out.println("请输入学生的姓名:");
            String name = sc.next();
            s.setName(name);

            System.out.println("请输入学生的年龄:");
            int age = sc.nextInt();
            s.setAge(age);

            System.out.println("请输入学生的家庭住址:");
            String gender = sc.next();
            s.setAddress(gender);


            System.out.println("修改学生成功");
        }else{
            System.out.println("该信息不存在,请重新输入");
        }
    }
    //查询学生的代码逻辑
    public static void findStudent(ArrayList<Student> list){
        System.out.println("查询学生");
        if (list.size()==0){
            System.out.println("无信息,请先添加信息");
            return;
        }
        //显示表头信息
        System.out.println("学号\t\t姓名\t\t年龄\t\t家庭住址");
        //当代码执行到这里,说明list集合中有数据,可以继续
        for (int i = 0; i < list.size(); i++) {
            Student s = list.get(i);
            System.out.println(s.getId()+"\t"+s.getName()+"\t"+s.getAge()+"\t\t"+s.getAddress());

        }
    }
    public static boolean contains(ArrayList<Student> list, Student s){
       // 循环遍历集合,获取每一个学生对象,使用学生对象
       for (int i = 0; i < list.size(); i++) {
            // 拿到学生对象,获取id进行判断
            Student s1 = list.get(i);
            String id1 = s1.getId();
            String id = s.getId();
            if (id.equals(id1)) {
                System.out.println("id重复");
                return true;
            }
       }
       // 当代码执行到这里,说明list集合中没有和s对象相同的id
       return false;
    }

    public static int getIndex(ArrayList<Student> list, String id){
        for (int i = 0; i < list.size(); i++) {
            Student s = list.get(i);
            String sid = s.getId();
            if (sid.equals(id)) {
                return i;
            }
        }
        return -1;
    }
}


详解代码:

1. 包声明与导入

package StudentSystem;

import java.util.ArrayList;
import java.util.Scanner;
  • package StudentSystem;:声明该 Java 类属于 StudentSystem 包。
  • import java.util.ArrayList;:导入 ArrayList 类,用于存储学生对象。
  • import java.util.Scanner;:导入 Scanner 类,用于从控制台读取用户输入。

2. 主类 studentSystemmain 方法

public class studentSystem {
    public static void main(String[] args) {
        ArrayList<Student> list = new ArrayList<>();

        while (true) {
            System.out.println("----------欢迎来到黑马学生管理系统------------");
            System.out.println("1.添加学生");
            System.out.println("2.删除学生");
            System.out.println("3.修改学生");
            System.out.println("4.查询学生");
            System.out.println("5.退出");
            System.out.println("请输入你的选择:");
            Scanner sc = new Scanner(System.in);
            String choose = sc.next();
            switch (choose) {
                case "1"->addStudent(list);
                case "2"->deleteStudent(list);
                case "3"->updateStudent(list);
                case "4"->findStudent(list);
                case "5"->{
                    System.out.println("退出");
                    System.exit(0);
                }
                default->System.out.println("没有这个选项");
            }
        }
    }
  • ArrayList<Student> list = new ArrayList<>();:创建一个 ArrayList 集合,用于存储 Student 对象。
  • while (true):使用无限循环,让程序持续运行,直到用户选择退出。
  • 通过 System.out.println 输出菜单选项,提示用户输入选择。
  • Scanner sc = new Scanner(System.in);:创建 Scanner 对象,用于读取用户输入。
  • switch 语句根据用户输入的选择调用相应的方法,若输入为 5,则调用 System.exit(0) 退出程序;若输入无效,输出提示信息。

3. 添加学生方法 addStudent

public static void addStudent(ArrayList<Student> list){
    Student s = new Student();
    System.out.println("添加学生");
    Scanner sc = new Scanner(System.in);
    System.out.println("请输入学生的id:");
    String id = sc.next();
    Student tempStudent = new Student();
    tempStudent.setId(id);
    boolean flag = contains(list, tempStudent);
    if (flag) {
        System.out.println("id重复,请重新输入");
        return;
    } else {
        System.out.println("id不重复");
        s.setId(id);
    }

    System.out.println("请输入学生的姓名:");
    String name = sc.next();
    s.setName(name);

    System.out.println("请输入学生的年龄:");
    int age = sc.nextInt();
    s.setAge(age);

    System.out.println("请输入学生的家庭住址:");
    String gender = sc.next();
    s.setAddress(gender);
    list.add(s);
    System.out.println("添加学生成功");
}
  • 创建一个 Student 对象 s 用于存储学生信息。
  • 提示用户输入学生的 id,并创建一个临时 Student 对象 tempStudent,将输入的 id 设置给它。
  • 调用 contains 方法检查 id 是否重复,若重复则输出提示信息并返回;若不重复,则将 id 设置给 s
  • 依次提示用户输入学生的姓名、年龄和家庭住址,并将这些信息设置给 s
  • s 添加到集合 list 中,并输出添加成功的信息。

4. 删除学生方法 deleteStudent

public static void deleteStudent(ArrayList<Student> list){
    Scanner sc = new Scanner(System.in);
    System.out.println("请输入你要删除的学生的id:");
    String id = sc.next();
    int index = getIndex(list,id);
    if(index>=0){
        list.remove(index);
        System.out.println("删除学生成功");
    }else{
        System.out.println("该信息不存在,请重新输入");
    }
}
  • 提示用户输入要删除的学生的 id
  • 调用 getIndex 方法获取该 id 对应的学生在集合中的索引。
  • 若索引大于等于 0,则删除该学生并输出删除成功的信息;若索引为 -1,则输出信息不存在的提示。

5. 修改学生方法 updateStudent

public static void updateStudent(ArrayList<Student> list){
    System.out.println("修改学生");
    Scanner sc = new Scanner(System.in);
    System.out.println("请输入你要修改的学生的id:");
    String id = sc.next();
    int index = getIndex(list,id);
    if(index>=0){
        Student s = list.get(index);

        System.out.println("请输入学生的姓名:");
        String name = sc.next();
        s.setName(name);

        System.out.println("请输入学生的年龄:");
        int age = sc.nextInt();
        s.setAge(age);

        System.out.println("请输入学生的家庭住址:");
        String gender = sc.next();
        s.setAddress(gender);

        System.out.println("修改学生成功");
    }else{
        System.out.println("该信息不存在,请重新输入");
    }
}
  • 提示用户输入要修改的学生的 id
  • 调用 getIndex 方法获取该 id 对应的学生在集合中的索引。
  • 若索引大于等于 0,则获取该学生对象,提示用户输入新的姓名、年龄和家庭住址,并更新学生信息;若索引为 -1,则输出信息不存在的提示。

6. 查询学生方法 findStudent

public static void findStudent(ArrayList<Student> list){
    System.out.println("查询学生");
    if (list.size()==0){
        System.out.println("无信息,请先添加信息");
        return;
    }
    System.out.println("学号\t\t姓名\t\t年龄\t\t家庭住址");
    for (int i = 0; i < list.size(); i++) {
        Student s = list.get(i);
        System.out.println(s.getId()+"\t"+s.getName()+"\t"+s.getAge()+"\t\t"+s.getAddress());
    }
}
  • 若集合 list 为空,则输出无信息的提示并返回。
  • 输出表头信息,然后遍历集合,输出每个学生的信息。

7. 辅助方法 containsgetIndex

public static boolean contains(ArrayList<Student> list, Student s){
    for (int i = 0; i < list.size(); i++) {
        Student s1 = list.get(i);
        String id1 = s1.getId();
        String id = s.getId();
        if (id.equals(id1)) {
            System.out.println("id重复");
            return true;
        }
    }
    return false;
}

public static int getIndex(ArrayList<Student> list, String id){
    for (int i = 0; i < list.size(); i++) {
        Student s = list.get(i);
        String sid = s.getId();
        if (sid.equals(id)) {
            return i;
        }
    }
    return -1;
}
  • contains 方法用于检查集合中是否存在与给定 Student 对象 id 相同的学生,若存在则返回 true,否则返回 false
  • getIndex 方法用于获取给定 id 对应的学生在集合中的索引,若存在则返回索引,否则返回 -1。

注意事项

  • 代码中假设存在 Student 类,该类应包含 idnameageaddress 属性,以及相应的 getter 和 setter 方法。
  • 代码未对用户输入进行严格的验证,例如输入的年龄是否为合法整数等,实际应用中可添加更多的输入验证逻辑。

升级版学生管理系统

需求文档

需求

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

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

分析:

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

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

注册功能:
  1. 用户名需要满足以下要求:

    验证要求:

    ​ 用户名唯一

    ​ 用户名长度必须在3-15位之间

    ​ 只能是字母加数字组合,但是不能是纯数字

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

  3. 身份证号码需要验证

    验证要求:

    ​ 长度为18位

    ​ 不能以0为开头

    ​ 前17位,必须都是数字

    ​ 最为一位可以是数字,也可以是大写X或小写x

  4. 手机号验证

    验证要求:

    ​ 长度为11位

    ​ 不能以0位开头

    ​ 必须都是数字

登录功能:
  1. 键盘录入用户名
  2. 键盘录入密码
  3. 键盘录入验证码

验证要求:

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

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

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

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

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

  3. 判断当前用户的身份证号和手机号码是否一致

    如果一致,则提示输入密码,进行修改

    如果不一致,则提示:账号信息不匹配,修改失败

验证码规则:

​ 长度为5

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

代码实现

代码部分

import java.util.*;

// User 类遵循 JavaBean 规范
class User {
    private String username;
    private String password;
    private String idNumber;
    private String phoneNumber;

    // 无参构造函数
    public User() {
    }

    // 带参构造函数
    public User(String username, String password, String idNumber, String phoneNumber) {
        this.username = username;
        this.password = password;
        this.idNumber = idNumber;
        this.phoneNumber = phoneNumber;
    }

    // Getter 方法
    public String getUsername() {
        return username;
    }

    public String getPassword() {
        return password;
    }

    public String getIdNumber() {
        return idNumber;
    }

    public String getPhoneNumber() {
        return phoneNumber;
    }

    // Setter 方法
    public void setUsername(String username) {
        this.username = username;
    }

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

    public void setIdNumber(String idNumber) {
        this.idNumber = idNumber;
    }

    public void setPhoneNumber(String phoneNumber) {
        this.phoneNumber = phoneNumber;
    }
}

public class StudentManagementSystem {
    private static List<User> users = new ArrayList<>();
    private static Scanner scanner = new Scanner(System.in);

    public static void main(String[] args) {
        while (true) {
            System.out.println("欢迎来到学生管理系统");
            System.out.println("请先选择操作 1登录 2注册 3忘记密码 4退出");
            int choice = scanner.nextInt();
            scanner.nextLine(); // 消耗换行符

            switch (choice) {
                case 1:
                    login();
                    break;
                case 2:
                    register();
                    break;
                case 3:
                    forgetPassword();
                    break;
                case 4:
                    System.out.println("感谢使用,再见!");
                    return;
                default:
                    System.out.println("无效的选择,请重新输入。");
            }
        }
    }

    private static void register() {
        while (true) {
            System.out.println("请输入用户名:");
            String username = scanner.nextLine();
            if (!isValidUsername(username)) {
                System.out.println("用户名不满足要求,请重新输入。");
                continue;
            }
            if (isUsernameExists(username)) {
                System.out.println("用户名已存在,请重新输入。");
                continue;
            }

            String password;
            while (true) {
                System.out.println("请输入密码:");
                String pwd1 = scanner.nextLine();
                System.out.println("请再次输入密码:");
                String pwd2 = scanner.nextLine();
                if (pwd1.equals(pwd2)) {
                    password = pwd1;
                    break;
                } else {
                    System.out.println("两次输入的密码不一致,请重新输入。");
                }
            }

            String idNumber;
            while (true) {
                System.out.println("请输入身份证号码:");
                idNumber = scanner.nextLine();
                if (isValidIdNumber(idNumber)) {
                    break;
                } else {
                    System.out.println("身份证号码不满足要求,请重新输入。");
                }
            }

            String phoneNumber;
            while (true) {
                System.out.println("请输入手机号码:");
                phoneNumber = scanner.nextLine();
                if (isValidPhoneNumber(phoneNumber)) {
                    break;
                } else {
                    System.out.println("手机号码不满足要求,请重新输入。");
                }
            }

            User newUser = new User();
            newUser.setUsername(username);
            newUser.setPassword(password);
            newUser.setIdNumber(idNumber);
            newUser.setPhoneNumber(phoneNumber);
            users.add(newUser);
            System.out.println("注册成功!");
            break;
        }
    }

    private static boolean isValidUsername(String username) {
        if (username.length() < 3 || username.length() > 15) {
            return false;
        }
        if (username.matches("[0-9]+")) {
            return false;
        }
        return username.matches("[a-zA-Z0-9]+");
    }

    private static boolean isUsernameExists(String username) {
        for (User user : users) {
            if (user.getUsername().equals(username)) {
                return true;
            }
        }
        return false;
    }

    private static boolean isValidIdNumber(String idNumber) {
        if (idNumber.length() != 18) {
            return false;
        }
        if (idNumber.startsWith("0")) {
            return false;
        }
        String first17 = idNumber.substring(0, 17);
        if (!first17.matches("[0-9]+")) {
            return false;
        }
        char lastChar = idNumber.charAt(17);
        return Character.isDigit(lastChar) || lastChar == 'X' || lastChar == 'x';
    }

    private static boolean isValidPhoneNumber(String phoneNumber) {
        if (phoneNumber.length() != 11) {
            return false;
        }
        if (phoneNumber.startsWith("0")) {
            return false;
        }
        return phoneNumber.matches("[0-9]+");
    }

    private static void login() {
        System.out.println("请输入用户名:");
        String username = scanner.nextLine();
        if (!isUsernameExists(username)) {
            System.out.println("用户名未注册,请先注册");
            return;
        }

        int attempts = 3;
        while (attempts > 0) {
            System.out.println("请输入密码:");
            String password = scanner.nextLine();
            String captcha = generateCaptcha();
            System.out.println("验证码:" + captcha);
            System.out.println("请输入验证码:");
            String inputCaptcha = scanner.nextLine();
            if (!inputCaptcha.equals(captcha)) {
                System.out.println("验证码不正确,请重新输入。");
                continue;
            }

            for (User user : users) {
                if (user.getUsername().equals(username) && user.getPassword().equals(password)) {
                    System.out.println("登录成功!");
                    studentManagement();
                    return;
                }
            }
            attempts--;
            System.out.println("用户名或密码错误,你还有 " + attempts + " 次机会。");
        }
        System.out.println("登录失败,尝试次数已用完。");
    }

    private static String generateCaptcha() {
        Random random = new Random();
        StringBuilder captcha = new StringBuilder();
        for (int i = 0; i < 4; i++) {
            int charCase = random.nextInt(2);
            if (charCase == 0) {
                captcha.append((char) (random.nextInt(26) + 'a'));
            } else {
                captcha.append((char) (random.nextInt(26) + 'A'));
            }
        }
        captcha.append(random.nextInt(10));
        return captcha.toString();
    }

    private static void forgetPassword() {
        System.out.println("请输入用户名:");
        String username = scanner.nextLine();
        if (!isUsernameExists(username)) {
            System.out.println("未注册");
            return;
        }

        System.out.println("请输入身份证号码:");
        String idNumber = scanner.nextLine();
        System.out.println("请输入手机号码:");
        String phoneNumber = scanner.nextLine();

        for (User user : users) {
            if (user.getUsername().equals(username) && user.getIdNumber().equals(idNumber) && user.getPhoneNumber().equals(phoneNumber)) {
                System.out.println("请输入新密码:");
                String newPassword = scanner.nextLine();
                user.setPassword(newPassword);
                System.out.println("密码修改成功!");
                return;
            }
        }
        System.out.println("账号信息不匹配,修改失败");
    }

    private static void studentManagement() {
        System.out.println("进入学生管理系统,你可以进行增删改查操作。");
        // 这里可以实现学生信息的增删改查操作
        while (true) {
            System.out.println("请选择操作:1添加学生 2删除学生 3修改学生信息 4查询学生信息 5退出管理系统");
            int choice = scanner.nextInt();
            scanner.nextLine(); // 消耗换行符
            switch (choice) {
                case 1:
                    System.out.println("添加学生功能待实现。");
                    break;
                case 2:
                    System.out.println("删除学生功能待实现。");
                    break;
                case 3:
                    System.out.println("修改学生信息功能待实现。");
                    break;
                case 4:
                    System.out.println("查询学生信息功能待实现。");
                    break;
                case 5:
                    System.out.println("退出学生管理系统。");
                    return;
                default:
                    System.out.println("无效的选择,请重新输入。");
            }
        }
    }
}    

详解代码

整体结构

代码主要由两个部分组成:User 类和 StudentManagementSystem 类。User 类是一个 JavaBean 类,用于封装用户的相关信息;StudentManagementSystem 类是主程序类,包含了系统的主要功能逻辑,如登录、注册、忘记密码以及学生管理操作等。

User
class User {
    private String username;
    private String password;
    private String idNumber;
    private String phoneNumber;

    // 无参构造函数
    public User() {
    }

    // 带参构造函数
    public User(String username, String password, String idNumber, String phoneNumber) {
        this.username = username;
        this.password = password;
        this.idNumber = idNumber;
        this.phoneNumber = phoneNumber;
    }

    // Getter 方法
    public String getUsername() {
        return username;
    }

    public String getPassword() {
        return password;
    }

    public String getIdNumber() {
        return idNumber;
    }

    public String getPhoneNumber() {
        return phoneNumber;
    }

    // Setter 方法
    public void setUsername(String username) {
        this.username = username;
    }

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

    public void setIdNumber(String idNumber) {
        this.idNumber = idNumber;
    }

    public void setPhoneNumber(String phoneNumber) {
        this.phoneNumber = phoneNumber;
    }
}
  • 属性

    • username:用户的用户名。
    • password:用户的密码。
    • idNumber:用户的身份证号码。
    • phoneNumber:用户的手机号码。
  • 构造函数

    • 无参构造函数:用于创建一个空的 User 对象。
    • 带参构造函数:用于在创建对象时直接初始化用户的信息。
  • Getter 和 Setter 方法

    • Getter 方法用于获取对象的属性值。
    • Setter 方法用于设置对象的属性值。通过这种方式,保证了数据的封装性,外部类不能直接访问和修改对象的属性,只能通过这些公共方法来操作。
StudentManagementSystem
public class StudentManagementSystem {
    private static List<User> users = new ArrayList<>();
    private static Scanner scanner = new Scanner(System.in);
  • 静态变量

    • users:一个 List 集合,用于存储所有已注册的用户信息。
    • scanner:用于从控制台读取用户输入的信息。
main 方法
public static void main(String[] args) {
    while (true) {
        System.out.println("欢迎来到学生管理系统");
        System.out.println("请先选择操作 1登录 2注册 3忘记密码 4退出");
        int choice = scanner.nextInt();
        scanner.nextLine(); // 消耗换行符

        switch (choice) {
            case 1:
                login();
                break;
            case 2:
                register();
                break;
            case 3:
                forgetPassword();
                break;
            case 4:
                System.out.println("感谢使用,再见!");
                return;
            default:
                System.out.println("无效的选择,请重新输入。");
        }
    }
}
  • 这是程序的入口方法,使用一个无限循环不断显示系统的主菜单,让用户选择操作。
  • 根据用户的选择,调用相应的方法(loginregisterforgetPassword)或退出程序。
  • scanner.nextLine() 用于消耗掉 scanner.nextInt() 输入时产生的换行符,避免影响后续的输入操作。
register 方法
private static void register() {
    while (true) {
        System.out.println("请输入用户名:");
        String username = scanner.nextLine();
        if (!isValidUsername(username)) {
            System.out.println("用户名不满足要求,请重新输入。");
            continue;
        }
        if (isUsernameExists(username)) {
            System.out.println("用户名已存在,请重新输入。");
            continue;
        }

        String password;
        while (true) {
            System.out.println("请输入密码:");
            String pwd1 = scanner.nextLine();
            System.out.println("请再次输入密码:");
            String pwd2 = scanner.nextLine();
            if (pwd1.equals(pwd2)) {
                password = pwd1;
                break;
            } else {
                System.out.println("两次输入的密码不一致,请重新输入。");
            }
        }

        String idNumber;
        while (true) {
            System.out.println("请输入身份证号码:");
            idNumber = scanner.nextLine();
            if (isValidIdNumber(idNumber)) {
                break;
            } else {
                System.out.println("身份证号码不满足要求,请重新输入。");
            }
        }

        String phoneNumber;
        while (true) {
            System.out.println("请输入手机号码:");
            phoneNumber = scanner.nextLine();
            if (isValidPhoneNumber(phoneNumber)) {
                break;
            } else {
                System.out.println("手机号码不满足要求,请重新输入。");
            }
        }

        User newUser = new User();
        newUser.setUsername(username);
        newUser.setPassword(password);
        newUser.setIdNumber(idNumber);
        newUser.setPhoneNumber(phoneNumber);
        users.add(newUser);
        System.out.println("注册成功!");
        break;
    }
}
  • 该方法实现了用户注册功能。
  • 首先,要求用户输入用户名,并验证用户名的合法性和唯一性。
  • 然后,要求用户输入两次密码,确保两次输入的密码一致。
  • 接着,要求用户输入身份证号码和手机号码,并分别验证其合法性。
  • 最后,创建一个新的 User 对象,使用 setter 方法设置用户信息,并将其添加到 users 集合中。
isValidUsername 方法
private static boolean isValidUsername(String username) {
    if (username.length() < 3 || username.length() > 15) {
        return false;
    }
    if (username.matches("[0-9]+")) {
        return false;
    }
    return username.matches("[a-zA-Z0-9]+");
}
  • 该方法用于验证用户名的合法性。
  • 用户名长度必须在 3 到 15 位之间。
  • 不能是纯数字。
  • 只能由字母和数字组成。
isUsernameExists 方法
private static boolean isUsernameExists(String username) {
    for (User user : users) {
        if (user.getUsername().equals(username)) {
            return true;
        }
    }
    return false;
}
  • 该方法用于检查用户名是否已存在。
  • 遍历 users 集合,比较每个用户的用户名与输入的用户名是否相同。
isValidIdNumber 方法
private static boolean isValidIdNumber(String idNumber) {
    if (idNumber.length() != 18) {
        return false;
    }
    if (idNumber.startsWith("0")) {
        return false;
    }
    String first17 = idNumber.substring(0, 17);
    if (!first17.matches("[0-9]+")) {
        return false;
    }
    char lastChar = idNumber.charAt(17);
    return Character.isDigit(lastChar) || lastChar == 'X' || lastChar == 'x';
}
  • 该方法用于验证身份证号码的合法性。
  • 身份证号码长度必须为 18 位。
  • 不能以 0 开头。
  • 前 17 位必须都是数字。
  • 最后一位可以是数字、大写 X 或小写 x
isValidPhoneNumber 方法
private static boolean isValidPhoneNumber(String phoneNumber) {
    if (phoneNumber.length() != 11) {
        return false;
    }
    if (phoneNumber.startsWith("0")) {
        return false;
    }
    return phoneNumber.matches("[0-9]+");
}
  • 该方法用于验证手机号码的合法性。
  • 手机号码长度必须为 11 位。
  • 不能以 0 开头。
  • 必须都是数字。
login 方法
private static void login() {
    System.out.println("请输入用户名:");
    String username = scanner.nextLine();
    if (!isUsernameExists(username)) {
        System.out.println("用户名未注册,请先注册");
        return;
    }

    int attempts = 3;
    while (attempts > 0) {
        System.out.println("请输入密码:");
        String password = scanner.nextLine();
        String captcha = generateCaptcha();
        System.out.println("验证码:" + captcha);
        System.out.println("请输入验证码:");
        String inputCaptcha = scanner.nextLine();
        if (!inputCaptcha.equals(captcha)) {
            System.out.println("验证码不正确,请重新输入。");
            continue;
        }

        for (User user : users) {
            if (user.getUsername().equals(username) && user.getPassword().equals(password)) {
                System.out.println("登录成功!");
                studentManagement();
                return;
            }
        }
        attempts--;
        System.out.println("用户名或密码错误,你还有 " + attempts + " 次机会。");
    }
    System.out.println("登录失败,尝试次数已用完。");
}
  • 该方法实现了用户登录功能。
  • 首先,要求用户输入用户名,并检查该用户名是否已注册。
  • 然后,用户有 3 次尝试登录的机会,每次尝试都需要输入密码和验证码。
  • 验证码由 generateCaptcha 方法生成,用户输入的验证码必须与生成的验证码一致。
  • 如果用户名、密码和验证码都正确,则登录成功,调用 studentManagement 方法进入学生管理系统。
generateCaptcha 方法
private static String generateCaptcha() {
    Random random = new Random();
    StringBuilder captcha = new StringBuilder();
    for (int i = 0; i < 4; i++) {
        int charCase = random.nextInt(2);
        if (charCase == 0) {
            captcha.append((char) (random.nextInt(26) + 'a'));
        } else {
            captcha.append((char) (random.nextInt(26) + 'A'));
        }
    }
    captcha.append(random.nextInt(10));
    return captcha.toString();
}
  • 该方法用于生成一个长度为 5 的验证码,由 4 位大写或小写字母和 1 位数字组成。
forgetPassword 方法
private static void forgetPassword() {
    System.out.println("请输入用户名:");
    String username = scanner.nextLine();
    if (!isUsernameExists(username)) {
        System.out.println("未注册");
        return;
    }

    System.out.println("请输入身份证号码:");
    String idNumber = scanner.nextLine();
    System.out.println("请输入手机号码:");
    String phoneNumber = scanner.nextLine();

    for (User user : users) {
        if (user.getUsername().equals(username) && user.getIdNumber().equals(idNumber) && user.getPhoneNumber().equals(phoneNumber)) {
            System.out.println("请输入新密码:");
            String newPassword = scanner.nextLine();
            user.setPassword(newPassword);
            System.out.println("密码修改成功!");
            return;
        }
    }
    System.out.println("账号信息不匹配,修改失败");
}
  • 该方法实现了忘记密码功能。
  • 首先,要求用户输入用户名,并检查该用户名是否已注册。
  • 然后,要求用户输入身份证号码和手机号码,验证用户输入的信息与存储的信息是否一致。
  • 如果信息一致,则允许用户输入新密码,并使用 setter 方法更新用户的密码。
studentManagement 方法
private static void studentManagement() {
    System.out.println("进入学生管理系统,你可以进行增删改查操作。");
    // 这里可以实现学生信息的增删改查操作
    while (true) {
        System.out.println("请选择操作:1添加学生 2删除学生 3修改学生信息 4查询学生信息 5退出管理系统");
        int choice = scanner.nextInt();
        scanner.nextLine(); // 消耗换行符
        switch (choice) {
            case 1:
                System.out.println("添加学生功能待实现。");
                break;
            case 2:
                System.out.println("删除学生功能待实现。");
                break;
            case 3:
                System.out.println("修改学生信息功能待实现。");
                break;
            case 4:
                System.out.println("查询学生信息功能待实现。");
                break;
            case 5:
                System.out.println("退出学生管理系统。");
                return;
            default:
                System.out.println("无效的选择,请重新输入。");
        }
    }
}

t.println(“请输入新密码:”);
String newPassword = scanner.nextLine();
user.setPassword(newPassword);
System.out.println(“密码修改成功!”);
return;
}
}
System.out.println(“账号信息不匹配,修改失败”);
}


- 该方法实现了忘记密码功能。
- 首先,要求用户输入用户名,并检查该用户名是否已注册。
- 然后,要求用户输入身份证号码和手机号码,验证用户输入的信息与存储的信息是否一致。
- 如果信息一致,则允许用户输入新密码,并使用 `setter` 方法更新用户的密码。

#### `studentManagement` 方法

```java
private static void studentManagement() {
    System.out.println("进入学生管理系统,你可以进行增删改查操作。");
    // 这里可以实现学生信息的增删改查操作
    while (true) {
        System.out.println("请选择操作:1添加学生 2删除学生 3修改学生信息 4查询学生信息 5退出管理系统");
        int choice = scanner.nextInt();
        scanner.nextLine(); // 消耗换行符
        switch (choice) {
            case 1:
                System.out.println("添加学生功能待实现。");
                break;
            case 2:
                System.out.println("删除学生功能待实现。");
                break;
            case 3:
                System.out.println("修改学生信息功能待实现。");
                break;
            case 4:
                System.out.println("查询学生信息功能待实现。");
                break;
            case 5:
                System.out.println("退出学生管理系统。");
                return;
            default:
                System.out.println("无效的选择,请重新输入。");
        }
    }
}
评论 37
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值