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

登录界面的创建

首先我们要创建菜单目录,跟上一个简易版的学生成长管理系统一样,提示用户对操作进行选择。

package com.it.upgradesystem;

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

public class AppTest {
    public static void main(String[] args) {
        ArrayList<App> list = new ArrayList<>();
        //先创建一个菜单目录,登入界面
        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("-----欢迎来到学生成长管理系统-----");
            System.out.println("请选择操作 1登录 2注册 3忘记密码 4退出");
            int choice = sc.nextInt();
            switch (choice) {
                case 1 -> login(list);
                case 2 -> register(list);
                case 3 -> forgetPassword(list);
                case 4 ->{
                    System.out.println("退出");
                    System.exit(0);
                }
                default -> System.out.println("没有这个选项,请重新输入");
            }
        }
    }
    public static void login(ArrayList<App> list) {
        System.out.println("登录");
    }

    public static void register(ArrayList<App> list) {
        System.out.println("注册");
    }

    public static void forgetPassword(ArrayList<App> list) {
        System.out.println("忘记密码");
    }
}

我们定义了一个简单的Java Bean类,用于封装用户的基本信息(用户名、密码、身份证号码和电话号码)。

package com.it.upgradesystem;

public class  App {
    private String uname;
    private String password;
    private String idCardNumber;
    private String phoneNumber;

    public App() {
    }

    public App(String uname, String password, String idCardNumber, String phoneNumber) {
        this.uname = uname;
        this.password = password;
        this.idCardNumber = idCardNumber;
        this.phoneNumber = phoneNumber;
    }

    public String getUname() {
        return uname;
    }

    public void setUname(String uname) {
        this.uname = uname;
    }

    public String getPassword() {
        return password;
    }

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

    public String getIdCardNumber() {
        return idCardNumber;
    }

    public void setIdCardNumber(String idCardNumber) {
        this.idCardNumber = idCardNumber;
    }

    public String getPhoneNumber() {
        return phoneNumber;
    }

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

前期工作完成了,然后我们就要开始分析如何实现这三个操作,首先我们要搞清楚,它们执行的先后顺序,先注册,再登录,最后忘记密码,可以很好的理解,有了帐号才能登录。

注册操作

  1. 用户名需求满足以下要求:

    验证要求:

    用户名唯一

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

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

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

  3. 身份证号码需要验证。

    验证要求

    长度为18位

    不能以0为开头

    前17位,必须都是数字

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

  4. 手机号验证

    验证要求:

    长度为11位

    不能以0为开头

    必须都是数字

我们现在来分析每一步要用到的方法:

第一段

Scanner键盘录入用户名username

1.先到list集合中判断是否存在contain/getindex

2.长度必须为3~15之间,可以用字符串length()

3.先循环获取username里面的每一个字符,如果有一个字符不在26个大小写字母,0~9数字中,那么就不满足条件,用统计的办法,统计有多少个字符在26个大小写字母中,大于等于0才是满足要求的用户。

代码演示如下:

首先判断输入用户名的格式是否正确,再判断其唯一性,如果不满足条件,则重新输入。

		//1.键盘录入用户名
        Scanner sc = new Scanner(System.in);
        String username;
        while (true) {
            System.out.println("请输入用户名:");
            username = sc.nextLine();
            //判断输入的用户名格式是否正确
            boolean flag1 = checkUserName(username);
            if (!flag1) {
                System.out.println("当前用户名不满足格式,请重新输入");
                continue;
            }
            //判断用户名的唯一性
            boolean flag2 = contains(list, username);
            if (flag2) {
                System.out.println("当前用户已经存在,请重新注册");
            } else {
                System.out.println("用户" + username + "可用");
                break;
            }
        }

判断用户名格式是否正确方法:

public static boolean checkUserName(String username) {
        //判断用户名的格式是否正确
        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;
            }
        }

        //计数器计算有多少个字符在'a'~'z','A'~'Z'中
        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++;
                //a123当第一个已经判断为字母了,就不用再继续执行了
                break;
            }
        }
        return count > 0;
    }

判断用户名的唯一性

public static boolean contains(ArrayList<App> list, String username) {
        //判断用户的唯一性
        //循环遍历集合得到每一个用户对象
        //拿着用户对象中的用户名进行比较
        for (int i = 0; i < list.size(); i++) {
            App user = list.get(i);
            String rightusername = user.getUname();
            if(rightusername.equals(username)) {
                return true;
            }
        }
        return false;
    }

接下来我们要陆续地输入密码,身份证号码,手机号码。

第二段

利用Scanner第一次输入密码

