为了学生管理系统书写一个登录、注册、忘记密码的功能。
只有用户登录成功之后,才能进入学生管理系统中进行增删查改操作。
System.out.println("欢迎来到学生成长管理系统");
System.out.println("请选择操作1登录 2注册 3忘记密码");
属性:用户名、密码、身份证号码、手机号码
用户名需求满足以下要求:
验证要求:
用户名唯一
用户名长度必须在3~15位之间
只能是字母加数字的组合,但是不能是纯数字
密码键盘输入两次,两次一致才可以进行注册
身份证号码需要验证。
验证要求
长度为18位
不能以0为开头
前17位,必须都是数字
最为一位可以是数字,也可以是大写X或小写x
手机号验证
验证要求:
长度为11位
不能以0为开头
必须都是数字
键盘录入用户名
键盘录入密码
键盘录入验证码
验证要求:
用户名如果未注册,直接结束方法,并提示:用户名未注册,请先注册
判断验证码是否正确,如不正确,重新输入
再判断用户名和密码是否正确,有3次机会
键盘录入用户名,判断当前用户名是否存在,如不存在,直接结束方法,并提示:未注册
键盘录入身份证号码和手机号码
判断当前用户的身份证号码和手机号码是否一致,
如果一致,则提示输入密码,进行修改。
如果不一致,则提示:账号信息不匹配,修改失败。
长度为5
由4位大写或者小写字母和1位数字组成,同一个字母可重复
数字可以出现在任意位置,比如:aQa1K
首先我们要创建菜单目录,跟上一个简易版的学生成长管理系统一样,提示用户对操作进行选择。
package com.it.upgradesystem;
import java.util.ArrayList;
import java.util.Scanner;
public class AppTest {
public static void main(String[] args) {
ArrayList<App> list = new ArrayList<>();
//先创建一个菜单目录,登入界面
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("-----欢迎来到学生成长管理系统-----");
System.out.println("请选择操作 1登录 2注册 3忘记密码 4退出");
int choice = sc.nextInt();
switch (choice) {
case 1 -> login(list);
case 2 -> register(list);
case 3 -> forgetPassword(list);
case 4 ->{
System.out.println("退出");
System.exit(0);
}
default -> System.out.println("没有这个选项,请重新输入");
}
}
}
public static void login(ArrayList<App> list) {
System.out.println("登录");
}
public static void register(ArrayList<App> list) {
System.out.println("注册");
}
public static void forgetPassword(ArrayList<App> list) {
System.out.println("忘记密码");
}
}
我们定义了一个简单的Java Bean类,用于封装用户的基本信息(用户名、密码、身份证号码和电话号码)。
package com.it.upgradesystem;
public class App {
private String uname;
private String password;
private String idCardNumber;
private String phoneNumber;
public App() {
}
public App(String uname, String password, String idCardNumber, String phoneNumber) {
this.uname = uname;
this.password = password;
this.idCardNumber = idCardNumber;
this.phoneNumber = phoneNumber;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getIdCardNumber() {
return idCardNumber;
}
public void setIdCardNumber(String idCardNumber) {
this.idCardNumber = idCardNumber;
}
public String getPhoneNumber() {
return phoneNumber;
}
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
}
前期工作完成了,然后我们就要开始分析如何实现这三个操作,首先我们要搞清楚,它们执行的先后顺序,先注册,再登录,最后忘记密码,可以很好的理解,有了帐号才能登录。
用户名需求满足以下要求:
验证要求:
用户名唯一
用户名长度必须在3~15位之间
只能是字母加数字的组合,但是不能是纯数字
密码键盘输入两次,两次一致才可以进行注册
身份证号码需要验证。
验证要求
长度为18位
不能以0为开头
前17位,必须都是数字
最为一位可以是数字,也可以是大写X或小写x
手机号验证
验证要求:
长度为11位
不能以0为开头
必须都是数字
我们现在来分析每一步要用到的方法:
Scanner键盘录入用户名username
1.先到list集合中判断是否存在contain/getindex
2.长度必须为3~15之间,可以用字符串length()
3.先循环获取username里面的每一个字符,如果有一个字符不在26个大小写字母,0~9数字中,那么就不满足条件,用统计的办法,统计有多少个字符在26个大小写字母中,大于等于0才是满足要求的用户。
代码演示如下:
首先判断输入用户名的格式是否正确,再判断其唯一性,如果不满足条件,则重新输入。
//1.键盘录入用户名
Scanner sc = new Scanner(System.in);
String username;
while (true) {
System.out.println("请输入用户名:");
username = sc.nextLine();
//判断输入的用户名格式是否正确
boolean flag1 = checkUserName(username);
if (!flag1) {
System.out.println("当前用户名不满足格式,请重新输入");
continue;
}
//判断用户名的唯一性
boolean flag2 = contains(list, username);
if (flag2) {
System.out.println("当前用户已经存在,请重新注册");
} else {
System.out.println("用户" + username + "可用");
break;
}
}
判断用户名格式是否正确方法:
public static boolean checkUserName(String username) {
//判断用户名的格式是否正确
int len = username.length();
if(len<3 || len>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;
}
}
//计数器计算有多少个字符在'a'~'z','A'~'Z'中
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++;
//a123当第一个已经判断为字母了,就不用再继续执行了
break;
}
}
return count > 0;
}
判断用户名的唯一性
public static boolean contains(ArrayList<App> list, String username) {
//判断用户的唯一性
//循环遍历集合得到每一个用户对象
//拿着用户对象中的用户名进行比较
for (int i = 0; i < list.size(); i++) {
App user = list.get(i);
String rightusername = user.getUname();
if(rightusername.equals(username)) {
return true;
}
}
return false;
}
接下来我们要陆续地输入密码,身份证号码,手机号码。
利用Scanner第一次输入密码
利用Scanner第二次输入密码
只有两次密码一致,才是符合要求的,否则不符合
//2.键盘输入密码
String password;
while (true) {
System.out.println("请输入您要注册的密码");
password = sc.nextLine();
System.out.println("请再次输入您要注册的密码");
String againPassword = sc.nextLine();
if (!(password.equals(againPassword))) {
System.out.println("密码不一致,请重新输入");
continue;
} else {
System.out.println("密码一致,继续录入其他信息");
break;
}
}
键盘录入身份证号码
调用字符串里面的length()方法获取长度,只有为18的时候才满足。
可以调用charAt(0)获取第一个字符,跟‘0’进行对比。
遍历前17位,如果有一个不在0~9的范围内,那么就是不符合的
获取最后一个字符,如果这个字符在0~9之间或者为‘x’,’X’那么就满足。
代码如下:
//键盘输入身份证号码
String personID;
while(true) {
System.out.println("请输入身份证号码:");
personID = sc.nextLine();
boolean flag = checkPersonID(personID);
if (flag) {
System.out.println("身份证号码输入成功,请继续其他操作");
break;
} else {
System.out.println("身份证号码输入有误,请重新输入");
continue;
}
}
判断身份证号的方法
public static boolean checkPersonID(String personID) {
//长度为18才满足
if(!(personID.length() == 18)){
return false;
}
//身份证号码第一位不能为‘0’
if(personID.charAt(0) == '0'){
return false;
}
//前17位必须为数字
for (int i = 0; i < personID.length()-1; i++) {
char c1 = personID.charAt(i);
if(!(c1 >='0' && c1<='9')){
return false;
}
}
//最后一个字符,判断是否再0~9之间还是为‘x''X',满足则符合要求
char endChar = personID.charAt(personID.length()-1);
if((endChar >= '0' && endChar <= '9') || (endChar == 'X') || (endChar == 'x')){
return true;
}else{
return false;
}
}
键盘录入手机号码
调用字符串里面的length()方法获取长度
可以调用charAt(0)获取第一个字符,跟‘0’进行对比。
遍历手机号码,如果一个字符不在0~9那么就是不行的
代码如下:
//键盘录入手机号码
String phoneNumber;
while(true) {
System.out.println("请输入手机号码");
phoneNumber = sc.nextLine();
boolean flag = checkPhoneNumber(phoneNumber);
if (flag) {
System.out.println("手机号输入成功");
break;
} else {
System.out.println("手机号输入有误,请重新输入");
continue;
}
}
System.out.println("注册成功");
App u = new App(username, password, personID, phoneNumber);
list.add(u);
}
判断手机号的方法
public static boolean checkPhoneNumber(String phoneNumber) {
//长度为11
if(phoneNumber.length() != 11){
return false;
}
//不能以0为开头
if(phoneNumber.charAt(0) == '0'){
return false;
}
//必须都是数字
for (int i = 0; i < phoneNumber.length(); i++) {
char c = phoneNumber.charAt(i);
if(!(c>='0' && c<='9')){
return false;
}
}
return true;
}
当我们输入完手机号码时,注册操作就已经完成了,我们将输入的数据存入集合当中,这样我们就完成了一个对象的注册。
我们可以创建一个方法来校验注册,就是循环打印集合里的对象。
//校验
printlist(list);
方法:
public static void printlist(ArrayList<App> list) {
for (int i = 0; i < list.size(); i++) {
App user = list.get(i);
System.out.println(user.getUname()+","+user.getPassword()+","
+user.getIdCardNumber()+","+user.getPhoneNumber());
}
}
要求:
//System.out.println("登录");
Scanner sc = new Scanner(System.in);
System.out.println("请输入用户名:");
String username = sc.nextLine();
boolean flag = contains(list, username);
if (!flag) {
System.out.println("该用户名未注册,请先注册再登录");
return;
}
System.out.println("请输入密码");
String password = sc.nextLine();
调用方法判断输入的用户名是否存在
System.out.println("请输入密码");
String password = sc.nextLine();
获取一个验证码
验证码的要求:
长度为5
由4位大写或者小写字母和1位数字组成,同一个字母可重复
数字可以出现在任意位置,比如:aQa1K
键盘录入验证码:
//验证码的判断
while(true) {
String rightCode = getCode();
System.out.println("当前验证码为:" + rightCode);
System.out.println("请输入当前验证码:");
String code = sc.nextLine();
if (code.equalsIgnoreCase(rightCode)) {
System.out.println("验证码输入正确");
break;
} else {
System.out.println("验证码输入错误,请重新输入");
continue;
}
}
随机生成验证码的方法:
public static String getCode(){
//先创建一个集合,将52个字母存入
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();
//随机抽取四个字符
Random r = new Random();
for (int i = 0; i < 4; i++) {
//获取索引
int index = r.nextInt(list.size());
//利用随机索引获取字符,并添加到StringBuilder类中
sb.append(list.get(index));
}
//将一个随机数字添加到末尾
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);
}
验证:
判断用户名是否存在,如果不存在,直接提示未注册
既然用户名存在,那么就判断密码和验证码是否正确。
如果正确,登陆成功
如果错误,会有三次机会
将整个登录操作中嵌入一个for循环,3次输入机会
//验证用户名和密码是否正确
//集合中是否包含用户名和密码
//定义一个方法来同时验证用户名和密码
//封装思想的应用
//将零散的数据进行封装,为一个对象
//之后传递一个整体就可以了
App useInfo = new App(username, password, null, null);
boolean result = checkUserInfo(list, useInfo);
if (result) {
System.out.println("登录成功,可以使用学生成长管理系统了");
break;
} else {
System.out.println("登录失败,用户名或密码错误");
if(i == 2){
System.out.println("当前帐号"+username+"已被锁住,请联系有关人员");
}else{
System.out.println("登录失败,用户名或密码错误。您还剩"+(2-i)+"次机会");
}
}
判断方法:
public static boolean checkUserInfo(ArrayList<App> list, App useInfo) {
//遍历集合,判断用户名和密码是否存在,如果存在则登录成功,不存在则登录失败
for (int i = 0; i < list.size(); i++) {
App user = list.get(i);
if((user.getUname().equals(useInfo.getUname())) && (user.getPassword().equals(useInfo.getPassword()))) {
return true;
}
}
return false;
}
检验用户名是否存在:
Scanner sc = new Scanner(System.in);
System.out.println("请输入用户名:");
String username = sc.nextLine();
boolean flag = contains(list,username);
if (!flag) {
System.out.println("用户名"+username+"未注册");
return;
}
键盘录入身份证号码和手机号码,并验证两个是否正确
//键盘录入身份证号码和手机号码
System.out.println("请输入身份证号码:");
String PersonID = sc.nextLine();
System.out.println("请输入手机号码:");
String PhoneNumber = sc.nextLine();
//要判断身份证号码和手机号码是否正确
//就要获取集合里用户的与之做对比
int index = getIndex(list, username);
App user = list.get(index);
if(!(user.getPhoneNumber().equalsIgnoreCase(PhoneNumber)) && (user.getIdCardNumber().equalsIgnoreCase(PersonID))) {
System.out.println("身份证号码或手机号码有误,不能修改密码");
return;
}
获取索引用到的方法:
public static int getIndex(ArrayList<App> list,String username) {
//获取索引
for (int i = 0; i < list.size(); i++) {
App user = list.get(i);
if(user.getUname().equals(username)){
return i;
}
}
return -1;
}
验证完毕,修改密码
String password;
while(true) {
System.out.println("请输入要修改的密码");
password = sc.nextLine();
System.out.println("请再次输入密码");
String againPassword = sc.nextLine();
if (password.equals(againPassword)) {
System.out.println("密码输入一致");
break;
} else {
System.out.println("密码输入有误,请重新输入");
continue;
}
}
//直接修改密码即可
user.setPassword(password);
System.out.println("密码修改成功");
代码输入完毕,说明我们三个操作的代码都写好了,但是我们想要将升级版的和简易版的学生成长管理系统连接起来,那么我们就要再登录完成之后写上链接的代码。
//创建对象调用方法,启动学生成长管理系统
My_StudentSystem ss = new My_StudentSystem();
ss.startMy_StudentSystem();
再将My_StudentSystem测试类的
public static void main(String[] args)
改为
public static void startMy_StudentSystem()
到目前为止,我们学生成长管理系统的升级版本就完成了。