学生管理系统升级(登录注册 + 关联学生管理系统)

新增需求

在这里插入图片描述
这是在昨天的基础初代版本上面新增一个登录注册忘记密码的功能

需求分析

注册

在这里插入图片描述

登录

在这里插入图片描述

忘记密码

在这里插入图片描述
user类代码呈现

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

登陆注册页面代码呈现:

package StudentSystem;import com.sun.jdi.DoubleType;import java.text.BreakIterator;
import java.util.ArrayList;
import java.util.List;
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.nextLine();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("没有这个选项");}}}//登录private 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);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.starStudentSystem();break;}else {System.out.println("登录失败,用户名或密码错误");if ( i == 2){System.out.println("当前账号"+username+"已被锁定请联系客服处理");return;}else {System.out.println("用户名或密码错误,还剩下"+(2-i)+"次机会");}}}}private 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;}//注册private static void register(ArrayList<User> list) {//将用户信息添加到集合中//将用户的用户名 密码 身份证号 手机号放入用户对象中//将用户的对象加入到集合中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;}//校验用户名是否唯一//username到用户名中判断是否存在boolean flag2 = contains(list,username);if (flag2) {//用户名已存在,那么当前用户名已存在要重新输入System.out.println("用户名已存在,请重新输入");}else {//不存在,当前用户名可用,可以录入其他数据System.out.println("用户名"+username+"可用");break;}}//2.键盘录入密码//要输入两次,两次一样才可以进行注册while (true) {System.out.println("请输入密码");Password = sc.next();System.out.println("请再次输入密码");String againPassword = sc.next();if (!Password.equals(againPassword)) {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;}}//4.键盘录入手机号码while (true) {System.out.println("请输入手机号码");phoneNumber = sc.next();boolean flag = checkphoneNumber(phoneNumber);if (flag){System.out.println("手机号码格式正确");break;}else {System.out.println("手机号码格式不正确请重新输入");continue;}}//将用户名密码身份证号码手机号码放入用户对象中User u = new User(username,Password,personID,phoneNumber);//将用户对象添加到集合中list.add(u);System.out.println("注册成功");//遍历集合printList(list);}private static void printList(ArrayList<User> list) {for (int i = 0; i < list.size(); i++) {//i表示索引User user = list.get(i);System.out.println(user.getUsername()+" "+user.getPassword()+" "+user.getPersonID()+" "+user.getPhoneNumber());}}private static boolean checkphoneNumber(String phoneNumber) {//长度11位if (phoneNumber.length() != 11){return false;}//不能以0开头boolean flag = phoneNumber.startsWith("0");if (flag){return false;}//必须都是数字for (int i = 0; i < phoneNumber.length(); i++) {char c = phoneNumber.charAt(i);if (!(c >= '0' && c <= '9')){return false;}}//循环结束之后每一个字符都在0-9之间return true;}private static boolean checkpersonID(String personID) {//长度为18if (personID.length() != 18) {return false;}//不能以0开头(0索引不能为0)//char c = personID.charAt(0);boolean flag = personID.startsWith("0");if (flag){return false;}//前17位必须为数字for (int i = 0; i <= personID.length() - 1; i++) {char c = personID.charAt(i);if (!(c >= '0' && c <= '9')) {return false;}}//最后一位可以是数字,也可以是大写x或者小写xchar endChar = personID.charAt(personID.length() - 1);if ((endChar >= '0' && endChar <= '9')||(endChar == 'X')||(endChar == 'x')) {return true;}else {return false;}}private static boolean contains(ArrayList<User> list, String username) {//循环遍历得到每一个对象//username到集合中判断是否存在for (int i = 0; i < list.size(); i++) {//i表示索引User user = list.get(i);String rightUsername = user.getUsername();if (rightUsername.equals(username)){return true;}}//当循环结束集合里面所有的用户都比较完毕,还没有一样的则返回falsereturn false;}private static boolean checkUsername(String username) {//用户名长度3-15位int len = username.length();if (len < 3 || len > 15) {return false;}//当代码执行到这边表示代码长度符合要求//继续校验 只能字母+数字//循环得到username里面的每一个字符for (int i = 0; i < username.length(); i++) {//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++) {//i索引char c = username.charAt(i);if ((c>='a' && c<='z')||(c>='A'&& c<='Z')){count++;break;}return count > 0;}return true;}//生成一个验证码private static String getCode(){//1.创建一个集合添加所有的大写小写字母ArrayList<Character> list = new ArrayList<>();for (int i = 0; i < 26; i++) {list.add((char)('a'+i));list.add((char)('A'+i));}StringBuilder sb = new StringBuilder();//2.随机抽取四个字符Random r = new Random();for (int i = 0; i < 4; i++) {//获取随机索引int index = r.nextInt(list.size());//利用随机的索引获取字符char c = list.get(index);//将随机字符添加到sb中sb.append(c);}//把一个随机数字添加到末尾int number = r.nextInt(10);sb.append(number);//如果要修改字符串的内容需要遍历得到每一个字符数组,再数组中修改,在创建一个新的字符串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);}//忘记密码private 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();//比较身份证和手机  都正确则修改密码//需要将用户对象先获取出来Userint index = findIndex(list,username);User user = list.get(index);//比较用户对象中的手机号码和身份证号码if (!(user.getPersonID().equalsIgnoreCase(personID) && user.getPhoneNumber().equals(phoneNumber))){System.out.println("身份证号码或手机号码输入有误,不能修改密码");return;}//当代码执行到这边,表示输入的数据全部验证成功,直接修改即可String password;while (true) {System.out.println("请输入新的密码");password = sc.next();System.out.println("请再次输入新的密码");String againPassword = sc.next();if (password.equals(againPassword)){System.out.println("两次输入密码一致");break;}else {System.out.println("两次输入的密码不一致,请重新输入");continue;}}//直接修改即可user.setPassword(password);System.out.println("密码修改成功");}private 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;}
}

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

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