利用Scanner第二次输入密码

只有两次密码一致,才是符合要求的,否则不符合

//2.键盘输入密码
            String password;
            while (true) {
                System.out.println("请输入您要注册的密码");
                password = sc.nextLine();
                System.out.println("请再次输入您要注册的密码");
                String againPassword = sc.nextLine();
                if (!(password.equals(againPassword))) {
                    System.out.println("密码不一致,请重新输入");
                    continue;
                } else {
                    System.out.println("密码一致,继续录入其他信息");
                    break;
                }
            }

第三段

键盘录入身份证号码

  1. 调用字符串里面的length()方法获取长度,只有为18的时候才满足。

  2. 可以调用charAt(0)获取第一个字符,跟‘0’进行对比。

  3. 遍历前17位,如果有一个不在0~9的范围内,那么就是不符合的

  4. 获取最后一个字符,如果这个字符在0~9之间或者为‘x’,’X’那么就满足。

代码如下:

 //键盘输入身份证号码
            String personID;
            while(true) {
                System.out.println("请输入身份证号码:");
                personID = sc.nextLine();
                boolean flag = checkPersonID(personID);
                if (flag) {
                    System.out.println("身份证号码输入成功,请继续其他操作");
                    break;
                } else {
                    System.out.println("身份证号码输入有误,请重新输入");
                    continue;
                }
            }

判断身份证号的方法

public static boolean checkPersonID(String personID) {
        //长度为18才满足
        if(!(personID.length() == 18)){
            return false;
        }
        //身份证号码第一位不能为‘0’
        if(personID.charAt(0) == '0'){
            return false;
        }
        //前17位必须为数字
        for (int i = 0; i < personID.length()-1; i++) {
            char c1 = personID.charAt(i);
            if(!(c1 >='0' && c1<='9')){
                return false;
            }
        }
        //最后一个字符,判断是否再0~9之间还是为‘x''X',满足则符合要求
        char endChar = personID.charAt(personID.length()-1);
        if((endChar >= '0' && endChar <= '9') || (endChar == 'X') || (endChar == 'x')){
            return true;
        }else{
            return false;
        }
    }

第四段

键盘录入手机号码

  1. 调用字符串里面的length()方法获取长度

  2. 可以调用charAt(0)获取第一个字符,跟‘0’进行对比。

  3. 遍历手机号码,如果一个字符不在0~9那么就是不行的

代码如下:

//键盘录入手机号码
            String phoneNumber;
            while(true) {
                System.out.println("请输入手机号码");
                phoneNumber = sc.nextLine();
                boolean flag = checkPhoneNumber(phoneNumber);
                if (flag) {
                    System.out.println("手机号输入成功");
                    break;
                } else {
                    System.out.println("手机号输入有误,请重新输入");
                    continue;
                }
            }
            System.out.println("注册成功");
            App u = new App(username, password, personID, phoneNumber);
            list.add(u);
        }

判断手机号的方法

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

当我们输入完手机号码时,注册操作就已经完成了,我们将输入的数据存入集合当中,这样我们就完成了一个对象的注册。

我们可以创建一个方法来校验注册,就是循环打印集合里的对象。

			//校验
            printlist(list);

方法:

public static void printlist(ArrayList<App> list) {
        for (int i = 0; i < list.size(); i++) {
            App user = list.get(i);
        	System.out.println(user.getUname()+","+user.getPassword()+","
                    +user.getIdCardNumber()+","+user.getPhoneNumber());
        }
    }

登录操作

要求:

  1. 键盘录入用户名
		//System.out.println("登录");
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入用户名:");
        String username = sc.nextLine();
        boolean flag = contains(list, username);
        if (!flag) {
            System.out.println("该用户名未注册,请先注册再登录");
            return;
        }
        System.out.println("请输入密码");
        String password = sc.nextLine();

调用方法判断输入的用户名是否存在

  1. 键盘录入密码
		System.out.println("请输入密码");
        String password = sc.nextLine();
  1. 获取一个验证码

    验证码的要求:

    长度为5

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

    数字可以出现在任意位置,比如:aQa1K

键盘录入验证码:

		//验证码的判断
        while(true) {
            String rightCode = getCode();
            System.out.println("当前验证码为:" + rightCode);
            System.out.println("请输入当前验证码:");
            String code = sc.nextLine();
            if (code.equalsIgnoreCase(rightCode)) {
                System.out.println("验证码输入正确");
                break;
            } else {
                System.out.println("验证码输入错误,请重新输入");
                continue;
            }
        }

随机生成验证码的方法:

