Java综合项目(一)之学生管理系统

前言:本次项目是对多天以来Java学习的总结,项目主体包含两部分,分别是学生登录界面以及学生信息管理界面,使用ArrayList集合对数据进行存储。总体包含Student和User两个JavaBean类和两个界面测试类
在这里插入图片描述

一、双界面展示

在这里插入图片描述

在这里插入图片描述

二、JavaBean类

学生类:

  • 成员变量:id、姓名、年龄、家庭住址。
  • 构造方法:无参构造和带四个参数的构造。
  • 成员方法:每个成员变量对应给出get/set方法。
	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;
    }
}

用户类:

  • ​ 属性:用户名、密码、身份证号码、手机号码
  • 构造方法:无参构造和带四个参数的构造。
  • 成员方法:每个成员变量对应给出get/set方法。
	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;
    }
}

三、学生登录界面

需求:

  • 为学生管理系统书写一个登陆、注册、忘记密码的功能。
  • 只有用户登录成功之后,才能进入到学生管理系统中进行增删改查操作。

3.1 main()方法

思路:
 使用sout语句完成对登录界面的构建。
 使用Scanner对象输入操作选项。
 使用switch语句完成操作的选择。
 使用循环反复操作。

public static void main(String[] args) {
        ArrayList<User> list = new ArrayList<>();
        while(true){
            System.out.println("欢迎来到学生管理登录系统");
            System.out.println("请选择1.登录 2.注册 3.忘记密码 4.关闭");
            Scanner sc = new Scanner(System.in);
            String choose = sc.next();
            switch(choose){
                case "1" -> login(list);
                case "2" -> register(list);
                case "3" -> forgetPassword(list);
                case "4" -> {
                    System.out.println("谢谢使用,再见");
                    System.exit(0);
                }
                default -> System.out.println("选项错误,请重新输入");
            }


        }

    }

3.2注册功能register()方法

需求:

  1. 用户名需要满足要求: ​用户名唯一; 用户名长度必须在3~15位之间; ​只能是字母加数字的组合,但是不能是纯数字
  2. ​密码需要满足要求:键盘输入两次,两次一致才可以进行注册。
  3. 身份证号码需要满足要求: 长度为18位 ;不能以0为开头 前17位,必须都是数字; 最为一位可以是数字,也可以是大写X或小写x
  4. 手机号需要满足要求: 长度为11位 ;不能以0为开头 ;必须都是数字

思路:
 创建用户对象和扫描器,用于接收用户输入并存储用户信息
 分步骤验证并获取用户信息:
  验证用户名格式及唯一性,直到输入符合要求
  验证两次输入密码的一致性,直到输入一致
  验证身份证格式,直到输入符合要求
  验证手机号格式,直到输入符合要求
 所有信息验证通过后,提示注册成功
 将新用户添加到用户列表中

 public static void register(ArrayList<User> list){
        User u = new User();
        Scanner sc = new Scanner(System.in);
        //判断用户名
        while (true) {
            System.out.println("请输入用户名");
            String username = sc.next();
            //先判断合法,在判断唯一
            boolean flag = checkUserName(username);
            if(!flag){
                System.out.println("格式不满足条件,请重新输入");
                continue;
            }
            boolean flag2 = contains(list, username);
            if(flag2){
                //用户名已存在,重新输入
                System.out.println("用户名" + username + "已存在,请重新输入");
            }else {
                System.out.println("用户名" + username + "输入成功" );
                u.setUsername(username);
                break;
            }
        }
        //判断密码
        while (true){
            System.out.println("请输入密码");
            String password1 = sc.next();
            System.out.println("请再次输入密码");
            String password2 = sc.next();
            boolean flag = checkPassword(password1,password2);
            if(!flag){
                System.out.println("密码不一致,请重新输入");
            }else {
                u.setPassword(password1);
                System.out.println("密码一致,输入其他数据");
                break;
            }
        }
        //判断身份证
        while (true){
            System.out.println("请输入身份证");
            String personId = sc.next();
            boolean flag = checkPersonId(personId);
            if(flag){
                System.out.println("身份证号码满足要求");
                u.setPersonId(personId);
                break;
            }else {
                System.out.println("身份证格式错误,请重新输入");
            }
        }
        //判断手机号
        while (true){
            System.out.println("请输入手机号");
            String phoneNumber = sc.next();
            boolean flag = checkPhoneNumber(phoneNumber);
            if(flag){
                System.out.println("手机格式正确");
                u.setPhoneNumber(phoneNumber);
                break;
            }else {
                System.out.println("手机号格式错误,请重新输入");
            }
        }

        System.out.println("注册成功!");
        list.add(u);
        //遍历集合
        printList(list);


    }

