Java必会项目——学生管理系统(升级版)

需求:

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

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


分析:

登录界面:
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位数字组成,同一个字母可重复

数字可以出现在任意位置

比如:

aQa1K


代码实现:

封装类Student
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;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}
封装类User
public class User {
    private String username;
    private String password;
    private String idNumber;
    private String phoneNumber;

    public User() {
    }

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

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

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

    public String getIdNumber() {
        return idNumber;
    }

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

    public String getPhoneNumber() {
        return phoneNumber;
    }

    public void setPhoneNumber(String phoneNumber) {
        this.phoneNumber = phoneNumber;
    }
}
学生管理系统
public class StudentSystem {

    public static void startStudentSystem() {

        ArrayList 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" -> add(list);
                case "2" -> delete(list);
                case "3" -> update(list);
                case "4" -> print(list);
                case "5" -> {
                    System.out.println("退出");
                    System.exit(0);
                }
                default -> System.out.println("没有这个选项");
            }
        }


    }

    //添加功能:
    //键盘录入每一个学生信息并添加,需要满足以下要求:id唯一
    public static void add(ArrayList list) {

        Student stu = new Student();
        Scanner sc = new Scanner(System.in);

        while (true) {
            System.out.println("请输入要添加学生的id");
            String id = sc.next();
            //调用方法判断id是否唯一
            boolean flag = judgment(list, id);
            if (flag) {
                System.out.println("id已存在,请重新输入");
            } else {
                stu.setId(id);
                break;
            }
        }


        System.out.println("请输入要添加学生的姓名");
        String name = sc.next();
        stu.setName(name);

        System.out.println("请输入要添加学生的年龄");
        int age = sc.nextInt();
        stu.setAge(age);

        System.out.println("请输入要添加学生的家庭地址");
        String address = sc.next();
        stu.setAddress(address);

        list.add(stu);
    }

    //删除功能:
    //键盘录入要删除的学生id,需要满足以下要求:id存在删除,id不存在,需要提示不存在,并回到初始菜单
    public static void delete(ArrayList list) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入要删除学生的id");
        String id = sc.next();
        //调用方法查找要删除的学生id是否存在,存在返回索引,不存在返回-1
        int index = checkIndex(list, id);
        if (index == -1) {
            System.out.println("您输入的id不存在,删除失败");
            return;
        } else {
            list.remove(index);
            System.out.println("删除成功");
        }
    }

    //修改功能:
    //键盘录入要修改的学生id,需要满足以下要求:
    //id存在,继续录入其他信息,id不存在,需要提示不存在,并回到初始菜单
    public static void update(ArrayList list) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入要修改的学生id");
        String id = sc.next();
        //调用方法检查id是否存在,存在返回索引,不存在返回-1
        int flag = checkIndex(list, id);
        if (flag == -1) {
            System.out.println("id不存在");
            return;

        } else {
            System.out.println("请输入新名字");
            String newName = sc.next();
            list.get(flag).setName(newName);

            System.out.println("请输入新年龄");
            int newAge = sc.nextInt();
            list.get(flag).setAge(newAge);

            System.out.println("请输入新地址");
            String newAddress = sc.next();
            list.get(flag).setAddress(newAddress);
        }
    }

    //查询功能:
    //打印所有的学生信息,需要满足以下要求:
    //如果没有学生信息,提示:当前无学生信息,请添加后再查询,如果有学生信息,输出。
    public static void print(ArrayList list) {
        if (list.size() == 0) {
            System.out.println("当前无学生信息,请添加后再查询");
            return;
        }

        System.out.println("id\t\t\t姓名\t年龄\t家庭住址");
        for (int i = 0; i < list.size(); i++) {
            Student stu = list.get(i);
            System.out.println(stu.getId() + "\t\t\t" + stu.getName() + "\t\t" + stu.getAge() + "\t\t" + stu.getAddress());
        }
    }

    //定义方法判断id是否存在,存在证明id重复
    public static boolean judgment(ArrayList list, String id) {
        //方案一:循环遍历查找
        /*
        for (int i = 0; i < list.size(); i++) {
            if(list.get(i).getId().equals(id)){
                return true;
            }
        }
        return false;
         */

        //方案二:调用checkIndex方法(推荐)
        return checkIndex(list, id) >= 0 ? true : false;
    }

    //定义方法判断id是否存在,存在返回索引,不存在返回-1
    public static int checkIndex(ArrayList list, String id) {
        for (int i = 0; i < list.size(); i++) {
            if (list.get(i).getId().equals(id)) {
                return i;
            }
        }
        return -1;
    }
}
登陆、注册、忘记密码系统
public class App {

