用了半天时间学习了Java中的学生管理系统,为了防止大脑delete过多,浅浅的记录一下。
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;
// 按两次 Shift 打开“随处搜索”对话框并输入 `show whitespaces`,
// 然后按 Enter 键。现在,您可以在代码中看到空格字符。
public class Main {
public static void StudentManagement() {
ArrayList<User> list = new ArrayList<>();
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("欢迎来到学生管理系统");
System.out.println("请选择操作: 1登录 2注册 3重置密码");
int choose = sc.nextInt();
switch (choose) {
//
case 1 -> login(list);
case 2 -> register(list);
case 3 -> forgetPassword(list);
case 4 -> System.out.println("谢谢使用,再见");
default -> System.out.println("没有这个选项");
}
}
}
//switch 语句之前在c语言学习过,一直没用过,最近搞这些java大作业倒是经常用,别说,比一堆if强多了
//也是在一个类中创建的多个方法,太让人眼花缭乱了,明天自己重写一遍一定要分成不同的类
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("未注册");
return;
}
System.out.println("请输入身份证号码");
String passWord= sc.next();
System.out.println("请输入手机号码");
String phoneNumber= sc.next();
//把用户对象先获取出来
int index=findIndex(list,userName);
User user=list.get(index);
if(!(user.getPassword().equals(passWord)&&user.getPhoneNumber().equals(phoneNumber))){
System.out.println("身份证号码或手机号码输入有误,不能修改密码");
return;
}
String key;
while (true) {
System.out.println("请输入新的密码");
key=sc.next();
System.out.println("请再次输入新的密码");
String key1= sc.next();
if(key.equals(key1)) {
System.out.println("修改成功");
break;
}
else {
System.out.println("不一致,请重新输入");
continue;
}
}
user.setPassword(key);
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;
}
//这就是一个注册的方法
在内部定义了应该传到集合里边的信息,还有这个while包裹,以前确实不会用,现在拿来进行信息的正确输入就很nice
//还有这boolean类型的方法,通过返回的正否来进行判断,好使
private static void register(ArrayList<User> list) {
System.out.println("注册");
//把用户信息添加到集合
String userName;
String userPassword;
String userID;
String phoneNumber;
Scanner sc = new Scanner(System.in);
while (true) {//用一个死循环进行包裹,直至输入正确
System.out.println("请输入用户名");
userName = sc.next();
boolean flag1 = checkUserName(userName);
if (!flag1) {
System.out.println("用户格式不满足,请重新输入");
continue;
}
boolean flag2 = contains(list, userName);
if (flag2) {
//证明集合中已经有这个名字,不能注册
System.out.println("用户名" + userName + "已存在,请重新输入");
} else {
//可以继续录入下面的数据
System.out.println(userName + "注册成功");
break;
}
}
while (true) {
System.out.println("请输入要注册的密码");
userPassword = sc.next();
System.out.println("请再次输入密码");
String again = sc.next();
if (again.equals(userPassword)) {
System.out.println("密码注册成功");
break;
} else {
System.out.println("注册失败,请重新注册");
}
}
//键盘录入身份证
while (true) {
System.out.println("请输入身份证号码");
userID = sc.next();
boolean flag = checkUserId(userID);
if (flag) {
System.out.println("身份证号码满足要求");
break;
} else System.out.println("身份证号码不满足要求,请重新输入");
}
while (true) {
System.out.println("请输入手机号码:");
phoneNumber = sc.next();
boolean flag = checkPhoneNumber(phoneNumber);
if (flag) {
System.out.println("手机号码输入正确");
break;
} else {
System.out.println("手机号码输入不对,请重新输入");
}
}
//用户名,密码,身份证,手机号放到用户对象中
//这个放到集合里边的方法还没用好,明天练习的时候要着重一些
User u=new User(userName,userPassword,userID,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 user=list.get(i);
System.out.println(user.getUsername()+" "+user.getPassword()+
" "+user.getPersonID()+" "+user.getPhoneNumber());
}
}
//打印集合的方法
第一句别总丢,获取当前索引的信息
private static boolean checkPhoneNumber(String phoneNumber) {
int len = phoneNumber.length();
if (len != 11) return false;
if (phoneNumber.startsWith("0")) return false;
int cnt = 0;
for (int i = 0; i < len; i++) {
char c = phoneNumber.charAt(i);
if (c >= '0' && c <= '9') cnt++;
}
if (cnt != 11) return false;
return true;
}
private static boolean checkUserId(String userID) {
int len = userID.length();
if (len != 18) return false;
if (userID.startsWith("0")) return false;
for (int i = 0; i < len - 1; i++) {
char c = userID.charAt(i);
if (!(c >= '0' && c <= '9')) return false;
}
char c = userID.charAt(len - 1);
if (!(c >= '0' && c <= '9') || (c == 'X') || (c == 'x')) return false;
return true;
}
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;
}
private static boolean checkUserName(String userName) {
int len = userName.length();
if (len < 3 || len > 15) {
return 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 cnt = 0;
for (int i = 0; i < len; i++) {
char c = userName.charAt(i);
if (c >= '0' && c <= '9') {
cnt++;
}
}
if (cnt == len) return false;
return true;
}
private static void login(ArrayList<User> list) {
for (int i=0;i<3;i++) {
System.out.println("登录");
System.out.println("请输入用户名");
Scanner sc=new Scanner(System.in);
String userName= sc.next();
boolean flag=contains(list,userName);
if(!flag){
System.out.println("用户名"+userName+"没有注册,请先注册再登录");
return ;
}
System.out.println("请输入密码");
String key= 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,key,null,null);
boolean result=checkUserInfo(list,userInfo);
if(result){
System.out.println("登陆成功,可以开始使用学生管理系统了");
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 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();
//随机抽取4个字符
for (int i = 0; i < 4; i++) {
//获取随机索引
int index= r.nextInt(list.size());
//利用随机索引获取字符
char c=list.get(index);
sb.append(c);
}
利用了StringBuilder来进行字符串的拼接
int n=r.nextInt(10);
sb.append(n);
//要修改字符串中的内容,先把字符串变成字符数组,在数组中修改,然后再创建一个新的字符串
char[]arr=sb.toString().toCharArray();
//新建了一个字符数组 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);
//字符数组位置的调换,把数组和字母的位置打乱
//这是真的刚接触,明天估计忘得差不都了,得repeat
}
}