Java_题目_学生管理系统_注册登录忘记密码

news/2024/10/30 23:23:15/

学生管理系统升级版

Java_题目_学生管理系统_业务分析并搭建主菜单_查询添加删除修改

需求:

​ 为学生管理系统书写一个登陆、注册、忘记密码的功能。

​ 只有用户登录成功之后,才能进入到学生管理系统中进行增删改查操作。

分析:

登录界面:

System.out.println("欢迎来到学生管理系统");
System.out.println("请选择操作1登录 2注册 3忘记密码");

用户类:

​ 属性:用户名、密码、身份证号码、手机号码

登录注册业务分析:
switch(choose){
​ case 1 登录
​ case 2 注册
​ case 3 忘记密码
​ default 没有这个选项
}

注册功能:

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

​ 验证要求:

​ 用户名唯一

​ 用户名长度必须在3~15位之间

​ 只能是字母加数字的组合,但是不能是纯数字

用户名要求分析:
1)Scanner键盘录入用户名username
2)在list集合中判断是否存在contains/getIndex
3)长度必须在3~15之间。可以用字符串的length()
4)先循环获取username里面每一个字符
如果有一个字符不在’a’~‘z’ ‘A’~‘Z’ ‘0’~‘9’,那么当前用户名不符合条件
统计一下用户名username当中有多少个字符在a-z A-Z
判断个数,只要大于等于0才是满足要求的用户名

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

1)利用Scanner第一次输入密码
2)利用Scanner第二次输入密码
3)两次一致则符合要求

​ 3,身份证号码需要验证。

​ 验证要求:

​ 长度为18位

​ 不能以0为开头

​ 前17位,必须都是数字

​ 最为一位可以是数字,也可以是大写X或小写x

1)键盘录入身份证号码
2)调用字符串里面的length()方法获取长度,只有为18的时候才满足
3)调用 charAt(0)获取第一个字符,与’0’比较
4)遍历前17位,如果有一个不在’0’~‘9’范围当中,则不符合
5)获取最后一个字符,如果这个字符在’0’~'9’之间或者’X’或’x’则符合条件

​ 4,手机号验证。

​ 验证要求:

​ 长度为11位

​ 不能以0为开头

​ 必须都是数字

1)键盘录入手机号码
2)调用字符串里面的length()方法获取长度
3)可以调用charAt(0),跟’0’进行比较
4)遍历手机号码,如果有一个字符不在’0’~'9’之间则不符合

User u =new User (username, password, personid, phoneNumber);
list.add(u);

登录功能:

​ 1,键盘录入用户名

​ 2,键盘录入密码

​ 3,键盘录入验证码

验证要求:

​ 用户名如果未注册,直接结束方法,并提示:用户名未注册,请先注册

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

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

1)键盘录入用户名
2)键盘录入密码
3)获取一个验证码
4)键盘录入验证码

验证:
1)先判断用户名是否存在,如果不存在直接提示未注册
2)用户名存在,则判断密码和验证码是否正确
如果正确,登录成功;如果错误,会有三次机会

忘记密码:

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

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

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

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

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

1)键盘录入用户名,判断是否存在,不存在直接提示未注册
2)当代码执行到第二步,表示用户名是存在的
此时才键盘录入身份证号和手机号
3)判断身份证号和手机号是否正确
如果错误,则修改失败;如果正确,让用户继续键盘输入密码,提示修改成功

验证码规则:

​ 长度为5

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

​ 数字可以出现在任意位置

比如:

​ aQa1K

