学生管理系统

学生管理系统

Student.java

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;
    }
}

StudentSystem.java

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

public class StudentSystem {
    public void startStudentSystem() {
        /*因为要被APP.java调用
        所以public static void main(String[] args) {}要改个函数名
        */
        boolean flag1 = true;

        ArrayList<Student> list = new ArrayList<>();

        txt();
        Scanner scanner = new Scanner(System.in);
        while (flag1) {
            String choose = scanner.next();
            switch (choose) {
                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("已退出");
                    System.exit(0);
                    break;
                default:
                    System.out.println("输入错误");
            }

            while (true) {
                System.out.print("是否继续?Y/N:");
                String yn = scanner.next();
                if (yn.equalsIgnoreCase("n")) {
                    System.out.println("已退出");
                    System.exit(0);
                } else if (yn.equalsIgnoreCase("y")) {
                    txt();
                    break;
                } else {
                    System.out.println("输入错误");
                }
            }
        }


        scanner.close();
    }

    public void txt() {
        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.print("请输入您的选择:");
    }

    public void addStudent(ArrayList<Student> list) {
        Scanner scanner = new Scanner(System.in);
        Student s = new Student();
        while (true) {
            System.out.print("请输入id:");
            String id = scanner.next();
            boolean flag2 = contains(list, id);
            if (flag2) {
                System.out.println("id已存在,请重录。");
            } else {
                s.setId(id);
                break;
            }
        }

        System.out.print("请输入姓名:");
        String name = scanner.next();
        s.setName(name);
        System.out.print("请输入年龄:");
        int age = scanner.nextInt();
        s.setAge(age);
        System.out.print("请输入地址:");
        String address = scanner.next();
        s.setAddress(address);

        list.add(s);
        System.out.println("添加成功");
    }

    public void deleteStudent(ArrayList<Student> list) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入要删除的学生id:");
        String id = scanner.next();
        int index = get_index(list, id);
        if (index >= 0) {
            list.remove(index);
            System.out.println("id为" + id + "的学生信息删除成功");
        } else {
            System.out.println("id不存在,删除失败");
        }
    }

    public void updateStudent(ArrayList<Student> list) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入要修改的学生id:");
        String id = scanner.next();
        int index = get_index(list, id);
        if (index == -1) {
            System.out.println("id不存在,修改失败");
        } else {
            Student stu = list.get(index);
            System.out.print("请输入要修改的学生姓名:");
            String newName = scanner.next();
            stu.setName(newName);
            System.out.print("请输入要修改的学生年龄:");
            int newAge = scanner.nextInt();
            stu.setAge(newAge);
            System.out.print("请输入要修改的学生地址:");
            String newAddress = scanner.next();
            stu.setAddress(newAddress);
            System.out.println("修改成功");
        }
    }

    public void queryStudent(ArrayList<Student> list) {
        if (list.size() == 0) {
            System.out.println("当前无学生信息,请添加后再查询。");
            return;//结束方法
        }
        //打印表头信息
        System.out.println("id\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 boolean contains(ArrayList<Student> list, String id) {
//        for (int i = 0; i < list.size(); i++) {
//            Student stu=list.get(i);
//            if (stu.getId().equals(id)){
//                return true;
//            }
//        }
//        return false;
        return get_index(list, id) >= 0;//提高代码复用性
    }


    //根据id获取索引
    public int get_index(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;
            }
        }
        //如果不同,就说明查询的id不存在,返回-1
        return -1;
    }
}

User.java

public class User {
    private String name;
    private String password;
    private String id;
    private String phone;

    public User() {
    }

    public User(String name, String password, String id, String phone) {
        this.name = name;
        this.password = password;
        this.id = id;
        this.phone = phone;
    }

    public String getName() {
        return name;
    }

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

    public String getPassword() {
        return password;
    }

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

    public String getId() {
        return id;
    }

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

    public String getPhone() {
        return phone;
    }

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

APP.java

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<>();