public static String getCode(){
        //先创建一个集合,将52个字母存入
        ArrayList<Character> list = new ArrayList<>();
        for (int i = 0; i < 26; i++) {
            list.add((char)('a'+i));
            list.add((char)('A'+i));
        }
        StringBuilder sb = new StringBuilder();
        //随机抽取四个字符
        Random r = new Random();
        for (int i = 0; i < 4; i++) {
            //获取索引
            int index = r.nextInt(list.size());
            //利用随机索引获取字符,并添加到StringBuilder类中
            sb.append(list.get(index));
        }
        //将一个随机数字添加到末尾
        int number = r.nextInt(10);
        sb.append(number);
        //将最后一位数字与随机数字进行交换
        //如果我们要修改字符串中的内容,就要先将其变成字符数组
        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);
    }

验证:

  1. 判断用户名是否存在,如果不存在,直接提示未注册

  2. 既然用户名存在,那么就判断密码和验证码是否正确。

    如果正确,登陆成功

    如果错误,会有三次机会

将整个登录操作中嵌入一个for循环,3次输入机会

			//验证用户名和密码是否正确
            //集合中是否包含用户名和密码
            //定义一个方法来同时验证用户名和密码

            //封装思想的应用
            //将零散的数据进行封装,为一个对象
            //之后传递一个整体就可以了
            App useInfo = new App(username, password, null, null);
            boolean result = checkUserInfo(list, useInfo);
            if (result) {
                System.out.println("登录成功,可以使用学生成长管理系统了");
                break;
            } else {
                System.out.println("登录失败,用户名或密码错误");
                if(i == 2){
                    System.out.println("当前帐号"+username+"已被锁住,请联系有关人员");
                }else{
                    System.out.println("登录失败,用户名或密码错误。您还剩"+(2-i)+"次机会");
                }
            }

判断方法:

public static boolean checkUserInfo(ArrayList<App> list, App useInfo) {
        //遍历集合,判断用户名和密码是否存在,如果存在则登录成功,不存在则登录失败
        for (int i = 0; i < list.size(); i++) {
            App user = list.get(i);
            if((user.getUname().equals(useInfo.getUname())) && (user.getPassword().equals(useInfo.getPassword()))) {
                return true;
            }
        }
        return false;
    }

忘记密码操作

检验用户名是否存在:

		Scanner sc = new Scanner(System.in);
        System.out.println("请输入用户名:");
        String username = sc.nextLine();
        boolean flag = contains(list,username);
        if (!flag) {
            System.out.println("用户名"+username+"未注册");
            return;
        }

键盘录入身份证号码和手机号码,并验证两个是否正确

		//键盘录入身份证号码和手机号码
        System.out.println("请输入身份证号码:");
        String PersonID = sc.nextLine();
        System.out.println("请输入手机号码:");
        String PhoneNumber = sc.nextLine();

        //要判断身份证号码和手机号码是否正确
        //就要获取集合里用户的与之做对比
        int index = getIndex(list, username);
        App user = list.get(index);
        if(!(user.getPhoneNumber().equalsIgnoreCase(PhoneNumber)) && (user.getIdCardNumber().equalsIgnoreCase(PersonID))) {
            System.out.println("身份证号码或手机号码有误,不能修改密码");
            return;
        }

获取索引用到的方法:

 public static int getIndex(ArrayList<App> list,String username) {
        //获取索引
        for (int i = 0; i < list.size(); i++) {
            App user = list.get(i);
            if(user.getUname().equals(username)){
                return i;
            }
        }
        return -1;
    }

验证完毕,修改密码

		String password;
        while(true) {
            System.out.println("请输入要修改的密码");
            password = sc.nextLine();
            System.out.println("请再次输入密码");
            String againPassword = sc.nextLine();
            if (password.equals(againPassword)) {
                System.out.println("密码输入一致");
                break;
            } else {
                System.out.println("密码输入有误,请重新输入");
                continue;
            }
        }

        //直接修改密码即可
        user.setPassword(password);
        System.out.println("密码修改成功");

代码输入完毕,说明我们三个操作的代码都写好了,但是我们想要将升级版的和简易版的学生成长管理系统连接起来,那么我们就要再登录完成之后写上链接的代码。

				//创建对象调用方法,启动学生成长管理系统
                My_StudentSystem ss = new My_StudentSystem();
                ss.startMy_StudentSystem();

再将My_StudentSystem测试类的

public static void main(String[] args)

改为

public static void startMy_StudentSystem()

到目前为止,我们学生成长管理系统的升级版本就完成了。

你可能感兴趣的:(Java升级版的学生成长管理系统)