代码

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;}
}
import java.util.ArrayList;
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.忘记密码");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("没有这个选项");}}}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();//比较用户对象中的手机号码和身份证号码是否相同//需要把用户对象通过索引先获取出来int index = findIndex(list, username);User user = list.get(index);//比较用户对象中的手机号码和身份证号码是否相同//★★★身份证号码最后一位可能是x,所以忽略大小写//★★★取反比较,增强代码阅读性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;}private static void register(ArrayList<User> list) {//1.键盘录入用户名Scanner sc = new Scanner(System.in);String username;while (true) {System.out.println("请输入用户名");username = sc.next();//开发细节:先验证格式是否正确,再验证是否唯一//因为存储在数据库中,如果要校验,需要使用到网络资源boolean flagCheckUsername = checkUsername(username);if (!flagCheckUsername) {System.out.println("用户名格式不满足条件,需要重新输入");continue;}//校验用户名唯一//username到集合中判断是否有存在boolean flagContainsUsername = contains(list, username);if (flagContainsUsername) {//用户名已存在,当前用户名无法注册,需要重新输入System.out.println("用户名" + username + "已存在,请重新输入");} else {//不存在,表示当前用户名可用,可以继续录入下面的其他数据System.out.println("用户名" + username + "可用");break;}}//2.键盘录入密码//密码键盘输入两次,两次一致才可以注册String password;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.键盘录入身份证号码String personID;while (true) {System.out.println("请输入身份证号码");personID = sc.next();boolean flagCheckPersonID = checkPersonID(personID);if (flagCheckPersonID) {System.out.println("身份证号码满足要求");break;} else {System.out.println("身份证号码格式有误,请重新输入");continue;}}//4.键盘录入手机号码String phoneNumber;while (true) {System.out.println("请输入手机号码");phoneNumber = sc.next();boolean flagCheckPhoneNumber = checkPhoneNumber(phoneNumber);if (flagCheckPhoneNumber) {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++) {User u = list.get(i);System.out.println(u.getUsername() + "," + u.getPassword() + ","+ u.getPersonID() + "," + u.getPhoneNumber());}}private static boolean checkPhoneNumber(String phoneNumber) {//长度为11位if (phoneNumber.length() != 11) {return false;}//不能以0数字开头if (phoneNumber.startsWith("0")) {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数字开头if (personID.startsWith("0")) {return false;}//前17位,必须都是数字for (int i = 0; i < personID.length() - 1; i++) {char c = personID.charAt(i);//如果有一个字符不在0-9之间,返回falseif (!(c >= '0' && c <= '9')) {return false;}}//最后一位可以是数字,也可以是大写X或小写xchar endPersonIDChar = personID.charAt(personID.length() - 1);if ((endPersonIDChar >= '0' && endPersonIDChar <= '9') || (endPersonIDChar == 'x') || (endPersonIDChar == 'X')) {return true;} else {return false;}}private static boolean contains(ArrayList<User> list, String username) {//循环遍历集合得到每一个用户对象//拿着用户对象中的用户名进行比较for (int i = 0; i < list.size(); 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里的每一个字符,如果有一个字符不是字母或者数字,返回falsefor (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++;//★★★当有一个存在,直接退出,提高效率 a123break;}}//★★★如果字母存在,返回truereturn count > 0;}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.startStudentSystem();break;} else {System.out.println("登录失败,用户名或密码错误");if (i == 2) {System.out.println("当前账号" + username + "被锁定,请联系客服:xxx-xxxxx");//当前账号锁定之后,直接结束方法即可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 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.要随机抽取4个字符Random r = new Random();for (int i = 0; i < 4; i++) {//获取随机索引int randomIndex = r.nextInt(list.size());//利用随机索引获取字符//Character是类,char基本数据类型//★★★JDK5.0后,char可以自动包装成Character;Character也可以自动拆包成charchar c = list.get(randomIndex);sb.append(c);}//3.把一个随机数字添加到末尾int number = r.nextInt(10);sb.append(number);//4.修改字符串内容//先把字符串变成字符数组,在数组中修改,然后再创建一个新的字符串】char[] arr = sb.toString().toCharArray();//获取随机索引int randomIndex = r.nextInt(arr.length);//最大索引指向的数字,和随机索引指向的元素交换char temp = arr[arr.length - 1];arr[arr.length - 1] = arr[randomIndex];arr[randomIndex] = temp;return new String(arr);}
}
public class StudentSystem {//★★★修改方法名,启动学生管理系统public static void startStudentSystem() {//public static void main(String[] args) {

控制台

在这里插入图片描述


http://www.ppmy.cn/news/1101.html

相关文章

软件架构模式

如果有兴趣了解更多相关内容&#xff0c;欢迎来我的个人网站看看&#xff1a;瞳孔空间 创建软件系统基本结构的原则称为软件体系结构。软件结构由软件元素及其相互关系组成&#xff0c;这些元素起着蓝图的作用&#xff0c;规划了要执行的任务的模式。软件设计团队极大地依赖于…

【数据结构】二叉树的基本操作与遍历(C语言)

目录 定义 满二叉树 完全二叉树 性质 应用 计算二叉树结点个数 计算叶子结点的个数 第 k 层结点的个数 查找值为x的节点 遍历 前序遍历 中序遍历 后序遍历 层序遍历 判断是否为完全二叉树 定义 &#x1f984;二叉树是由树发展过来的&#xff0c;即度最大为2的树&…

关于举办2022年合作伙伴第一期数字化研发系列高级工程师认证考试的通知

为深入贯彻集团公司“强基固本、守正创新、融合开放”新战略&#xff0c;进一步落实集团数字化转型要求&#xff0c;持续打造数字化人才队伍&#xff0c;根据2022年联通数字化研发系列培训认证工作安排&#xff0c;联通软件研究院拟于12月5日至6日举办合作伙伴第一期数字化研发…

第十四届蓝桥杯模拟赛第二期部分题答案(C++代码)

A题 题面 请找到一个大于 2022 的最小数&#xff0c;这个数转换成二进制之后&#xff0c;最低的 6 个二进制为全为 0 。 请将这个数的十进制形式作为答案提交。 答案&#xff1a;2048 B题 题面 我们计从 1949 年 10 月 1 日至 1949 年 10 月 2 日为经过了 1 天。请问从 1…

Shell脚本流程控制语句CASE详解

本章节继续介绍流程控制语句&#xff0c;在前面的while语句&#xff0c;read语句生成了一些简单的菜单并构建了用户选择处理逻辑。使用了了一系列的if命令来识别可能的菜单选项。这种逻辑经常会出现在程序中&#xff0c;Shell提供了们处理多重选择的流程控制机制。 1.case命令 …

python接口自动化测试框架

本文总结分享介绍接口测试框架开发&#xff0c;环境使用python3selenium3unittestddtrequests测试框架及ddt数据驱动&#xff0c;采用Excel管理测试用例等集成测试数据功能&#xff0c;以及使用HTMLTestRunner来生成测试报告&#xff0c;目前有开源的poman、Jmeter等接口测试工…

[附源码]计算机毕业设计养生药膳推荐系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

redis我记不住的那些命令(五)

背景&#xff1a;我记不住那么多命令&#xff0c;又是Linux命令&#xff0c;又是Git命令&#xff0c;又是kubernetes的命令&#xff0c;又是maven命令&#xff0c;又是redis命令。所谓好记性不如烂笔头&#xff0c;记下来吧。 一、set集合 集合的特点是 无序且各不相同的元素…