文章目录
- 学生管理系统进阶版
- 一,需求部分
- (一)需求
- (二)分析
- 1,登录界面
- 2,用户类
- 3,注册功能
- 4,登录功能
- 5,忘记密码
- 6,验证码规则
- 二,实现部分
- (一)登录界面
- (二)编写方法实现注册功能
- (三)编写方法实现登录功能
- (四)编写方法实现忘记密码功能
- (五)编写生成验证码方法
- (六)集成代码,实现系统
学生管理系统进阶版
一,需求部分
(一)需求
为学生管理系统书写一个登陆、注册、忘记密码的功能。
只有用户登录成功之后,才能进入到学生管理系统中进行增删改查操作。
(二)分析
1,登录界面
System.out.println("-------------欢迎来到学生管理系统-------------");
System.out.println("请选择操作:1登录 2注册 3忘记密码");
2,用户类
属性:用户名、密码、身份证号码、手机号码
3,注册功能
1,用户名需要满足以下要求:
验证要求:
- 用户名唯一
- 用户名长度必须在3~15位之间
- 只能是字母加数字的组合,但是不能是纯数字
2,密码键盘输入两次,两次一致才可以进行注册。
3,身份证号码需要验证。
验证要求:
- 长度为18位
- 不能以0为开头
- 前17位,必须都是数字
- 最为一位可以是数字,也可以是大写X或小写x
4,手机号验证。
验证要求:
- 长度为11位
- 不能以0为开头
- 必须都是数字
4,登录功能
1,键盘录入用户名
2,键盘录入密码
3,键盘录入验证码
验证要求:
-
用户名如果未注册,直接结束方法,并提示:用户名未注册,请先注册
-
判断验证码是否正确,如不正确,重新输入
-
再判断用户名和密码是否正确,有3次机会
5,忘记密码
1,键盘录入用户名,判断当前用户名是否存在,如不存在,直接结束方法,并提示:未注册
2,键盘录入身份证号码和手机号码
3,判断当前用户的身份证号码和手机号码是否一致,如果一致,则提示输入密码,进行修改;如果不一致,则提示:账号信息不匹配,修改失败。
6,验证码规则
-
长度为5
-
由4位大写或者小写字母和1位数字组成,同一个字母可重复
-
数字可以出现在任意位置
-
比如:aQa1K
二,实现部分
(一)登录界面
要为学生管理系统编写一个登录页面,你可以按照以下代码示例进行操作:
import java.util.Scanner;
public class LoginSystem {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("-------------欢迎来到学生管理系统-------------");
System.out.println("请选择操作:1登录 2注册 3忘记密码");
int choice = input.nextInt();
switch (choice) {
case 1:
login();
break;
case 2:
register();
break;
case 3:
forgetPassword();
break;
default:
System.out.println("无效的选择");
break;
}
}
public static void login() {
// TODO: 实现登录逻辑
}
public static void register() {
// TODO: 实现注册逻辑
}
public static void forgetPassword() {
// TODO: 实现忘记密码逻辑
}
}
在上述代码中,我们首先使用Scanner
类创建一个接收用户输入的对象input
。然后打印欢迎信息和操作选项。接下来,根据用户的选择,使用switch
语句调用相应的方法,即login()
、register()
或forgetPassword()
。
你可以在login()
、register()
和forgetPassword()
方法中实现登录、注册和忘记密码的具体逻辑。根据实际需求,可以使用数据库或文件来存储和验证用户信息。这些方法留给你自己来实现。
(二)编写方法实现注册功能
你可以按照以下代码示例来编写注册方法:
public static void register() {
Scanner input = new Scanner(System.in);
System.out.print("请输入用户名:");
String username = input.nextLine();
// 校验用户名
if (!validateUsername(username)) {
System.out.println("用户名不符合要求,请重新注册");
return;
}
System.out.print("请输入密码:");
String password1 = input.nextLine();
System.out.print("请再次输入密码:");
String password2 = input.nextLine();
// 校验密码
if (!validatePassword(password1, password2)) {
System.out.println("两次输入的密码不一致,请重新注册");
return;
}
System.out.print("请输入身份证号码:");
String idNumber = input.nextLine();
// 校验身份证号码
if (!validateIdNumber(idNumber)) {
System.out.println("身份证号码不符合要求,请重新注册");
return;
}
System.out.print("请输入手机号:");
String phoneNumber = input.nextLine();
// 校验手机号
if (!validatePhoneNumber(phoneNumber)) {
System.out.println("手机号码不符合要求,请重新注册");
return;
}
// 注册成功
System.out.println("注册成功");
}
public static boolean validateUsername(String username) {
// 校验用户名是否唯一
// TODO: 根据实际需求,编写判断用户名是否唯一的代码
// 校验用户名长度
int length = username.length();
if (length < 3 || length > 15) {
return false;
}
// 校验用户名是否是字母加数字的组合,但不能是纯数字
if (!username.matches("^(?=.*[a-zA-Z])(?=.*\\d)[a-zA-Z\\d]+$") || username.matches("^\\d+$")) {
return false;
}
return true;
}
public static boolean validatePassword(String password1, String password2) {
// 校验两次输入的密码是否一致
return password1.equals(password2);
}
public static boolean validateIdNumber(String idNumber) {
// 校验身份证号码长度和开头是否满足要求
if (idNumber.length() != 18 || idNumber.startsWith("0")) {
return false;
}
// 校验前17位是否都是数字
String idNumber17 = idNumber.substring(0, 17);
if (!idNumber17.matches("^\\d{17}$")) {
return false;
}
// 校验最后一位是否是数字或大写X或小写x
String lastChar = idNumber.substring(17);
if (!lastChar.matches("^\\d|[Xx]$")) {
return false;
}
return true;
}
public static boolean validatePhoneNumber(String phoneNumber) {
// 校验手机号码长度和开头是否满足要求
if (phoneNumber.length() != 11 || phoneNumber.startsWith("0")) {
return false;
}
// 校验是否都是数字
if (!phoneNumber.matches("^\\d+$")) {
return false;
}
return true;
}
在上述代码中,我们首先使用Scanner
类创建一个接收用户输入的对象input
。然后,通过validateUsername()
方法来校验用户名是否符合要求。在该方法中,我们首先需要根据实际需求编写判断用户名是否唯一的代码。然后,校验用户名长度是否在3~15位之间,以及是否是字母加数字的组合,但不能是纯数字。
接着,通过validatePassword()
方法来校验两次输入的密码是否一致。
然后,通过validateIdNumber()
方法来校验身份证号码是否符合要求。在该方法中,我们首先校验身份证号码的长度和开头是否满足要求,然后校验前17位是否都是数字,最后一位是否是数字或大写X或小写x。
最后,通过validatePhoneNumber()
方法来校验手机号码是否符合要求。在该方法中,我们校验手机号码的长度和开头是否满足要求,以及是否是纯数字。
如果所有的校验都通过,则输出注册成功的提示信息。
需要注意的是,上述代码中的校验逻辑只是简单示例,实际开发中,你可能需要根据具体需求来进行更严格和完善的校验。例如,可以使用正则表达式、外部库、数据库等来实现更复杂的校验逻辑。
(三)编写方法实现登录功能
你可以按照以下代码示例来编写登录方法:
public static void login() {
String username = "admin"; // 假设已注册的用户名为admin
String password = "123456"; // 假设密码为123456
String verificationCode = "aQa1K"; // 假设验证码为aQa1K
Scanner input = new Scanner(System.in);
int attempts = 3; // 登录尝试次数
while (attempts > 0) {
System.out.print("请输入用户名:");
String inputUsername = input.nextLine();
// 判断用户名是否正确
if (!inputUsername.equals(username)) {
System.out.println("用户名未注册,请先注册");
return;
}
System.out.print("请输入密码:");
String inputPassword = input.nextLine();
System.out.print("请输入验证码:");
String inputVerificationCode = input.nextLine();
// 判断验证码是否正确
if (!inputVerificationCode.equals(verificationCode)) {
System.out.println("验证码不正确,请重新输入");
continue;
}
// 判断用户名和密码是否正确
if (inputUsername.equals(username) && inputPassword.equals(password)) {
System.out.println("登录成功");
return;
} else {
attempts--;
System.out.println("用户名或密码错误,剩余尝试次数:" + attempts);
}
}
System.out.println("登录失败,已达到最大尝试次数");
}
在上述代码中,我们首先定义了已注册的用户名admin
、密码123456
和验证码aQa1K
。然后使用Scanner
类创建一个接收用户输入的对象input
。接下来,使用while
循环来控制登录尝试次数,初始值为3。
在循环中,首先要求用户输入用户名,然后判断用户名是否正确。如果用户名未注册,则直接结束方法,并提示用户先进行注册。如果用户名正确,则要求用户输入密码和验证码。
接着,判断验证码是否正确。如果验证码不正确,则重新要求用户输入验证码,并继续下一次循环。如果验证码正确,则判断用户名和密码是否正确。如果用户名和密码都正确,则登录成功并结束方法。如果用户名或密码不正确,则尝试次数减1,并提示剩余尝试次数。
当尝试次数减到0时,循环结束,并提示登录失败。
这个示例只是简单地演示了登录方法的逻辑,实际开发中,你还需要结合具体需求来实现更完整和安全的登录功能。例如,可以使用数据库来存储和验证用户信息,使用加密算法对密码进行加密等。
(四)编写方法实现忘记密码功能
public static void forgetPassword() {
Scanner input = new Scanner(System.in);
System.out.print("请输入用户名:");
String username = input.nextLine();
// 判断用户名是否存在
if (!userMap.containsKey(username)) {
System.out.println("未注册");
return;
}
System.out.print("请输入身份证号码:");
String idNumber = input.nextLine();
System.out.print("请输入手机号码:");
String phoneNumber = input.nextLine();
UserInfo userInfo = userMap.get(username);
// 判断身份证号码和手机号码是否一致
if (userInfo.getIdNumber().equals(idNumber) && userInfo.getPhoneNumber().equals(phoneNumber)) {
System.out.print("请输入新密码:");
String newPassword = input.nextLine();
// 修改密码
userInfo.setPassword(newPassword);
System.out.println("密码修改成功");
} else {
System.out.println("账号信息不匹配,修改失败");
}
}
public static void registerUser(String username, String password, String idNumber, String phoneNumber) {
UserInfo userInfo = new UserInfo(username, password, idNumber, phoneNumber);
userMap.put(username, userInfo);
}
static class UserInfo {
private String username;
private String password;
private String idNumber;
private String phoneNumber;
public UserInfo(String username, String password, String idNumber, String phoneNumber) {
this.username = username;
this.password = password;
this.idNumber = idNumber;
this.phoneNumber = phoneNumber;
}
public String getUsername() {
return username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getIdNumber() {
return idNumber;
}
public String getPhoneNumber() {
return phoneNumber;
}
}
(五)编写生成验证码方法
public static void generateCaptcha() {
StringBuilder captcha = new StringBuilder();
Random random = new Random();
// 生成4位字母
for (int i = 0; i < 4; i++) {
char letter = (char) (random.nextInt(26) + 'a');
captcha.append(letter);
}
// 生成1位数字
captcha.append(random.nextInt(10));
System.out.println("验证码为:" + captcha.toString());
}
(六)集成代码,实现系统
package net.army.java.studentmanger;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import java.util.Scanner;
/**
* 功能:学生管理系统(注册、登录和忘记)
* 日期:2023年09月02日
* 作者:梁辰兴
*/
public class StudentManagementSystem {
private static Map<String, User> userMap = new HashMap<>();
private static String loggedInUser = null;
private static int loginAttempts = 0;
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
while (true) {
System.out.println("-------------欢迎来到学生管理系统-------------");
System.out.println("请选择操作:1登录 2注册 3忘记密码");
int choice = input.nextInt();
input.nextLine(); // 清除输入缓冲区的换行符
switch (choice) {
case 1:
login();
break;
case 2:
register();
break;
case 3:
forgotPassword();
break;
default:
System.out.println("无效的操作,请重新选择!");
}
}
}
public static void generateCaptcha() {
StringBuilder captcha = new StringBuilder();
Random random = new Random();
// 生成4位字母
for (int i = 0; i < 4; i++) {
char letter = (char) (random.nextInt(26) + 'a');
captcha.append(letter);
}
// 生成1位数字
captcha.append(random.nextInt(10));
System.out.println("验证码为:" + captcha.toString());
}
public static void login() {
Scanner input = new Scanner(System.in);
System.out.print("请输入用户名:");
String username = input.nextLine();
System.out.print("请输入密码:");
String password = input.nextLine();
generateCaptcha();
System.out.print("请输入验证码:");
String captcha = input.nextLine();
if (!userMap.containsKey(username)) {
System.out.println("用户名未注册,请先注册!");
return;
}
if (!validateCaptcha(captcha)) {
System.out.println("验证码错误,请重新输入!");
return;
}
User user = userMap.get(username);
if (user.getPassword().equals(password)) {
loggedInUser = username;
System.out.println("登录成功!");
} else {
loginAttempts++;
if (loginAttempts < 3) {
System.out.println("用户名或密码错误,请重新输入!");
} else {
System.out.println("登录失败次数过多,退出系统!");
System.exit(0);
}
}
}
public static void register() {
Scanner input = new Scanner(System.in);
System.out.print("请输入用户名:");
String username = input.nextLine();
if (userMap.containsKey(username)) {
System.out.println("用户名已存在,请重新输入!");
return;
}
if (!validateUsername(username)) {
System.out.println("用户名不符合要求,请重新输入!");
return;
}
System.out.print("请输入密码:");
String password1 = input.nextLine();
System.out.print("请再次输入密码:");
String password2 = input.nextLine();
if (!password1.equals(password2)) {
System.out.println("两次输入的密码不一致,请重新输入!");
return;
}
System.out.print("请输入身份证号码:");
String idCard = input.nextLine();
if (!validateIdCard(idCard)) {
System.out.println("身份证号码不符合要求,请重新输入!");
return;
}
System.out.print("请输入手机号码:");
String phoneNumber = input.nextLine();
if (!validatePhoneNumber(phoneNumber)) {
System.out.println("手机号码不符合要求,请重新输入!");
return;
}
User user = new User(username, password1, idCard, phoneNumber);
userMap.put(username, user);
System.out.println("注册成功!");
}
public static void forgotPassword() {
Scanner input = new Scanner(System.in);
System.out.print("请输入用户名:");
String username = input.nextLine();
if (!userMap.containsKey(username)) {
System.out.println("未注册的用户名,请先注册!");
return;
}
User user = userMap.get(username);
System.out.print("请输入身份证号码:");
String idCard = input.nextLine();
if (!user.getIdCard().equals(idCard)) {
System.out.println("账号信息不匹配,修改失败!");
return;
}
System.out.print("请输入手机号码:");
String phoneNumber = input.nextLine();
if (!user.getPhoneNumber().equals(phoneNumber)) {
System.out.println("账号信息不匹配,修改失败!");
return;
}
System.out.print("请输入新密码:");
String newPassword = input.nextLine();
user.setPassword(newPassword);
System.out.println("密码修改成功!");
}
public static boolean validateUsername(String username) {
// 验证用户名的规则
// 用户名唯一
// 用户名长度必须在3~15位之间
// 只能是字母加数字的组合,但是不能是纯数字
if (userMap.containsKey(username)) {
return false;
}
int length = username.length();
if (length < 3 || length > 15) {
return false;
}
boolean containsLetter = false;
boolean containsDigit = false;
for (char c : username.toCharArray()) {
if (Character.isLetter(c)) {
containsLetter = true;
} else if (Character.isDigit(c)) {
containsDigit = true;
}
}
if (!containsLetter || !containsDigit) {
return false;
}
if (containsDigit && !containsLetter && length == 1) {
return false;
}
return true;
}
public static boolean validateIdCard(String idCard) {
// 验证身份证号码的规则
// 长度为18位
// 不能以0为开头
// 前17位,必须都是数字
// 最后一位可以是数字,也可以是大写X或小写x
if (idCard.length() != 18) {
return false;
}
if (idCard.startsWith("0")) {
return false;
}
String idCardDigits = idCard.substring(0, 17);
String idCardLastDigit = idCard.substring(17);
if (!idCardDigits.matches("\\d+")) {
return false;
}
if (!idCardLastDigit.matches("[\\dXx]")) {
return false;
}
return true;
}
public static boolean validatePhoneNumber(String phoneNumber) {
// 验证手机号码的规则
// 长度为11位
// 不能以0为开头
// 必须都是数字
if (phoneNumber.length() != 11) {
return false;
}
if (phoneNumber.startsWith("0")) {
return false;
}
if (!phoneNumber.matches("\\d+")) {
return false;
}
return true;
}
public static boolean validateCaptcha(String captcha) {
// 验证码的规则
// 长度为5
// 由4位大写或者小写字母和1位数字组成,同一个字母可重复
// 数字可以出现在任意位置
if (captcha.length() != 5) {
return false;
}
int digitCount = 0;
int letterCount = 0;
char lastChar = '\0';
for (char c : captcha.toCharArray()) {
if (Character.isDigit(c)) {
digitCount++;
} else if (Character.isLetter(c)) {
letterCount++;
if (c == lastChar) {
return false;
}
lastChar = c;
} else {
return false;
}
}
if (digitCount == 0 || letterCount == 0) {
return false;
}
return true;
}
static class User {
private String username;
private String password;
private String idCard;
private String phoneNumber;
public User(String username, String password, String idCard, String phoneNumber) {
this.username = username;
this.password = password;
this.idCard = idCard;
this.phoneNumber = phoneNumber;
}
public String getUsername() {
return username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getIdCard() {
return idCard;
}
public String getPhoneNumber() {
return phoneNumber;
}
}
}
请注意,以上代码只是一个简单的示例,可能还有其他更复杂的验证规则需要根据实际需求进行实现和调整。
运行效果: