Java基础语法综合练习_学生管理系统(控制台)

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

需求:

初始菜单:


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

学生类:

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

添加功能:

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

·id唯一

删除功能:

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

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

修改功能:

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

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

查询功能:

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

·如果没有学生信息,提示:当前无学生信息,请添加后再查询
·如果有学生信息,需要按照以下格式输出。(不用过于纠结对齐的问题)
        id            姓名        年龄        家庭住址
        001         张三         23          南京
        002         李四         24          北京
        003         王五         25          广州
        004         赵六         26          深圳

代码编写:

创建学生类,编写初始页面,并对功能依次编写。

StudentSyetem:

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

public class StudentSystem {

    //创建集合存储学生信息
    static ArrayList<Student> list = new ArrayList<>();

    添加初始学生信息
    static {
        list.add(new Student("001", "han", 21, "石家庄"));
    }


    //设置常量
    private static final String ADD_STUDENT = "1";
    private static final String DELETE_STUDENT = "2";
    private static final String UPDATE_STUDENT = "3";
    private static final String QUERY_STUDENT = "4";


    public static void startStudentSystem() {
        Scanner sc = new Scanner(System.in);
        loop : while (true) {
            //1.界面
            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("请输入您的选择");

            //键盘录入用户选择
            String choose = sc.next();

            //对应选择做出对应行为
            switch (choose) {
                case ADD_STUDENT -> addStudent(list);
                case DELETE_STUDENT -> deleteStudent(list);
                case UPDATE_STUDENT -> updateStudent(list);
                case QUERY_STUDENT -> queryStudent(list);
                case "5" -> {
                    System.out.println("退出");
                    System.exit(0);//用System.exit(0) 停止虚拟机运行,等于点×关闭页面
                }
                default -> System.out.println("没有此选项!");
            }
        }
    }

    //定义每个选择对应方法

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

        String id = "";
        while (true) {
            System.out.println("请输入学生id:");
            id = sc.next();
            boolean flag = contains(list, id);
            //id已存在
            if(flag) {
                System.out.println("id已存在,请重新输入");
            }
            //id不存在
            else {
                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("添加成功");
    }

    //删除学生
    public static void deleteStudent(ArrayList<Student> list) {
        System.out.println("删除学生");
        //键盘录入要删除学生的id
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入要删除学生的id:");
        String id = sc.next();
        //查询id索引
        int index = getIndex(list, id);
        //id存在
        if(index >= 0) {
            list.remove(index);
            System.out.println("id为" + id + "的学生删除成功");
        }
        //id不存在
        else {
            System.out.println("id不存在");
        }
        }

    //修改学生
    public static void updateStudent(ArrayList<Student> list) {
        System.out.println("修改学生");
        //1.键盘录入id
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入要修改的学生id");
        String id = sc.next();

        //获取id索引
        int index = getIndex(list, id);

        if(index == -1) {
            System.out.println("查找的id为" + id + "的学生不存在");
            return;
        }

        //代码到这里说明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) {
        System.out.println("查询学生");
        //没有学生信息
        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 static boolean contains(ArrayList<Student> list, String id) {
        return getIndex(list, id) >= 0;
    }

    //定义方法根据返回id所在索引
    public static int getIndex(ArrayList<Student> list, String id) {
        for (int i = 0; i < list.size(); i++) {
            Student stu = list.get(i);
            String sid = stu.getId();
            if(sid.equals(id)) {
                return i;
            }
        }

        return -1;
    }

}
我们可以进行一些测试

编写测试类Test调用一下我们编写的学生管理系统

public class Test {
    public static void main(String[] args) {
        StudentSystem ss = new StudentSystem();
        ss.startStudentSystem();
    }
}

运行后直接进入到我们的功能页面

接下来我们选择4:查询学生

如图,正常显示了我们初始化添加的学生信息(学生信息没对齐有一点小瑕疵),并且继续显示我们的功能页面,并可以选择功能。

我们添加学生并查询试试

也是没有问题的

我们再验证下删除学生和修改学生后查询学生看看怎么个事

如图,功能全部运行正常

我们再测试一下不符合规范的情况:

修改不存在的学生:                                               删除不存在的学生:            

接下来我们对这个学生管理系统进行升级,加入登录页面

需求:

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

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

登录界面:


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
 

我们开始进行编码

StudentSystemInfo:

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

public class StudentSystemInfo {
    //创建集合存储用户信息
    //注:静态里面只能用静态,所以也要有static修饰
    static ArrayList<User> list = new ArrayList<>();

    //添加初始用户信息           ※若要把集合创建和添加初始用户放到main方法内,可能
    static {
        list.add(new User("han", "123456", "111222333322221111", "11122223333"));
    }
    /*↑※↑你可能有疑问了,若是把集合创建和添加初始用户放到main方法内,也不会报错,但是!
    main方法可被调用,若反复调用main方法内存中可能会存在多个集合,用户信息也会被反复添加。*/


    public static void main(String[] args) {

        loop : while (true) {

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

            //录入操作
            Scanner sc = new Scanner(System.in);
            String choose = sc.next();

            //对应操作的方法
            switch (choose) {
                case "1" -> login(list);
                case "2" -> register(list);
                case "3" -> forgetPassword(list);
                case "4" -> {
                    System.out.println("退出系统");
                    break loop;
                }
                default -> System.out.println("没有这个操作");
            }


        }


    }

    //注册功能
    public static void register(ArrayList<User> list) {
        //※先验证格式是否正确,再验证是否唯一,节约资源

        Scanner sc = new Scanner(System.in);

        //1.用户名验证
        //键盘录入用户名
        String username = "";
        while (true) {
            System.out.println("请输入用户名(注:长度为3~15位,只能含大小写字母和数字,且不能为纯数字!)");
            username = sc.next();

            //判断
            boolean flag1 = checkUsername(username);
            //如果不满足
            if (!flag1) {
                System.out.println("用户名格式不符合规范,请重新输入!");
                continue;
            }
            //代码到这里说明格式满足  继续判断是否存在
            boolean flag2 = contains(list, username);
            if (flag2) {
                //当前用户名已存在
                System.out.println("用户名:" + username + "已存在,请重新输入!");
            } else {
                //当前用户名不存在
                //继续录入下面的数据
                System.out.println("用户名:" + username + "可用");
                break;
            }
        }

        //2.密码验证
        String password = "";
        while (true) {
            System.out.println("请输入密码");
            password = sc.next();
            System.out.println("请再次输入密码确认");
            String password2 = sc.next();
            if (!(password.equals(password2))) {
                //不一致
                System.out.println("两次输入的密码不一致,请重新输入!");
                continue;
            } else {
                //一致
                System.out.println("两次输入的密码一致,密码可用");
                break;
            }
        }

        //3.身份证号码验证
        String personId = "";
        while (true) {
            System.out.println("请输入身份证号码");
            personId = sc.next();
            boolean flag2 = checkPersonid(personId);
            if (flag2) {
                //符合规范
                System.out.println("当前身份证号码可用");
                break;
            } else {
                //不符合规范
                System.out.println("当前身份证号码不符合规范,请重新输入!");
            }
        }

        //4.手机号验证
        String phone = "";
        while (true) {
            System.out.println("请输入手机号");
            phone = sc.next();
            boolean flag3 = checkPhone(phone);
            if (flag3) {
                //符合规范
                System.out.println("手机号可用");
                break;
            } else {
                //不符合规范
                System.out.println("当前手机号不符合规范,请重新输入!");
            }
        }

        //验证完毕 将信息存入集合中
        //创建对象
        User user = new User(username, password, personId, phone);
        //添加元素
        list.add(user);

    }

    //登录功能
    public static void login(ArrayList<User> list) {
        Scanner sc = new Scanner(System.in);
        for (int i = 0; i < 3; i++) {
            //1.录入用户名
            System.out.println("请输入用户名");
            String username = sc.next();
            //2.验证用户名是否存在
            if (!contains(list, username)) {
                //不存在
                System.out.println("用户名未注册,请先注册");
                return;
            }
            //用户名存在进行以下操作
            //输入密码
            System.out.println("请输入密码");
            String password = sc.next();
            while (true) {
                //生成验证码
                String rightCode = getCode();
                System.out.println("验证码:" + rightCode);
                //输入验证码
                System.out.println("请输入验证码");
                String code = sc.next();
                //比较验证码
                if (!code.equalsIgnoreCase(rightCode)) {
                    //不正确
                    System.out.println("验证码不正确,请重新输入");
                    continue;
                } else {
                    break;
                }
            }
            //判断用户名和密码是否正确
            User userInfo = new User(username, password, null, null);
            boolean result = checkUserInfo(list, userInfo);
            if (result) {
                System.out.println("登录成功,已进入学生管理系统");
                //调用学生管理系统功能页面
                StudentSystem ss = new StudentSystem();
                ss.startStudentSystem();
                break;
            } else {
                System.out.println("登录失败,用户名或密码错误");
                if (i == 2) {
                    System.out.println("当前账号" + username + "因为用户名密码错误次数过多,已被封禁");
                    return;
                } else {
                    System.out.println("当前账号" + username + "还有" + (2 - i) + "次机会");
                }
            }
        }

    }

    //忘记密码功能
    public static void forgetPassword(ArrayList<User> list) {
        //1.键盘录入用户名
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入用户名:");
        String username = sc.next();

        //2.对用户名判断
        int index = getIndex(list, username);
        //用户名不存在
        if (index == -1) {
            System.out.println("用户名不存在,请先注册");
            return;
        }
        //代码到这里说明用户名存在
        System.out.println("请输入身份证号码:");
        String personid = sc.next();
        System.out.println("请输入手机号码:");
        String phone = sc.next();

        //3.判断身份证号码和手机号码是否正确
        User user = list.get(index);
        //都正确
        if (!(personid.equals(user.getPersonId()) && phone.equals(user.getPhone()))) {
            System.out.println("身份证号码或手机号错误,修改失败");
            return;
        }
        //不正确
        while (true) {
            System.out.println("请输入修改后的密码:");
            String password = sc.next();
            System.out.println("请再次输入确认修改后的密码:");
            String passwordAgain = sc.next();
            if (password.equals(passwordAgain)) {
                user.setPassword(password);
                System.out.println("密码已修改");
                break;
            } else {
                System.out.println("两次输入的密码不一致,请重新输入");
            }
        }

    }

    //根据用户名返回list中的对应索引   //※注意可能为null的字符串
    public static int getIndex(ArrayList<User> list, String username) {
        //集合为空
        for (int i = 0; i < list.size(); i++) {
            User user = list.get(i);
            String listUserName = user.getUserName();
            if (listUserName.equals(username)) {
                return i;
            }
        }
        return -1;
    }

    //判断用户名是否在list中存在
    public static boolean contains(ArrayList<User> list, String username) {
        return getIndex(list, username) >= 0;
    }

    //生成验证码方法
    //要求:一共五位,四位字母,不论大小写和一位数字,位置随机
    public static String getCode() {
        //1.创建集合存储大小写字母
        ArrayList<Character> list = new ArrayList<>();
        for (int i = 0; i < 26; i++) {
            list.add((char) ('a' + i));
            list.add((char) ('A' + i));
        }
        //2.创建一个4位随机字母的字符串
        StringBuilder sb = new StringBuilder();
        Random r = new Random();
        for (int i = 0; i < 4; i++) {
            int index = r.nextInt(list.size());
            sb.append(list.get(index));
        }
        //3.再在末尾添加随机数字
        int randomNumber = r.nextInt(10);
        sb.append(randomNumber);
        //4.将最后一位数字与随即索引交换位置
        //转换为字符数组
        char[] arr = sb.toString().toCharArray();
        int randomIndex = r.nextInt(arr.length);
        char temp = arr[arr.length - 1];
        arr[arr.length - 1] = arr[randomIndex];
        arr[randomIndex] = temp;
        //转换为数组
        String result = new String(arr);

        //返回结果
        return result;

    }

    //创建方法,验证用户名
    public static boolean checkUsername(String username) {
        //※先验证格式,再验证是否存在,节约资源

        //长度3~15
        int length = username.length();
        if (!(length >= 3 && length <= 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 letterCount = 0;
        //遍历数组查看字母个数,不能为0
        for (int i = 0; i < username.length(); i++) {
            char c = username.charAt(i);
            if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {
                letterCount++;
                break;          //提高效率
            }
        }
        return letterCount > 0;
    }

    //创建方法,验证身份证号码
    public static boolean checkPersonid(String personId) {
        int length = personId.length();
        if (length != 18) {
            //长度不为18
            return false;
        }
        //代码到这里说明长度合法
        char first = personId.charAt(0);
        if (first == '0') {
            //首字母为0
            return false;
        }
        //代码到这里说明长度合法,首个数字合法
        //遍历 前17位需都为数字
        for (int i = 0; i < length - 1; i++) {
            char c = personId.charAt(i);
            if (!(c >= '0' && c <= '9')) {
                //不为数字
                return false;
            }
        }
        //最后一位可以是数字,也可以是'X'或'x'
        char last = personId.charAt(length - 1);
        if (!((last >= '0' && last <= '9') || (last == 'X') || (last == 'x'))) {
            //不符合要求
            return false;
        }

        return true;
    }

    //创建方法,验证手机号
    public static boolean checkPhone(String phone) {
        //长度
        int length = phone.length();
        if (length != 11) {
            return false;
        }
        //不能以0开头
        char first = phone.charAt(0);
        if (first == '0') {
            return false;
        }
        //只能为数字
        //遍历
        for (int i = 0; i < length; i++) {
            char c = phone.charAt(i);
            if (!(c >= '0' && c <= '9')) {
                return false;
            }
        }

        return true;
    }

    //创建方法,验证用户名和密码是否正确
    public static boolean checkUserInfo(ArrayList<User> list, User userInfo) {
        //遍历集合
        for (int i = 0; i < list.size(); i++) {
            User user = list.get(i);
            if (userInfo.getUserName().equals(user.getUserName()) && userInfo.getPassword().equals(user.getPassword())) {
                return true;
            }
        }

        return false;
    }
}

可以看到里边有很多方法来验证或者实现某些功能,这里我想说下我的感悟,正确使用方法真的可以很大程度的简化代码逻辑,对代码编写思路有很大优化,我会把我没有定义验证方法且编码思路不那么清晰时编写的代码放到文章结尾,没有正确使用方法真的让人有费力不讨好的感觉,大家一定注意啊。

接下来我们先来测试一下功能升级后的学生管理系统吧

先使用我们添加的初始化用户登录一下:

注册再登录试试:

点击忘记密码后再登陆试试:

好,都没问题

接下来我们开始不符合规范的信息看它会不会提示:

登录功能中用户名不存在,密码错误和验证码错误的情况

注册功能中用户名错误格式信息验证:

注册功能中密码,身份证号及电话号码错误格式信息验证:

忘记密码功能中不符合规范情况验证:

没有问题,圆满!

下面是编码思路及方法使用相比上述代码差一点的登陆界面代码:

(没有兴趣的同学可以不往下看了,也希望大家可以看完然后找出缺陷,从而之后可以避免,掌握更规范简洁的编码习惯。)

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

public class StudentSystemPro {
    public static void main(String[] args) {
        //创建集合存储用户信息
        ArrayList<User> list = new ArrayList<>();
        loop : while (true) {

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

            //录入操作
            Scanner sc = new Scanner(System.in);
            String choose = sc.next();

            //对应操作的方法
            switch (choose) {
                case "1" -> login(list);
                case "2" -> register(list);
                case "3" -> forgetPassword(list);
                case "4" -> {
                    System.out.println("退出系统");
                    break loop;
                }
                default -> System.out.println("没有这个操作");
            }


        }


    }

    //注册功能
    public static void register(ArrayList<User> list) {
        //1.用户名验证
        //※先验证格式是否正确,再验证是否唯一,节约资源

        Scanner sc = new Scanner(System.in);

        //创建对象
        User user = new User();

        //添加元素
        list.add(user);

        //键盘录入用户名
        loop:
        while (true) {
            System.out.println("请输入用户名");
            String username = sc.next();

            //判断
            //用户名已存在
            if (contains(list, username)) {
                System.out.println("用户名已存在,请重新输入!");
            }
            //用户名未存在
            //用户名长度不满足3~15位
            else if (username.length() < 3 || username.length() > 15) {
                System.out.println("用户名长度应为3~15位,请重新输入!");
            }
            //用户名未存在且长度满足
            else {
                int letterNum = 0;
                boolean flag = true;
                for (int i = 0; i < username.length(); i++) {
                    char c = username.charAt(i);
                    //判断每个字符是否为字母或数字
                    if ((c >= '0' && c <= '9') || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {
                        //字符大于字符9,则为字母
                        if (c > '9') {
                            letterNum++;
                        }
                    }
                    //有其他字符
                    else {
                        System.out.println("密码应为字母加数字,请重新输入!");
                        flag = false;
                        break;
                    }
                }
                //如果所有字符都为字母或数组
                if (flag) {
                    //是否为纯数字,即字母个数为0
                    if (letterNum == 0) {
                        System.out.println("密码不能为纯数字,请重新输入!");
                    } else {
                        System.out.println("用户名符合规范");
                        user.setUserName(username);
                        break loop;
                    }
                }


            }

        }

        //2.密码验证
        String password = "";
        while (true) {
            System.out.println("请输入密码:");
            password = sc.next();
            System.out.println("请再次输入密码:");
            String password2 = sc.next();
            if (password.equals(password2)) {
                user.setPassword(password);
                break;
            } else {
                System.out.println("两次输入的密码不一致,请重新输入!");
            }
        }
        System.out.println("密码可用");
        user.setPassword(password);

        //3.身份证号码验证
        String personid = "";
        loop:
        while (true) {
            System.out.println("请输入身份证号码:");
            personid = sc.next();
            //长度不符合
            if (personid.length() != 18) {
                System.out.println("身份证号码长度不符合规范,请重新输入!");
            }
            //长度符合 第一位不符合
            else if (personid.charAt(0) == '0') {
                System.out.println("身份证号码第一位不为0,请重新输入!");
            }
            //长度符合 第一位符合
            else {
                boolean flag = true;
                //前十七位需都为数字
                for (int i = 0; i < (personid.length() - 1); i++) {
                    char c = personid.charAt(i);
                    if (c < '0' || c > '9') {
                        System.out.println("身份证前十七位应都为数字!请重新输入");
                        flag = false;
                        break;
                    }
                }
                //最后一位可以是数字可以是X或x
                //flag为true 说明前十七位都为数字 符合要求
                char lastChar = personid.charAt(personid.length() - 1);
                if (flag && ((lastChar >= '0' && lastChar <= '9') || lastChar == 'X' || lastChar == 'x')) {
                    user.setPersonId(personid);
                    System.out.println("身份证号码符合规范");
                    break loop;
                }
            }
        }

        //4.手机号验证
        String phone = "";
        loop:
        while (true) {
            System.out.println("请输入手机号码:");
            phone = sc.next();
            //手机号码长度不为11
            if (phone.length() != 11) {
                System.out.println("手机号码长度不符合规范,请重新输入!");
            }
            //手机长度为11位 但是以0开头
            else if (phone.charAt(0) == '0') {
                System.out.println("手机号码不能以0开头,请重新输入!");
            }
            //手机长度符合,开头不为0 也符合
            //遍历全部为0~9
            else {
                boolean flag = true;
                for (int i = 0; i < phone.length(); i++) {
                    char c = phone.charAt(i);
                    if (c < '0' || c > '9') {
                        flag = false;
                        System.out.println("电话号码应全为数字,请重新输入!");
                        break;
                    }
                }
                if (flag) {
                    user.setPhone(phone);
                    System.out.println("电话号码符合规范");
                    break loop;
                }
            }
        }
        System.out.println("注册成功");
    }

    //登录功能
    public static void login(ArrayList<User> list) {
        Scanner sc = new Scanner(System.in);
        //定义错误次数
        int count = 0;
        loop:
        while (true) {
            //录入用户名
            System.out.println("请输入用户名:");
            String username = sc.next();

            //判断用户名是否存在
            int index = getIndex(list, username);
            //用户名不存在
            if (index == -1) {
                System.out.println("用户名未注册,请先注册!");
                break;
            }
            //用户名存在
            else {
                //输入密码
                System.out.println("请输入密码:");
                String password = sc.next();
                //生成验证码
                String rightCode = getCode();
                System.out.println("验证码:" + rightCode);
                //输入验证码
                System.out.println("请输入验证码:");
                String code = sc.next();

                //判断验证码
                //验证码正确  忽略大小写
                if (code.equalsIgnoreCase(rightCode)) {
                    //判断用户名和密码 代码到这里说明用户名已存在
                    //返回用户名所在索引
                    if (list.get(getIndex(list, username)).getPassword().equals(password)) {
                        System.out.println("登录成功");
                        StudentSystem ss = new StudentSystem();
                        ss.startStudentSystem();
                        break loop;
                    }
                    //密码不正确
                    else {
                        System.out.println("用户名或密码错误!");
                        count++;
                    }

                }
                //验证码错误
                else {
                    System.out.println("验证码错误,请重新输入");
                    count++;
                }
                if(count != 3) {
                    System.out.println("您还剩" + (3 - count) + "次机会");
                } else {
                    System.out.println("您的登录次数已用尽,请联系管理员");
                    break loop;
                }
            }

        }
    }

    //忘记密码功能
    public static void forgetPassword(ArrayList<User> list) {
        //1.键盘录入用户名
        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("请输入用户名:");
            String username = sc.next();

            //2.对用户名判断
            int index = getIndex(list, username);
            //用户名不存在
            if(index == -1) {
                System.out.println("用户名不存在,请先注册");
                break;
            }
            //代码到这里说明用户名存在
            System.out.println("请输入身份证号码:");
            String personid = sc.next();
            System.out.println("请输入手机号码:");
            String phone = sc.next();

            //3.判断身份证号码和手机号码是否正确
            User user = list.get(index);
            //都正确
            if(personid.equals(user.getPersonId()) && phone.equals(user.getPhone())) {
                System.out.println("请输入修改后的密码:");
                String password = sc.next();
                user.setPassword(password);
                System.out.println("密码已修改");
                break;
            }
            //不正确
            else {
                System.out.println("修改失败");
            }
        }

    }

    //根据用户名返回list中的对应索引   //※注意可能为null的字符串
    public static int getIndex(ArrayList<User> list, String username) {
        //集合为空
            for (int i = 0; i < list.size(); i++) {
                User user = list.get(i);
                String listUserName = user.getUserName();
                if(listUserName == null) {

                }
                else if (listUserName.equals(username)) {
                    return i;
                }
            }
        return -1;
    }

    //判断用户名是否在list中存在
    public static boolean contains(ArrayList<User> list, String username) {
        return getIndex(list, username) >= 0;
    }

    //生成验证码方法
    //要求:一共五位,四位字母,不论大小写和一位数字,位置随机
    public static String getCode() {
        Random r = new Random();
        String str = "";

        //创建数组存储大小写字母
        char[] arr = new char[52];
        for (int i = 0; i < arr.length; i++) {
            if (i < 26) {
                arr[i] = (char) ('a' + i);
            } else {
                arr[i] = (char) ('A' + i - 26);
            }
        }

        //随机生成四位字母的字符串
        for (int i = 0; i < 4; i++) {
            int index = r.nextInt(52);
            str = str + arr[index];
        }

        //再在四位字母字符串后加上随机数字
        int number = r.nextInt(10);
        str = str + number;

        //将最后一位数字与任意索引调换位置
        //创建字符数组
        char[] charArr = new char[5];
        //将字符串字符存入字符数组
        for (int i = 0; i < 5; i++) {
            charArr[i] = str.charAt(i);
        }
        //在字符数组中交换位置
        int randomIndex = r.nextInt(5);
        char temp = charArr[charArr.length - 1];
        charArr[charArr.length - 1] = charArr[randomIndex];
        charArr[randomIndex] = temp;

        //将字符数组转换成字符串
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < charArr.length; i++) {
            sb.append(charArr[i]);
        }
        String result = sb.toString();

        return result;
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值