这次我们来尝试使用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("输入错误,请重新输入"); } } }}
那么关于"学生管理系统"的进阶方法也就为大家讲解完啦~如果有哪里不懂或我说的不够清楚,可以在评论区多多留言提问哦~我也会细心回答的,如果有错误也请大家多多指出,那我们下次再见啦~