【Java学习笔记】

学生管理系统

需求

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

升级:书写登录、注册、忘记密码的功能,只有用户登录成功之后,才能进入到学生管理系统中进行增删改查操作。

分析

初始菜单

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

学生类

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

添加功能

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

  • id唯一

删除功能

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

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

修改功能

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

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

查询功能

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

  • 如果没有学生信息,提示:当前无学生信息,请添加后再查询
  • 如果有学生信息,需要按照以下格式输出。(不用过于纠结对齐的问题)
id			姓名		年龄		家庭住址
ytlds001    Jin       28        南京
ytlds002    Jimin     26        北京
ytlds003    Suga      27        深圳
ytlds004    Vante     25        长沙

登录界面

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

1.User类

public class User {
    private String username;
    private String password;
    private String identityID;
    private String phone;

    public User() {
    }

    public User(String username, String password, String identityID, String phone) {
        this.username = username;
        this.password = password;
        this.identityID = identityID;
        this.phone = phone;
    }

    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 getIdentityID() {
        return identityID;
    }

    public void setIdentityID(String identityID) {
        this.identityID = identityID;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }
}

2.Login类(学生管理系统登录界面)

public class Login {
    public static void main(String[] args) {
        ArrayList<User> list = new ArrayList<>();
        Scanner sc = new Scanner(System.in);

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

            //2.操作
            String choose = sc.next();
            switch (choose){
                case "1":
                    login(list);
                    StudentSystem stuSystem = new StudentSystem();
                    stuSystem.startStudentSystem();
                    break;
                case "2":
                    register(list);
                    break;
                case "3":
                    updatePassword(list);
                    break;
                case "4":
                    System.exit(0);
                default:
                    System.out.println("输入错误,请重新输入!");
            }
        }
    }

    //注册新用户
    public static void register(ArrayList<User> list) {
        //1.获取用户名
        String username = getRightUserName(list);
        //2.获取用户密码
        String password = getRightPassword();
        //3.获取用户身份证号码
        String identityID = getRightIdentityID();
        //4.获取用户手机号码
        String phone = getRightPhone();
        //5.创建用户对象,将新注册的用户对象加入集合中
        list.add(new User(username,password,identityID,phone));
        System.out.println("您已注册成功,返回主菜单界面!");
    }

    //用户登录
    public static void login(ArrayList<User> list) {
        Scanner sc = new Scanner(System.in);
        String username;
        String password;
        String code;    //随机生成的验证码
        String newCode; //用户输入的验证码
        int count = 3;  //计数器

        System.out.println("请输入用户名:");
        username = sc.next();
        if(!contains(list,username)) {
            System.out.println("用户名未注册,请先注册!");
            return;
        }
        while (count > 0) {
            System.out.println("请输入用户密码:");
            password = sc.next();
            while (true) {
                code = getIdentifyCode();
                System.out.println("验证码:"+code);
                System.out.println("请输入验证码:");
                newCode = sc.next();
                if(!code.equals(newCode)) {
                    System.out.println("验证码错误,请重新输入!");
                }else {
                    break;
                }
            }
            //再判断用户名和密码是否正确,有3次机会
            int index = getIndex(list,username);
            if(list.get(index).getPassword().equals(password)) {
                System.out.println("登录成功!");
                return;
            }else {
                count--;
                if(count == 0) {
                    System.out.println("密码错误,登录失败!");
                    return;
                }
                System.out.println("密码错误,您还有"+count+"重新输入密码的机会!");
            }
        }
    }

    //忘记密码
    public static void updatePassword(ArrayList<User> list) {
        Scanner sc = new Scanner(System.in);
        String identityID;
        String phone;
        String password;

        //先输入用户名
        System.out.println("请输入您的用户名:");
        String username = sc.next();
        //返回用户名索引
        int index = getIndex(list,username);
        if(index < 0) {
            System.out.println("该用户未注册!");
            return;
        }
        //用户名存在,输入身份证号码和手机号码
        System.out.println("请输入您的身份证号码:");
        identityID = sc.next();
        System.out.println("请输入您的手机号码:");
        phone = sc.next();

        //判断当前用户的身份证号码和手机号码是否一致
        if(list.get(index).getIdentityID().equals(identityID) && list.get(index).getPhone().equals(phone)) {
            //一致,则提示输入密码,进行修改
            System.out.println("修改密码:");
            password = sc.next();
            list.get(index).setPassword(password);
            System.out.println("密码修改成功!");
        }else {
            //不一致,则提示:账号信息不匹配,修改失败
            System.out.println("账号信息不匹配,修改失败!");
        }
    }

    //生成验证码
    public static String getIdentifyCode() {
        Random random = new Random();
        char[] arr = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',
                'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
        StringBuilder sb = new StringBuilder("");
        //随机生成四个字母
        int num;
        for (int i = 0; i < 4; i++) {
            num = random.nextInt(52);
            sb.append(arr[num]);
        }
        //生成一个0-9的随机数
        sb.append(random.nextInt(10));
        char[] code = sb.toString().toCharArray();
        for (int i = 0; i < code.length; i++) {
            num = random.nextInt(code.length);
            char temp = code[i];
            code[i] = code[num];
            code[num] = temp;
        }
        String result = new String(code);
        return result;
    }

    //获取不存在且格式正确的用户名
    public static String getRightUserName(ArrayList<User> list){
        Scanner sc = new Scanner(System.in);
        String username;

        while (true) {
            //1.提示用户输入用户名
            System.out.println("请输入用户名:");
            username = sc.next();
            //2.判断用户名是否存在
            if(contains(list,username)) {
                System.out.println("用户名已存在,请重新输入!");
            }else {
                if(rightUserName(username)) {
                    return username;
                }else {
                    System.out.println("用户名格式错误,用户名必须是由3-15位字母和数字组成的,不能为纯数字,请重新输入用户名!");
                }
            }
        }
    }

    //获取正确的密码(两次输入一致)
    public static String getRightPassword() {
        Scanner sc = new Scanner(System.in);

        String password1;
        String password2;
        while (true) {
            System.out.println("请输入密码:");
            password1 = sc.next();
            System.out.println("请再次输入密码,保证与第一次输入的密码一致:");
            password2 = sc.next();
            if(!password1.equals(password2)) {
                System.out.println("您输入的两次密码不一致,请重新输入!");
            }else {
                return password1;
            }
        }
    }

    //获取格式正确的身份证号码
    public static String getRightIdentityID() {
        Scanner sc = new Scanner(System.in);
        String identityID;

        //到此时,用户名与密码都通过验证,下面验证身份证号码
        while (true) {
            System.out.println("请输入身份证号码:");
            identityID = sc.next();
            if(rightIdentityID(identityID)) {
                return identityID;
            }else {
                System.out.println("格式错误,请重新输入身份证号码!");
            }
        }
    }

    //获取格式正确的手机号码
    public static String getRightPhone() {
        Scanner sc = new Scanner(System.in);
        String phone;

        while (true) {
            System.out.println("请输入手机号码:");
            phone = sc.next();
            if(rightPhone(phone)) {
                return phone;
            }else {
                System.out.println("格式错误,请重新输入手机号码!");
            }
        }
    }

    //判断用户名是否存在
    public static boolean contains(ArrayList<User> list,String username) {
//        for (int i = 0; i < list.size(); i++) {
//            if(list.get(i).getUsername().equals(username)) {
//                return true;
//            }
//        }
//        return false;
        if(getIndex(list,username) >= 0) {
            return true;
        }else {
            return false;
        }
    }

    //返回所要询用的户名的索引
    public static int getIndex(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;
    }

    //判断用户名格式是否符合要求
    public static boolean rightUserName(String username) {
        //用户名长度不在3-15位之间
        if(username.length() < 3 || username.length() > 15) {
            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')&&(c < '0' || c > '9')) {
                //出现了既不是字母也不是数字的字符
                return false;
            }
            if(c >= '0' && c <= '9') {
                count++;
            }
        }
        if(count == username.length()) {
            //全是数字
            return false;
        }
        //验证通过
        return true;
    }

    //判断身份证号码是否符合要求
    public static boolean rightIdentityID(String  identityID) {
        String regex = "[1-9]\\d{16}[0-9Xx]";
        boolean flag = identityID.matches(regex);
        if(flag) {
            return true;
        }else {
            return false;
        }
    }

    //验证手机号码是否符合要求
    public static boolean rightPhone(String phone) {
        String regex = "[1-9]\\d{10}";
        boolean flag = phone.matches(regex);
        if(flag) {
            return true;
        }else {
            return false;
        }
    }
}

