个人主页
文章专栏
嘻嘻嘻,插播一个最近喜欢看的羽坛运动员~
需求文档
需求:
采取控制台的方式去书写学生管理系统
分析:
初始菜单:
"-------欢迎来到黑马学生管理系统-------"
"1:添加学生"
"2: 删除学生"
"3:修改学生"
"4:查询学生"
"5:退出"
"请输入您的选择"
学生类:
属性:id,姓名,年龄,家庭住址
添加功能:
键盘录入每一个学生信息并添加,需要满足以下要求:
- id唯一
删除功能:
键盘录入要删除的学生的id,需要满足以下要求:
- id存在删除
- id不存在,需要 提示不存在,并回到初始菜单
修改功能:
键盘录入需要修改的学生id,需要满足以下要求
- id存在,继续录入其他信息
- id不存在,需要提示不存在,并回到初始菜单
查询功能:
打印所有的学生信息,需要满足以下条件
-
如果没有学生信息,提示:当前无学生信息,请添加后再查询
-
如果有学生信息,需要按照以下格式输出。(不用过于纠结对齐的问题)
id 姓名 年龄 家庭住址 chen001 张三 17 南京 chen002 李四 18 北京 chen003 王五 19 上海 chen004 赵六 18 广州
代码实现
代码部分
Java Bean 类
package StudentSystem;
public class Student {
private String id;
private String name;
private int age;
private String address;
public Student() {
}
public Student(String id, String name, int age, String address) {
this.id = id;
this.name = name;
this.age = age;
this.address = address;
}
/**
* 获取
* @return id
*/
public String getId() {
return id;
}
/**
* 设置
* @param id
*/
public void setId(String id) {
this.id = id;
}
/**
* 获取
* @return name
*/
public String getName() {
return name;
}
/**
* 设置
* @param name
*/
public void setName(String name) {
this.name = name;
}
/**
* 获取
* @return age
*/
public int getAge() {
return age;
}
/**
* 设置
* @param age
*/
public void setAge(int age) {
this.age = age;
}
/**
* 获取
* @return address
*/
public String getAddress() {
return address;
}
/**
* 设置
* @param address
*/
public void setAddress(String address) {
this.address = address;
}
public String toString() {
return "Student{id = " + id + ", name = " + name + ", age = " + age + ", address = " + address + "}";
}
}
package StudentSystem;
import java.util.ArrayList;
import java.util.Scanner;
public class studentSystem {
public static void main(String[] args) {
ArrayList<Student> list = new ArrayList<>();
while (true) {
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("请输入你的选择:");
Scanner sc = new Scanner(System.in);
String choose = sc.next();
switch (choose) {
case "1"->addStudent(list);
case "2"->deleteStudent(list);
case "3"->updateStudent(list);
case "4"->findStudent(list);
case "5"->{
System.out.println("退出");
System.exit(0);//停止jvm虚拟机
}
default->System.out.println("没有这个选项");
}
}
}
//添加学生的代码逻辑
public static void addStudent(ArrayList<Student> list){
//空参构造
Student s = new Student();
System.out.println("添加学生");
Scanner sc = new Scanner(System.in);
System.out.println("请输入学生的id:");
String id = sc.next();
// 问题 1:修正 contains 方法调用,创建 Student 对象传入
Student tempStudent = new Student();
tempStudent.setId(id);
boolean flag = contains(list, tempStudent);
if (flag) {
System.out.println("id重复,请重新输入");
return;
} else {
System.out.println("id不重复");
s.setId(id);
}
System.out.println("请输入学生的姓名:");
// 问题 2:正常使用 sc.next() 获取输入
String name = sc.next();
s.setName(name);
System.out.println("请输入学生的年龄:");
int age = sc.nextInt();
s.setAge(age);
System.out.println("请输入学生的家庭住址:");
String gender = sc.next();
s.setAddress(gender);
//将学生对象添加到集合中
list.add(s);
System.out.println("添加学生成功");
}
//删除学生的代码逻辑
public static void deleteStudent(ArrayList<Student> list){
Scanner sc = new Scanner(System.in);
System.out.println("请输入你要删除的学生的id:");
String id = sc.next();
int index = getIndex(list,id);
if(index>=0){
list.remove(index);
System.out.println("删除学生成功");
}else{
System.out.println("该信息不存在,请重新输入");
}
}
//修改学生的代码逻辑
public static void updateStudent(ArrayList<Student> list){
System.out.println("修改学生");
Scanner sc = new Scanner(System.in);
System.out.println("请输入你要修改的学生的id:");
String id = sc.next();
int index = getIndex(list,id);
if(index>=0){
Student s = list.get(index);
System.out.println("请输入学生的姓名:");
String name = sc.next();
s.setName(name);
System.out.println("请输入学生的年龄:");
int age = sc.nextInt();
s.setAge(age);
System.out.println("请输入学生的家庭住址:");
String gender = sc.next();
s.setAddress(gender);
System.out.println("修改学生成功");
}else{
System.out.println("该信息不存在,请重新输入");
}
}
//查询学生的代码逻辑
public static void findStudent(ArrayList<Student> list){
System.out.println("查询学生");
if (list.size()==0){
System.out.println("无信息,请先添加信息");
return;
}
//显示表头信息
System.out.println("学号\t\t姓名\t\t年龄\t\t家庭住址");
//当代码执行到这里,说明list集合中有数据,可以继续
for (int i = 0; i < list.size(); i++) {
Student s = list.get(i);
System.out.println(s.getId()+"\t"+s.getName()+"\t"+s.getAge()+"\t\t"+s.getAddress());
}
}
public static boolean contains(ArrayList<Student> list, Student s){
// 循环遍历集合,获取每一个学生对象,使用学生对象
for (int i = 0; i < list.size(); i++) {
// 拿到学生对象,获取id进行判断
Student s1 = list.get(i);
String id1 = s1.getId();
String id = s.getId();
if (id.equals(id1)) {
System.out.println("id重复");
return true;
}
}
// 当代码执行到这里,说明list集合中没有和s对象相同的id
return false;
}
public static int getIndex(ArrayList<Student> list, String id){
for (int i = 0; i < list.size(); i++) {
Student s = list.get(i);
String sid = s.getId();
if (sid.equals(id)) {
return i;
}
}
return -1;
}
}
详解代码:
1. 包声明与导入
package StudentSystem;
import java.util.ArrayList;
import java.util.Scanner;
package StudentSystem;
:声明该 Java 类属于StudentSystem
包。import java.util.ArrayList;
:导入ArrayList
类,用于存储学生对象。import java.util.Scanner;
:导入Scanner
类,用于从控制台读取用户输入。
2. 主类 studentSystem
及 main
方法
public class studentSystem {
public static void main(String[] args) {
ArrayList<Student> list = new ArrayList<>();
while (true) {
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("请输入你的选择:");
Scanner sc = new Scanner(System.in);
String choose = sc.next();
switch (choose) {
case "1"->addStudent(list);
case "2"->deleteStudent(list);
case "3"->updateStudent(list);
case "4"->findStudent(list);
case "5"->{
System.out.println("退出");
System.exit(0);
}
default->System.out.println("没有这个选项");
}
}
}
ArrayList<Student> list = new ArrayList<>();
:创建一个ArrayList
集合,用于存储Student
对象。while (true)
:使用无限循环,让程序持续运行,直到用户选择退出。- 通过
System.out.println
输出菜单选项,提示用户输入选择。 Scanner sc = new Scanner(System.in);
:创建Scanner
对象,用于读取用户输入。switch
语句根据用户输入的选择调用相应的方法,若输入为5
,则调用System.exit(0)
退出程序;若输入无效,输出提示信息。
3. 添加学生方法 addStudent
public static void addStudent(ArrayList<Student> list){
Student s = new Student();
System.out.println("添加学生");
Scanner sc = new Scanner(System.in);
System.out.println("请输入学生的id:");
String id = sc.next();
Student tempStudent = new Student();
tempStudent.setId(id);
boolean flag = contains(list, tempStudent);
if (flag) {
System.out.println("id重复,请重新输入");
return;
} else {
System.out.println("id不重复");
s.setId(id);
}
System.out.println("请输入学生的姓名:");
String name = sc.next();
s.setName(name);
System.out.println("请输入学生的年龄:");
int age = sc.nextInt();
s.setAge(age);
System.out.println("请输入学生的家庭住址:");
String gender = sc.next();
s.setAddress(gender);
list.add(s);
System.out.println("添加学生成功");
}
- 创建一个
Student
对象s
用于存储学生信息。 - 提示用户输入学生的
id
,并创建一个临时Student
对象tempStudent
,将输入的id
设置给它。 - 调用
contains
方法检查id
是否重复,若重复则输出提示信息并返回;若不重复,则将id
设置给s
。 - 依次提示用户输入学生的姓名、年龄和家庭住址,并将这些信息设置给
s
。 - 将
s
添加到集合list
中,并输出添加成功的信息。
4. 删除学生方法 deleteStudent
public static void deleteStudent(ArrayList<Student> list){
Scanner sc = new Scanner(System.in);
System.out.println("请输入你要删除的学生的id:");
String id = sc.next();
int index = getIndex(list,id);
if(index>=0){
list.remove(index);
System.out.println("删除学生成功");
}else{
System.out.println("该信息不存在,请重新输入");
}
}
- 提示用户输入要删除的学生的
id
。 - 调用
getIndex
方法获取该id
对应的学生在集合中的索引。 - 若索引大于等于 0,则删除该学生并输出删除成功的信息;若索引为 -1,则输出信息不存在的提示。
5. 修改学生方法 updateStudent
public static void updateStudent(ArrayList<Student> list){
System.out.println("修改学生");
Scanner sc = new Scanner(System.in);
System.out.println("请输入你要修改的学生的id:");
String id = sc.next();
int index = getIndex(list,id);
if(index>=0){
Student s = list.get(index);
System.out.println("请输入学生的姓名:");
String name = sc.next();
s.setName(name);
System.out.println("请输入学生的年龄:");
int age = sc.nextInt();
s.setAge(age);
System.out.println("请输入学生的家庭住址:");
String gender = sc.next();
s.setAddress(gender);
System.out.println("修改学生成功");
}else{
System.out.println("该信息不存在,请重新输入");
}
}
- 提示用户输入要修改的学生的
id
。 - 调用
getIndex
方法获取该id
对应的学生在集合中的索引。 - 若索引大于等于 0,则获取该学生对象,提示用户输入新的姓名、年龄和家庭住址,并更新学生信息;若索引为 -1,则输出信息不存在的提示。
6. 查询学生方法 findStudent
public static void findStudent(ArrayList<Student> list){
System.out.println("查询学生");
if (list.size()==0){
System.out.println("无信息,请先添加信息");
return;
}
System.out.println("学号\t\t姓名\t\t年龄\t\t家庭住址");
for (int i = 0; i < list.size(); i++) {
Student s = list.get(i);
System.out.println(s.getId()+"\t"+s.getName()+"\t"+s.getAge()+"\t\t"+s.getAddress());
}
}
- 若集合
list
为空,则输出无信息的提示并返回。 - 输出表头信息,然后遍历集合,输出每个学生的信息。
7. 辅助方法 contains
和 getIndex
public static boolean contains(ArrayList<Student> list, Student s){
for (int i = 0; i < list.size(); i++) {
Student s1 = list.get(i);
String id1 = s1.getId();
String id = s.getId();
if (id.equals(id1)) {
System.out.println("id重复");
return true;
}
}
return false;
}
public static int getIndex(ArrayList<Student> list, String id){
for (int i = 0; i < list.size(); i++) {
Student s = list.get(i);
String sid = s.getId();
if (sid.equals(id)) {
return i;
}
}
return -1;
}
contains
方法用于检查集合中是否存在与给定Student
对象id
相同的学生,若存在则返回true
,否则返回false
。getIndex
方法用于获取给定id
对应的学生在集合中的索引,若存在则返回索引,否则返回 -1。
注意事项
- 代码中假设存在
Student
类,该类应包含id
、name
、age
和address
属性,以及相应的 getter 和 setter 方法。 - 代码未对用户输入进行严格的验证,例如输入的年龄是否为合法整数等,实际应用中可添加更多的输入验证逻辑。
升级版学生管理系统
需求文档
需求
为学生管理系统书写一个登录、注册、忘记密码的功能。
只用用户登录成功之后,才能进入到学生管理系统中进行增删改查操作。
分析:
登录界面:
System.out.println("欢迎来到学生管理系统");
System.out.println("请先选择操作 1登录 2注册 3忘记密码");
用户类:
属性:用户名、密码、身份证号码、手机号码
注册功能:
-
用户名需要满足以下要求:
验证要求:
用户名唯一
用户名长度必须在3-15位之间
只能是字母加数字组合,但是不能是纯数字
-
密码键盘录入两次,两次一致才可以进行注册
-
身份证号码需要验证
验证要求:
长度为18位
不能以0为开头
前17位,必须都是数字
最为一位可以是数字,也可以是大写X或小写x
-
手机号验证
验证要求:
长度为11位
不能以0位开头
必须都是数字
登录功能:
- 键盘录入用户名
- 键盘录入密码
- 键盘录入验证码
验证要求:
用户名如果未注册,直接结束方法,并提示:用户名未注册,请先注册
判断验证码是否正确,如不正确,重新输入
再判断用户名和密码是否正确,有3次机会
忘记密码:
-
键盘录入用户名,判断当前用户名是否存在,如不存在,直接结束方法,并提示:未注册
-
键盘录入身份证号和手机号
-
判断当前用户的身份证号和手机号码是否一致
如果一致,则提示输入密码,进行修改
如果不一致,则提示:账号信息不匹配,修改失败
验证码规则:
长度为5
由4位大写或者小写字母和1位数字组成,同一个字母可重复
代码实现
代码部分
import java.util.*;
// User 类遵循 JavaBean 规范
class User {
private String username;
private String password;
private String idNumber;
private String phoneNumber;
// 无参构造函数
public User() {
}
// 带参构造函数
public User(String username, String password, String idNumber, String phoneNumber) {
this.username = username;
this.password = password;
this.idNumber = idNumber;
this.phoneNumber = phoneNumber;
}
// Getter 方法
public String getUsername() {
return username;
}
public String getPassword() {
return password;
}
public String getIdNumber() {
return idNumber;
}
public String getPhoneNumber() {
return phoneNumber;
}
// Setter 方法
public void setUsername(String username) {
this.username = username;
}
public void setPassword(String password) {
this.password = password;
}
public void setIdNumber(String idNumber) {
this.idNumber = idNumber;
}
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
}
public class StudentManagementSystem {
private static List<User> users = new ArrayList<>();
private static Scanner scanner = new Scanner(System.in);
public static void main(String[] args) {
while (true) {
System.out.println("欢迎来到学生管理系统");
System.out.println("请先选择操作 1登录 2注册 3忘记密码 4退出");
int choice = scanner.nextInt();
scanner.nextLine(); // 消耗换行符
switch (choice) {
case 1:
login();
break;
case 2:
register();
break;
case 3:
forgetPassword();
break;
case 4:
System.out.println("感谢使用,再见!");
return;
default:
System.out.println("无效的选择,请重新输入。");
}
}
}
private static void register() {
while (true) {
System.out.println("请输入用户名:");
String username = scanner.nextLine();
if (!isValidUsername(username)) {
System.out.println("用户名不满足要求,请重新输入。");
continue;
}
if (isUsernameExists(username)) {
System.out.println("用户名已存在,请重新输入。");
continue;
}
String password;
while (true) {
System.out.println("请输入密码:");
String pwd1 = scanner.nextLine();
System.out.println("请再次输入密码:");
String pwd2 = scanner.nextLine();
if (pwd1.equals(pwd2)) {
password = pwd1;
break;
} else {
System.out.println("两次输入的密码不一致,请重新输入。");
}
}
String idNumber;
while (true) {
System.out.println("请输入身份证号码:");
idNumber = scanner.nextLine();
if (isValidIdNumber(idNumber)) {
break;
} else {
System.out.println("身份证号码不满足要求,请重新输入。");
}
}
String phoneNumber;
while (true) {
System.out.println("请输入手机号码:");
phoneNumber = scanner.nextLine();
if (isValidPhoneNumber(phoneNumber)) {
break;
} else {
System.out.println("手机号码不满足要求,请重新输入。");
}
}
User newUser = new User();
newUser.setUsername(username);
newUser.setPassword(password);
newUser.setIdNumber(idNumber);
newUser.setPhoneNumber(phoneNumber);
users.add(newUser);
System.out.println("注册成功!");
break;
}
}
private static boolean isValidUsername(String username) {
if (username.length() < 3 || username.length() > 15) {
return false;
}
if (username.matches("[0-9]+")) {
return false;
}
return username.matches("[a-zA-Z0-9]+");
}
private static boolean isUsernameExists(String username) {
for (User user : users) {
if (user.getUsername().equals(username)) {
return true;
}
}
return false;
}
private static boolean isValidIdNumber(String idNumber) {
if (idNumber.length() != 18) {
return false;
}
if (idNumber.startsWith("0")) {
return false;
}
String first17 = idNumber.substring(0, 17);
if (!first17.matches("[0-9]+")) {
return false;
}
char lastChar = idNumber.charAt(17);
return Character.isDigit(lastChar) || lastChar == 'X' || lastChar == 'x';
}
private static boolean isValidPhoneNumber(String phoneNumber) {
if (phoneNumber.length() != 11) {
return false;
}
if (phoneNumber.startsWith("0")) {
return false;
}
return phoneNumber.matches("[0-9]+");
}
private static void login() {
System.out.println("请输入用户名:");
String username = scanner.nextLine();
if (!isUsernameExists(username)) {
System.out.println("用户名未注册,请先注册");
return;
}
int attempts = 3;
while (attempts > 0) {
System.out.println("请输入密码:");
String password = scanner.nextLine();
String captcha = generateCaptcha();
System.out.println("验证码:" + captcha);
System.out.println("请输入验证码:");
String inputCaptcha = scanner.nextLine();
if (!inputCaptcha.equals(captcha)) {
System.out.println("验证码不正确,请重新输入。");
continue;
}
for (User user : users) {
if (user.getUsername().equals(username) && user.getPassword().equals(password)) {
System.out.println("登录成功!");
studentManagement();
return;
}
}
attempts--;
System.out.println("用户名或密码错误,你还有 " + attempts + " 次机会。");
}
System.out.println("登录失败,尝试次数已用完。");
}
private static String generateCaptcha() {
Random random = new Random();
StringBuilder captcha = new StringBuilder();
for (int i = 0; i < 4; i++) {
int charCase = random.nextInt(2);
if (charCase == 0) {
captcha.append((char) (random.nextInt(26) + 'a'));
} else {
captcha.append((char) (random.nextInt(26) + 'A'));
}
}
captcha.append(random.nextInt(10));
return captcha.toString();
}
private static void forgetPassword() {
System.out.println("请输入用户名:");
String username = scanner.nextLine();
if (!isUsernameExists(username)) {
System.out.println("未注册");
return;
}
System.out.println("请输入身份证号码:");
String idNumber = scanner.nextLine();
System.out.println("请输入手机号码:");
String phoneNumber = scanner.nextLine();
for (User user : users) {
if (user.getUsername().equals(username) && user.getIdNumber().equals(idNumber) && user.getPhoneNumber().equals(phoneNumber)) {
System.out.println("请输入新密码:");
String newPassword = scanner.nextLine();
user.setPassword(newPassword);
System.out.println("密码修改成功!");
return;
}
}
System.out.println("账号信息不匹配,修改失败");
}
private static void studentManagement() {
System.out.println("进入学生管理系统,你可以进行增删改查操作。");
// 这里可以实现学生信息的增删改查操作
while (true) {
System.out.println("请选择操作:1添加学生 2删除学生 3修改学生信息 4查询学生信息 5退出管理系统");
int choice = scanner.nextInt();
scanner.nextLine(); // 消耗换行符
switch (choice) {
case 1:
System.out.println("添加学生功能待实现。");
break;
case 2:
System.out.println("删除学生功能待实现。");
break;
case 3:
System.out.println("修改学生信息功能待实现。");
break;
case 4:
System.out.println("查询学生信息功能待实现。");
break;
case 5:
System.out.println("退出学生管理系统。");
return;
default:
System.out.println("无效的选择,请重新输入。");
}
}
}
}
详解代码
整体结构
代码主要由两个部分组成:User
类和 StudentManagementSystem
类。User
类是一个 JavaBean 类,用于封装用户的相关信息;StudentManagementSystem
类是主程序类,包含了系统的主要功能逻辑,如登录、注册、忘记密码以及学生管理操作等。
User
类
class User {
private String username;
private String password;
private String idNumber;
private String phoneNumber;
// 无参构造函数
public User() {
}
// 带参构造函数
public User(String username, String password, String idNumber, String phoneNumber) {
this.username = username;
this.password = password;
this.idNumber = idNumber;
this.phoneNumber = phoneNumber;
}
// Getter 方法
public String getUsername() {
return username;
}
public String getPassword() {
return password;
}
public String getIdNumber() {
return idNumber;
}
public String getPhoneNumber() {
return phoneNumber;
}
// Setter 方法
public void setUsername(String username) {
this.username = username;
}
public void setPassword(String password) {
this.password = password;
}
public void setIdNumber(String idNumber) {
this.idNumber = idNumber;
}
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
}
-
属性
:
username
:用户的用户名。password
:用户的密码。idNumber
:用户的身份证号码。phoneNumber
:用户的手机号码。
-
构造函数
:
- 无参构造函数:用于创建一个空的
User
对象。 - 带参构造函数:用于在创建对象时直接初始化用户的信息。
- 无参构造函数:用于创建一个空的
-
Getter 和 Setter 方法
:
- Getter 方法用于获取对象的属性值。
- Setter 方法用于设置对象的属性值。通过这种方式,保证了数据的封装性,外部类不能直接访问和修改对象的属性,只能通过这些公共方法来操作。
StudentManagementSystem
类
public class StudentManagementSystem {
private static List<User> users = new ArrayList<>();
private static Scanner scanner = new Scanner(System.in);
-
静态变量
:
users
:一个List
集合,用于存储所有已注册的用户信息。scanner
:用于从控制台读取用户输入的信息。
main
方法
public static void main(String[] args) {
while (true) {
System.out.println("欢迎来到学生管理系统");
System.out.println("请先选择操作 1登录 2注册 3忘记密码 4退出");
int choice = scanner.nextInt();
scanner.nextLine(); // 消耗换行符
switch (choice) {
case 1:
login();
break;
case 2:
register();
break;
case 3:
forgetPassword();
break;
case 4:
System.out.println("感谢使用,再见!");
return;
default:
System.out.println("无效的选择,请重新输入。");
}
}
}
- 这是程序的入口方法,使用一个无限循环不断显示系统的主菜单,让用户选择操作。
- 根据用户的选择,调用相应的方法(
login
、register
、forgetPassword
)或退出程序。 scanner.nextLine()
用于消耗掉scanner.nextInt()
输入时产生的换行符,避免影响后续的输入操作。
register
方法
private static void register() {
while (true) {
System.out.println("请输入用户名:");
String username = scanner.nextLine();
if (!isValidUsername(username)) {
System.out.println("用户名不满足要求,请重新输入。");
continue;
}
if (isUsernameExists(username)) {
System.out.println("用户名已存在,请重新输入。");
continue;
}
String password;
while (true) {
System.out.println("请输入密码:");
String pwd1 = scanner.nextLine();
System.out.println("请再次输入密码:");
String pwd2 = scanner.nextLine();
if (pwd1.equals(pwd2)) {
password = pwd1;
break;
} else {
System.out.println("两次输入的密码不一致,请重新输入。");
}
}
String idNumber;
while (true) {
System.out.println("请输入身份证号码:");
idNumber = scanner.nextLine();
if (isValidIdNumber(idNumber)) {
break;
} else {
System.out.println("身份证号码不满足要求,请重新输入。");
}
}
String phoneNumber;
while (true) {
System.out.println("请输入手机号码:");
phoneNumber = scanner.nextLine();
if (isValidPhoneNumber(phoneNumber)) {
break;
} else {
System.out.println("手机号码不满足要求,请重新输入。");
}
}
User newUser = new User();
newUser.setUsername(username);
newUser.setPassword(password);
newUser.setIdNumber(idNumber);
newUser.setPhoneNumber(phoneNumber);
users.add(newUser);
System.out.println("注册成功!");
break;
}
}
- 该方法实现了用户注册功能。
- 首先,要求用户输入用户名,并验证用户名的合法性和唯一性。
- 然后,要求用户输入两次密码,确保两次输入的密码一致。
- 接着,要求用户输入身份证号码和手机号码,并分别验证其合法性。
- 最后,创建一个新的
User
对象,使用setter
方法设置用户信息,并将其添加到users
集合中。
isValidUsername
方法
private static boolean isValidUsername(String username) {
if (username.length() < 3 || username.length() > 15) {
return false;
}
if (username.matches("[0-9]+")) {
return false;
}
return username.matches("[a-zA-Z0-9]+");
}
- 该方法用于验证用户名的合法性。
- 用户名长度必须在 3 到 15 位之间。
- 不能是纯数字。
- 只能由字母和数字组成。
isUsernameExists
方法
private static boolean isUsernameExists(String username) {
for (User user : users) {
if (user.getUsername().equals(username)) {
return true;
}
}
return false;
}
- 该方法用于检查用户名是否已存在。
- 遍历
users
集合,比较每个用户的用户名与输入的用户名是否相同。
isValidIdNumber
方法
private static boolean isValidIdNumber(String idNumber) {
if (idNumber.length() != 18) {
return false;
}
if (idNumber.startsWith("0")) {
return false;
}
String first17 = idNumber.substring(0, 17);
if (!first17.matches("[0-9]+")) {
return false;
}
char lastChar = idNumber.charAt(17);
return Character.isDigit(lastChar) || lastChar == 'X' || lastChar == 'x';
}
- 该方法用于验证身份证号码的合法性。
- 身份证号码长度必须为 18 位。
- 不能以 0 开头。
- 前 17 位必须都是数字。
- 最后一位可以是数字、大写
X
或小写x
。
isValidPhoneNumber
方法
private static boolean isValidPhoneNumber(String phoneNumber) {
if (phoneNumber.length() != 11) {
return false;
}
if (phoneNumber.startsWith("0")) {
return false;
}
return phoneNumber.matches("[0-9]+");
}
- 该方法用于验证手机号码的合法性。
- 手机号码长度必须为 11 位。
- 不能以 0 开头。
- 必须都是数字。
login
方法
private static void login() {
System.out.println("请输入用户名:");
String username = scanner.nextLine();
if (!isUsernameExists(username)) {
System.out.println("用户名未注册,请先注册");
return;
}
int attempts = 3;
while (attempts > 0) {
System.out.println("请输入密码:");
String password = scanner.nextLine();
String captcha = generateCaptcha();
System.out.println("验证码:" + captcha);
System.out.println("请输入验证码:");
String inputCaptcha = scanner.nextLine();
if (!inputCaptcha.equals(captcha)) {
System.out.println("验证码不正确,请重新输入。");
continue;
}
for (User user : users) {
if (user.getUsername().equals(username) && user.getPassword().equals(password)) {
System.out.println("登录成功!");
studentManagement();
return;
}
}
attempts--;
System.out.println("用户名或密码错误,你还有 " + attempts + " 次机会。");
}
System.out.println("登录失败,尝试次数已用完。");
}
- 该方法实现了用户登录功能。
- 首先,要求用户输入用户名,并检查该用户名是否已注册。
- 然后,用户有 3 次尝试登录的机会,每次尝试都需要输入密码和验证码。
- 验证码由
generateCaptcha
方法生成,用户输入的验证码必须与生成的验证码一致。 - 如果用户名、密码和验证码都正确,则登录成功,调用
studentManagement
方法进入学生管理系统。
generateCaptcha
方法
private static String generateCaptcha() {
Random random = new Random();
StringBuilder captcha = new StringBuilder();
for (int i = 0; i < 4; i++) {
int charCase = random.nextInt(2);
if (charCase == 0) {
captcha.append((char) (random.nextInt(26) + 'a'));
} else {
captcha.append((char) (random.nextInt(26) + 'A'));
}
}
captcha.append(random.nextInt(10));
return captcha.toString();
}
- 该方法用于生成一个长度为 5 的验证码,由 4 位大写或小写字母和 1 位数字组成。
forgetPassword
方法
private static void forgetPassword() {
System.out.println("请输入用户名:");
String username = scanner.nextLine();
if (!isUsernameExists(username)) {
System.out.println("未注册");
return;
}
System.out.println("请输入身份证号码:");
String idNumber = scanner.nextLine();
System.out.println("请输入手机号码:");
String phoneNumber = scanner.nextLine();
for (User user : users) {
if (user.getUsername().equals(username) && user.getIdNumber().equals(idNumber) && user.getPhoneNumber().equals(phoneNumber)) {
System.out.println("请输入新密码:");
String newPassword = scanner.nextLine();
user.setPassword(newPassword);
System.out.println("密码修改成功!");
return;
}
}
System.out.println("账号信息不匹配,修改失败");
}
- 该方法实现了忘记密码功能。
- 首先,要求用户输入用户名,并检查该用户名是否已注册。
- 然后,要求用户输入身份证号码和手机号码,验证用户输入的信息与存储的信息是否一致。
- 如果信息一致,则允许用户输入新密码,并使用
setter
方法更新用户的密码。
studentManagement
方法
private static void studentManagement() {
System.out.println("进入学生管理系统,你可以进行增删改查操作。");
// 这里可以实现学生信息的增删改查操作
while (true) {
System.out.println("请选择操作:1添加学生 2删除学生 3修改学生信息 4查询学生信息 5退出管理系统");
int choice = scanner.nextInt();
scanner.nextLine(); // 消耗换行符
switch (choice) {
case 1:
System.out.println("添加学生功能待实现。");
break;
case 2:
System.out.println("删除学生功能待实现。");
break;
case 3:
System.out.println("修改学生信息功能待实现。");
break;
case 4:
System.out.println("查询学生信息功能待实现。");
break;
case 5:
System.out.println("退出学生管理系统。");
return;
default:
System.out.println("无效的选择,请重新输入。");
}
}
}
t.println(“请输入新密码:”);
String newPassword = scanner.nextLine();
user.setPassword(newPassword);
System.out.println(“密码修改成功!”);
return;
}
}
System.out.println(“账号信息不匹配,修改失败”);
}
- 该方法实现了忘记密码功能。
- 首先,要求用户输入用户名,并检查该用户名是否已注册。
- 然后,要求用户输入身份证号码和手机号码,验证用户输入的信息与存储的信息是否一致。
- 如果信息一致,则允许用户输入新密码,并使用 `setter` 方法更新用户的密码。
#### `studentManagement` 方法
```java
private static void studentManagement() {
System.out.println("进入学生管理系统,你可以进行增删改查操作。");
// 这里可以实现学生信息的增删改查操作
while (true) {
System.out.println("请选择操作:1添加学生 2删除学生 3修改学生信息 4查询学生信息 5退出管理系统");
int choice = scanner.nextInt();
scanner.nextLine(); // 消耗换行符
switch (choice) {
case 1:
System.out.println("添加学生功能待实现。");
break;
case 2:
System.out.println("删除学生功能待实现。");
break;
case 3:
System.out.println("修改学生信息功能待实现。");
break;
case 4:
System.out.println("查询学生信息功能待实现。");
break;
case 5:
System.out.println("退出学生管理系统。");
return;
default:
System.out.println("无效的选择,请重新输入。");
}
}
}