当前位置:首页 » 《关于电脑》 » 正文

Java-学生管理系统[进阶](登录系统)

0 人参与  2024年11月11日 15:21  分类 : 《关于电脑》  评论

点击全文阅读


这次我们来尝试使用Java实现一下"学生管理系统",顾名思义,就是实现一个能用来管理学生各种数据的系统。在后续学习中我们将对"学生管理系统"进行两种实现

? 学生管理系统[初阶](不带模拟登录系统)——(传送门:Java-学生管理系统[初阶]-CSDN博客)

? 学生管理系统[进阶](附带模拟登录系统)——(我们这次讲这个)

在这篇文章学习实现"学生管理系统"之前,需要我们了解并学习过以下知识点:

? Java的输入和输出

? Java的分支与循环

? Java的数组

? Java的方法(定义 调用 重载)

? Java的初阶面向对象(类和对象 构造方法)

? Java的集合(基本使用)

前言:

? 在实现"学生管理系统[进阶]"之前,我们先需要明确一下此篇文章中我们的目标

此次我们的目标是:以上一篇文章中学习的"学生管理系统[初阶]"为基础上再实现一个"模拟用户登录"的功能大概能细分为以下几个功能

? "学生管理系统"用户的登录("用户名","密码","验证码")

? "学生管理系统"用户的注册("用户名","密码","身份证号","手机号")

? "学生管理系统"用户忘记密码(修改)(输入:"用户名","身份证号","手机号";修改:"密码")

(在上一篇中已经编写过的代码,这篇文章就会一带而过了,如果有兴趣的朋友可以去上一篇进行学习~)

一、创建用户类

因为每个"用户"都有不同的"用户名","密码","手机号","身份证号",而对这种繁杂的数据进行处理,最好的方法就是创建一个拥有这些属性的"类"。所以我们第一步先创建用户类~

先创建出一个"User"文件

用户的属性:"用户名","密码","手机号","身份证号":

用户的"get""set""构造"

二、创建系统菜单

我们知道,再平常使用软件时,账户也不是唯一的,所以为了准确的便捷的存放多个账户,我们还是需要先创建一个<集合>

然后就是此篇文章中最简单的部分~就和往常一样,使用while()循环switch()语句就能够解决啦:

? 只需要通过一个String的输入,然后进入switch()分别进行判断

? 如果为"1"则进入"登录方法"

? 如果为"2"则进入"注册方法"

? 如果为"3"则进入"忘记密码方法"

? 如果为"0"则退出登录

三、实现用户注册功能

注册!"学生管理系统[进阶]"中最难的一个方法,(本来想放在后面讲的,但是不注册用户就没法登录...不注册用户就没法忘记(修改)密码...所以只能先讲注册了)

由于比较复杂,让我们将"注册功能"分成四步,分别进行讲解吧:

① 用户名的注册

? 要求

? 注册用户名(需要满足以下要求):

? 输入的用户名必须唯一

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

? 用户名必须同时拥有字母与数字,并且只能由字母与数字组成

编写思路

① 由于用户名必须唯一,所以我们在注册用户名的时候,必须先对"注册用户名"在<集合>进行查找,如果能找到该"注册用户名",代表用户名失去了唯一性,便不能够进行注册。

? (可以创建一个"FindNum"方法,对<集合>中的"用户"进行遍历,可以使用equals()方法"注册用户名"是否重复进行判断)

② 在注册用户名时,我们需要对"注册用户名"的长度进行判断,如果长度不在[3~15]之间(可以使用String.length()进行判断),则不能够进行注册。

③ 我们必须保证用户名必须有数字和字母,并且只能有数字和字母。那么我们可以创建一个方法"Num"在其中创建两个计数器"num1"和"num2",通过 fori( ) 循环"注册用户名"分别 charAt(i) 索引,若该字符为数字,则num1++,若该字符为字母,则num2++若都不是,则返回"false"若num1与num2均 >0 ,则返回"true"

? (可以使用 Character.isLetter() Character.isDigit() 判断是否为"字母"或"数字")

