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

爱是小小的癌 2024-10-20 10:05:01 阅读 67

这次我们来尝试使用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() 判断是否为"字母"或"数字")

代码实现

<code> 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

<code>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("输入错误,请重新输入");

}

}

}

}

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



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。