利用JAVA实现学生管理系统

先给大家看一看代码的运行结果:

 

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;
    }

}

 最后,相信大家都看明白了,建议大家可以离开答案自己敲一遍代码哦!!

 

  • 17
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值