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

新增需求

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

需求分析

注册

在这里插入图片描述

登录

在这里插入图片描述

忘记密码

在这里插入图片描述
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.xdnf.cn/news/1523588.html

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

相关文章

828华为云征文|华为云Flexus X实例docker部署srs6并调优,协议使用webrtc与rtmp

828华为云征文&#xff5c;华为云Flexus X实例docker部署srs6并调优&#xff0c;协议使用webrtc与rtmp 华为云最近正在举办828 B2B企业节&#xff0c;Flexus X实例的促销力度非常大&#xff0c;特别适合那些对算力性能有高要求的小伙伴。如果你有自建MySQL、Redis、Nginx等服务…

KTH5701 系列低功耗、高精度 3D 霍尔传感器

KTH5701 是一款数字输出的 3D 霍尔芯片&#xff0c;内部 分别集成了 X 轴、 Y 轴和 Z 轴三个独立的霍尔传感器。 信号链采用高精度运放通过 16 bit ADC 将模拟信号 转换成数字输出。外部主机可以采用 SPI 或 I2C 两种 模式读出测量数据。此外&#xff0c;在芯片…

2024第三届大学生算法大赛 真题训练一 解题报告 | 珂学家

前言 题解 这是第三届大学生算法大赛(第二届为清华社杯)的赛前练习赛一. 这是上界比赛的体验报告: 2023第二届“清华社杯”大学生算法大赛 解题报告(流水账版) | 珂学家&#xff0c;个人还是非常推荐这个比赛。 难度分布&#xff1a;4 easy/4 mid-hard/2 hard 赛前练习赛一…

Node.js发票查验接口示例、识别查验接口参数返回

财务、审计等经常与发票打交道的人员常常会遇到虚假发票、错票、重复报销等一系列问题。对于会计审计、代理记账、电子商务等发票查验量多的企业来说&#xff0c;成千上万张发票如果仅依赖于人工来进行核验&#xff0c;速度慢效率低&#xff0c;准确率也没保障&#xff0c;因此…

Tomato靶机通关攻略

步骤一&#xff1a;进行端口扫描&#xff0c;找寻靶机地址 步骤二&#xff1a;访问靶机地址 步骤三&#xff1a;利用dirb进行扫描 得出&#xff1a;/antibot_image/进行访问 步骤四&#xff1a;进入antibots->info.php->右击进入页面源代码->发现存在文件包含漏洞 步…

如何让wave波形信号不显示全路径

Modesim仿真如何让wave信号不显示全路径 问题说明 在使用modesim仿真时&#xff0c;需要利用modesim的wave界面显示调试信号的波形&#xff0c;默认情况下wave栏的左边是显示抓捕信号的全路径的&#xff0c;如下图所示: 这种情况下&#xff0c;区分信号比较麻烦&#xff0c;如…

vulhub xxe靶机渗透测试

1.先用kali的nmap扫描端口 2. 找到靶机地址后用工具扫描目录 3.我们先进入robots.txt中 4.访问xxe文件 5.在登陆时抓包 这里可以看到在我们用户名的位置是有回显的&#xff0c;我们可以在这里做文章 6.因为在 linux 系统中/etc/passwd 文件包含有用户账号信息所以我们可以写一…

开源轻量级进程监控工具monit的使用以及monit进程监控工具常用的监控配置案例示例大全

一、开源轻量级进程监控工具monit的应用 今天在服务器杀进程时&#xff0c;发现有一个进程一直在重启&#xff0c;寻找服务器各种定时任务未发现有定时程序&#xff0c;也没有发现supervisord的进程管理服务&#xff0c;后来才发现服务器上启用了monit这个工具&#xff0c;moni…

上证50ETF期权交易策略有哪些?期权交易时要注意什么?

今天带你了解上证50ETF期权交易策略有哪些&#xff1f;期权交易时要注意什么&#xff1f;上证50ETF期权是一种以华夏50etf基金为标的物的金融衍生品&#xff0c;它允许投资者通过买卖期权合约来对冲风险或进行投机。 期权趋势型策略 趋势型的策略就是我们通常说的追涨杀跌&am…

Anaconda最新安装教程

1 概述 1 介绍 Anaconda是一个专注于数据分析的Python发行版本&#xff0c;它为科学计算和数据科学领域提供了强大的支持。Anaconda是一个开源的Python发行版&#xff0c;包含了conda、Python以及超过190个科学包及其依赖项。这些包涵盖了数据分析、机器学习、深度学习等多个…

