【学生管理系统升级版】

news2025/4/19 2:41:37

学生管理系统升级版

    • 需求
    • 分析:
      • 注册功能:
      • 登录功能:
      • 验证码规则:
      • 忘记密码:
    • 实操:
      • 系统主页面
      • 注册功能
      • 登录功能
      • 忘记密码
      • 效果演示

请添加图片描述

需求

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

分析:

注册功能:

1,用户名需要满足以下要求:

   用户名唯一
   用户名长度必须在3~15位之间
   只能是字母加数字的组合,但是不能是纯数字

2,密码键盘输入两次,两次一致才可以进行注册

3,身份证号码需要验证

   长度为18位
   不能以0为开头
   前17位,必须都是数字
   最为一位可以是数字,也可以是大写X或小写x

4,手机号验证

   长度为11位
   不能以0为开头
   必须都是数字

登录功能:

1,键盘录入用户名
   用户名如果未注册,直接结束方法,并提示:用户名未注册,请先注册。

2,键盘录入密码

3,键盘录入验证码

   判断验证码是否正确,如不正确,重新输入

   再判断用户名和密码是否正确,有3次机会

验证码规则:

   长度为5

   由4位大写或者小写字母和1位数字组成,同一个字母可重复

   数字可以出现在任意位置

   比如:aB1sa

忘记密码:

   1,键盘录入用户名,判断当前用户名是否存在,如不存在,直接结束方法,并提示:未注册

   2,键盘录入身份证号码和手机号码

   3,判断当前用户的身份证号码和手机号码是否一致

​    如果一致,则提示输入密码,进行修改。

​    如果不一致,则提示:账号信息不匹配,修改失败。

实操:

系统主页面

欢迎来到用户管理系统
1:注册   2:登录   3:忘记密码   4:退出
请选择操作:

通过while循环和switch语句实现

public static void main(String[] args) {
        ArrayList<User> list = new ArrayList<>();
        loop:
        while (true) {
            Scanner sc = new Scanner(System.in);
            System.out.println("欢迎来到用户管理系统");
            System.out.println("1:注册   2:登录   3:忘记密码   4:退出");
            System.out.println("请选择操作:");
            String choice = sc.nextLine();
            switch (choice) {
                case "1"->register(list);
                case "2"->login(list);
                case "3"->forget(list);
                case "4"->{
                    System.out.println("退出");
                    break loop;
                }
                default->{
                    System.out.println("输入错误");
                }
            }
        }
    }