3.3登录功能login()方法

需求:

  • 键盘录入用户名、密码、验证码
  • ​用户名如果未注册,直接结束方法,并提示:用户名未注册,请先注册
  • ​判断验证码是否正确,如不正确,重新输入
  • ​再判断用户名和密码是否正确,有3次机会

思路:
 最多提供 3 次登录机会,通过 for 循环控制
 每次登录流程:
  输入用户名,检查是否已注册,未注册则直接返回
  输入密码后,生成并验证验证码(忽略大小写),直到输入正确
  将用户名和密码封装成 User 对象,验证与列表中存储的信息是否匹配
 验证通过则提示登录成功,启动学生管理系统
 验证失败则提示错误,若 3 次都失败则锁定账号并返回,否则显示剩余尝试次数

//登录功能
    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();
            //判断用户名是否存在
            boolean flag = contains(list,username);
            if (!flag){
                System.out.println("用户名" + username + "未注册,请先注册再登录");
                return;
            }
            System.out.println("请输入密码");
            String password = sc.next();

            while (true) {
                String rightCode = getCode();
                System.out.println("请输入验证码(" + rightCode + ")");
                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 + "被锁定");
                    return;
                }else{
                    System.out.println("用户名或密码错误,还剩下" + (2-i) + "次机会");
                }
            }
        }
    }

3.4忘记密码功能forgetPassword()方法

需求:

  • 键盘录入用户名,判断当前用户名是否存在,如不存在,直接结束方法,并提示:未注册
  • 键盘录入身份证号码和手机号码
  • 判断当前用户的身份证号码和手机号码是否一致, 如果一致,则提示输入密码,进行修改。 如果不一致,则提示:账号信息不匹配,修改失败。

思路:
 输入用户名,检查是否已注册,未注册则直接返回
 验证身份:输入身份证号和手机号,与该用户注册时的信息比对
 信息验证通过后,进入密码修改流程:
  输入新密码并再次确认
  两次输入一致则更新密码,否则重新输入
 密码修改成功后给出提示

//忘记密码
    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.getPhoneNumber().equals(phoneNumber))){
            System.out.println("身份证或手机输入有误,不能修改");
            return;
        }

        //当代码执行到这里,表示所有的数据全部验证成功,可以修改
        while (true) {
            System.out.println("请输入新的密码");
            String password = sc.next();
            System.out.println("请再次输入新的密码");
            String againPassword = sc.next();
            boolean result = checkPassword(password,againPassword);
            if (result){
                System.out.println("输入一致");
                user.setPassword(password);
                break;
            }else {
                System.out.println("两次密码输入不一致,请重新输入");
                continue;
            }
        }

        System.out.println("密码修改成功");
    }

四、学生管理系统界面

需求:

  • 采取控制台的方式去书写学生管理系统。

4.1 startStudentSystem()方法

思路:
 使用sout语句完成对登录界面的构建。
 使用Scanner对象输入操作选项。
 使用switch语句完成操作的选择。
 使用循环反复操作。

public static void startStudentSystem() {
        ArrayList<Student> list  = new ArrayList<>();
        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 "1" -> addStudent( list);
                case "2" -> deleteStudent(list);
                case "3" -> updateStudent(list);
                case "4" -> queryStudent(list);
                case "5" -> {
                    System.out.println();
                    System.exit(0);
                }
                default -> System.out.println("没有这个选项");
            }
        }
    }

4.2 添加功能:

​ 键盘录入每一个学生信息并添加,需要满足以下要求:

  • id唯一

思路:
 创建学生对象和扫描器,用于存储学生信息和接收输入
 验证并设置学生 ID:
  循环输入 ID,检查是否已存在
  若 ID已存在则提示重新输入,否则设置该 ID 并退出循环
 依次输入并设置学生的姓名、年龄、家庭地址
 将完整的学生对象添加到列表中,提示添加成功

