学生管理系统
需求
采取控制台的方式去书写学生管理系统。
升级:书写登录、注册、忘记密码的功能,只有用户登录成功之后,才能进入到学生管理系统中进行增删改查操作。
分析
初始菜单
"------------欢迎来到亚特兰蒂斯学生管理系统------------"
"1:添加学生"
"2:删除学生"
"3:修改学生"
"4:查询学生"
"5:退出"
"请输入您的选择:"
学生类
属性:id、姓名、年龄、家庭住址
添加功能
键盘录入每一个学生的信息并添加,需要满足以下要求:
- id唯一
删除功能
键盘录入要删除的学生id,需要满足以下要求:
- id存在删除
- id不存在,需要提示不存在,并回到初始菜单
修改功能
键盘录入要修改的学生id,需要满足以下要求
- id存在,继续录入其他信息
- id不存在,需要提示不存在,并回到初始菜单
查询功能
打印所有的学生信息,需要满足以下要求
- 如果没有学生信息,提示:当前无学生信息,请添加后再查询
- 如果有学生信息,需要按照以下格式输出。(不用过于纠结对齐的问题)
id 姓名 年龄 家庭住址
ytlds001 Jin 28 南京
ytlds002 Jimin 26 北京
ytlds003 Suga 27 深圳
ytlds004 Vante 25 长沙
登录界面
System.out.println("欢迎来到学生管理系统");
System.out.println("请选择操作 1登录 2注册 3忘记密码");
用户类
属性:用户名、密码、身份证号码、手机号码
注册功能
1.用户名需要满足以下要求:
验证要求:
用户名唯一
用户名长度必须在3-15位之间
只能是字母加数字的组合,但不能是纯数字
2.密码键盘输入两次,两次一致才可以进行注册
3.身份证号码需要验证
验证要求:
长度为18位
不能以0开头
前17位必须都是数字
最后一位可以是数字,也可以是大写X或小写x
4.手机号验证
验证要求:
长度为11位
不能以0开头
必须都是数字
登录功能
1.键盘录入用户名
2.键盘录入密码
3.键盘录入验证码
验证要求:
用户名如果未注册,直接结束方法,并提示:用户名未注册,请先注册
判断验证码是否正确,若不正确,重新输入
再判断用户名和密码是否正确,有3次机会
忘记密码
1.键盘录入用户名,判断当前用户名是否存在,如不存在,直接结束方法,并提示:未注册
2.键盘录入身份证号码和手机号码
3.判断当前用户的身份证号码和手机号码是否一致
如果一致,则提示输入密码,进行修改
如果不一致,则提示:账号信息不匹配,修改失败
验证码规则
长度为5
由4位大写或小写字母和1位数字组成,同一个字母可重复
数字可以出现在任意位置
比如:aQa1K
1.User类
public class User {
private String username;
private String password;
private String identityID;
private String phone;
public User() {
}
public User(String username, String password, String identityID, String phone) {
this.username = username;
this.password = password;
this.identityID = identityID;
this.phone = phone;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getIdentityID() {
return identityID;
}
public void setIdentityID(String identityID) {
this.identityID = identityID;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
}
2.Login类(学生管理系统登录界面)
public class Login {
public static void main(String[] args) {
ArrayList<User> list = new ArrayList<>();
Scanner sc = new Scanner(System.in);
while (true) {
//1.输出登录界面
System.out.println("-------欢迎来到学生管理系统-------");
System.out.println("请选择操作 1登录 2注册 3忘记密码 4退出");
//2.操作
String choose = sc.next();
switch (choose){
case "1":
login(list);
StudentSystem stuSystem = new StudentSystem();
stuSystem.startStudentSystem();
break;
case "2":
register(list);
break;
case "3":
updatePassword(list);
break;
case "4":
System.exit(0);
default:
System.out.println("输入错误,请重新输入!");
}
}
}
//注册新用户
public static void register(ArrayList<User> list) {
//1.获取用户名
String username = getRightUserName(list);
//2.获取用户密码
String password = getRightPassword();
//3.获取用户身份证号码
String identityID = getRightIdentityID();
//4.获取用户手机号码
String phone = getRightPhone();
//5.创建用户对象,将新注册的用户对象加入集合中
list.add(new User(username,password,identityID,phone));
System.out.println("您已注册成功,返回主菜单界面!");
}
//用户登录
public static void login(ArrayList<User> list) {
Scanner sc = new Scanner(System.in);
String username;
String password;
String code; //随机生成的验证码
String newCode; //用户输入的验证码
int count = 3; //计数器
System.out.println("请输入用户名:");
username = sc.next();
if(!contains(list,username)) {
System.out.println("用户名未注册,请先注册!");
return;
}
while (count > 0) {
System.out.println("请输入用户密码:");
password = sc.next();
while (true) {
code = getIdentifyCode();
System.out.println("验证码:"+code);
System.out.println("请输入验证码:");
newCode = sc.next();
if(!code.equals(newCode)) {
System.out.println("验证码错误,请重新输入!");
}else {
break;
}
}
//再判断用户名和密码是否正确,有3次机会
int index = getIndex(list,username);
if(list.get(index).getPassword().equals(password)) {
System.out.println("登录成功!");
return;
}else {
count--;
if(count == 0) {
System.out.println("密码错误,登录失败!");
return;
}
System.out.println("密码错误,您还有"+count+"重新输入密码的机会!");
}
}
}
//忘记密码
public static void updatePassword(ArrayList<User> list) {
Scanner sc = new Scanner(System.in);
String identityID;
String phone;
String password;
//先输入用户名
System.out.println("请输入您的用户名:");
String username = sc.next();
//返回用户名索引
int index = getIndex(list,username);
if(index < 0) {
System.out.println("该用户未注册!");
return;
}
//用户名存在,输入身份证号码和手机号码
System.out.println("请输入您的身份证号码:");
identityID = sc.next();
System.out.println("请输入您的手机号码:");
phone = sc.next();
//判断当前用户的身份证号码和手机号码是否一致
if(list.get(index).getIdentityID().equals(identityID) && list.get(index).getPhone().equals(phone)) {
//一致,则提示输入密码,进行修改
System.out.println("修改密码:");
password = sc.next();
list.get(index).setPassword(password);
System.out.println("密码修改成功!");
}else {
//不一致,则提示:账号信息不匹配,修改失败
System.out.println("账号信息不匹配,修改失败!");
}
}
//生成验证码
public static String getIdentifyCode() {
Random random = new Random();
char[] arr = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',
'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
StringBuilder sb = new StringBuilder("");
//随机生成四个字母
int num;
for (int i = 0; i < 4; i++) {
num = random.nextInt(52);
sb.append(arr[num]);
}
//生成一个0-9的随机数
sb.append(random.nextInt(10));
char[] code = sb.toString().toCharArray();
for (int i = 0; i < code.length; i++) {
num = random.nextInt(code.length);
char temp = code[i];
code[i] = code[num];
code[num] = temp;
}
String result = new String(code);
return result;
}
//获取不存在且格式正确的用户名
public static String getRightUserName(ArrayList<User> list){
Scanner sc = new Scanner(System.in);
String username;
while (true) {
//1.提示用户输入用户名
System.out.println("请输入用户名:");
username = sc.next();
//2.判断用户名是否存在
if(contains(list,username)) {
System.out.println("用户名已存在,请重新输入!");
}else {
if(rightUserName(username)) {
return username;
}else {
System.out.println("用户名格式错误,用户名必须是由3-15位字母和数字组成的,不能为纯数字,请重新输入用户名!");
}
}
}
}
//获取正确的密码(两次输入一致)
public static String getRightPassword() {
Scanner sc = new Scanner(System.in);
String password1;
String password2;
while (true) {
System.out.println("请输入密码:");
password1 = sc.next();
System.out.println("请再次输入密码,保证与第一次输入的密码一致:");
password2 = sc.next();
if(!password1.equals(password2)) {
System.out.println("您输入的两次密码不一致,请重新输入!");
}else {
return password1;
}
}
}
//获取格式正确的身份证号码
public static String getRightIdentityID() {
Scanner sc = new Scanner(System.in);
String identityID;
//到此时,用户名与密码都通过验证,下面验证身份证号码
while (true) {
System.out.println("请输入身份证号码:");
identityID = sc.next();
if(rightIdentityID(identityID)) {
return identityID;
}else {
System.out.println("格式错误,请重新输入身份证号码!");
}
}
}
//获取格式正确的手机号码
public static String getRightPhone() {
Scanner sc = new Scanner(System.in);
String phone;
while (true) {
System.out.println("请输入手机号码:");
phone = sc.next();
if(rightPhone(phone)) {
return phone;
}else {
System.out.println("格式错误,请重新输入手机号码!");
}
}
}
//判断用户名是否存在
public static boolean contains(ArrayList<User> list,String username) {
// for (int i = 0; i < list.size(); i++) {
// if(list.get(i).getUsername().equals(username)) {
// return true;
// }
// }
// return false;
if(getIndex(list,username) >= 0) {
return true;
}else {
return false;
}
}
//返回所要询用的户名的索引
public static int getIndex(ArrayList<User> list,String username) {
for (int i = 0; i < list.size(); i++) {
User user = list.get(i);
if(user.getUsername().equals(username)) {
return i;
}
}
return -1;
}
//判断用户名格式是否符合要求
public static boolean rightUserName(String username) {
//用户名长度不在3-15位之间
if(username.length() < 3 || username.length() > 15) {
return false;
}
int count = 0;
for (int i = 0; i < username.length(); i++) {
char c = username.charAt(i);
if((c < 'a' || c > 'z')&&(c < 'A' || c > 'Z')&&(c < '0' || c > '9')) {
//出现了既不是字母也不是数字的字符
return false;
}
if(c >= '0' && c <= '9') {
count++;
}
}
if(count == username.length()) {
//全是数字
return false;
}
//验证通过
return true;
}
//判断身份证号码是否符合要求
public static boolean rightIdentityID(String identityID) {
String regex = "[1-9]\\d{16}[0-9Xx]";
boolean flag = identityID.matches(regex);
if(flag) {
return true;
}else {
return false;
}
}
//验证手机号码是否符合要求
public static boolean rightPhone(String phone) {
String regex = "[1-9]\\d{10}";
boolean flag = phone.matches(regex);
if(flag) {
return true;
}else {
return false;
}
}
}
3.Student类
public class Student {
//id、姓名、年龄、住址
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;
}
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 String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
4.StudentSystem类(学生管理系统管理界面)
public class StudentSystem {
public static void startStudentSystem() {
//创建学生集合
ArrayList<Student> list = new ArrayList<>();
String num;
Scanner sc = new Scanner(System.in);
//实现菜单功能
loop: 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("请输入您的选择:");
num = sc.next();
switch (num){
case "1":
addStudent(list);
break;
case "2":
deleteStudent(list);
break;
case "3":
updateStudent(list);
break;
case "4":
queryStudent(list);
break;
case "5":
System.out.println("退出");
sc.close();
//break loop;
System.exit(0); //停止虚拟机运行
default:
System.out.println("没有这个选项,请重新输入!");
break;
}
}
}
//添加学生
public static void addStudent(ArrayList<Student> list) {
Scanner sc = new Scanner(System.in);
String id = null;
while (true) {
System.out.println("请输入学生的id:");
id = sc.next();
if(contains(list,id)) {
//id已存在,提示一下用户
System.out.println("学生id已经存在,请重新录入!");
}else {
//表示学生id不存在,可以继续录入后续信息
break;
}
}
System.out.println("请输入学生的姓名:");
String name = sc.next();
System.out.println("请输入学生的年龄:");
int age = sc.nextInt();
System.out.println("请输入学生的家庭住址:");
String address = sc.next();
Student stu = new Student(id,name,age,address);
//把学生对象添加到集合当中
list.add(stu);
System.out.println("学生信息添加成功!");
//sc.close();
}
//删除学生
public static void deleteStudent(ArrayList<Student> list) {
//键盘录入要删除的学生id
Scanner sc = new Scanner(System.in);
int index;
String id;
while (true) {
System.out.println("请输入要删除的学生id:");
id = sc.next();
//查询学生id在集合中的索引
index = getIndex(list,id);
//对返回的index进行判断
//index >= 0则表示存在id,删除该学生对象
//index < 0表示不存在该id,给出提示信息
if(index >= 0) {
list.remove(index);
System.out.println("成功删除学生信息!");
break;
}else {
System.out.println("该学生id不存在,请重新录入!");
}
}
}
//修改学生
public static void updateStudent(ArrayList<Student> list) {
Scanner sc = new Scanner(System.in);
String id = null;
int index;
while (true) {
System.out.println("请输入学生的id:");
id = sc.next();
index = getIndex(list,id);
if(index >= 0) {
//id存在,退出循环
break;
}else {
//表示学生id不存在,给出提示重新录入
System.out.println("要修改的学生id不存在,请重新录入!");
}
}
Student stu = list.get(index);
System.out.println("请输入学生的姓名:");
String newName = sc.next();
stu.setName(newName);
System.out.println("请输入学生的年龄:");
int newAge = sc.nextInt();
stu.setAge(newAge);
System.out.println("请输入学生的家庭住址:");
String newAddress = sc.next();
stu.setAddress(newAddress);
System.out.println("学生信息修改成功!");
}
//查询学生
public static void queryStudent(ArrayList<Student> list) {
if(list.size() == 0) {
System.out.println("当前无学生信息,请添加后再查询!");
//结束方法
return;
}
//打印表头信息
System.out.println("id\t\t\t姓名\t\t年龄\t家庭住址");
//当代码执行到这里时,表示集合中是有数据的
for (int i = 0; i < list.size(); i++) {
Student stu = list.get(i);
System.out.println(stu.getId()+"\t"+stu.getName()+"\t"+stu.getAge()+"\t"+stu.getAddress());
}
}
//判断id在集合中是否存在
public static boolean contains(ArrayList<Student> list,String id) {
//循环遍历集合得到里面的每一个学生对象的id进行判断
// for (int i = 0; i < list.size(); i++) {
// Student stu = list.get(i);
// if(stu.getId().equals(id)) {
// //存在则返回true
// return true;
// }
// }
//不存在返回false
if(getIndex(list,id) >= 0) {
return true;
}else {
return false;
}
}
//通过id获取索引的方法
public static int getIndex(ArrayList<Student> list,String id) {
//遍历集合
for (int i = 0; i < list.size(); i++) {
//得到每一个学生对象
Student stu = list.get(i);
//将集合中的学生id与要查询的id比较
if(stu.getId().equals(id)) {
//如果一样就返回索引
return i;
}
}
//循环结束后还没找到表示不存在,则返回-1
return -1;
}
}
说明:
以上笔记学习是学习b站黑马程序员时记下的笔记,仅限于帮助理解学习,不做任何其他商业用途。