1.代码涉及知识点
-
一个标准JavaBean类,一个测试类
-
增强switch
-
集合Arraylist及其常用方法
-
调用方法
-
StringBuilder
类,boolean类,random类,String类
2.项目大纲
需求:
分析:
登录界面
用户类
注册功能
登录功能
忘记密码
验证码规则
3.需求
4.标准的JavaBean类——用户类
-
首先要定义一个User类,在该类中,可以存储学生的属性,也就是基本信息。
-
属性用private修饰符修饰(将数据封装起来,保证数据的安全性和完整性。当一个属性被声明为private时,只有在同一个类中的方法才能直接访问该属性,如果其他类想要访问该属性,只能通过该类提供的公共方法进行访问)
-
构造器用于初始化对象的属性值,Getter方法用于获取对象的属性值,Setter方法用于设置对象的属性值。(Getter和Setter方法是该类提供的公共方法,用于访问私有属性)
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;
}
/**
* 获取
* @return username
*/
public String getUsername() {
return username;
}
/**
* 设置
* @param username
*/
public void setUsername(String username) {
this.username = username;
}
/**
* 获取
* @return password
*/
public String getPassword() {
return password;
}
/**
* 设置
* @param password
*/
public void setPassword(String password) {
this.password = password;
}
/**
* 获取
* @return personID
*/
public String getPersonID() {
return personID;
}
/**
* 设置
* @param personID
*/
public void setPersonID(String personID) {
this.personID = personID;
}
/**
* 获取
* @return phoneNumber
*/
public String getPhoneNumber() {
return phoneNumber;
}
/**
* 设置
* @param phoneNumber
*/
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
public String toString() {
return "User{username = " + username + ", password = " + password + ", personID = " + personID + ", phoneNumber = " + phoneNumber + "}";
}
}
5.登录界面
分析:在主方法中,先打印初始菜单,然后使用switch让用户输入选择。因为用户可能不止使用一次该项目或者不止选择一种功能,故使用while循环。
剖析难点:
1.ArrayList<Student> list = new ArrayList<>();这句代码是用来创建一个名为list的ArrayList对象,可以用来存储多个Student对象。在学生管理系统中,这个ArrayList会被用于存储学生信息,包括学生的ID、姓名、年龄和地址等属性。通过向集合ArrayList中添加、删除、修改和查询学生信息,实现对学生管理系统的各项功能操作。
-
ArrayList<Student>:声明了一个ArrayList对象,其中<Student>表示该ArrayList只能存储Student类型的数据。
-
list:变量名,可以根据需要自行命名。
-
new ArrayList<>():使用new关键字创建一个ArrayList实例,ArrayList<>中的尖括号表示ArrayList中存储的对象类型,这里留空表示不限制类型
2.login,register,forgestPassword皆为方法,分别负责实现注册,登录,忘记密码功能。(如果将代码都写在主函数里,会比较复杂,采用调用函数的方法会好一点)
3..System.exit(0); 停止虚拟机运行(使用break只能跳出switch语句,并不能跳出while循环,而且当用户输入5退出时,就要结束这个程序,所以可以采取使虚拟机停止运行)
4..“->”增强switch。增强的switch具有返回值,整个语句可以作为一个表达式,在不同的情况下返回不同的值,而不再只能是不同情况下执行不同的语句。
public class App {
public static void main(String[] args) {
ArrayList<User> list = new ArrayList<>();
Scanner input = new Scanner(System.in);
while (true) {
System.out.println("欢迎来到学生管理系统");
System.out.println("请选择操作:1.登录 2.注册 3.忘记密码");
String choice= input.next();
switch (choice){
case "1"-> login(list);
case "2"-> register(list);
case "3"-> forgestPassword(list);
case "4"->{
System.out.println("谢谢使用,再见");
System.exit(0);
}
default -> System.out.println("没有这个选项");
}
}
}
6.方法
6.1.注册功能:register方法
剖析知识点
-
boolean类型
boolean类型用于表示逻辑值,它只有两个取值:true和false。boolean类型通常用于控制流程和条件判断,例如在if语句、while循环以及逻辑运算中使用。
private static void register(ArrayList<User> list ){
Scanner input = new Scanner(System.in);
String username ;
while (true) {
System.out.println("请输入用户名");
username= input.next();
//先验证格式是否正确,再验证是否唯一
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;
}
}
String password;
while (true) {
System.out.println("请输入要注册的密码");
password = input.next();
System.out.println("请再次输入要注册的密码");
String passwordConfirm = input.next();
if (!password.equals(passwordConfirm)) {
System.out.println("两次密码输入不一致,请重新输入");
continue;
} else {
System.out.println("两次密码一致,继续录入其他数据");
break;
}
}
String userid;
while (true) {
System.out.println("请输入身份证号码");
userid= input.next();
boolean flag3=checkUesrid(userid);
if(flag3){
System.out.println("身份证号码符合要求");
break;
}else{
System.out.println("身份证号码不符合要求,请重新输入");
}
}
String userphone;
while (true) {
System.out.println("请输入手机号码");
userphone = input.next();
boolean flag4=checkUesrphone(userphone);
if(flag4){
System.out.println("手机号码格式正确");
break;
}else{
System.out.println("手机号码格式有误,请重新输入");
}
}
//用户名,密码,身份证账号,手机号码均放到用户对象中去
User user=new User(username,password,userid,userphone);
//把用户对象添加到集合中
list.add(user);
System.out.println("注册成功");
}
6.1.1:checkUsername
判断用户名是否符合条件
剖析知识点
-
charAt 方法属于 String 类,是用于获取字符串中指定位置的字符的方法。括号中为索引值,要获取的字符的索引,从 0 开始。
private static boolean checkUsername(String username){
//用户名长度必须在3~15位之间
int len=username.length();
if(len<3||len>15){
return false;
}
//循环得到username里面的每一个字符,如果有一个字符不是字母或者数字,用户不符合条件,则返回false
for (int i = 0; i < len; 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 j = 0; j < len; j++) {
char c=username.charAt(j);
if((c>='a'&&c<='z')||(c>='A'&&c<='Z')){
count++;
break;//当有一个字母时,便已经满足了条件,用户名不是纯数字
}
}
return count>0;
}
6.1.2: contains方法
判断用户名是否唯一(在登录功能,忘记密码中也会用到)
剖析知识点:
-
在 Java 中,
equals
是用于比较两个对象是否相等的方法。对于字符串(String
类),equals
方法被用于比较字符串的内容是否相同。 -
list.size();——一个
ArrayList
类的方法,用于获取该列表中元素的数量(即列表的大小)。返回的是一个整数值,表示列表中元素的个数 -
list.get(i);——一个
ArrayList
类的方法,用于获取指定位置的元素。返回列表中指定位置的元素。
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;
}
}
return false;
}
6.1.3:checkUesrid方法
判断身份证号码是否符合条件
剖析知识点:
-
Java中String类的startsWith()方法用于判断一个字符串是否以指定的前缀开始。
private static boolean checkUesrid(String userid){
//调用字符串里的length()方法获取长度,只有为18位时才满足条件
int len=userid.length();
if(len!=18){
return false;
}
//如果userid以"0"开头,则flag将被设置为true,否则将被设置为false。
boolean flag=userid.startsWith("0");
if(flag){
//如果以0开头,则返回false
return false;
}
//遍历前面17位,如果有一个不在数字范围内,即身份证号码不符合条件
for (int i = 0; i < len-1; i++) {
char a = userid.charAt(i);
if (!(a <= '9' && a >= '0')) {
return false;
}
}
//获取最后一个字符,如果这个字符在0~9之间或为x或X,即满足条件
char b=userid.charAt(17);
if((b=='x')||(b=='X')||(!(b>='0'&&b<=9))){
return true;
}else{
return false;
}
}
6.1.4:checkUesrphone方法
判断电话号码是否符合条件
private static boolean checkUesrphone(String userphone){
//调用字符串里的length()方法获取长度,只有为11位时才满足条件
int len=userphone.length();
if(len!=11){
return false;
}
if(userphone.startsWith("0")){
return false;
}
//遍历手机号码,如果有一个不在数字范围内,即号码不符合条件
for (int i = 0; i < len; i++) {
char c=userphone.charAt(i);
if(!(c>='0'&&c<='9')){
return false;
}
}
//当循环结束之后,表示每一个字符都在0~9之间
return true;
}
6.2.登录功能:login方法
分析:for循环是用来记录总共有多少次机会,而遇到重新输入时一般都会用到while循环
private static void login(ArrayList<User> list ){
Scanner input = new Scanner(System.in);
for (int i = 0; i < 3; i++) {
System.out.println("请输入用户名");
String username=input.next();
//判断用户名是否存在
boolean flag=contains(list,username);
if(!flag){
System.out.println("用户名"+username+"未注册,请先注册再登录");
return;
}
System.out.println("请输入密码");
String password= input.next();
while (true) {
String rightCode=getCode();
System.out.println("验证码:"+rightCode);
System.out.println("请输入验证码");
String code= input.next();
if(code.equalsIgnoreCase(rightCode)){
System.out.println("验证码正确");
break;
}else{
System.out.println("验证码错误");
System.out.println("请重新输入");
}
}
//验证用户名和密码是否正确
User uesInfo=new User(username,password,null,null);
boolean result=checkUserInfo(list,uesInfo);
if(result){
System.out.println("登录成功,可以开始使用学生管理系统了");
//创建对象,调用方法,启动学生管理系统
StudentSystem ss=new StudentSystem();
ss.startStudentSystem();
break;
}else{
System.out.println("登录失败,用户名或密码错误");
if(i==2){
System.out.println("当前账号"+username+"被锁定,请联系管理人员:xxx");
return;
}else{
System.out.println("用户名或密码错误,还剩下"+(2-i)+"次机会");
}
}
}
}
6.2.3:checkUserInfo
验证用户名和密码是否正确
分析:通过遍历集合,获得集合中的每一个对象,再将获取到的密码、用户名和useInfo对象的密码,用户名比较。
private static boolean checkUserInfo(ArrayList<User> list,User useInfo){
for (int i = 0; i < list.size(); i++) {
User user=list.get(i);
if(user.getUsername().equals(useInfo.getUsername())&&user.getPassword().equals(useInfo.getPassword())){
return true;
}
}
return false;
}
6.3.忘记密码:forgestPassword方法
剖析知识点:
-
equalsIgnoreCase 是 String 类中的一个方法,它用于比较字符串时忽略大小写。具体来说,equalsIgnoreCase 方法会将调用它的字符串与传入的字符串进行比较。
private static void forgestPassword(ArrayList<User> list ){
Scanner input = new Scanner(System.in);
System.out.println("请输入用户名");
String username=input.next();
boolean flag=contains(list,username);
if(!flag){
System.out.println("当前用户"+username+"未注册,请先注册");
return;
}
//键盘录入身份证号码和手机号码
System.out.println("请输入身份证号码");
String userid=input.next();
System.out.println("请输入手机号码");
String userphone= input.next();
//比较用户对象中的手机号码和身份证号码是否相同
//先获取用户对象
int index=findIndex(list,username);
User user=list.get(index);
if(!(user.getPersonID().equalsIgnoreCase(userid)&&user.getPhoneNumber().equalsIgnoreCase(userphone))){
System.out.println("身份证号码或手机号码输入有误,不能修改密码");
return;
}
//当代码执行到这里,表示所有的数据全部验证成功,直接修改即可
String password;
while (true) {
System.out.println("请输入新的密码");
password= input.next();
System.out.println("请再次输入新的密码");
String againPassword= input.next();
if(password.equals(againPassword)){
System.out.println("两次密码输入一致");
break;
}else{
System.out.println("两次密码输入不一致,请重新输入");
}
}
//直修改即可
user.setPassword(password);
System.out.println("密码修改成功");
}
6.3.2:findIndex方法
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;
}
6.4验证码规则:getCode方法
剖析知识点:
-
StringBuilder
类是 Java 中一个可变的字符串类,它提供了一系列的方法来进行字符串的操作。相对于String
类,StringBuilder
类更加高效,因为它能够避免创建过多的字符串对象,从而减少了内存的开销和垃圾回收的负担。 -
sb.append(char c)
是StringBuilder
类的方法,将指定的字符追加到字符序列末尾,并返回当前对象本身。 -
sb.toString()
和toCharArray()
都是StringBuilder
类中的方法,分别用于将字符序列转换为字符串和将字符串转换为字符数组。 -
int number=r.nextInt(10);范围是0到9
private static String getCode(){
//创建一个集合添加所有的大写字母和小写字母
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());
//利用随机索引获取字符
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);
}
7.测试类完整代码
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 input = new Scanner(System.in);
while (true) {
System.out.println("欢迎来到学生管理系统");
System.out.println("请选择操作:1.登录 2.注册 3.忘记密码");
String choice= input.next();
switch (choice){
case "1"-> login(list);
case "2"-> register(list);
case "3"-> forgestPassword(list);
case "4"->{
System.out.println("谢谢使用,再见");
System.exit(0);
}
default -> System.out.println("没有这个选项");
}
}
}
private static void register(ArrayList<User> list ){
Scanner input = new Scanner(System.in);
String username ;
while (true) {
System.out.println("请输入用户名");
username= input.next();
//先验证格式是否正确,再验证是否唯一
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;
}
}
String password;
while (true) {
System.out.println("请输入要注册的密码");
password = input.next();
System.out.println("请再次输入要注册的密码");
String passwordConfirm = input.next();
if (!password.equals(passwordConfirm)) {
System.out.println("两次密码输入不一致,请重新输入");
} else {
System.out.println("两次密码一致,继续录入其他数据");
break;
}
}
String userid;
while (true) {
System.out.println("请输入身份证号码");
userid= input.next();
boolean flag3=checkUesrid(userid);
if(flag3){
System.out.println("身份证号码符合要求");
break;
}else{
System.out.println("身份证号码不符合要求,请重新输入");
}
}
String userphone;
while (true) {
System.out.println("请输入手机号码");
userphone = input.next();
boolean flag4=checkUesrphone(userphone);
if(flag4){
System.out.println("手机号码格式正确");
break;
}else{
System.out.println("手机号码格式有误,请重新输入");
}
}
//用户名,密码,身份证账号,手机号码均放到用户对象中去
User user=new User(username,password,userid,userphone);
//把用户对象添加到集合中
list.add(user);
System.out.println("注册成功");
}
private static boolean checkUsername(String username){
//用户名长度必须在3~15位之间
int len=username.length();
if(len<3||len>15){
return false;
}
//循环得到username里面的每一个字符,如果有一个字符不是字母或者数字,用户不符合条件,则返回false
for (int i = 0; i < len; 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 j = 0; j < len; j++) {
char c=username.charAt(j);
if((c>='a'&&c<='z')||(c>='A'&&c<='Z')){
count++;
break;//当有一个字母时,便已经满足了条件,用户名不是纯数字
}
}
return count>0;
}
private static boolean checkUesrid(String userid){
//调用字符串里的length()方法获取长度,只有为18位时才满足条件
int len=userid.length();
if(len!=18){
return false;
}
boolean flag=userid.startsWith("0");
if(flag){
//如果以0开头,则返回false
return false;
}
//遍历前面17位,如果有一个不在数字范围内,即身份证号码不符合条件
for (int i = 0; i < len-1; i++) {
char a = userid.charAt(i);
if (!(a <= '9' && a >= '0')) {
return false;
}
}
//获取最后一个字符,如果这个字符在0~9之间或为x或X,即满足条件
char b=userid.charAt(17);
if((b=='x')||(b=='X')||(!(b>='0'&&b<=9))){
return true;
}else{
return false;
}
}
private static boolean checkUesrphone(String userphone){
//调用字符串里的length()方法获取长度,只有为11位时才满足条件
int len=userphone.length();
if(len!=11){
return false;
}
if(userphone.startsWith("0")){
return false;
}
//遍历手机号码,如果有一个不在数字范围内,即号码不符合条件
for (int i = 0; i < len; i++) {
char c=userphone.charAt(i);
if(!(c>='0'&&c<='9')){
return false;
}
}
//当循环结束之后,表示每一个字符都在0~9之间
return true;
}
private static void login(ArrayList<User> list ){
Scanner input = new Scanner(System.in);
for (int i = 0; i < 3; i++) {
System.out.println("请输入用户名");
String username=input.next();
//判断用户名是否存在
boolean flag=contains(list,username);
if(!flag){
System.out.println("用户名"+username+"未注册,请先注册再登录");
return;
}
System.out.println("请输入密码");
String password= input.next();
while (true) {
String rightCode=getCode();
System.out.println("验证码:"+rightCode);
System.out.println("请输入验证码");
String code= input.next();
if(code.equalsIgnoreCase(rightCode)){
System.out.println("验证码正确");
break;
}else{
System.out.println("验证码错误");
System.out.println("请重新输入");
}
}
//验证用户名和密码是否正确
User uesInfo=new User(username,password,null,null);
boolean result=checkUserInfo(list,uesInfo);
if(result){
System.out.println("登录成功,可以开始使用学生管理系统了");
//创建对象,调用方法,启动学生管理系统
StudentSystem ss=new StudentSystem();
ss.startStudentSystem();
break;
}else{
System.out.println("登录失败,用户名或密码错误");
if(i==2){
System.out.println("当前账号"+username+"被锁定,请联系管理人员:xxx");
return;
}else{
System.out.println("用户名或密码错误,还剩下"+(2-i)+"次机会");
}
}
}
}
private static boolean checkUserInfo(ArrayList<User> list,User useInfo){
for (int i = 0; i < list.size(); i++) {
User user=list.get(i);
if(user.getUsername().equals(useInfo.getUsername())&&user.getPassword().equals(useInfo.getPassword())){
return true;
}
}
return false;
}
private static void forgestPassword(ArrayList<User> list ){
Scanner input = new Scanner(System.in);
System.out.println("请输入用户名");
String username=input.next();
boolean flag=contains(list,username);
if(!flag){
System.out.println("当前用户"+username+"未注册,请先注册");
return;
}
//键盘录入身份证号码和手机号码
System.out.println("请输入身份证号码");
String userid=input.next();
System.out.println("请输入手机号码");
String userphone= input.next();
//比较用户对象中的手机号码和身份证号码是否相同
//先获取用户对象
int index=findIndex(list,username);
User user=list.get(index);
if(!(user.getPersonID().equalsIgnoreCase(userid)&&user.getPhoneNumber().equalsIgnoreCase(userphone))){
System.out.println("身份证号码或手机号码输入有误,不能修改密码");
return;
}
//当代码执行到这里,表示所有的数据全部验证成功,直接修改即可
String password;
while (true) {
System.out.println("请输入新的密码");
password= input.next();
System.out.println("请再次输入新的密码");
String againPassword= input.next();
if(password.equals(againPassword)){
System.out.println("两次密码输入一致");
break;
}else{
System.out.println("两次密码输入不一致,请重新输入");
}
}
//直修改即可
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 String getCode(){
//创建一个集合添加所有的大写字母和小写字母
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());
//利用随机索引获取字符
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 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;
}
}
return false;
}
}