侧边栏壁纸
博主头像
青菜-halo2 博主等级

行动起来,活在当下

  • 累计撰写 74 篇文章
  • 累计创建 6 个标签
  • 累计收到 7 条评论

目 录CONTENT

文章目录

12-学生管理系统升级版

Administrator
2025-10-04 / 0 评论 / 1 点赞 / 28 阅读 / 0 字

12-学生管理系统升级版

## 学生管理系统升级版

### 需求:

​	为学生管理系统书写一个登陆、注册、忘记密码的功能。

​	只有用户登录成功之后,才能进入到学生管理系统中进行增删改查操作。

### 分析:

#### 登录界面:

```java
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

12.1 分析

1.登录注册业务分析

1.登录注册业务分析.png

2.注册业务分析

2.注册业务分析.png

3.登录业务分析

3.登录业务分析.png4.修改密码业务分析

4.修改密码业务分析.png

12.2 实现代码

User.java

package com.yq.studentsystem;
​
public class User {
    private String username;
    private String password;
    private String personid;
    private String phoneNumber;
​
    public User() {
    }
​
    public User(String username, String password, String personid, String phoneNumber) {
        this.username = username;
        this.password = password;
        this.personid = personid;
        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 getPersonid() {
        return personid;
    }
​
    public void setPersonid(String personid) {
        this.personid = personid;
    }
​
    public String  getPhoneNumber() {
        return phoneNumber;
    }
​
    public void setPhoneNumber(String phoneNumber) {
        this.phoneNumber = phoneNumber;
    }
}
​

Student.java

package com.yq.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;
    }
​
    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

package com.yq.studentsystem;
​
import javax.naming.Name;
import java.util.ArrayList;
import java.util.Scanner;
​
public class StudentSystem {
    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.退出");
​
            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" -> queryStudent(list);
                case "5" -> {
                    System.out.println("退出");
                    //break; //只能跳出单层循环 此处只能跳出switch
                    //break loop;  //方法1 用loop标记
                    System.exit(0);  //方法2 停止虚拟机运行
                }
                default -> System.out.println("没有这个选项");
            }
        }
    }
​
    //添加学生
    public static void addStudent(ArrayList<Student> list){
        //System.out.println("添加学生");
        //利用空参构造学生对象
        Student s = new Student();
        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 {
                s.setId(id);
                break;
            }
        }
​
        System.out.println("输入学生的姓名");
        String name = sc.next();
        s.setName(name);
​
        System.out.println("输入学生的年龄");
        int age = sc.nextInt();
        s.setAge(age);
​
        System.out.println("输入学生的家庭住址");
        String address = sc.next();
        s.setAddress(address);
​
        //将学生对象添加到集合中
        list.add(s);
​
        System.out.println("-----学生信息添加成功-----");
    }
​
    //删除学生
    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 >= 0){
            list.remove(index);
            System.out.println("id为: " + id + "的学生删除成功");
        } else {
            System.out.println("id不存在 删除失败");
        }
    }
​
    //修改学生
    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 address = sc.next();
            s.setAddress(address);
​
​
            System.out.println("-----学生信息修改成功-----");
        } else {
            System.out.println("id不存在 修改失败");
        }
    }
​
    //查询学生
    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 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后进行判断
        //存在 ture ; 不存在 false
        /*for (int i = 0; i < list.size(); i++) {
            Student stu = list.get(i);
            String sid = stu.getId();
            if (sid.equals(id)){
                return  true;
            }
        }
        return false;*/
        return getIndex(list,id) >= 0;
​
    }
​
    //通过id获取索引的方法
    public static int getIndex(ArrayList<Student> list, String id){
        for (int i = 0; i < list.size(); i++) {
            Student stu = list.get(i);  //得到学生对象
            String sid = stu.getId();   //得到学生的id
            if(sid.equals(id)){
                return i;           //判断id是否一样 如果一样,则返回索引
            }
        }
        return -1;
    }
}
​

App.java

package com.yq.studentsystem;
​
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<>();
        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("欢迎来到学生管理系统");
            System.out.println("请选择操作: 1登录 2注册 3忘记密码 4退出");
            String choose = sc.next();
            switch (choose) {
                case "1" -> {
                    login(list);
                    //System.out.println("登录");
                }
                case "2" -> register(list);
                case "3" -> forGetPassword(list);
                case "4" -> {
                    System.out.println("谢谢使用, 再见");
                    System.exit(0);
                }
                default -> System.out.println("没有这个选项, 请重新输入");
            }
        }
​
    }
​
    //修改密码
    public static void forGetPassword(ArrayList<User> list) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入用户名: ");
        String username = sc.next();
        boolean flag = contains(list,username);
        if (!flag) {
            System.out.println("用户" +username+ "不存在,请先注册");
            return;
        }
​
        //键盘录入身份证号、手机号
        System.out.println("请输入身份证号码: ");
        String personID = sc.next();
        System.out.println("请输入手机号: ");
        String phoneNumber = sc.next();
​
        //比较身份证号、手机号
        int index = findIndex(list,username);  //获取用户所在集合中的索引
        User user = list.get(index);
        if (!( user.getPersonid().equalsIgnoreCase(personID) && user.getPersonid().equals(phoneNumber) )) {
            System.out.println("身份证号码或手机号输入有误,不能修改密码");
            return;
        }
​
        String password;
        while (true) {
            System.out.println("请输入新的密码: ");
            password = sc.next();
            System.out.println("请再次输入密码: ");
            String password_again = sc.next();
​
            if (password.equals(password_again)) {
                System.out.println("两次密码输入一致");
                break;
            } else {
                System.out.println("两次密码输入不一致,请重新输入");
                continue;
            }
        }
​
        //修改用户密码
        user.setPassword(password);
        System.out.println("密码修改完毕!!");
​
    }
​
    public static int findIndex(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 void login(ArrayList<User> list) {
        Scanner sc = new Scanner(System.in);
        for (int i = 0; i < 3; i++) {
            System.out.println("请输入用户名: ");
            String username = sc.next();
            if (!contains(list,username)){
                System.out.println("用户名"+ username + "未注册,请先注册再登录");
                return ;
            }
​
            System.out.println("请输入密码: ");
            String password = sc.next();
​
            //校验验证码是否正确
            while (true) {
                String rightCode = getCode();
                System.out.println("当前正确的验证码为: " + rightCode);
                System.out.println("请输入验证码: ");
                String code = sc.next();
                if (code.equalsIgnoreCase(rightCode)){
                    System.out.println("验证码正确");
                    break;
                } else {
                    System.out.println("验证码错误,请重新输入");
                    continue;
                }
            }
​
            //验证用户名密码是否正确
            /* 封装思想的利用:
             *   我们可以将一些零散的数据,封装成一个对象
             * */
            User userInfo = new User(username,password, null, null);
            boolean result = checkUserInfo(list, userInfo);
            if (result) {
                System.out.println("登录成功, 可以开始使用学生管理系统了");
                //创建对象,调用方法,启动学生管理系统
                StudentSystem ss = new StudentSystem();
                ss.startStudentSystem();
                break;
            } else {
                System.out.println("登录失败,用户名或密码错误");
                if (i==2) {
                    System.out.println("当前账户" +username + "被锁定,请联系管理员恢复");
                } else {
                    System.out.println("你还有" + (2 - i ) + "次机会");
                }
            }
        }
​
    }
​
    //定义一个方法,校验用户名密码是否正确
    public static boolean checkUserInfo(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;
​
    }
​
    //生成验证码
    public static String getCode(){
        //1.创建一个集合添加所有的大小写作为元素
        ArrayList<Character> list = new ArrayList<>();
        for (int i = 0; i < 26; i++) {
            list.add((char)('a' + i)); //'a' + 1 = 98 --> char(98) --> b
            list.add((char)('A' + i));
        }
​
        //2.随机抽取四个字符
        StringBuilder sb = new StringBuilder();
        Random r = new Random();
        for (int i = 0; i < 4; i++) {
            int index = r.nextInt(list.size()); //获取一个随机索引
            Character c = list.get(index);  //li以哦那个随机索引,获取到字符
            sb.append(c);   //将字符添加到sb中
        }
​
        //3.将随机数字添加到末尾
        int number = r.nextInt(10);
        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);     //利用arr,new出一个新的字符串,再返回
​
    }
​
    //注册用户
    public static void register(ArrayList<User> list) {
        System.out.println("正在进行用户注册,请完成如下步骤: ");
        Scanner sc = new Scanner(System.in);
        String username;
        String password;
        String personid;
        String phoneNumber;
​
​
        //1.键盘录入用户名
        while (true) {
            System.out.println("请输入用户名: ");
            username = sc.next();
            //先验证格式是否正确,再验证是否唯一(因为在以后所有的数据,都是存在数据库中,如果先校验,需要使用到网络资源)
​
            boolean flag1 = checkUsername(username);
            if (!flag1) {
                System.out.println("用户格式不满足条件, 请重新输入");
                continue;
            }
​
            //校验用户名唯一性
            boolean flag2 = contains(list, username);
            if (flag2) {
                System.out.println("用户名" + username + "已经存在, 请重新输入");
            } else {
                System.out.println("用户名" + username + "可用");
                break;
            }
        }
​
        //2.键盘录入密码
        while (true) {
            System.out.println("请输入要注册的密码: ");
            password = sc.next();
​
            System.out.println("请再次输入要注册的密码: ");
            String password_again = sc.next();
​
            if (!password.equals(password_again)) {
                System.out.println("两次密码输入不一致, 请重新输入");
                continue;
            } else {
                System.out.println("两次密码一致, 继续录入其他数据");
                break;
            }
        }
​
        //3.键盘录入身份证号码
        while (true) {
            System.out.println("请输入身份证号码: ");
            personid = sc.next();
            boolean flag = checkPersonId(personid);
            if(flag) {
                System.out.println("身份证号码满足要求");
                break;
            } else {
                System.out.println("身份证号码格式有误,请重新输入");
                continue;  //此处continue可有可不有,因为执行完毕以后还会进入下一次while循环,没有跳出
            }
        }
​
        //4.键盘录入手机号码
        while (true) {
            System.out.println("请输入手机号码: ");
            phoneNumber = sc.next();
            boolean flag = checkPhoneNumber(phoneNumber);
            if (flag) {
                System.out.println("手机号码格式正确");
                break;
            } else {
                System.out.println("手机号码格式有误,请重新输入");
                continue;  //此处continue可有可不有,因为执行完毕以后还会进入下一次while循环,没有跳出
            }
        }
​
        //将用户名、密码、身份证号码、手机号天机道用户对象中
        User u = new User(username, password, personid, phoneNumber);
        list.add(u);
        System.out.println("注册成功");
​
        //遍历集合
        printList(list);
    }
​
    //遍历集合
    public static void printList(ArrayList<User> list){
        for (int i = 0; i < list.size(); i++) {
            User user = list.get(i);
            System.out.println(user.getUsername()+"," + user.getPassword() +","
                    + user.getPersonid() +","+ user.getPhoneNumber());
        }
    }
​
    //验证用户名唯一性
    public static boolean contains(ArrayList<User> list, String username) {
        return getIndex(list, username) >= 0;
    }
    public static int getIndex(ArrayList<User> list, String username) {
        for (int i = 0; i < list.size(); i++) {
            User u = list.get(i);
            String username_right = u.getUsername();
            if (username_right.equals(username)) {
                return i;
            }
        }
        return -1;
    }
​
    //检查用户名有效性
    public static boolean checkUsername(String username) {
        // 1. 验证长度 //用户长度必须3~15位之间,只能是字母加数字的组合,但不能是纯数字
        int len = username.length();
        if (len < 3 || len > 15) {
            System.out.println("用户名长度不对, 长度必须在 3~15");
            return false;
        }
​
        // 2. 遍历字符串的每个字符,如果有一个字符不是字母或者数字,则返回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;
            }
        }
​
        // 3. 验证至少包含一个字母, 统计字母的个数
        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;  //如果count > 0 表示 return true;  如果count不大于0 表示 return false
    }
​
    //检查身份证有效性
    public static boolean checkPersonId(String personid) {
        //长度为18位
        if (personid == null || personid.length() != 18) {
            System.out.println("身份证号码必须为18位");
            return false;
        }
​
        //不能以0开头
        //
        /*
        if (personid.startsWith("0")) {         //方法一:使用startsWith
            System.out.println("身份证不能以0开头");
            return false;
        } */
        if (personid.charAt(0) == '0') {        //方法二:使用charAt(0)
            System.out.println("身份证不能以0开头");
            return false;
        }
​
        // 验证前17位都是数字
        for (int i = 0; i < personid.length() - 1 ; i++) {
            char c = personid.charAt(i);
            if (c < '0' || c > '9') {
                System.out.println("身份证前17位必须都是数字,第" + (i + 1) + "位 '" + c + "' 非法");
                return false;
            }
        }
​
        // 验证最后一位
        char lastChar = personid.charAt(personid.length() - 1);
        if (lastChar == 'x' || lastChar == 'X' || (lastChar >= '0' && lastChar <= '9')) {
            return true;
        } else {
            System.out.println("身份证最后一位只能是数字或X,当前为: '" + lastChar + "'");
            return false;
        }
​
    }
​
    //检查手机号有效性
    public static boolean checkPhoneNumber(String phone) {
        if (phone == null || phone.length() != 11) {
            System.out.println("手机号必须为11位");
            return false;
        }
        //if (phone.charAt(0) == '0') {
        if (phone.startsWith("0")){
            System.out.println("手机号不能以0开头");
            return false;
        }
        for (int i = 0; i < phone.length(); i++) {
            char c = phone.charAt(i);
            if (c < '0' || c > '9') {
                System.out.println("手机号必须都是数字,第" + (i + 1) + "位 '" + c + "' 非法");
                return false;
            }
        }
        return true;
    }
​
}
​


image-20251004124525172.png

1

评论区