        txt();
        Scanner sc = new Scanner(System.in);
        while (true) {
            String choose = sc.next();
            switch (choose) {
                case "1":
                    login(list);
                    break;
                case "2":
                    register(list);
                    break;
                case "3":
                    forget(list);
                    break;
                case "4":
                    System.out.println("已退出");
                    sc.close();
                    System.exit(0);
                    break;
                default:
                    System.out.println("输入错误");
            }

            while (true) {
                System.out.print("是否继续?Y/N:");
                String yn = sc.next();
                if (yn.equalsIgnoreCase("n")) {
                    System.out.println("已退出");
                    sc.close();
                    System.exit(0);
                } else if (yn.equalsIgnoreCase("y")) {
                    txt();
                    break;
                } else {
                    System.out.println("输入错误");
                }
            }
        }
    }


    //目前用到的类还太少,public和private都行
    public static void txt() {
        System.out.println("=================学生管理系统登录界面=================");
        System.out.println("1:登录");
        System.out.println("2:注册");
        System.out.println("3:忘记/修改密码");
        System.out.println("4:退出系统");
        System.out.print("请输入您的选择:");
    }


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

        System.out.print("请输入用户名:");
        String name = sc.next();
        //判断用户名是否存在
        boolean flag = contains(list, name);
        if (!flag) {
            System.out.println("用户名" + name + "未注册,请先注册再登录");
            return;//结束方法
        }

        for (int i = 0; i < 3; i++) {//3次输入密码的机会
            System.out.print("请输入密码:");
            String password = sc.next();

            while (true) {
                String rightCode = getCode();
                System.out.println("验证码:" + rightCode);
                System.out.print("请输入验证码:");
                String code = sc.next();
                if (!rightCode.equalsIgnoreCase(code)) {
                    System.out.println("验证码错误,请重新输入");
                    continue;
                } else {
                    break;
                }
            }
            //验证用户名和密码是否正确
            //封装思想的应用:可以把一些零散的数据封装成一个对象,传递参数时就不用考虑其他无关的数据,直接传递整体。
            //这里的验证用户名和密码的方法可以传递name和password参数,但以后要id和phone参数就比较麻烦
            //所以采用封装思想
            User userInfo = new User(name, password, null, null);
            boolean result = checkUserInfo(list, userInfo);//集合提供判断的数据
            if (result) {
                System.out.println("登录成功");
                StudentSystem ss = new StudentSystem();//创建学生管理系统的对象
                ss.startStudentSystem();
                break;
            } else if (i == 2) {
                System.out.println("用户名或密码错误,当前账号:" + name + "被锁定,请24小时后重新登录");
                break;
            } else {
                System.out.println("用户名或密码错误,还剩" + (2 - i) + "次机会");
            }
        }
    }

    //验证码
    private static String getCode() {
        /*长度为5,由4位字母和1位数字组成,字母可重复,数字可出现在任何位置*/
        //1.将所有大小写字母添加到一个集合中
        ArrayList<Character> list = new ArrayList<>();
        for (int i = 0; i < 26; i++) {
            list.add((char) ('a' + i));//所有小写字母 a->97 b->98
            list.add((char) ('A' + i));//所有大写字母
        }
        //2.随机抽4个字符
        Random r = new Random();
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < 4; i++) {
            //获取随机索引
            int index = r.nextInt(list.size());
            //获取随机字符
            Character c = list.get(index);
            sb.append(c);
        }

        //3.把一个随机数字添加到末尾
        int number = r.nextInt(10);//数字就是[0,9]
        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);//返回新的字符串
    }

    private static boolean checkUserInfo(ArrayList<User> list, User userInfo) {
        //遍历集合,判断对象中用户名和密码是否一致
        for (int i = 0; i < list.size(); i++) {
            User user = list.get(i);
            if (user.getName().equals(userInfo.getName()) && user.getPassword().equals(userInfo.getPassword())) {
                return true;
            }
        }
        return false;
    }


    //注册功能
    private static void register(ArrayList<User> list) {
        //注册的本质:把用户信息添加到用户对象中,再把用户对象添加到集合中
        //1.键盘录入用户名
        Scanner sc = new Scanner(System.in);
        String name;
        while (true) {
            System.out.print("请输入用户名:");
            name = sc.next();
        /*编程细节:先验证格式是否正确,再验证是否唯一,
        因为以后用到数据库时校验唯一性要联网,浪费性能,
        而校验格式不用,不会浪费性能*/
            //用户名长度必须在3~15位之间
            //只能输入字母和数字,且不能是纯数字
            boolean flag1 = checkName(name);
            if (!flag1) {
                System.out.println("格式不ok");
                continue;
            }
            //用户名唯一
            //把name拿到集合中判断是否存在
            boolean flag2 = contains(list, name);
            if (flag2) {
                System.out.println("用户名:" + name + "已存在,请重新输入");
            } else {
                break;
            }
        }

        //2.键盘录入密码
        //长度必须在6~15位
        //密码输入两次,两次一致才可录入
        String password;
        while (true) {
            System.out.print("请输入密码:");
            password = sc.next();
            boolean flag3 = checkPassword(password);
            if (!flag3) {
                System.out.println("密码长度有误,请重新输入");
                continue;
            }
            System.out.print("请再次输入密码:");
            String againPassword = sc.next();
            if (!againPassword.equals(password)) {
                System.out.println("密码输入错误,请重试");
                continue;
            } else {
                break;
            }
        }

        //3.键盘录入身份证号码
        //长度为18位
        //不能以0开头
        //前17位必须是数字
        //最后一位可以是数字也可以是X或者x
        String id;
        while (true) {
            System.out.print("请输入身份证号码:");
            id = sc.next();
            boolean flag4 = checkID(id);
            if (!flag4) {
                System.out.println("身份证格式有误,请重新输入");
                continue;
            } else {
                break;
            }
        }

        //4.键盘录入手机号码
        //长度为11位
        //不能以0开头
        //必须都是数字
        String phone;
        while (true) {
            System.out.print("请输入手机号码:");
            phone = sc.next();
            boolean flag5 = checkPhone(phone);
            if (!flag5) {
                System.out.println("输入的手机号码有误,请重新输入");
                continue;
            } else {
                break;
            }
        }

        User user = new User(name, password, id, phone);
        list.add(user);
        System.out.println("注册成功");
    }

    private static boolean checkName(String name) {
        //用户名长度必须在3~15位之间
        int len = name.length();//减少if处调用name.length的次数
        if (len < 3 || len > 15) {
            return false;
        }
        //只能输入字母和数字,且不能是纯数字
        //只能输入字母和数字:遍历name的每一个字符,如果有一个字符不是字母或数字,就返回false
        for (int i = 0; i < name.length(); i++) {
            //i索引,c是name的单个字符
            char c = name.charAt(i);
            //          小写字母            大写字母             数字
            if (!((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9'))) {
                return false;
            }
        }
        //不能是纯数字:遍历name的每一个字符,如果有一个字符是字母,就返回false并统计
        int count = 0;
        for (int i = 0; i < name.length(); i++) {
            char c = name.charAt(i);
            if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {
                count++;
                break;//只要有一个是字母就退出循环
            }
        }
        return count > 0;
    }

    private static boolean contains(ArrayList<User> list, String name) {
        //遍历集合中的每一个对象,拿对象的用户名跟name比较
        for (int i = 0; i < list.size(); i++) {
            User user = list.get(i);
            if (user.getName().equals(name)) {
                return true;
            }
        }
        return false;
    }

    private static boolean checkPassword(String password) {
        ////长度必须在6~15位
        int len = password.length();
        if (len < 6 || len > 15) {
            return false;
        }
        return true;
    }

    private static boolean checkID(String id) {
        //长度为18位
        int len = id.length();
        if (len != 18) {
            return false;
        }
        //不能以0开头
        boolean flag = id.startsWith("0");//id.charAt(0)
        //startsWith方法判断开头是否为0,是则返回true,不是则false
        if (flag) {
            return false;
        }
        //前17位必须是数字
        for (int i = 0; i < id.length() - 1; i++) {//-1→前17位
            char c = id.charAt(i);
            if (!(c >= '0' && c <= '9')) {
                return false;
            }
        }
        //最后一位可以是数字也可以是X或者x
        char endChar = id.charAt(id.length() - 1);
        if ((endChar >= '0' && endChar <= '9') || (endChar == 'X') || (endChar == 'x')) {
            return true;
        } else {
            return false;
        }
    }

    private static boolean checkPhone(String phone) {
        //长度为11位
        int len = phone.length();
        if (len != 11) {
            return false;
        }
        //不能以0开头
        boolean flag = phone.startsWith("0");
        if (flag) {
            return false;
        }
        //必须都是数字
        for (int i = 0; i < phone.length(); i++) {
            char c = phone.charAt(i);
            if (!(c >= '0' && c <= '9')) {
                return false;
            }
        }
        return true;
    }


    //忘记/修改密码
    private static void forget(ArrayList<User> list) {
        Scanner sc = new Scanner(System.in);
        //1.判断用户名是否存在
        System.out.print("请输入用户名:");
        String name = sc.next();
        boolean flag = contains(list, name);
        if (!flag) {
            System.out.println("当前用户" + name + "未注册,请先注册");
            return;
        }

        //2.输入身份证号码和手机号码
        System.out.print("请输入身份证号码:");
        String id = sc.next();
        System.out.print("请输入手机号码:");
        String phone = sc.next();
        //根据用户名获取集合索引定位到对象
        int index = getIndex(list, name);
        User user = list.get(index);
        //判断用户的身份证号码和手机号是否一致
        if (!(user.getId().equalsIgnoreCase(id) && user.getPhone().equals(phone))) {
            System.out.println("身份证号码或手机号有误,不能修改密码");
            return;
        }
        while (true) {
            System.out.print("请输入密码:");
            String newPassword = sc.next();
            boolean result = checkPassword(newPassword);
            if (!result) {
                System.out.println("密码长度有误,请重新输入");
                continue;
            }
            System.out.print("请再次输入密码:");
            String againPassword = sc.next();
            if (!againPassword.equals(newPassword)) {
                System.out.println("密码输入错误,请重试");
                continue;
            } else {
                user.setPassword(newPassword);
                System.out.println("修改密码成功");
                break;
            }
        }
    }

    private static int getIndex(ArrayList<User> list, String name) {
        for (int i = 0; i < list.size(); i++) {
            User user = list.get(i);
            if (user.getName().equals(name)) {
                return i;
            }
        }
        return -1;
    }
}
posted @ 2022-09-27 20:54  ben10044  阅读(47)  评论(0编辑  收藏  举报