学生管理系统
Student.java
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;
}
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;
}
}
StudentSystem.java
import java.util.ArrayList;
import java.util.Scanner;
public class StudentSystem {
public void startStudentSystem() {
/*因为要被APP.java调用
所以public static void main(String[] args) {}要改个函数名
*/
boolean flag1 = true;
ArrayList<Student> list = new ArrayList<>();
txt();
Scanner scanner = new Scanner(System.in);
while (flag1) {
String choose = scanner.next();
switch (choose) {
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("已退出");
System.exit(0);
break;
default:
System.out.println("输入错误");
}
while (true) {
System.out.print("是否继续?Y/N:");
String yn = scanner.next();
if (yn.equalsIgnoreCase("n")) {
System.out.println("已退出");
System.exit(0);
} else if (yn.equalsIgnoreCase("y")) {
txt();
break;
} else {
System.out.println("输入错误");
}
}
}
scanner.close();
}
public void txt() {
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.print("请输入您的选择:");
}
public void addStudent(ArrayList<Student> list) {
Scanner scanner = new Scanner(System.in);
Student s = new Student();
while (true) {
System.out.print("请输入id:");
String id = scanner.next();
boolean flag2 = contains(list, id);
if (flag2) {
System.out.println("id已存在,请重录。");
} else {
s.setId(id);
break;
}
}
System.out.print("请输入姓名:");
String name = scanner.next();
s.setName(name);
System.out.print("请输入年龄:");
int age = scanner.nextInt();
s.setAge(age);
System.out.print("请输入地址:");
String address = scanner.next();
s.setAddress(address);
list.add(s);
System.out.println("添加成功");
}
public void deleteStudent(ArrayList<Student> list) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入要删除的学生id:");
String id = scanner.next();
int index = get_index(list, id);
if (index >= 0) {
list.remove(index);
System.out.println("id为" + id + "的学生信息删除成功");
} else {
System.out.println("id不存在,删除失败");
}
}
public void updateStudent(ArrayList<Student> list) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入要修改的学生id:");
String id = scanner.next();
int index = get_index(list, id);
if (index == -1) {
System.out.println("id不存在,修改失败");
} else {
Student stu = list.get(index);
System.out.print("请输入要修改的学生姓名:");
String newName = scanner.next();
stu.setName(newName);
System.out.print("请输入要修改的学生年龄:");
int newAge = scanner.nextInt();
stu.setAge(newAge);
System.out.print("请输入要修改的学生地址:");
String newAddress = scanner.next();
stu.setAddress(newAddress);
System.out.println("修改成功");
}
}
public void queryStudent(ArrayList<Student> list) {
if (list.size() == 0) {
System.out.println("当前无学生信息,请添加后再查询。");
return;//结束方法
}
//打印表头信息
System.out.println("id\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 boolean contains(ArrayList<Student> list, String id) {
// for (int i = 0; i < list.size(); i++) {
// Student stu=list.get(i);
// if (stu.getId().equals(id)){
// return true;
// }
// }
// return false;
return get_index(list, id) >= 0;//提高代码复用性
}
//根据id获取索引
public int get_index(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;
}
}
//如果不同,就说明查询的id不存在,返回-1
return -1;
}
}
User.java
public class User {
private String name;
private String password;
private String id;
private String phone;
public User() {
}
public User(String name, String password, String id, String phone) {
this.name = name;
this.password = password;
this.id = id;
this.phone = phone;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
}
APP.java
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;
public class APP {
public static void main(String[] args) {
ArrayList<User> list = new ArrayList<>();
txt();
Scanner sc = new Scanner(System.in);
while (true) {
String choose = sc.next();
switch (choose) {
case "1":
login(list);
break;
case "2":
register(list);
break;
case "3":
forget(list);
break;
case "4":
System.out.println("已退出");
sc.close();
System.exit(0);
break;
default:
System.out.println("输入错误");
}
while (true) {
System.out.print("是否继续?Y/N:");
String yn = sc.next();
if (yn.equalsIgnoreCase("n")) {
System.out.println("已退出");
sc.close();
System.exit(0);
} else if (yn.equalsIgnoreCase("y")) {
txt();
break;
} else {
System.out.println("输入错误");
}
}
}
}
//目前用到的类还太少,public和private都行
public static void txt() {
System.out.println("=================学生管理系统登录界面=================");
System.out.println("1:登录");
System.out.println("2:注册");
System.out.println("3:忘记/修改密码");
System.out.println("4:退出系统");
System.out.print("请输入您的选择:");
}
//登录功能
private static void login(ArrayList<User> list) {
Scanner sc = new Scanner(System.in);
System.out.print("请输入用户名:");
String name = sc.next();
//判断用户名是否存在
boolean flag = contains(list, name);
if (!flag) {
System.out.println("用户名" + name + "未注册,请先注册再登录");
return;//结束方法
}
for (int i = 0; i < 3; i++) {//3次输入密码的机会
System.out.print("请输入密码:");
String password = sc.next();
while (true) {
String rightCode = getCode();
System.out.println("验证码:" + rightCode);
System.out.print("请输入验证码:");
String code = sc.next();
if (!rightCode.equalsIgnoreCase(code)) {
System.out.println("验证码错误,请重新输入");
continue;
} else {
break;
}
}
//验证用户名和密码是否正确
//封装思想的应用:可以把一些零散的数据封装成一个对象,传递参数时就不用考虑其他无关的数据,直接传递整体。
//这里的验证用户名和密码的方法可以传递name和password参数,但以后要id和phone参数就比较麻烦
//所以采用封装思想
User userInfo = new User(name, password, null, null);
boolean result = checkUserInfo(list, userInfo);//集合提供判断的数据
if (result) {
System.out.println("登录成功");
StudentSystem ss = new StudentSystem();//创建学生管理系统的对象
ss.startStudentSystem();
break;
} else if (i == 2) {
System.out.println("用户名或密码错误,当前账号:" + name + "被锁定,请24小时后重新登录");
break;
} else {
System.out.println("用户名或密码错误,还剩" + (2 - i) + "次机会");
}
}
}
//验证码
private static String getCode() {
/*长度为5,由4位字母和1位数字组成,字母可重复,数字可出现在任何位置*/
//1.将所有大小写字母添加到一个集合中
ArrayList<Character> list = new ArrayList<>();
for (int i = 0; i < 26; i++) {
list.add((char) ('a' + i));//所有小写字母 a->97 b->98
list.add((char) ('A' + i));//所有大写字母
}
//2.随机抽4个字符
Random r = new Random();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 4; i++) {
//获取随机索引
int index = r.nextInt(list.size());
//获取随机字符
Character c = list.get(index);
sb.append(c);
}
//3.把一个随机数字添加到末尾
int number = r.nextInt(10);//数字就是[0,9]
sb.append(number);
//4.数字出现在随机位置,即要修改字符串的内容
//就得先把字符串变成字符数组,在数组中修改,然后再创建一个新的字符串
char[] arr = sb.toString().toCharArray();
//拿最后一个索引(数字)跟随机索引交换
int randomIndex = r.nextInt(arr.length);//随机索引
char temp = arr[randomIndex];//随机索引指向的元素
//最后一个索引(数字)指向的元素跟随机索引指向的元素交换
arr[randomIndex] = arr[arr.length - 1];
arr[arr.length - 1] = temp;
return new String(arr);//返回新的字符串
}
private static boolean checkUserInfo(ArrayList<User> list, User userInfo) {
//遍历集合,判断对象中用户名和密码是否一致
for (int i = 0; i < list.size(); i++) {
User user = list.get(i);
if (user.getName().equals(userInfo.getName()) && user.getPassword().equals(userInfo.getPassword())) {
return true;
}
}
return false;
}
//注册功能
private static void register(ArrayList<User> list) {
//注册的本质:把用户信息添加到用户对象中,再把用户对象添加到集合中
//1.键盘录入用户名
Scanner sc = new Scanner(System.in);
String name;
while (true) {
System.out.print("请输入用户名:");
name = sc.next();
/*编程细节:先验证格式是否正确,再验证是否唯一,
因为以后用到数据库时校验唯一性要联网,浪费性能,
而校验格式不用,不会浪费性能*/
//用户名长度必须在3~15位之间
//只能输入字母和数字,且不能是纯数字
boolean flag1 = checkName(name);
if (!flag1) {
System.out.println("格式不ok");
continue;
}
//用户名唯一
//把name拿到集合中判断是否存在
boolean flag2 = contains(list, name);
if (flag2) {
System.out.println("用户名:" + name + "已存在,请重新输入");
} else {
break;
}
}
//2.键盘录入密码
//长度必须在6~15位
//密码输入两次,两次一致才可录入
String password;
while (true) {
System.out.print("请输入密码:");
password = sc.next();
boolean flag3 = checkPassword(password);
if (!flag3) {
System.out.println("密码长度有误,请重新输入");
continue;
}
System.out.print("请再次输入密码:");
String againPassword = sc.next();
if (!againPassword.equals(password)) {
System.out.println("密码输入错误,请重试");
continue;
} else {
break;
}
}
//3.键盘录入身份证号码
//长度为18位
//不能以0开头
//前17位必须是数字
//最后一位可以是数字也可以是X或者x
String id;
while (true) {
System.out.print("请输入身份证号码:");
id = sc.next();
boolean flag4 = checkID(id);
if (!flag4) {
System.out.println("身份证格式有误,请重新输入");
continue;
} else {
break;
}
}
//4.键盘录入手机号码
//长度为11位
//不能以0开头
//必须都是数字
String phone;
while (true) {
System.out.print("请输入手机号码:");
phone = sc.next();
boolean flag5 = checkPhone(phone);
if (!flag5) {
System.out.println("输入的手机号码有误,请重新输入");
continue;
} else {
break;
}
}
User user = new User(name, password, id, phone);
list.add(user);
System.out.println("注册成功");
}
private static boolean checkName(String name) {
//用户名长度必须在3~15位之间
int len = name.length();//减少if处调用name.length的次数
if (len < 3 || len > 15) {
return false;
}
//只能输入字母和数字,且不能是纯数字
//只能输入字母和数字:遍历name的每一个字符,如果有一个字符不是字母或数字,就返回false
for (int i = 0; i < name.length(); i++) {
//i索引,c是name的单个字符
char c = name.charAt(i);
// 小写字母 大写字母 数字
if (!((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9'))) {
return false;
}
}
//不能是纯数字:遍历name的每一个字符,如果有一个字符是字母,就返回false并统计
int count = 0;
for (int i = 0; i < name.length(); i++) {
char c = name.charAt(i);
if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {
count++;
break;//只要有一个是字母就退出循环
}
}
return count > 0;
}
private static boolean contains(ArrayList<User> list, String name) {
//遍历集合中的每一个对象,拿对象的用户名跟name比较
for (int i = 0; i < list.size(); i++) {
User user = list.get(i);
if (user.getName().equals(name)) {
return true;
}
}
return false;
}
private static boolean checkPassword(String password) {
////长度必须在6~15位
int len = password.length();
if (len < 6 || len > 15) {
return false;
}
return true;
}
private static boolean checkID(String id) {
//长度为18位
int len = id.length();
if (len != 18) {
return false;
}
//不能以0开头
boolean flag = id.startsWith("0");//id.charAt(0)
//startsWith方法判断开头是否为0,是则返回true,不是则false
if (flag) {
return false;
}
//前17位必须是数字
for (int i = 0; i < id.length() - 1; i++) {//-1→前17位
char c = id.charAt(i);
if (!(c >= '0' && c <= '9')) {
return false;
}
}
//最后一位可以是数字也可以是X或者x
char endChar = id.charAt(id.length() - 1);
if ((endChar >= '0' && endChar <= '9') || (endChar == 'X') || (endChar == 'x')) {
return true;
} else {
return false;
}
}
private static boolean checkPhone(String phone) {
//长度为11位
int len = phone.length();
if (len != 11) {
return false;
}
//不能以0开头
boolean flag = phone.startsWith("0");
if (flag) {
return false;
}
//必须都是数字
for (int i = 0; i < phone.length(); i++) {
char c = phone.charAt(i);
if (!(c >= '0' && c <= '9')) {
return false;
}
}
return true;
}
//忘记/修改密码
private static void forget(ArrayList<User> list) {
Scanner sc = new Scanner(System.in);
//1.判断用户名是否存在
System.out.print("请输入用户名:");
String name = sc.next();
boolean flag = contains(list, name);
if (!flag) {
System.out.println("当前用户" + name + "未注册,请先注册");
return;
}
//2.输入身份证号码和手机号码
System.out.print("请输入身份证号码:");
String id = sc.next();
System.out.print("请输入手机号码:");
String phone = sc.next();
//根据用户名获取集合索引定位到对象
int index = getIndex(list, name);
User user = list.get(index);
//判断用户的身份证号码和手机号是否一致
if (!(user.getId().equalsIgnoreCase(id) && user.getPhone().equals(phone))) {
System.out.println("身份证号码或手机号有误,不能修改密码");
return;
}
while (true) {
System.out.print("请输入密码:");
String newPassword = sc.next();
boolean result = checkPassword(newPassword);
if (!result) {
System.out.println("密码长度有误,请重新输入");
continue;
}
System.out.print("请再次输入密码:");
String againPassword = sc.next();
if (!againPassword.equals(newPassword)) {
System.out.println("密码输入错误,请重试");
continue;
} else {
user.setPassword(newPassword);
System.out.println("修改密码成功");
break;
}
}
}
private static int getIndex(ArrayList<User> list, String name) {
for (int i = 0; i < list.size(); i++) {
User user = list.get(i);
if (user.getName().equals(name)) {
return i;
}
}
return -1;
}
}