相关文章

PHP同城派送多区域运营配送小程序源码

&#x1f69a;&#x1f4a8;「同城派送多区域运营小程序」——让每一份需求快速触达&#xff01;&#x1f308;&#x1f680; &#x1f525; 开篇燃爆&#xff1a;同城生活新风尚&#xff0c;一键速达不是梦&#xff01; Hey小伙伴们&#xff0c;你还在为找不到合适的同城服务…

推荐并整理一波vscode插件(哪些内置了,哪些好用)

文章目录 背景现在还在用的&#xff08;21款&#xff09;Chinese(Simplified)简体中文Chinese LoremLorem ipsumCode Runner&#xff08;很推荐&#xff09;Codeium: AI Coding Autocomplete&#xff08;推荐&#xff09;Draw.io IntegrationESLintHighlight Matching TagJavaS…

甄选范文“论软件系统建模方法及其应用”,软考高级论文,系统架构设计师论文

论文真题 软件系统建模(Software System Modeling)是软件开发中的重要环节,通过构建软件系统模型可以帮助系统开发人员理解系统、抽取业务过程和管理系统的复杂性,也可以方便各类人员之间的交流。软件系统建模是在系统需求分析和系统实现之间架起的一座桥梁,系统开发人员…

【二叉树】OJ题目

&#x1f31f;个人主页&#xff1a;落叶 目录 单值⼆叉树 【单值二叉树】代码 相同的树 【相同二叉树】代码 对称⼆叉树 【对称二叉树】代码 另一颗树的子树 【另一颗树的子树】代码 二叉树的前序遍历 【二叉树前序遍历】代码 二叉树的中序遍历 【二叉树中序遍历】…

NVIDIA将在Hot Chips 2024会议上展示Blackwell服务器装置

NVIDIA 将在 Hot Chips 2024 上展示其 Blackwell 技术堆栈&#xff0c;并在本周末和下周的主要活动中进行会前演示。对于 NVIDIA 发烧友来说&#xff0c;这是一个激动人心的时刻&#xff0c;他们将深入了解NVIDIA的一些最新技术。然而&#xff0c;Blackwell GPU 的潜在延迟可能…

【freeDiameter】服务端和客户端的连接流程

连接流程详解 进程启动时&#xff0c;先使用main_cmdline解析命令行参数&#xff0c;比如使用-c就会使用指定路径的配置文件&#xff0c;使用-d就会启用后台进程。 之后使用fd_core_initialize初始化核心库。具体会先使用fd_conf_init初始化配置&#xff0c;比如设置各项的默…

最长的一帧学习 part3

文章目录 八、osgUtil:: SceneView::cull ()part1 初始化必要的SceneView类成员变量part2 立体显示的处理part3 执行SceneView::cullStage函数&#xff0c;它也是场景视图筛选工作的核心函数part3.1 首先统计场景中的遮挡节点&#xff08;OccluderNode&#xff09;&#xff0c;…

缺失ffmpeg.dll要用什么修复方法?快速恢复丢失的ffmpeg.dll文件

多媒体软件用户常常会遭遇一个提示&#xff1a;系统无法找到ffmpeg.dll文件。这类情况经常在启动视频编辑软件、流媒体播放应用或其他音视频处理工具时出现&#xff0c;导致相关程序无法正确加载和执行。ffmpeg.dll是一种关键的动态链接库文件&#xff0c;负责处理复杂的视频和…

ssrf+redis未授权访问漏洞复现