    public static void main(String[] args) {

        ArrayList list = new ArrayList<>();
        Scanner sc = new Scanner(System.in);

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

            String choose = sc.next();
            switch (choose) {
                case "1" -> login(list);
                case "2" -> register(list);
                case "3" -> forgetPassword(list);
                default -> System.exit(0);
            }
        }

    }

    //注册功能:
    public static void register(ArrayList list) {
        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;
            }
            //调用方法判断用户名是否唯一(是否在集合中存在)
            boolean flag2 = judgment(list, username);
            if (flag2) {
                System.out.println("用户名重复,请重新输入");
            } else {
                System.out.println("用户名注册成功");
                break;
            }
        }

        //密码
        String password;
        while (true) {
            System.out.println("请输入密码");
            password = sc.next();
            System.out.println("请再次输入密码");
            String passwordAgain = sc.next();
            //判断两次密码是否一致
            if (password.equals(passwordAgain)) {
                System.out.println("密码注册成功");
                break;
            } else {
                System.out.println("两次密码不一致,请重新输入");
            }
        }

        //身份证号码
        String idNumber;
        while (true) {
            System.out.println("请输入身份证号码");
            idNumber = sc.next();
            //调用方法判断身份证号码格式是否满足要求
            boolean flag = checkIdNumber(idNumber);
            if (flag) {
                System.out.println("身份证号码注册成功");
                break;
            } else {
                System.out.println("身份证号码格式不满足要求,请重新输入");
            }
        }

        //手机号
        String phoneNumber;
        while (true) {
            System.out.println("请输入手机号");
            phoneNumber = sc.next();
            //调用方法判断手机号格式是否满足要求
            boolean flag = checkPhoneNumber(phoneNumber);
            if (flag) {
                System.out.println("手机号注册成功");
                break;
            } else {
                System.out.println("手机号格式不满足要求,请重新输入");
            }
        }

        //创建User
        User u = new User(username, password, idNumber, phoneNumber);

        //添加到集合中
        list.add(u);
        System.out.println("用户注册成功");
    }

    //登录功能
    public static void login(ArrayList list) {
        Scanner sc = new Scanner(System.in);

        for (int i = 0; i < 3; i++) {
            //输入用户名
            System.out.println("请输入用户名");
            String myUsername = sc.next();
            //调用方法判断用户名是否注册(是否存在)
            boolean flag1 = judgment(list, myUsername);
            if (!flag1) {
                System.out.println("用户名未注册,请先注册");
                return;
            }

            //输入密码
            System.out.println("请输入密码");
            String myPassword = sc.next();

            while (true) {
                //调用方法生成验证码
                String code = code();
                System.out.println("验证码:" + code);

                //输入验证码
                System.out.println("请输入验证码");
                String myCode = sc.next();

                //判断验证码是否正确
                if (myCode.equalsIgnoreCase(code)) {
                    break;
                } else {
                    System.out.println("验证码错误,请重新输入");
                }
            }

            //判断用户名和密码是否正确
            //封装思想,将想传递的参数封装起来
            User myUser = new User(myUsername, myPassword, null, null);
            boolean flag2 = checkUserInfo(list, myUser);
            if (flag2) {
                System.out.println("登录成功");

                //类名调用方法,启动学生管理系统
                StudentSystem.startStudentSystem();

                break;
            } else {
                //登录失败
                if (i == 2) {
                    System.out.println("账号被锁定");
                } else {
                    System.out.println("用户名或密码错误,还有" + (2 - i) + "次机会");
                }
            }
        }

    }

    //忘记密码
    public static void forgetPassword(ArrayList list) {
        Scanner sc = new Scanner(System.in);

        //键盘录入用户名
        System.out.println("请输入用户名");
        String myUsername = sc.next();
        //判断当前用户名是否存在
        boolean flag = judgment(list, myUsername);
        if (!flag) {
            //不存在
            System.out.println("未注册");
            return;
        }

        //键盘录入身份证号码和手机号码
        System.out.println("请输入身份证号码");
        String myIdNumber = sc.next();
        System.out.println("请输入手机号码");
        String myPhoneNumber = sc.next();

        //调用方法根据当前用户名找到其在集合中的索引
        int index = findIndex(list, myUsername);
        //根据索引找到当前用户对象
        User u = list.get(index);

        //判断当前用户的身份证号码和手机号码是否一致
        if (!(u.getIdNumber().equals(myIdNumber) && u.getPhoneNumber().equals(myPhoneNumber))) {
            //不一致
            System.out.println("账号信息不匹配,修改失败");
            return;
        }

        //到这里一致,进行修改。
        while (true) {
            System.out.println("请输入新密码");
            String newPassword = sc.next();
            System.out.println("再次请输入新密码");
            String newPasswordAgain = sc.next();
            if (newPassword.equals(newPasswordAgain)) {
                u.setPassword(newPassword);
                System.out.println("修改成功");
                break;
            } else {
                System.out.println("两次密码不一致,请重新输入");
            }
        }

    }

    //判断用户名格式是否满足要求
    public static boolean checkUsername(String username) {
        //用户名长度在3~15位之间
        int len = username.length();
        if (len < 3 || len > 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;
            }
        }
        //用户名不能是纯数字
        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;
            }
        }
        if (count == 0) {
            return false;
        }

        return true;
    }

    //判断用户名是否在集合中存在,存在返回true
    public static boolean judgment(ArrayList list, String username) {
        for (int i = 0; i < list.size(); i++) {
            if (list.get(i).getUsername().equals(username)) {
                return true;
            }
        }
        return false;
    }

    //判断身份证号码格式是否满足要求
    public static boolean checkIdNumber(String idNumber) {
        //长度为18位
        int len = idNumber.length();
        if (len != 18) {
            return false;
        }
        //b不能以0为开头
        if (idNumber.startsWith("0")) {
            return false;
        }
        //前17位必须都是数字
        for (int i = 0; i < len - 1; i++) {
            char c = idNumber.charAt(i);
            if (!(c >= '0' && c <= '9')) {
                return false;
            }
        }
        //最后一位可以是数字也可以是大写X或小写x
        char c = idNumber.charAt(len - 1);
        if ((c >= '0' && c <= '9') || c == 'x' || c == 'X') {
            return true;
        }
        return false;
    }

    //判断手机号格式是否满足要求
    public static boolean checkPhoneNumber(String phoneNumber) {
        //长度为11位
        int len = phoneNumber.length();
        if (len != 11) {
            return false;
        }
        //不能以0为开头
        if (phoneNumber.startsWith("0")) {
            return false;
        }
        //必须都是数字
        for (int i = 0; i < len; i++) {
            char c = phoneNumber.charAt(i);
            if (!(c >= '0' && c <= '9')) {
                return false;
            }
        }
        return true;
    }

    //生成验证码
    public static String code() {
        //长度为5
        //由4位大写或者小写字母和1位数字组成,同一个字母可重复
        //数字可以出现在任意位置
        //定义集合作为数据表
        ArrayList codeList = new ArrayList<>();
        //将a-z A-Z 存入集合
        for (int i = 0; i < 26; i++) {
            codeList.add((char) ('a' + i));
            codeList.add((char) ('A' + i));
        }
        //创建sb用于连接字符
        StringBuilder sb = new StringBuilder();
        //随机在数据表中抽取4个字母
        Random r = new Random();
        for (int i = 0; i < 4; i++) {
            int index = r.nextInt(codeList.size());
            sb.append(codeList.get(index));
        }
        //随机从0-9中选择一个数字
        int number = r.nextInt(10);
        sb.append(number);
        //改变字符串中字符的位置,可以将其转化为字符数组
        String str = sb.toString();
        char[] chars = str.toCharArray();
        //改变位置
        int randomIndex = r.nextInt(str.length());
        char temp = chars[str.length() - 1];
        chars[str.length() - 1] = chars[randomIndex];
        chars[randomIndex] = temp;
        //转化为字符串
        return new String(chars);
    }

    //判断用户名和密码是否正确
    public static boolean checkUserInfo(ArrayList list, User myUser) {
        for (int i = 0; i < list.size(); i++) {
            User u = list.get(i);
            if ((u.getUsername().equals(myUser.getUsername())) && (u.getPassword().equals(myUser.getPassword()))) {
                return true;
            }
        }
        return false;
    }

    //根据键盘录入用户名找到其在集合中的索引
    public static int findIndex(ArrayList list, String username) {
        for (int i = 0; i < list.size(); i++) {
            if (list.get(i).getUsername().equals(username)) {
                return i;
            }
        }
        return -1;
    }

}

你可能感兴趣的:(java,开发语言,需求分析,个人开发,敏捷流程)