先给大家看一看代码的运行结果:
1. 第一步:我们首先要写出学生类,利用面向对象思想,将学生的信息封装成一个类,里面定义好学生的属性,方法等
// 属性:id、姓名、年龄、家庭住址
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;
}
}
2.第二步:当然是要创建User用户类咯,没有用户,我们怎么实现登录,查看学生信息,退出等操作呢
里面的属性有用户名,密码等(你也可以按照自己的需求和想法多封装几个属性或者方法)
public 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;
}
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 getIdNumber() {
return idNumber;
}
public void setIdNumber(String idNumber) {
this.idNumber = idNumber;
}
public String getPhoneNumber() {
return phoneNumber;
}
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
}
3.第三步:我们就要进行当前模块比较核心的逻辑代码了:
实现学生信息的增,删,改,查操作.
首先我们要构建一个大体模型,大家可以思考,要怎么实现用户想选择哪个操作呢?我们需要做的是:
用户选哪个操作,我们就进行哪一个操作的逻辑.所以大家应该明白了. 没错,我们可以利用选择结构,
用户想操作哪个我们就进入那个逻辑代码,并把逻辑代码包装成一个方法,这样会使代码更有阅读性!
需要注意的是,我们可以把用户选择的1,2,3,4赋给对应的常量(用final修饰的)这样也会使得代码更易
读!
剩下每个操作的逻辑我在代码中都有注释,大家仔细看应该就能理解
public class StudentSystem {
//常量:使得代码更易阅读和维护
//静态:因为下面main是静态,只能访问静态;final:不想被别人改写
private static final String ADD_STUDENT = "1";
private static final String DELETE_STUDENT = "2";
private static final String UPDATE_STUDENT = "3";
private static final String QUERY_STUDENT = "4";
private static final String EXIT = "5";
public static void startStudentSystem() {
ArrayList<Student> list = new ArrayList<>();
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("请输入您的选择:");
Scanner sc = new Scanner(System.in);
String choose = sc.next();
switch (choose) {
case ADD_STUDENT -> addStudent(list);
case DELETE_STUDENT -> deleteStudent(list);
case UPDATE_STUDENT -> updateStudent(list);
case QUERY_STUDENT -> queryStudent(list);
case EXIT -> {
System.out.println("退出");
/*System.exit(0);*/ //停止虚拟机运行,即强制停止代码运行
//还可以用loop
break loop;
}
default -> System.out.println("输入错误,请再次输入!");
}
}
}
public static void addStudent(ArrayList<Student> list) {
System.out.println("添加学生");
Scanner sc = new Scanner(System.in);
String id = null;
while (true) {
System.out.println("请输入学生的id:");
id = sc.next();
boolean flag = contains(list, id);
if (flag) {
System.out.println("该id已存在,请重新输入");
} else {
break;
}
}
System.out.println("请输入学生的姓名:");
String name = sc.next();
System.out.println("请输入学生的年龄:");
int age = sc.nextInt();
System.out.println("请输入学生的家庭住址:");
String address = sc.next();
Student student = new Student(id, name, age, address);
list.add(student);
}
public static void deleteStudent(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 == -1) {
System.out.println("id不存在,删除失败!");
return;
}
if (index >= 0) {
list.remove(index);
System.out.println("删除成功!");
}
}
public static void updateStudent(ArrayList<Student> list) {
System.out.println("修改学生");
Scanner sc = new Scanner(System.in);
String id = sc.next();
int index = getIndex(list, id);
if (index == -1) {
System.out.println("id不存在");
return;
}
System.out.println("请输入要修改的学生姓名:");
String newName = sc.next();
System.out.println("请输入要修改的学生年龄:");
int newAge = sc.nextInt();
System.out.println("请输入要修改的学生家庭住址:");
String newAdress = sc.next();
Student student = new Student(id, newName, newAge, newAdress);//将修改的内容放在创建的新对象
list.set(index, student);//将新对象的内容改进去
}
public static void queryStudent(ArrayList<Student> list) {
System.out.println("查询学生");
if (list.size() == 0) {
System.out.println("当前无学生信息,请添加后查询!");
return;
}
System.out.println("id\t\t姓名\t年龄\t家庭住址");
for (int i = 0; i < list.size(); i++) {
Student student = list.get(i);
System.out.println(student.getId() + "\t" + student.getName() + "\t" + student.getAge() + "\t" + student.getAddress());
}
}
public static boolean contains(ArrayList<Student> list, String id) {
for (int i = 0; i < list.size(); i++) {
if (list.get(i).getId().equals(id)) {
return true;
}
}
return false;
}
public static int getIndex(ArrayList<Student> list, String id) {
for (int i = 0; i < list.size(); i++) {
if (list.get(i).getId().equals(id)) {
return i;
}
}
return -1;
}
}
第四步:也是最重要的一步,我们要实现用户注册,登录,忘记密码,退出的操作了.也就是登陆学生管理系统的整体逻辑
每一块代码我都有对应的注释
package com.itheima.studentsystem;
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;
public class App {
//因为静态只能访问静态所以static修饰
static ArrayList<User> list = new ArrayList<>();
//静态代码块:进行初始化,多次调用main方法时,不用多次创建新集合,就不会浪费内存
static{
list.add(new User("张三","123456","001","110"));
}
public static void main(String[] args) {
//ArrayList<User> list = new ArrayList<>();
Scanner sc = new Scanner(System.in);
loop:
while (true) {
System.out.println("-----欢迎来到学生管理系统-----");
System.out.println("请选择操作:1:登录 2:注册 3:忘记密码 4:退出");
String choose = sc.next();
switch (choose) {
case "1" -> login(list);
case "2" -> register(list);
case "3" -> forgetPassword(list);
case "4" -> {
System.out.println("已退出!");
break loop;
}
default -> System.out.println("输入错误!");
}
}
}
private static void login(ArrayList<User> list) {
System.out.println("---注册---");
Scanner sc = new Scanner(System.in);
System.out.println("请输入用户名:");
String username = sc.next();
if (!(contains(list, username))) {
System.out.println("用户名未注册,请先注册!");
return;//直接结束方法
}
System.out.println("请输入密码:");
String password = sc.next();
while (true) {
System.out.println("请输入验证码:");
String right_verification_code = verification_code_generate();
System.out.println(right_verification_code);
String verification_code = sc.next();
boolean flag = verification_code_check(verification_code, right_verification_code);
if (!flag) {
System.out.println("验证码输入错误,请重新输入!");
continue;
} else {
System.out.println("验证码输入正确!");
break;
}
}
//当代码执行到这里,说明用户名存在且验证码正确,判断用户名和密码匹配是否正确
int i = 2;
while (i >= 0) {
//封装思想
User userInfo = new User(username, password, null, null);
if (!(checkPassword(list, userInfo))) {
if (i > 0) {
System.out.println("密码输入错误,你还有" + i + "次机会");
System.out.println("请输入密码:");
password = sc.next();
}
if (i == 0) {
System.out.println("密码输入次数已用完,即将退出页面!");
return;
}
i--;
continue;
} else {
System.out.println("密码正确,登录成功!");
StudentSystem studentSystem = new StudentSystem();
studentSystem.startStudentSystem();
break;
}
}
}
private static void register(ArrayList<User> list) {
System.out.println("---注册---");
Scanner sc = new Scanner(System.in);
String username = null;//先定义,否则出了while下面就用不了
while (true) {
System.out.println("请输入用户名:");
username = sc.next();
if (!(checkUsername(username))) {
System.out.println("用户名格式错误,请重新输入用户名!");
continue;
}
//代码执行到这说明此时格式是正确的,判断唯一性
boolean flag = contains(list, username);
if (flag) {
System.out.println("用户名重复,请重新输入!");
} else {
System.out.println("用户名创建成功!");
break;
}
}
String password = null;
while (true) {
System.out.println("请输入密码:");
password = sc.next();
System.out.println("请再次输入密码:");
String password2 = sc.next();
if (!(password.equals(password2))) {
System.out.println("密码输入错误,请重新输入!");
continue;
} else {
System.out.println("密码创建成功!");
break;
}
}
String idNumber = null;
while (true) {
System.out.println("请输入身份证号码:");
idNumber = sc.next();
if (!(checkIdNumber(idNumber))) {
System.out.println("身份证格式错误,请重新输入!");
continue;
} else {
System.out.println("身份证输入成功!");
break;
}
}
String phoneNumber = null;
while (true) {
System.out.println("请输入手机号码:");
phoneNumber = sc.next();
if (!(checkPhoneNumber(phoneNumber))) {
System.out.println("手机号格式错误,请重新输入!");
continue;
} else {
System.out.println("手机号输入成功");
break;
}
}
//把信息填到对象中
User user = new User(username, password, idNumber, phoneNumber);
//再把对象存入集合中
list.add(user);
System.out.println("注册成功!");
for (int i = 0; i < list.size(); i++) {
User u = list.get(i);
System.out.println(u.getUsername() + " " + u.getIdNumber() + " " + u.getPhoneNumber() + " " + u.getPassword());
}
}
private static void forgetPassword(ArrayList<User> list) {
System.out.println("---忘记密码---");
Scanner sc = new Scanner(System.in);
System.out.println("请输入您的用户名:");
String username = sc.next();
if (!(contains(list, username))){
System.out.println("改用户名不存在");
return;
}
System.out.println("请输入身份证号码");
String idNumber = sc.next();
System.out.println("请输入手机号码:");
String phoneNumber = sc.next();
User userInfo = new User(null,null,idNumber,phoneNumber);
int index = checkUserInfo(list,userInfo);
if(index < 0 ){
System.out.println("账号信息不匹配,修改失败!");
return;
}else{
System.out.println("账号信息匹配成功!");
System.out.println("请输入要修改的密码:");
String newPassword = sc.next();
list.get(index).setPassword(newPassword);
System.out.println("您的新密码已修改为"+newPassword+",即将退出此页面");
}
}
//返回索引才能进行修改
private static int checkUserInfo(ArrayList<User> list, User userInfo) {
for (int i = 0; i < list.size(); i++) {
User rightUserInfo = list.get(i);
if(rightUserInfo.getIdNumber().equals(userInfo.getIdNumber()) && rightUserInfo.getPhoneNumber().equals(userInfo.getPhoneNumber())){
return i;
}
}
return -1;
}
private 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;
}
private static boolean checkUsername(String username) {
int len = username.length();//赋给一个变量,在下面就不用多次调用字符串方法了,代码更简洁
if (len < 3 || len > 15) {
return false;
}
//如果当代码执行到这里,说明上述条件已满足
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;
}
}
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') {
count++;
break;
}
}
return count > 0;
}
private static boolean checkIdNumber(String idNumber) {
int len = idNumber.length();
for (int i = 0; i < idNumber.length(); i++) {
if (len != 18) {
return false;
}
}
if (idNumber.charAt(0) == '0') {
return false;
}
for (int i = 0; i < idNumber.length() - 1; i++) {
char c = idNumber.charAt(i);
if (!(c >= '0' && c <= '9')) {
return false;
}
}
char c = idNumber.charAt(17);
if (!(c == 'x' || c == 'X' || c >= '0' && c <= '9')) {
return false;
}
return true;
}
private static boolean checkPhoneNumber(String phoneNumber) {
if (phoneNumber.length() != 11) {
return false;
}
if (phoneNumber.charAt(0) == '0') {
return false;
}
for (int i = 0; i < phoneNumber.length(); i++) {
char c = phoneNumber.charAt(i);
if (!(c >= '0' && c <= '9')) {
return false;
}
}
return true;
}
private static boolean verification_code_check(String verification_code, String right_verification_code) {
if (verification_code.equalsIgnoreCase(right_verification_code)) {
return true;
} else {
return false;
}
}
private static String verification_code_generate() {
//集合做法
//将大小写字母存到一个集合中
ArrayList<Character> list = new ArrayList<>();
for (int i = 0; i < 26; i++) {
list.add((char) ('A' + i)); //也可以把'A'换成97
list.add((char) ('a' + i));
}
//将集合中抽出4个随机的字母存入一个容器中
StringBuilder sb = new StringBuilder();
Random r = new Random();
for (int i = 0; i < 4; i++) {
int randomIndex = r.nextInt(list.size());
sb.append(list.get(randomIndex));
}
//将随机数字添加到容器末尾
int number = r.nextInt(10);
sb.append(number);
//将容器转化为字符再转为字符数组以便修改内容,不用字符是因为,每个字符不能进行交换
char[] chs = sb.toString().toCharArray();
//只要将最后一位索引(数字)与随机索引交换位置即可
int randomIndex = r.nextInt(chs.length);
char temp = chs[chs.length - 1];
chs[chs.length - 1] = chs[randomIndex];
chs[randomIndex] = temp;
String verification_code = new String(chs);
return verification_code;
//数组做法
/*String verification_code = "";
//将大小写字母存在一个数组中
char[] chs = new char[52];//大写加小写字母52个
for (int i = 0; i < chs.length; i++) {
if (i < 26) {
chs[i] = (char) (97 + i);
} else {
chs[i] = (char) (65 + i - 26);//因为此时i是从26开始的所以要减去26从0开始,也就是65A开始赋值
}
}
Random r = new Random();
for (int i = 0; i < 4; i++) {
//生成随机索引
int randomIndex = r.nextInt(chs.length);
verification_code += chs[randomIndex];
}
//随机生成一位数字
int number = r.nextInt(10);
verification_code += number;
char[] ver = verification_code.toCharArray();
for (int i = 0; i < ver.length; i++) {
int ramdomIndex = r.nextInt(ver.length);
char temp = ver[i];
ver[i] = ver[ramdomIndex];
ver[ramdomIndex] = temp;
}
String verification_code1 = new String(ver);
return verification_code1;*/
}
private static boolean checkPassword(ArrayList<User> list, User userInfo) {
for (int i = 0; i < list.size(); i++) {
User user = list.get(i);
if (user.getUsername().equals(userInfo.getUsername()) && user.getPassword().equals(userInfo.getPassword())) {
return true;
}
}
return false;
}
}
最后,相信大家都看明白了,建议大家可以离开答案自己敲一遍代码哦!!