代码实现

    public static void enroll(ArrayList<User> list) {        Scanner in = new Scanner(System.in);        System.out.println("请输入注册的用户名:");        out:while (true) {            String account = in.next();            int num = FindNum(list, account);            if (num >= 0) {                System.out.println("该用户名已被注册,请重新输入:");            } else {                if (!Num(account)) {                    System.out.println("格式错误,请重新输入:");                   }                else {               ---------开始输入密码---------

"FindNum"方法实现

    public static int FindNum(ArrayList<User> list, String account) {        for (int i = 0; i < list.size(); i++) {            User user = list.get(i);            if (user.getAccount().equals(account)) {                return i;            }        }        return -1;    }

"Num"方法实现

    public static boolean Num(String account) {        int num1 = 0;        int num2 = 0;        if (account.length() >= 3 && account.length() <= 15) {            char[] s = account.toCharArray();            for (int i = 0; i < s.length; i++) {                if (Character.isLetter(s[i])) {                    num1++;                } else if (Character.isDigit(s[i])) {                    num2++;                }else{                    return false;                }            }        }        if (num1 > 0 && num2 > 0) {            return true;        }        return false;    }

② 设置密码

? 要求

? 从键盘中输入两次,如果输入两次都一致则设置成功

这个还是比较简单的,只需要使用equasl()进行比较以下就行~

代码实现

       while(true) {              System.out.println("请输入注册的密码:");              String num1 = in.next();              System.out.println("请再次输入注册的密码:");              String num2 = in.next();              if (!num1.equals(num2)) {                  System.out.println("两次输入密码不一致,请重新输入:");               } else {      //---------开始输入身份证号--------

③ 输入身份证号码

? 要求

? 对于身份证号码的格式(有以下要求):

? 长度必须等于18

? 开头不能为0

? 前17位必须为数字,最后一位可以是数字,也可以是大写' X '或小写' x '

编写思路

① 使用length()对长度进行判断。

② 使用charAt(0)索引对开头与' 0 '进行比较

③ 创建方法"userNum",使用for()循环遍历"身份证号码"的各个字符,确保前17位为数字最后一位可以是数字也可以是'X','x'。

? (仍然是使用 Character.isDigit() 对 charAt(i) 的字符进行逐一判断)

代码实现

            System.out.println("请输入身份证号码:");            while(true) {                 String usernum = in.next();                 if (!userNum(usernum)) {                 System.out.println("身份证输入格式错误,请重新输入:");                 }else{         //---------开始输入手机号---------

"userNum"方法实现

    public static boolean userNum(String usernum){        if(usernum.length() != 18 || usernum.charAt(0) == '0'){            return false;        }else{            for (int i = 0; i < usernum.length(); i++) {                if((i == usernum.length() - 1) && (usernum.charAt(i) == 'x' ||                        usernum.charAt(i) == 'X')){                    return true;                }else if(!Character.isDigit(usernum.charAt(i))){                    return false;                }            }        }        return true;    }

④ 输入手机号

?要求

? 手机号格式(满足以下要求)

? 长度为11位

? 不能以0开头

? 必须都是数字

编写思路

其实和上面的"身份证号码验证"大同小异,按照上面的方法就好啦~

(此处定义新方法"phoneNum"但实现原理基本和"userNum"方法是一样的)

代码实现

               while(true) {                    System.out.println("请输入手机号:");                    String phone = in.next();                    if (!phoneNum(phone)) {                    System.out.println("手机号输入错误,请重新输入");                 }else{                     System.out.println("帐号注册成功!");                     User user = new User(account,num1,usernum,phone);                     list.add(user);                     break out;                }

"phoneNum"方法实现

    public static boolean phoneNum(String phone){        if(phone.charAt(0) == '0' || phone.length() != 11){            return false;        }else{            for (int i = 0; i < phone.length(); i++) {                if(!Character.isDigit(phone.charAt(i))){                    return false;                }            }        }        return true;    }

至此,第一个功能:注册功能就完成啦~

四、登录功能

登录功能与注册功能相比起来,还是要简单上许多的~但仍然有三步繁琐的方法,为了讲解方便,我们还是分三块讲解~

① 输入用户名

? 要求

? 如果用户名未注册,直接结束方法,并且提示:" 用户名未注册,需要先注册 "

? (仍然可以通过"FindNum"的比较方法进行查找,并且"FindNum"返回的<集合>下标也是非常的有用~)

代码实现

    public static void login(ArrayList<User> list) {        Scanner in = new Scanner(System.in);        System.out.println("请输入用户名:");        int n = 3;//用于控制密码输入3次        out:while (true) {            String id = in.next();            int num = FindNum(list, id);            if (num < 0) {                System.out.println("该用户名不存在,请重新输入:");            } else {                System.out.println("用户名输入正确");

② 输入密码

? 要求

? 需要与"账户"原密码相同

? 若输入密码错误则会给予警告,三次之后则被强制退出登录

? (我们可以使用while(自减变量)来控制"三次")

代码实现

    while (n >= 0) {        User user = list.get(num);        System.out.println("请输入密码:");        String num1 = in.next();        if (!user.getPassword().equals(num1)) {            if(n > 0) {                System.out.println("密码输入错误,你还有" + n-- + "次机会!");            }else if(n == 0){                System.out.println("你已经没有机会了!");                break out;            }        } else {            System.out.println("密码输入正确");

③ 输入验证码

此块儿为"登录功能"中最难的一步,我们需要灵活的使用Random()随机生成字符或数字

? 要求

? 生成验证码(有以下规则):

? 长度为5

? 由4位大写小写字母1位数字组成

?(使用 Random() 随机生成)

? 同一个字母可以重复,数字出现在任意位置

?(使用for()循环生成,可生成随机数代表数字出现的位置)

编写思路

① 使用length()对长度进行比较。

② 对于生成"大写字母"、"小写字母"、"数字"。我们都可以通过Ascii码转换而得~没错,也就是说我们可以创建一个方法"phonerandom",在其中使用Random()随机生成"大写字母"、"小写字母"对应的Ascii码范围间的数字再将其传换成字符,通过StringBuilder()的append()方法来进行拼接,最后再将其转换为String值进行返回。

③ 而对于那一个数字出现的位置,我们可以随机生成一个[0,5)的数字代表了for()循环在进行时,i = ?时在会StringBuilder其中插入那唯一的数字

代码实现

        while (true) {            String s = phonerandom();            System.out.println(s);            System.out.println("请输入验证码:");            String ss = in.next();            if (!s.equals(ss)) {                System.out.println("验证码输入错误,请重新输入:");            }else{                System.out.println("验证码输入正确");                System.out.println("登陆成功");                STU();                break out;            }        }

"phonerandom"方法实现

    public static String phonerandom(){        Random random = new Random();        StringBuilder sb = new StringBuilder();        int num1 = random.nextInt(5);//唯一数字出现的位置        for (int i = 0; i < 5; i++) {            int num2 = random.nextInt(2);//字母的大小写            if(i == num1){                int n = random.nextInt(10)+48;//数字的Ascii                sb.append((char)n);            }else if(num2 == 0){                int n = random.nextInt(26)+97;//小写字母的Ascii                sb.append((char)n);            }else if(num2 == 1){                int n = random.nextInt(26)+65;//小写字母的Ascii                sb.append((char)n);            }        }        String s = sb.toString();        return s;    }

五、忘记密码(修改密码)

修改密码就和我们生活中一样,需要先输入"用户名"判断是否存在该帐号,然后再分别输入"身份证号码"和"手机号码"进行验证,最后成功修改密码~

① 输入找回用户名

? 要求

? 输入想要找回的用户名,判断是否存在

? 若不存在则直接结束方法并提示"未注册"

编写思路

仍然是使用我们的"FindNum"方法就能够解决啦~并使用num接收返回的<集合>下标~

代码实现

    public static void forget(ArrayList<User> list) {        Scanner in = new Scanner(System.in);        System.out.println("请输入忘记的帐号:");        String id = in.next();        int num = FindNum(list, id);        if (num < 0) {            System.out.println("该用户名不存在,请注册");        } else {            System.out.println("输出正确");

② 输入手机号码与身份证号码

? 要求

? 判断当前用户的身份证号与手机号是否正确

? (如果正确,则可以输入新密码进行修改)

? (如果不正确,则修改失败)

编写思路

与上面的方法其实都大同小异,仍然还是通过"FindNum"返回的<集合>下标找到对应的帐号,然后再对该账号的"身份证号"和"手机号"进行判断如果都相同,则提示修改密码,将新密码通过临时变量"user"将原密码替换后将"user"替换到<集合>的对应位置中

代码实现

out:while (true) {    String phone = in.next();    if (!user.getPhonenumber().equals(phone)) {        System.out.println("输入错误,请重新输入:");    } else {        System.out.println("输入正确");        System.out.println("请输入你的身份证号:");        while (true) {            String usernum = in.next();            if (!user.getUsernumber().equals(usernum)) {                System.out.println("身份证输入错误,请重新输入");            } else {                System.out.println("输入正确");                System.out.println("请输入新密码:");                String newnum = in.next();                user.setPassword(newnum);                list.set(num,user);                System.out.println("密码修改成功!");                break out;            }        }    }}

六、功能演示(附源码)

? Student.java

public class Student {    private String id;    private String name;    private int age;    private double score;    public Student(String id, String name, int age, double score) {        this.id = id;        this.name = name;        this.age = age;        this.score = score;    }    public Student() {    }    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 double getScore() {        return score;    }    public void setScore(double score) {        this.score = score;    }}

? User.java:

public class User {    private String account;    private String password;    private String usernumber;    private String phonenumber;    public User() {    }    public User(String account, String password, String usernumber, String phonenumber) {        this.account = account;        this.password = password;        this.usernumber = usernumber;        this.phonenumber = phonenumber;    }    public String getAccount() {        return account;    }    public void setAccount(String account) {        this.account = account;    }    public String getPassword() {        return password;    }    public void setPassword(String password) {        this.password = password;    }    public String getUsernumber() {        return usernumber;    }    public void setUsernumber(String usernumber) {        this.usernumber = usernumber;    }    public String getPhonenumber() {        return phonenumber;    }    public void setPhonenumber(String phonenumber) {        this.phonenumber = phonenumber;    }}

? Test.java:

import javax.xml.stream.events.Characters;import java.util.*;public class Test {    public static void main(String[] args) {        Scanner in = new Scanner(System.in);        ArrayList<User> users = new ArrayList<>();//存储用户信息        outside:        while (true) {            System.out.println("------------欢迎来到学生管理系统------------");            System.out.println("1:登录");            System.out.println("2:注册");            System.out.println("3:忘记密码");            System.out.println("0:退出登录");            System.out.println("请输入你的选择:");            String s = in.next();            switch (s) {                case "1" -> login(users);                case "2" -> enroll(users);                case "3" -> forget(users);                case "0" -> {                    System.out.println("退出登录");                    break outside;                }                default -> System.out.println("输入错误,请重新输入");            }        }    }    public static void forget(ArrayList<User> list) {        Scanner in = new Scanner(System.in);        System.out.println("请输入忘记的帐号:");        String id = in.next();        int num = FindNum(list, id);        if (num < 0) {            System.out.println("该用户名不存在,请注册");        } else {            System.out.println("输出正确");            User user = list.get(num);            System.out.println("请输入你的手机号:");            out:while (true) {                String phone = in.next();                if (!user.getPhonenumber().equals(phone)) {                    System.out.println("输入错误,请重新输入:");                } else {                    System.out.println("输入正确");                    System.out.println("请输入你的身份证号:");                    while (true) {                        String usernum = in.next();                        if (!user.getUsernumber().equals(usernum)) {                            System.out.println("身份证输入错误,请重新输入");                        } else {                            System.out.println("输入正确");                            System.out.println("请输入新密码:");                            String newnum = in.next();                            user.setPassword(newnum);                            list.set(num,user);                            System.out.println("密码修改成功!");                            break out;                        }                    }                }            }        }    }    public static void login(ArrayList<User> list) {        Scanner in = new Scanner(System.in);        System.out.println("请输入用户名:");        int n = 3;//用于控制密码输入3次        out:while (true) {            String id = in.next();            int num = FindNum(list, id);            if (num < 0) {                System.out.println("该用户名不存在,请重新输入:");            } else {                System.out.println("用户名输入正确");                while (n >= 0) {                    User user = list.get(num);                    System.out.println("请输入密码:");                    String num1 = in.next();                    if (!user.getPassword().equals(num1)) {                        if(n > 0) {                            System.out.println("密码输入错误,你还有" + n-- + "次机会!");                        }else if(n == 0){                            System.out.println("你已经没有机会了!");                            break out;                        }                    } else {                        System.out.println("密码输入正确");                        while (true) {                            String s = phonerandom();                            System.out.println(s);                            System.out.println("请输入验证码:");                            String ss = in.next();                            if (!s.equals(ss)) {                                System.out.println("验证码输入错误,请重新输入:");                            }else{                                System.out.println("验证码输入正确");                                System.out.println("登陆成功");                                STU();                                break out;                            }                        }                    }                }            }        }    }    public static String phonerandom(){        Random random = new Random();        StringBuilder sb = new StringBuilder();        int num1 = random.nextInt(5);//唯一数字出现的位置        for (int i = 0; i < 5; i++) {            int num2 = random.nextInt(2);//字母的大小写            if(i == num1){                int n = random.nextInt(10)+48;//数字的Ascii                sb.append((char)n);            }else if(num2 == 0){                int n = random.nextInt(26)+97;//小写字母的Ascii                sb.append((char)n);            }else if(num2 == 1){                int n = random.nextInt(26)+65;//小写字母的Ascii                sb.append((char)n);            }        }        String s = sb.toString();        return s;    }    public static void enroll(ArrayList<User> list) {        Scanner in = new Scanner(System.in);        System.out.println("请输入注册的用户名:");        out:while (true) {            String account = in.next();            int num = FindNum(list, account);            if (num >= 0) {                System.out.println("该用户名已被注册,请重新输入:");            } else {                if (!Num(account)) {                    System.out.println("格式错误,请重新输入:");                }                //---------开始输入密码---------                else {                    while(true) {                        System.out.println("请输入注册的密码:");                        String num1 = in.next();                        System.out.println("请再次输入注册的密码:");                        String num2 = in.next();                        if (!num1.equals(num2)) {                            System.out.println("两次输入密码不一致,请重新输入:");                        } else {                            //---------开始输入身份证号--------                            System.out.println("请输入身份证号码:");                            while(true) {                                String usernum = in.next();                                if (!userNum(usernum)) {                                    System.out.println("身份证输入格式错误,请重新输入:");                                }else{                                    //---------开始输入手机号---------                                    while(true) {                                        System.out.println("请输入手机号:");                                        String phone = in.next();                                        if (!phoneNum(phone)) {                                            System.out.println("手机号输入错误,请重新输入");                                        }else{                                            System.out.println("帐号注册成功!");                                            User user = new User(account,num1,usernum,phone);                                            list.add(user);                                            break out;                                        }                                    }                                }                            }                        }                    }                }            }        }    }    public static int FindNum(ArrayList<User> list, String account) {        for (int i = 0; i < list.size(); i++) {            User user = list.get(i);            if (user.getAccount().equals(account)) {                return i;            }        }        return -1;    }    public static boolean Num(String account) {        int num1 = 0;        int num2 = 0;        if (account.length() >= 3 && account.length() <= 15) {            char[] s = account.toCharArray();            for (int i = 0; i < s.length; i++) {                if (Character.isLetter(s[i])) {                    num1++;                } else if (Character.isDigit(s[i])) {                    num2++;                }else{                    return false;                }            }        }        if (num1 > 0 && num2 > 0) {            return true;        }        return false;    }    public static boolean userNum(String usernum){        if(usernum.length() != 18 || usernum.charAt(0) == '0'){            return false;        }else{            for (int i = 0; i < usernum.length(); i++) {                if((i == usernum.length() - 1) && (usernum.charAt(i) == 'x' ||                        usernum.charAt(i) == 'X')){                    return true;                }else if(!Character.isDigit(usernum.charAt(i))){                    return false;                }            }        }        return true;    }    public static boolean phoneNum(String phone){        if(phone.charAt(0) == '0' || phone.length() != 11){            return false;        }else{            for (int i = 0; i < phone.length(); i++) {                if(!Character.isDigit(phone.charAt(i))){                    return false;                }            }        }        return true;    }    public static void add(ArrayList<Student> stu) {        System.out.println("添加学生");        Scanner in = new Scanner(System.in);        while (true) {            System.out.println("请输入学生id:");            String id1 = in.next();            int n = findnum(stu,id1);            if(n >= 0){                System.out.println("此学号已存在,请重新输入!");                continue;            }            System.out.println("请输入学生姓名:");            String name1 = in.next();            System.out.println("请输入学生年龄:");            int age1 = in.nextInt();            System.out.println("请输入学生成绩:");            double score1 = in.nextDouble();            Student s = new Student(id1,name1,age1,score1);            stu.add(s);            System.out.println("学生添加成功");            break;        }    }    public static void delete(ArrayList<Student> stu) {        System.out.println("删除学生");        Scanner in = new Scanner(System.in);        System.out.println("请输入你要删除的学生id:");        String id1 = in.next();        int num = 0;        for (int i = 0; i < stu.size(); i++) {            Student s = stu.get(i);            if(s.getId().equals(id1)){                System.out.println("删除成功!");                stu.remove(findnum(stu,id1));                num++;            }        }        if(num == 0) {            System.out.println("未找到此id的学生,删除失败");        }    }    public static void revise(ArrayList<Student> stu) {        Scanner in = new Scanner(System.in);        System.out.println("修改学生");        while (true) {            System.out.println("请输入学生的id:");            String id1 = in.next();            int num = findnum(stu, id1);            if (num < 0) {                System.out.println("未找到此id的学生,请重新输入");            }else {                System.out.println("请输入学生新的id:");                String id2 = in.next();                int num1 = findnum(stu, id2);                if(num1 >= 0){                    System.out.println("此id已经拥有,请重新输入");                }else{                    System.out.println("请输入学生新的姓名:");                    String name1 = in.next();                    System.out.println("请输入学生新的年龄:");                    int age1 = in.nextInt();                    System.out.println("请输入学生新的成绩:");                    double score1 = in.nextDouble();                    Student s = new Student(id2, name1, age1, score1);                    stu.set(num, s);                    System.out.println("学生修改成功");                    break;                }            }        }    }    public static void print(ArrayList<Student> stu) {        System.out.println("查询学生");        if(stu.size() == 0){            System.out.println("目前系统中暂无学生!");        }        for (int i = 0; i < stu.size(); i++) {            Student s = stu.get(i);            System.out.println(String.format("id:%-6s",s.getId()) + String.format("name:%-6s",s.getName()) + String.format("age:%-6d",s.getAge()) + String.format("score:%-6.2f",s.getScore()));        }    }    public static int findnum(ArrayList<Student> stu,String id1) {        for (int i = 0; i < stu.size(); i++) {            Student s = stu.get(i);            if(s.getId().equals(id1)){                return i;            }        }        return -1;    }    public static void STU() {        ArrayList<Student> stu = new ArrayList<>();        outside:        while (true) {            Scanner in = new Scanner(System.in);            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 num = in.next();            switch (num) {                case "1" -> add(stu);                case "2" -> delete(stu);                case "3" -> revise(stu);                case "4" -> print(stu);                case "5" -> {                    System.out.println("退出学生管理系统");                    break outside;                }                default -> System.out.println("输入错误,请重新输入");            }        }    }}

那么关于"学生管理系统"的进阶方法也就为大家讲解完啦~如果有哪里不懂或我说的不够清楚,可以在评论区多多留言提问哦~我也会细心回答的,如果有错误也请大家多多指出,那我们下次再见啦~


点击全文阅读


本文链接:http://m.zhangshiyu.com/post/184656.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1