自己动手写CPU_step5_移动指令

移动操作指令 define EXE_MOVN 6b001011 //不等于0转移 if rt ! 0 then rs -> rd define EXE_MOVZ 6b001010 //等于0转移 if rt 0 then rs -> rd define EXE_MFHI 6b010000 // hi -> rd define EXE_MFLO 6b010010 // lo…

828华为云征文|华为云Flexus X实例docker部署harbor镜像仓库

828华为云征文&#xff5c;华为云Flexus X实例docker部署harbor镜像仓库 华为云最近正在举办828 B2B企业节&#xff0c;Flexus X实例的促销力度非常大&#xff0c;特别适合那些对算力性能有高要求的小伙伴。如果你有自建MySQL、Redis、Nginx等服务的需求&#xff0c;一定不要错…

使用豆包 MarsCode 编程助手,兑换 4090 显卡!

关于豆包 MarsCode 编程助手 豆包 MarsCode 编程助手是一个智能化的编程工具&#xff0c;通过与 AI 的对话&#xff0c;用户可以轻松获取编程建议、解决问题并提高编程效率。无论您是编程新手还是经验丰富的开发者&#xff0c;MarsCode 都能为您提供极具价值的帮助。 点击直达…

查询电脑上已经连接的wifi密码

首先在电脑屏幕的右下角找到自己的wifi图标&#xff0c;右键wifi的图标&#xff0c;点击打开“网络和Internet设置” 进入设置后左侧先点击WLAN&#xff0c;然后在右侧找到并点击网络和共享中心 在网络和共享中心中点击连接后面&#xff0c;WLAN的名称 在WLAN状态中点击无线…

【ruoyi框架】开箱即用的管理系统框架

目录 1.简介 2.快速开始 2.1.仓库 2.2.环境初始化 3.使用介绍 3.1.权限与组件 3.2.开发与测试 1.简介 管理系统是当前软件市场上最常见的软件&#xff0c;管理系统在功能和界面上都有大量通用的点。 功能上通用的点包括但不限于&#xff1a; 角色、权限管理菜单管理鉴…

六西格玛项目:从定义问题到控制成果,全程无忧——张驰咨询

什么是六西格玛项目 六西格玛项目是一种旨在通过改善企业质量流程管理&#xff0c;以“零缺陷”的完美商业追求&#xff0c;带动质量大幅提高、成本大幅度降低&#xff0c;最终实现企业财务成效的提升与企业竞争力的突破的管理策略。它由摩托罗拉公司的工程师比尔史密斯于1986…

【学习AI-相关路程-工具使用-自我学习-jetson收集数据-图片采集-训练前准备-基础样例 (5)】

【学习AI-相关路程-工具使用-自我学习-jetson&模型训练-图片识别-使用模型检测图片-基础样例 &#xff08;5&#xff09;】 1 -前言2 -环境说明3 -先行了解&#xff08;1&#xff09;整理流程了解&#xff08;2&#xff09;了解模型-MobileNet1、MobileNetV2 的主要特性&am…

idea一键自动化部署项目

文章目录 前言一、 IDEA插件安装1. 首先下载 Alibaba Cloud Toolkit 插件2. 插件下载完成后重启IDEA 二、SpringBoot项目准备1. pom.xml 文件2. controller3. 启动类 三、SpringBoot项目jar包部署1. Alibaba Cloud Toolkit 插件服务器配置2. 主机 IP、用户名、密码 点击测试链接…

51单片机.之i2c读写eproom

1、i2c读写eeproom 通过uart发送数据&#xff0c;单片机接收数据后&#xff0c;显示到lcd&#xff0c;并写到eeprom保存。每次开机时&#xff0c;读取eeprom保存的数据&#xff0c;显示到 lcd。 程序框架 1、i2c驱动时序 2、uart中断收发数据 3、eeprom读写驱动 4、lcd驱动 5…

动手学深度学习(pytorch)学习记录19-参数管理[学习记录]

文章目录 参数访问目标参数一次性访问所有参数从嵌套块收集参数 参数初始化内置初始化自定义初始化 参数绑定延后初始化 本节内容&#xff1a; 访问参数&#xff0c;用于调试、诊断和可视化&#xff1b; 参数初始化&#xff1b; 在不同模型组件间共享参数&#xff1b; 延后初始…