ssrfredis未授权访问漏洞复现 一&#xff0c;pikachu靶场练习 docker拉取环境&#xff1a; docker run -d -p 8765:80 8023/pikachu-expect:latest国内很多加速源都用不成&#xff0c;配置代理拉取即可&#xff0c;配置方式如下&#xff1a; 1&#xff0c;新建目录 mkdir -…

数据结构与算法的代码实现(C++版)

数据结构与算法的代码实现&#xff08;C版&#xff09; 1. 线性表的顺序表示和实现1.1 线性表的初始化1.2 线性表的销毁1.3 线性表的清空1.4 线性表的长度1.5 判断线性表是否为空1.6 线性表的线性表取值1.7 线性表的顺序查找1.8 线性表的插入1.9 线性表的删除总结 2. 线性表的链…

JavaScript ES6+ 新特性

JavaScript ES6 新特性 引言 随着前端技术的不断发展&#xff0c;JavaScript 语言也在不断演进。自 ES6&#xff08;ES2015&#xff09;发布以来&#xff0c;JavaScript 引入了许多新的特性和语法&#xff0c;极大地提升了开发者的编程体验和代码的可维护性。本篇文章将详细探…

真话有危险,测评需谨慎!一个家最大的内耗:谁都在抱怨,没人肯改变——早读(逆天打工人爬取热门微信文章解读)

现在都这么完了吗&#xff1f; 引言Python 代码第一篇 洞见 一个家最大的内耗&#xff1a;谁都在抱怨&#xff0c;没人肯改变第二篇 故事风云录结尾 引言 慢慢调整时间 一是现在有点忙 做那个传播声音的研究实验实在是有点没有头绪 没有头绪的事情你就不知道怎么安排时间 也就…

数学建模比赛(国赛)水奖攻略

之前很多同学私聊问我&#xff0c;学校要求参加数模比赛&#xff0c;但是不擅长建模编程&#xff0c;但又不想浪费这个时间该怎么办呢&#xff0c;今天就来给大家讲一下大家都非常感兴趣的内容——数学建模水奖攻略。分享一下博主直接参加比赛时候的经验。 一、选题技巧 有一句…

HarmonyOs如何获取rawfile目录下的所有文件列表

最近在做一个功能&#xff0c;需要使用获取rawfile下目录的所有文件 参考连接为&#xff1a; zRawfile-模块-C API-Localization Kit&#xff08;本地化开发服务&#xff09;-应用框架 - 华为HarmonyOS开发者 (huawei.com) 需要使用到native实现&#xff0c;实现步骤&#…

2008-2020年 中国健康与养老追踪调查CHARLS数据合集

中国健康与养老追踪调查&#xff08;China Health and Retirement Longitudinal Study, CHARLS&#xff09;是一项由北京大学国家发展研究院主持的大型跨学科调查项目。该项目始于2011年&#xff0c;每两到三年对样本进行一次追踪调查&#xff0c;旨在收集代表中国45岁及以上中…

面试经典算法150题系列-反转字符串中的单词

反转字符串中的单词 给你一个字符串 s &#xff0c;请你反转字符串中 单词 的顺序。 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。 返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。 注意&#xff1a;输入字符串 s中可能…

关于告警,要想做好,从这些方面着手

各类监控系统都会产生告警事件&#xff0c;于是&#xff0c;就产生了 FlashDuty、PagerDuty、Opsgenie 这类产品&#xff0c;做告警事件的收敛降噪、排班认领升级等。如果你想增强自己公司的告警事件处理能力&#xff0c;参考&#xff08;chao xi&#xff09;这些产品的功能就可…

使用统计方法在AMD GPU上使用JAX Profiler可靠地比较大型生成AI模型中的算法性能

Using statistical methods to reliably compare algorithm performance in large generative AI models with JAX Profiler on AMD GPUs — ROCm Blogs 摘要 本文提供了一份详细的指南&#xff0c;介绍如何在JAX实现的生成AI模型中测量和比较各种算法的性能。利用JAX Profiler…

35岁程序员的4条出路!请提早布局!

小编准备入门了Python入门学习籽料80个Python爬虫实战入门实例 点击 领取&#xff08;无偿获得&#xff09; 20多岁&#xff0c;初入职场&#xff0c;满腔热血&#xff0c;对未来充满憧憬&#xff1b; 30多岁&#xff0c;家庭事业双重压力&#xff0c;开始迷茫&#xff0c;对…

阿里云发送短信功能(Java)

&#xff08;1&#xff09;注册用户&#xff0c;并且开通短信套餐 &#xff08;2&#xff09; 点击快速学习&#xff0c;然后绑定测试的手机号码。 选用专用测试签名&#xff08;自定义的话阿里可能会验证什么什么的比较麻烦&#xff09; 然后在选取调用API &#xff08;3&…