注册功能

  这里需要调用自定义contains方法判断需要注册的用户是否存在,在对录入的username,password,personId,phone,进行根据需求,定义不同的检验方法,最后再将,用户user添加入集合list

   
    //注册
    public static void register(ArrayList<User> list) {
        Scanner scanner = new Scanner(System.in);
        User user = new User();
        //用户名
        while (true) {
            System.out.println("请输入用户名:");
            String username = scanner.nextLine();
            boolean flag = contains(list, username);
            int length = username.length();
            if (flag) {
                System.out.println("用户名已存在,请从新输入用户名");
            } else {
                if (checkUsername(username)) {
                    user.setUsername(username);
                    break;
                } else {
                    System.out.println("用户名不正确,请重新输入");
                }
            }
        }
        //密码
        while (true) {
            System.out.println("请输入密码:");
            String password1 = scanner.nextLine();
            System.out.println("请再次输入密码:");
            String password2 = scanner.nextLine();
            if (password1.equals(password2)) {
                user.setPassword(password1);
                break;
            } else {
                System.out.println("两次密码不一致,请重新输入");
            }
        }
        //身份证号
        while (true) {
            System.out.println("请输入身份证号:");
            String personId = scanner.nextLine();
            int length = personId.length();
            if (checkPersonId(personId)) {
                user.setPersonId(personId);
                break;
            } else {
                System.out.println("身份证号有误,请重新输入");
            }
        }
        //手机号
        while (true) {
            System.out.println("请输入手机号:");
            String phone = scanner.nextLine();
            boolean flag = checkPhone(phone);
            if (flag) {
                user.setPhone(phone);
                break;
            } else System.out.println("手机号长度有误,请重新输入");
        }
        list.add(user);
        System.out.println("注册成功");
    }

  判断用户名是否存在
  contains方法

 //用户名是否存在
    public static boolean contains(ArrayList<User> list, String username) {
        for (int i = 0; i < list.size(); i++) {
            User user = list.get(i);
            if (user.getUsername().equals(username)) {
                return true;
            }
        }
        return false;
    }

  检验用户名是否符合标准

    //判断用户名是否正确
    public static boolean checkUsername(String username) {
        int length = username.length();
        if (length < 3 || length > 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;

    }

  检验身份证号是否符合标准

    //判断身份证号是否正确
    public static boolean checkPersonId(String personId) {
        if ((personId.length() != 18)) {
            return false;hao
        }
        for (int i = 0; i < personId.length() - 1; i++) {
            char c = personId.charAt(i);
            if (!(c >= '0' && c <= '9')) {
                return false;
            }
        }
        if (personId.startsWith("0")) {
            return false;
        }
        char end = personId.charAt(personId.length() - 1);
        if ((end >= '0' && end <= '9') || (end == 'x') || (end == 'X')) {
            return true;
        } else {
            return false;
        }
    }

  检验手机号是否符合标准

    //判断手机号是否正确
    public static boolean checkPhone(String phone) {
        if (phone.length() != 11) {
            return false;
        }
        if (phone.startsWith("0")) {
            return false;
        }
        for (int i = 0; i < phone.length(); i++) {
            char c = phone.charAt(i);
            if (!(c >= '0' && c <= '9')) {
                return false;
            }
        }
        return true;
    }

  🆗,用户注册模块,这就已经完成了。

登录功能

  这里的登陆成功后调用 StudentTest1()进入学生管理系统。
  记得把之前的学生管理系统封装为方法后在调用。
  链接: 学生管理系统

    // 登录
    public static void login(ArrayList<User> list) {
        loop:
        while (true) {
            int count = 0;
            Scanner sc = new Scanner(System.in);
            System.out.println("请输入用户名:");
            String username = sc.nextLine();
            System.out.println("请输入密码:");
            String password = sc.nextLine();
            while (true) {
                String s = yzmcreate();
                System.out.println("验证码为:" + s);
                System.out.println("请输入验证码:");
                String yzm = sc.nextLine();
                if (s.equalsIgnoreCase(yzm)) {
                    for (int i = 0; i < list.size(); i++) {
                        User user = list.get(i);
                        if (username.equalsIgnoreCase(user.getUsername()) && password.equals(user.getPassword())) {
                            System.out.println("登录成功");
                            StudentTest1();
                            break loop;
                        } else {
                            System.out.println("用户名或密码错误,请重新输入,你还剩" + (2 - count) + "次机会");
                            count++;
                        }
                        if (count == 2) {
                            System.out.println("登录失败,请联系管理员");
                            break loop;
                        }
                    }
                } else System.out.println("验证码错误,请重新输入");
            }

        }
    }

  验证码生成

   // 验证码
    public static String yzmcreate() {
        ArrayList<Character> yzm = new ArrayList<>();
        for (int i = 0; i < 26; i++) {
            yzm.add((char) ('a' + i));
            yzm.add((char) ('A' + i));
        }
        char[] yzm1 = new char[10];
        for (int i = 0; i < yzm1.length; i++) {
            yzm1[i] = (char) (i + '0');
        }
        StringBuilder sb = new StringBuilder();
        Random r = new Random();

        for (int i = 0; i < 4; i++) {
            int index = r.nextInt(yzm.size());
            sb.append(yzm.get(index));
        }
        sb.append(yzm1[r.nextInt(10)]);
        char[] chars = sb.toString().toCharArray();
        int index = r.nextInt(chars.length);
        char temp = chars[chars.length - 1];
        chars[chars.length - 1] = chars[index];
        chars[index] = temp;
        return new String(chars);
    }

  🆗,登录功能模块,这就已经完成了。

忘记密码

  利用用户名得到用户名所在集合的索引来进行操作

//    忘记密码
    public static void forget(ArrayList<User> list) {
        while (true) {
            Scanner sc = new Scanner(System.in);
            System.out.println("请输入用户名:");
            String xusername = sc.nextLine();
            if (contains(list, xusername)) {
                System.out.println("请输入注册手机号:");
                String xphone = sc.nextLine();
                System.out.println("请输入注册身份证号:");
                String xpersonId = sc.nextLine();
                User xuser = new User(xusername, "", xpersonId, xphone);
                if (checkUser(list, xuser)) {
                    System.out.println("请输入新密码:");
                    String xpassword = sc.nextLine();
                    int count = index(list,xusername);
                    list.get(count).setPassword(xpassword);
                    System.out.println("修改成功");
                    return;
                } else System.out.println("输入信息与注册不相符,请重新输入");
            } else System.out.println("用户名不存在,请重新输入");
        }

    }

  检验注册时的,手机号与身份证号是否正确

    //判断信息是否正确
    public static boolean checkUser(ArrayList<User> list, User user) {
        for (int i = 0; i < list.size(); i++) {
            User u = list.get(i);
            if (u.getPhone().equals(user.getPhone()) && u.getPersonId().equals(user.getPersonId())) {
                return true;
            }
        }
        return false;
    }

  根据用户名返回索引

 //查找用户索引
    public static int index(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;
    }

  🆗, 忘记密码模块,这就已经完成了。

效果演示

欢迎来到用户管理系统
1:注册   2:登录   3:忘记密码   4:退出
请选择操作:
1
请输入用户名:
zjj123
请输入密码:
123456
请再次输入密码:
123456
请输入身份证号:
123456789012345678
请输入手机号:
12345678900
注册成功
欢迎来到用户管理系统
1:注册   2:登录   3:忘记密码   4:退出
请选择操作:
2
请输入用户名:
zjj123
请输入密码:
123456
验证码为:uc3La
请输入验证码:
uc3la
登录成功
——————————————欢迎使用学生管理系统——————————————
1:添加学生
2:删除学生
3:修改学生
4:查询学生
5:退出系统
请输入您的选择:
5
退出系统
欢迎来到用户管理系统
1:注册   2:登录   3:忘记密码   4:退出
请选择操作:
3
请输入用户名:
zjj123
请输入注册手机号:
12345678900
请输入注册身份证号:
123456789012345678
请输入新密码:
z123456
修改成功
欢迎来到用户管理系统
1:注册   2:登录   3:忘记密码   4:退出
请选择操作:
2
请输入用户名:
zjj123
请输入密码:
z123456
验证码为:x1TUL
请输入验证码:
x1tul
登录成功
——————————————欢迎使用学生管理系统——————————————
1:添加学生
2:删除学生
3:修改学生
4:查询学生
5:退出系统
请输入您的选择:
5
退出系统
欢迎来到用户管理系统
1:注册   2:登录   3:忘记密码   4:退出
请选择操作:
4
退出

Process finished with exit code 0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2332784.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Web3 的云基础设施正在成型,Polkadot 2.0 用三项技术改写“上链成本”

在Web3基础设施内卷加剧的今天&#xff0c;“如何以更低成本、更大灵活性部署一条高性能应用链”正成为开发者们最关心的问题。而刚刚走出“技术慢热”误区的Polkadot&#xff0c;正在用一套名为 Polkadot 2.0 的架构升级方案&#xff0c;重新定义这一问题的解法。 这套升级最…

机器学习——ROC曲线、PR曲线

一、ROC曲线简介 1.1 ROC曲线的构成 1.横轴&#xff08;假正率&#xff0c;FPR&#xff09;&#xff1a; 表示负样本被错误分类为正的比例&#xff08;越小越好&#xff09; 2.纵轴&#xff08;真正率&#xff0c;TPR&#xff0c;即召回率&#xff09;&#xff1a; 表示正样…

我为女儿开发了一个游戏网站

大家好&#xff0c;我是星河。 自从协助妻子为女儿开发了算数射击游戏后&#xff0c;星河就一直有个想法&#xff1a;为女儿打造一个专属的学习游戏网站。之前的射击游戏虽然有趣&#xff0c;但缺乏难度分级&#xff0c;无法根据女儿的学习进度灵活调整。而且&#xff0c;仅仅…

【Spring Cloud Netflix】GateWay服务网关

1.基本概述 GateWay用于在微服务架构中提供统一的入口点&#xff0c;对请求进行路由&#xff0c;过滤和处理。它就像是整个微服务系统的大门&#xff0c;所有外部请求都要通过它才能访问到后端的各个微服务。 2.核心概念 2.1路由(Route) 路由是Spring Cloud gateWay中最基本…

Docker部署Jenkins服务

文章目录 1.下载Jenkins服务2.部署Java21&#xff08;可选&#xff09;2.1 安装Java21 3.Maven3.9.9安装4.启动Jenkins5.初始化Jenkins5.1 入门5.2 安装推荐的插件5.3 创建第一个管理员用户5.4 实例配置5.5 Jenkins已就绪5.6 开始使用Jenkins5.7 重启Jenkins 6.配置Jenkins6.1 …

[ctfshow web入门] web40

信息收集 怎么一下子多这么多过滤啊&#xff0c;我以为跳过了好几题 这又能eval了&#xff0c;但是连$也不能用了 不能用. * ?&#xff0c;所以打不出fla*或者fla?????了 不能用/&#xff0c;构造不出日志注入和伪协议包含 仔细观察&#xff0c;禁的是中文的括号&#x…

蓝桥杯c ++笔记(含算法 贪心+动态规划+dp+进制转化+便利等)

蓝桥杯 #include <iostream> #include <vector> #include <algorithm> #include <string> using namespace std; //常使用的头文件动态规划 小蓝在黑板上连续写下从 11 到 20232023 之间所有的整数&#xff0c;得到了一个数字序列&#xff1a; S12345…

Qt问题之 告别软件因系统默认中文输入法导致错误退出的烦恼

1. 问题 使用Qt进行研发时&#xff0c;遇到一个问题&#xff0c;当在系统默认输入法中文&#xff08;英文输入法或者搜狗就不会触发闪退&#xff09;的情况下&#xff0c;选中QTableWidget控件&#xff08;QTableWidgetItem有焦点&#xff0c;但是不双击&#xff09;&#xff…

AlDente Pro for Mac电脑 充电限制保护工具

AlDente Pro for Mac电脑 充电限制保护工具 一、介绍 AlDente Pro for Mac&#xff0c;是一款充电限制保护工具&#xff0c;是可以限制最大充电百分比来保护电池的工具。锂离子和聚合物电池&#xff08;如 MacBook 中的电池&#xff09;在40&#xff05; 至 80&#xff05; 之…

算法训练之动态规划(一)

♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥ ✨✨✨✨✨✨ 个…

Navicat连接远程PostGreSQL失败

问题描述 使用本地Navicat连接Windows远程服务器上部署的PostGreSQL数据库时,出现以下错误: 解决方案 出现以上报错信息,是因为PostGreSQL数据库服务尚未设置允许客户端建立远程连接。可做如下配置, 1. 找到PostGreSQL数据库安装目录下的data子文件夹,重点关注:postgres…

新一代达梦官方管理工具SQLark:可视化建表操作指南

在数据库管理工作中&#xff0c;新建表是一项基础且频繁的操作。SQLark 的可视化建表功能为我们提供了一种高效、便捷且丝滑流畅的建表新体验。一起来了解下吧。 SQLark 官方下载链接&#xff1a;www.sqlark.com 新建表作为常见的功能&#xff0c;相比其他管理工具&#xff0c;…

什么是EXR透视贴图 ?

EXR透视贴图是一种基于 OpenEXR 格式的高动态范围&#xff08;HDR&#xff09;图像技术&#xff0c;主要用于3D建模、渲染和视觉特效领域。它通过高精度图像数据和透视映射功能&#xff0c;为场景创建逼真的光影效果和空间深度。 技术原理 高动态范围&#xff08;HDR&#xf…

每日一题(小白)数组娱乐篇21

由于题意可知我们是要将对应的数字转换为英文&#xff0c;我们要考虑两点一个是进制的转换&#xff0c;也就是类似于我们的十进制一到9就多一位&#xff0c;这里的进制就是Z进制也就是27进制一旦到26下一位则进位&#xff1b;另一方面要考虑数字的转换也就是1~26对应A~Z。解决上…

LINUX的使用(1)-挂载云硬盘

1.磁盘的挂载&#xff1a; 这个输出是来自 fdisk 或类似的工具&#xff0c;它展示了两块磁盘的分区信息。让我们逐个分析&#xff1a; 第一块磁盘 /dev/sda: 磁盘大小: 53.7 GB (约 53687091200 字节)&#xff0c;总共有 104857600 个扇区。扇区单位: 每个扇区大小为 512 字节…

GPT-4o-image模型:开启AI图片编辑新时代

在生成式AI技术爆发式迭代的今天&#xff0c;智创聚合API率先突破多模态创作边界&#xff0c;正式发布集成GPT-4o-image模型的创作平台&#xff0c;以“文生图-图生图-循环编辑”三位一体的技术矩阵&#xff0c;重新定义数字内容生产流程。生成图像效率较传统工具提升300%&…

使用pip3安装PyTorch与PyG,实现NVIDIA CUDA GPU加速

使用python3的pip3命令安装python依赖库。 # python3 -V Python 3.12.3 # # pip3 -V pip 25.0.1 from /root/.pyenv/versions/3.12.3/lib/python3.12/site-packages/pip (python 3.12)Usage: pip3 install [options] <package> ...pip3 install [options] -r <re…

Rust主流框架性能比拼: Actix vs Axum vs Rocket

本内容是对知名性能评测博主 Anton Putra Actix (Rust) vs Axum (Rust) vs Rocket (Rust): Performance Benchmark in Kubernetes 内容的翻译与整理, 有适当删减, 相关指标和结论以原作为准 在以下中&#xff0c;我们将比较 Rust 生态中最受欢迎的几个框架。我会将三个应用程序…

【QT】QT的消息盒子和对话框(自定义对话框)

QT的消息盒子和对话框&#xff08;自定义对话框&#xff09; 一、消息盒子QMessageBox1、弹出警告盒子示例代码&#xff1a;现象&#xff1a; 2、致命错误盒子示例代码&#xff1a;现象&#xff1a; 3、帮助盒子示例代码&#xff1a;现象&#xff1a; 4、示例代码&#xff1a; …

【结合vue源码,分析vue2及vue3的数据绑定实现原理】

结合vue源码&#xff0c;分析vue2及vue3的数据绑定实现原理 Vue 2 数据绑定实现整体思路详细实现1. Observer 类&#xff1a;数据劫持2. Dep 类&#xff1a;依赖收集3. Watcher 类&#xff1a;订阅者 Vue 3 数据绑定实现整体思路详细实现1. reactive 函数&#xff1a;创建响应式…