package test2;
import java.awt.image.LookupOp;
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;
import java.util.concurrent.CountDownLatch;
public class updateSystem {
public static void main(String[] args) {
//创建一个集合用来存储用户的用户名和密码
ArrayList<user> a1 = new ArrayList<>();
while (true) {
System.out.println("-----欢迎来到学生管理系统-----");
System.out.println("1.登录");
System.out.println("2.注册");
System.out.println("3.忘记密码");
System.out.println("4.退出");
Scanner sc = new Scanner(System.in);
String number = sc.next();
switch (number) {
case "1" -> dengLu(a1);
case "2" -> zhuCe(a1);
case "3" -> fotgetSecret(a1);
case "4" -> System.exit(0);
default -> System.out.println("抱歉,没有这个选项");
}
}
}
//先进行注册
public static void zhuCe(ArrayList<user> a1)
{
user u1= new user();
Scanner sc = new Scanner(System.in);
//先让用户输入用户名
while (true) {
System.out.println("请输入用户名");
String name = sc.next();
//判断唯一性
boolean flag = only(a1,name);
if(flag)
{
System.out.println("用户名已重复");
}else{
//不重复的话,判断长度是否在3-15之间
if(3<=name.length()&&name.length()<=15)
{
//判断用户名,只能是字母跟数字的组合,但是不能全是数字
//将name中的每一个字符拿出来比较
//定义一个方法,用来查看用户名是否合法
boolean flag1 = compare(name);
//返回值为真,则说明用户名都是子母和数字组成的
if(flag1)
{
//判断是不是全是数字,如果是的话也要重新输入
if(compare1(name)==0)
{
System.out.println("用户名不能全是数字,请重新输入");
}else{
u1.setName(name);
break;
}
}else{
System.out.println("用户名中存在不是字母和数字的字符,请重新输入");
}
}else{
System.out.println("用户名应当在3-15之间,请重新输入");
}
}
}
//这个时候已经成功输入了正确的用户名
//接下来要输入密码
while (true) {
System.out.println("请您输入密码");
String secret1 = sc.next();
System.out.println("请您再次输入密码");
String secret2 = sc.next();
if(secret1.equals(secret2))
{
u1.setSecret(secret1);
break;
}
else{
System.out.println("您两次输入的密码不一样,请重新输入");
}
}
// 定义一个成员变量
String idcardNumber;
//这个时候,用户名和密码都是合法的了,现在需要进行身份验证
System.out.println("请输入您的身份证号码进行验证");
while (true) {
String idcard = sc.next();
if(idcard.length()==18)
{
if(idcard.charAt(0)=='0')
{
System.out.println("身份证号码首位不能为0,请重新输入");
}
else{
//定义一个数数字的方法
int number = numbercount(idcard);
if(number==17) {
if (('0' <= (idcard.charAt(17)) && (idcard.charAt(17)) <= '9') || idcard.charAt(17) == 'x' || idcard.charAt(17) == 'X')
{
idcardNumber = idcard;
break;
}else{
System.out.println("身份证末位应为数字或者是x的大小写");
}
}else{
System.out.println("身份证前17位应为数字");
}
}
}else {
System.out.println("请输入18位的身份证号码");
}
}
u1.setIdCard(idcardNumber);
//此时身份证号码也已经成功输入了
//接下来进行电话号码的验证
System.out.println("请输入11位有效数字的电话号码");
String phoneNumber;
while (true) {
String phonenumber = sc.next();
//电话号码必须都得是数字
int n =numbercount1(phonenumber);
if(n==11){
if(phonenumber.charAt(0)=='0')
{
System.out.println("电话号码首位不能是0");
}else{
phoneNumber = phonenumber;
break;
}
}else{
System.out.println("请输入11位有效数字的电话号码");
}
}
u1.setPhoneNumber(phoneNumber);
//此时电话号码也已经成功录入
//将用户名和密码录入到user对象中
a1.add(u1);
}
//登录模块
public static void dengLu(ArrayList<user> a1)
{
Scanner sc = new Scanner(System.in);
System.out.println("请输入用户名");
String name = sc.next();
//查看是否已经在集合里面有这个账号名
if(only(a1,name))
{
loop:while (true) {
System.out.println("请输入验证码");
Random ran = new Random();
String result = "";
//定义一个字母数组,用来形成随机生成的验证码
//验证码为5位,为任意数字或字母
for (int i = 0; i < 5; i++) {
int r1 = ran.nextInt(36);
result = arr1(r1) + result;
}
System.out.println(result);
//输入验证码匹配,如果不一样,需要重新输入
String number1 = sc.next();
boolean flag = number1.equalsIgnoreCase(result);
if(flag){
//获得用户名对应的集合的索引的密码
String secret1 = a1.get(getindex(a1,name)).getSecret();
for (int i = 0; i < 3; i++) {
int count = 0;
System.out.printf("请输入密码,您还有%s次机会",3-i);
String secret = sc.next();
if(secret.equals(secret1) ){
try {
System.out.println("登录成功");
studentadminiersystem s1 = new studentadminiersystem();
s1.studentSystem();
} catch (Exception e) {
throw new RuntimeException(e);
}
break loop;
}else {
count++;
System.out.println("密码错误");
if(count==3)
{
System.out.println("您已经连续输入错误三次密码,请重新登录");
}
}
}
}else{
System.out.println("您输入的验证码不正确,请重新输入");
}
}
}else {
System.out.println("未存在账户,请重新输入或是注册账号");
}
}
//忘记密码
public static void fotgetSecret(ArrayList<user> a1)
{
System.out.println("请输入您的用户名");
Scanner sc = new Scanner(System.in);
//先确认用户名是否在集合中的元素
String name = sc.next();
if(only(a1,name))
{
//此时已经找到了用户名对应的索引
int a =getindex(a1,name);
//验证身份证和手机号码,用来表现是否能修改密码
System.out.println("请输入身份证号码");
String id = sc.next();
System.out.println("请输入手机号码");
String ph = sc.next();
//开始判断是否相同
if(id==a1.get(a).getIdCard()&&ph == a1.get(a).getPhoneNumber())
{
while (true) {
System.out.println("请输入新的密码");
String s1 = sc.next();
System.out.println("请再次输入新密码");
String s2 = sc.next();
//两次相同则可以开始修改
if(s1.equals(s2))
{
//录入到集合中,修改所在索引的对象的密码
a1.get(a).setSecret(s1);
break;
}else{
System.out.println("两次密码不同请重新输入");
}
}
}else{
System.out.println("账号信息不匹配,修改失败");
}
}else{
System.out.println("未注册");
}
}
//唯一性判断
public static boolean only(ArrayList<user> a1,String name)
{
int a = getindex(a1,name);
if(a>=0)
{
return true;
}
else{return false;}
}
//获得对应的用户名在集合中的索引
public static int getindex(ArrayList<user> a1,String name)
{
for (int i = 0; i < a1.size(); i++) {
if(name.equals(a1.get(i).getName()))
{
return i;
}
}
return -1;
}
//定义一个比较字母的方法
public static boolean compare(String name )
{
int count=0;
for (int i = 0; i < name.length(); i++) {
if((('a'<=name.charAt(i)&&name.charAt(i)<='z')||('A'<=name.charAt(i)&&name.charAt(i)<='Z')||('0'<=name.charAt(i)&&name.charAt(i)<='9')))
{
count++;
}
}
if(count==name.length())
{
return true;
}else {return false;}
}
//定义一个获取用户名中有多少个字母的方法
public static int compare1(String name )
{
int count = 0;
for (int i = 0; i < name.length(); i++) {
if(('a'<=name.charAt(i)&&name.charAt(i)<='z')||('A'<=name.charAt(i)&&name.charAt(i)<='Z')) {
count++;
}
}
return count;
}
//定义一个计算字符串17位中有多少数字的方法
public static int numbercount(String id)
{
int count = 0;
for (int i = 0; i < 17; i++) {
if('0'<=id.charAt(i)&&id.charAt(i)<='9')
{
count ++;
}
}
return count;
}
//定义一个计算字符串有多少数字的方法
public static int numbercount1(String id)
{
int count = 0;
for (int i = 0; i < id.length(); i++) {
if('0'<=id.charAt(i)&&id.charAt(i)<='9')
{
count ++;
}
}
return count;
}
//定义一个将数字转变为字母的方法
public static char arr1(int a)
{
char c1[] = new char[36];
for (int i = 0; i < 26; i++) {
c1[i]= (char)('a'+i);
}
for (int i =26 ; i<=35 ; i++) {
c1[i] = (char) ('0'+i-26);
}
return c1[a];
}
}
class studentadminiersystem {
public static void studentSystem() {
ArrayList<student> al = new ArrayList<>();
loop:
while (true) {
System.out.println("=========欢迎来到学生管理系统========");
System.out.println("1.添加学生");
System.out.println("2.删除学生");
System.out.println("3.修改学生");
System.out.println("4.查询学生");
System.out.println("5.退出");
System.out.println("请输入您的选择");
Scanner sc = new Scanner(System.in);
String s1 = sc.next();
switch (s1) {
case "1" -> addStudent(al);
case "2" -> deleteStudent(al);
case "3" -> rewriteStudent(al);
case "4" -> findStudent(al);
case "5" -> {
System.out.println("退出");
break loop;
//直接退出loop:的地方
//还有一种退出的方法是虚拟机的结束
//System.exit(0);
}
default -> System.out.println("您输入的内容不合法");
}
}
}
//增加学生信息
public static void addStudent(ArrayList<student> a1) {
Scanner sc = new Scanner(System.in);
student s1 = new student();
System.out.println("please input students name");
loop1:
while (true) {
//录入名字
String name1 = sc.next();
//id唯一性确认
for (int i = 0; i < a1.size(); i++) {
student s2 = a1.get(i);
if (name1.equals(s2.getName())) {
System.out.println("the name is repeatede, please input again");
continue loop1;
}
}
s1.setName(name1);
break;
}
System.out.println("please input students gender");
s1.setGender(sc.next());
System.out.println("please input students age");
s1.setAge(sc.nextInt());
System.out.println("please input students phoneNumber");
s1.setPhoneNumber(sc.nextInt());
//将学生对象录入到集合中
a1.add(s1);
}
//删除学生信息
public static void deleteStudent(ArrayList<student> a1) {
System.out.println("请输入您想删除的学生的名字");
Scanner sc = new Scanner(System.in);
String name = sc.next();
int a = getIndex(a1, name);
//判断这个学生在不在里面
if (a >= 0) {
a1.remove(a);
} else {
System.out.println("没有这个学生的信息");
}
}
//改变学生信息
public static void rewriteStudent(ArrayList<student> a1) {
System.out.println("请输入您想修改信息的学生的名字");
Scanner sc = new Scanner(System.in);
String name2 = sc.next();
//判断想要修改的名字是不是已经在集合里面了
boolean flag = only(a1,name2);
int a ;
//如果在里面,就进入修改的环节
if(flag) {
//加一个循环,防止想要输入的名字已经在集合里面了,也就是唯一性的判别
loop2:
while (true) {
//这个时候我们已经知道要修改的名字在里面
//得到这个名字所在的集合的索引
a = getIndex(a1, name2);
//让用户输入要改成什么名字
System.out.println("请问您要修改成什么样的名字");
String name = sc.next();
//得到要改的名字之后,要判别是不是在已有的集合里面
int b = getIndex(a1,name);
//唯一性判别
if (b >= 0) {
//如果输入的是跟旧名字一样的名字,就直接跳出循环
if(a1.get(b).getName().equals(name))
{break;}
//已经存在了,需要重新输入
System.out.println("输入的名字已经重复,请重新输入");
//这个是为了能重新输入名字
continue loop2;
} else {
//将名字放到之前名字得到的索引的位置
a1.get(a).setName(name);
}
//跳出循环
break;
}
System.out.println("请输入要修改的学生的性别");
a1.get(a).setGender(sc.next());
System.out.println("请输入要修改的学生的年龄");
a1.get(a).setAge(sc.nextInt());
System.out.println("请输入要修改的学生的手机号");
a1.get(a).setPhoneNumber(sc.nextInt());
}
else{
System.out.println("未找到学生信息");
}
}
//查找学生信息
public static void findStudent(ArrayList<student> a1) {
if (a1 == null) {
System.out.println("无学生信息");
} else {
//print head of table information
System.out.println("name\tgender\tage\tphoneNumber");
System.out.println();
for (int i = 0; i < a1.size(); i++) {
student s1 = a1.get(i);
System.out.println(s1.getName() + "\t" + s1.getGender() + "\t" + s1.getAge() + "\t" + s1.getPhoneNumber());
}
}
}
//遍历集合,得到索引
public static int getIndex(ArrayList<student> a1, String name) {
for (int i = 0; i < a1.size(); i++) {
if (a1.get(i).getName().equals(name)) {
return i;
}
}
return -1;
}
//name唯一性判断
public static boolean only(ArrayList<student> a1, String name) {
int a = getIndex(a1, name);
if (a >= 0) {
return true;
} else {
return false;
}
}
}
class student {
private String name;
private int age ;
private String gender;
private int phoneNumber;
public student() {
}
public student(String name, int age, String gender, int phoneNumber) {
this.name = name;
this.age = age;
this.gender = gender;
this.phoneNumber = phoneNumber;
}
/**
* 获取
* @return name
*/
public String getName() {
return name;
}
/**
* 设置
* @param name
*/
public void setName(String name) {
this.name = name;
}
/**
* 获取
* @return age
*/
public int getAge() {
return age;
}
/**
* 设置
* @param age
*/
public void setAge(int age) {
this.age = age;
}
/**
* 获取
* @return gender
*/
public String getGender() {
return gender;
}
/**
* 设置
* @param gender
*/
public void setGender(String gender) {
this.gender = gender;
}
/**
* 获取
* @return phoneNumber
*/
public int getPhoneNumber() {
return phoneNumber;
}
/**
* 设置
* @param phoneNumber
*/
public void setPhoneNumber(int phoneNumber) {
this.phoneNumber = phoneNumber;
}
public String toString() {
return "student{name = " + name + ", age = " + age + ", gender = " + gender + ", phoneNumber = " + phoneNumber + "}";
}
}
class user {
private String name;
private String secret;
private String phoneNumber;
private String idCard;
public user() {
}
public user(String name, String secret) {
this.name = name;
this.secret = secret;
}
public user(String name, String secret, String phoneNumber, String idCard) {
this.name = name;
this.secret = secret;
this.phoneNumber = phoneNumber;
this.idCard = idCard;
}
/**
* 获取
* @return name
*/
public String getName() {
return name;
}
/**
* 设置
* @param name
*/
public void setName(String name) {
this.name = name;
}
/**
* 获取
* @return secret
*/
public String getSecret() {
return secret;
}
/**
* 设置
* @param secret
*/
public void setSecret(String secret) {
this.secret = secret;
}
public String toString() {
return "user{name = " + name + ", secret = " + secret + "}";
}
/**
* 获取
* @return phoneNumber
*/
public String getPhoneNumber() {
return phoneNumber;
}
/**
* 设置
* @param phoneNumber
*/
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
/**
* 获取
* @return idCard
*/
public String getIdCard() {
return idCard;
}
/**
* 设置
* @param idCard
*/
public void setIdCard(String idCard) {
this.idCard = idCard;
}
}