3.Student类

public class Student {
    //id、姓名、年龄、住址
    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;
    }
}

4.StudentSystem类(学生管理系统管理界面)

public class StudentSystem {
    public static void startStudentSystem() {
        //创建学生集合
        ArrayList<Student> list = new ArrayList<>();

        String num;
        Scanner sc = new Scanner(System.in);

        //实现菜单功能
        loop: 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("请输入您的选择:");

            num = sc.next();
            switch (num){
                case "1":
                    addStudent(list);
                    break;
                case "2":
                    deleteStudent(list);
                    break;
                case "3":
                    updateStudent(list);
                    break;
                case "4":
                    queryStudent(list);
                    break;
                case "5":
                    System.out.println("退出");
                    sc.close();
                    //break loop;
                    System.exit(0); //停止虚拟机运行
                default:
                    System.out.println("没有这个选项,请重新输入!");
                    break;
            }
        }
    }

    //添加学生
    public static void addStudent(ArrayList<Student> list) {
        Scanner sc = new Scanner(System.in);

        String id = null;
        while (true) {
            System.out.println("请输入学生的id:");
            id = sc.next();
            if(contains(list,id)) {
                //id已存在,提示一下用户
                System.out.println("学生id已经存在,请重新录入!");
            }else {
                //表示学生id不存在,可以继续录入后续信息
                break;
            }
        }
        System.out.println("请输入学生的姓名:");
        String name = sc.next();
        System.out.println("请输入学生的年龄:");
        int age = sc.nextInt();
        System.out.println("请输入学生的家庭住址:");
        String address = sc.next();

        Student stu = new Student(id,name,age,address);
        //把学生对象添加到集合当中
        list.add(stu);
        System.out.println("学生信息添加成功!");

        //sc.close();
    }

    //删除学生
    public static void deleteStudent(ArrayList<Student> list) {
        //键盘录入要删除的学生id
        Scanner sc = new Scanner(System.in);
        int index;
        String id;

        while (true) {
            System.out.println("请输入要删除的学生id:");
            id = sc.next();

            //查询学生id在集合中的索引
            index = getIndex(list,id);
            //对返回的index进行判断
            //index >= 0则表示存在id,删除该学生对象
            //index < 0表示不存在该id,给出提示信息
            if(index >= 0) {
                list.remove(index);
                System.out.println("成功删除学生信息!");
                break;
            }else {
                System.out.println("该学生id不存在,请重新录入!");
            }
        }
    }

    //修改学生
    public static void updateStudent(ArrayList<Student> list) {
        Scanner sc = new Scanner(System.in);

        String id = null;
        int index;
        while (true) {
            System.out.println("请输入学生的id:");
            id = sc.next();
            index = getIndex(list,id);
            if(index >= 0) {
                //id存在,退出循环
                break;
            }else {
                //表示学生id不存在,给出提示重新录入
                System.out.println("要修改的学生id不存在,请重新录入!");
            }
        }
        Student stu = list.get(index);
        System.out.println("请输入学生的姓名:");
        String newName = sc.next();
        stu.setName(newName);

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

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

        System.out.println("学生信息修改成功!");
    }

    //查询学生
    public static void queryStudent(ArrayList<Student> list) {
        if(list.size() == 0) {
            System.out.println("当前无学生信息,请添加后再查询!");
            //结束方法
            return;
        }

        //打印表头信息
        System.out.println("id\t\t\t姓名\t\t年龄\t家庭住址");
        //当代码执行到这里时,表示集合中是有数据的
        for (int i = 0; i < list.size(); i++) {
            Student stu = list.get(i);
            System.out.println(stu.getId()+"\t"+stu.getName()+"\t"+stu.getAge()+"\t"+stu.getAddress());
        }
    }

    //判断id在集合中是否存在
    public static boolean contains(ArrayList<Student> list,String id) {
        //循环遍历集合得到里面的每一个学生对象的id进行判断
//        for (int i = 0; i < list.size(); i++) {
//            Student stu = list.get(i);
//            if(stu.getId().equals(id)) {
//                //存在则返回true
//                return true;
//            }
//        }
        //不存在返回false
        if(getIndex(list,id) >= 0) {
            return true;
        }else {
            return false;
        }
    }

    //通过id获取索引的方法
    public static int getIndex(ArrayList<Student> list,String id) {
        //遍历集合
        for (int i = 0; i < list.size(); i++) {
            //得到每一个学生对象
            Student stu = list.get(i);
            //将集合中的学生id与要查询的id比较
            if(stu.getId().equals(id)) {
                //如果一样就返回索引
                return i;
            }
        }
        //循环结束后还没找到表示不存在,则返回-1
        return -1;
    }
}

说明:

以上笔记学习是学习b站黑马程序员时记下的笔记,仅限于帮助理解学习,不做任何其他商业用途。

黑马程序员

  • 25
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值