这次我们来尝试使用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() 判断是否为"字母"或"数字")
++代码实现++:
java
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"方法实现++:
java
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"方法实现++:
java
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()**进行比较以下就行~
++代码实现++ :
java
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) 的字符进行逐一判断)
++代码实现++:
java
System.out.println("请输入身份证号码:");
while(true) {
String usernum = in.next();
if (!userNum(usernum)) {
System.out.println("身份证输入格式错误,请重新输入:");
}else{
//---------开始输入手机号---------
++"userNum"方法实现++:
java
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"方法是一样的)
++代码实现++:
java
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"方法实现++:
java
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"返回的<集合>下标也是非常的有用~**)
++代码实现++:
java
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(自减变量) 来控制**"三次"**)
++代码实现++:
java
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其中插入那唯一的数字。
++代码实现++:
java
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"方法实现++:
java
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接收返回的<集合>下标~
++代码实现++:
java
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"替换到<集合>的对应位置中。
++代码实现++:
java
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:
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:
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:
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("输入错误,请重新输入");
}
}
}
}
那么关于"学生管理系统"的进阶方法也就为大家讲解完啦~如果有哪里不懂或我说的不够清楚,可以在评论区多多留言提问哦~我也会细心回答的,如果有错误也请大家多多指出,那我们下次再见啦~