//添加学生
    public static void addStudent(ArrayList<Student> list){
        Scanner sc = new Scanner(System.in);
        Student stu = new Student();
        while (true) {
            System.out.println("请输入id:");
            String id = sc.next();
            boolean flag = contains(list,id);
            if (flag){
                //表示id已经存在,需要重新录入
                System.out.println("id已经存在,请重新录入");
            }else{
                stu.setId(id);
                break;
            }
        }

        System.out.println("请输入姓名");
        String name = sc.next();
        stu.setName(name);
        System.out.println("请输入年龄");
        int age = sc.nextInt();
        stu.setAge(age);
        System.out.println("请输入家庭地址");
        String address = sc.next();
        stu.setAddress(address);
        list.add(stu);
        System.out.println("添加成功");
    }

4.3删除功能:

​ 键盘录入要删除的学生id,需要满足以下要求:

  • id存在删除
  • id不存在,需要提示不存在,并回到初始菜单

思路:
 接收用户输入的要删除的学生 ID
 查询该 ID 在学生列表中的索引位置
根据索引判断操作
  若索引有效(存在该学生),则从列表中删除该学生并提示成功
  若索引无效(不存在该学生),则提示删除失败

//删除学生
    public static void deleteStudent(ArrayList<Student> list){
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入要删除的id");
        String id = sc.next();
        //查询id在集合中的索引
        int index = getIndex(list,id);
        //对id进行判断
        //如果-1,就表示不存在,结束方法,回到初始菜单
        if(index >= 0){
            //如果大于等于0的,表示存在,直接删除
            list.remove(index);
            System.out.println("id为" + id + "的学生删除成功");
        }else{
            System.out.println("id不存在,删除失败");
        }
    }

4.4修改功能:

​ 键盘录入要修改的学生id,需要满足以下要求

  • id存在,继续录入其他信息
  • id不存在,需要提示不存在,并回到初始菜单

思路:
 接收用户输入的要修改的学生 ID
 查询该 ID 在学生列表中的索引位置
 根据索引判断操作:
  若索引无效(不存在该学生),提示修改失败并结束
  若索引有效(存在该学生),则依次输入修改后的姓名、年龄、家庭地址
 创建新学生对象并设置修改后的信息(保持原 ID),替换列表中对应位置的学生信息

//修改学生
    public static void updateStudent(ArrayList<Student> list){
        Student stu = new Student();
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入要修改的id");
        String id = sc.next();
        //查询id在集合中的索引
        int index = getIndex(list,id);
        //对id进行判断
        //如果-1,就表示不存在,结束方法,回到初始菜单
        if(index >= 0){
            //如果大于等于0的,表示存在,修改
            //list.set(index,);

            System.out.println("请输入修改后的姓名");
            String name = sc.next();
            System.out.println("请输入修改后的年龄");
            int age = sc.nextInt();
            System.out.println("请输入修改后的家庭地址");
            String address = sc.next();
            stu.setId(id);
            stu.setName(name);
            stu.setAge(age);
            stu.setAddress(address);
            list.set(index,stu);//Student stu = list.get(index)可直接修改
            System.out.println("id为" + id + "的学生修改成功");
        }else{
            System.out.println("id"+id+"不存在,修改失败");
        }
    }

4.5查询功能:

​ 打印所有的学生信息,需要满足以下要求

  • 如果没有学生信息,提示:当前无学生信息,请添加后再查询
  • 如果有学生信息,需要输出。

思路:
 先检查学生列表是否为空,若为空则提示用户添加后再查询并返回
 若列表有数据,先打印表头(id、姓名、年龄、家庭地址)
 遍历学生列表,依次获取每个学生对象的信息并按格式输出
  完成所有学生信息的展示

//查询学生
    public static void queryStudent(ArrayList<Student> list){
        //没有学生信息时
        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());
        }

    }

五、功能测试

1.登录系统

1.1注册功能

在这里插入图片描述

1.2登录功能

在这里插入图片描述

1.3忘记密码功能

在这里插入图片描述

2.学生信息管理界面

2.1添加功能

在这里插入图片描述

2.2查询功能

在这里插入图片描述

2.3删除功能

在这里插入图片描述

2.4修改功能

在这里插入图片描述

注:为节省篇幅,一些在功能中调用的方法功能未全部列出,如若需要全部源码,请私信。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值