注册
1.用户名满足以下要求
用户名唯一
用户名长度在3~15之间
只能是字母加数字组合,但不能是纯数字
2. 键盘输入两次密码,两次一致才可以进行注册
3. 身份证号码验证
长度18位
不能以0开头
前17位必须都是数字
最后一位可以是数字,也可以是x或X
4. 手机号验证
长度11位
不能以0开头
都是数字
登录
输入用户名、密码、验证码
验证要求:
用户名如果未注册,直接结束方法,并提示:用户名未注册,请先注册
判断验证码是否正确,若不正确,重新输入
再判断用户名和密码是否正确,有3次机会
忘记密码
键盘录入用户名,判断是否存在,不存在则结束方法,并提示:用户未注册
输入身份证号码和手机号码
判断当前用户的身份证号码和手机号是否一致
一致,则提示输入密码,进行修改
不一致,提示:账号信息不匹配,修改失败
验证码
长度为5
由4位大小写字母和一位数字组成,字母可以重复
数字可以出现在任意位置
代码如下:
package studentMange;
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;
public class StudentManger {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//创建集合存储用户对象
ArrayList<User> list = new ArrayList<>();
static {
//添加一些用户信息用于测试
list.add(new User("张三丰", "123", "450330200002210123", "18201233306"));
list.add(new User("风清扬", "000", "450330200001230123", "18201230123"));
}
while (true) {
//菜单
System.out.println("--------欢迎使用几何学生管理系统--------");
System.out.println("* 1. 用户注册 *");
System.out.println("* 2. 用户登录 *");
System.out.println("* 3. 忘记密码 *");
System.out.println("* 4. 退出系统 *");
System.out.println("------------------------------------");
System.out.println("请输入您的选择:");
String choice = sc.next();
switch (choice) {
case "1":
register(list);
break;
case "2":
login(list);
break;
case "3":
forgetPwd(list);
break;
case "4":
System.out.println("谢谢使用,再见");
System.exit(0);//停止虚拟机运行
default:
System.out.println("没有这个选项");
break;
}
}
}
//注册
private static void register(ArrayList<User> list) {
Scanner sc = new Scanner(System.in);
//键盘录入用户名
String username;
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("用户名已存在,请重新输入");
continue;
} else {
System.out.println("用户名" + username + "可用");
break;
}
}
//键盘录入密码
String password;
while (true) {
System.out.println("请输入密码");
password = sc.next();
System.out.println("请确认密码");
String confirmPwd = sc.next();
if (!confirmPwd.equals(password)) {
System.out.println("两次密码输入不一致,请重新输入");
continue;
} else {
System.out.println("两次密码一致,继续录入其他数据");
break;
}
}
//录入身份证号码
String idCard;
while (true) {
System.out.println("请输入要注册的身份证号码");
idCard = sc.next();
boolean flag = checkIdCard(idCard);
if (!flag) {
System.out.println("身份证号码格式错误,请重新输入");
continue;
} else {
System.out.println("身份证号码录入成功,继续录入其他数据");
break;
}
}
//录入手机号
String phone;
while (true) {
System.out.println("请输入手机号");
phone = sc.next();
boolean flag = checkPhone(phone);
if (!flag) {
System.out.println("手机号码格式错误,请重新输入");
continue;
} else {
System.out.println("手机号录入成功");
break;
}
}
//把属性放到用户对象中
User user = new User(username, password, idCard, phone);
//把用户添加到集合
list.add(user);
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.getIdCard() + ", " + user.getPhone());
}
}
//验证手机号
private static boolean checkPhone(String phone) {
//长度为11位
if (phone.length() != 11) {
return false;
}
//不能以0开头
if (phone.charAt(0) == '0') {
return false;
}
//都是数字
for (int i = 0; i < phone.length(); i++) {
char c = phone.charAt(i);
if (c < '0' || c > '9') {
return false;
}
}
return true;
}
//验证身份证
private static boolean checkIdCard(String idCard) {
//长度为18
if (idCard.length() != 18) {
return false;
}
//不能以0开头
if (idCard.charAt(0) == '0') {
return false;
}
//前17位必须是数字
//可以使用subString()截取,再遍历截取后的字符串idStr
//String idStr = idCard.substring(17);
//也可以直接遍历字符串,到length()-1即为前17位
for (int i = 0; i < idCard.length() - 1; i++) {
char c = idCard.charAt(i);
//判断每一个字符是否都是数字
if ((c < '0' || c > '9')) {
return false;
}
}
//最后一位可以是数字,也可以是x或X
char c = idCard.charAt(17);
if (!(c == 'x' || c == 'X' || (c >= '0' && c <= '9'))) {
return false;
}
return true;
}
//验证用户名
private static boolean checkUsername(String username) {
//用户名长度在3~15之间
//可以直接将username.length()放到if进行判断,但这样需要调用两次,效率较低
//所以先获取长度,再进行判断
int len = username.length();
if (len < 3 || len > 15) {
return false;
}
//只能是字母加数字组合,但不能是纯数字
int count = 0;
for (int i = 0; i < username.length(); i++) {
char c = username.charAt(i);
//循环得到每一个字符,如果不满足要求,则返回false
if (!((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9'))) {
return false;
}
//检验是否为纯数字
if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {
count++;
break;
}
}
return 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();
//判断用户名是否已经注册
int index = getIndex(list,username);
if (index == -1){
System.out.println("用户名未注册,请先注册");
return;
}
System.out.println("请输入密码");
String password = sc.next();
//输入验证码
while (true) {
String trueCaptcha = getCaptcha();//生成的验证码
System.out.println(trueCaptcha);
System.out.println("请输入验证码");
String captcha = sc.next();
//判断验证码是否正确
if (!captcha.equalsIgnoreCase(trueCaptcha)) {//忽略大小写
System.out.println("验证码错误,请重新输入");
continue;
} else {
System.out.println("验证码正确");
break;
}
}
//验证用户名和密码是否正确
//封装零散的数据
User userInfo = new User(username, password, null, null);
boolean flag = checkNameAndPwd(list, userInfo);
if (!flag) {
if (i == 2) {
System.out.println("当前账号被锁定,请联系xxx客服:xxx-xxxx-xxxx");
} else {
System.out.println("登录失败,用户名或密码错误,您还有" + (2 - i) + "次机会");
}
} else {
System.out.println("登录成功,欢迎使用学生管理系统");
//StudentMangeSystem st = new StudentMangeSystem();
//使用学生管理系统
//把之前写的学生管理系统的main()改为useStuSystem(),把里面的参数删掉
//st.useStuSystem();
break;
}
}
}
//验证用户名和密码
private static boolean checkNameAndPwd(ArrayList<User> list, User userInfo) {
for (int i = 0; i < list.size(); i++) {
User user = list.get(i);
// if (user.equals(userInfo)){
// return true;
// }
if (user.getUsername().equals(userInfo.getUsername())
&& user.getPassword().equals(userInfo.getPassword())) {
return true;
}
}
return false;
}
//生成验证码
private static String getCaptcha() {
//长度为5
//由4位大小写字母和一位数字组成,字母可以重复
//数字可以出现在任意位置
//定义集合存放大小写字母
ArrayList<Character> list = new ArrayList<>();
for (int i = 0; i < 26; i++) {
list.add((char) (97 + i));// 97 -- 'a'
list.add((char) (65 + i));// 65 -- 'A'
}
StringBuilder sb = new StringBuilder();
//随机获取4个字符
Random r = new Random();
for (int i = 0; i < 4; i++) {
int randomIndex = r.nextInt(list.size());
char c = list.get(randomIndex);
sb.append(c);
}
//生成一个0~9的随机数,拼接到最后
int num = r.nextInt(10);
sb.append(num);
//变成字符数组
char[] arr = sb.toString().toCharArray();
char temp;
//把最后一个元素和前面的元素随机进行交换
int index = r.nextInt(arr.length);
temp = arr[arr.length - 1];
arr[arr.length - 1] = arr[index];
arr[index] = temp;
//把字符数组变为字符串得到验证码
String captcha = new String(arr);
return captcha;
}
//忘记密码
private static void forgetPwd(ArrayList<User> list) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入用户名");
String username = sc.next();
int index = getIndex(list, username);//获取用户名对应的索引
if (index == -1) {
System.out.println("当前用户未注册");
return;
}
System.out.println("请输入身份证号码进行验证");
String idCard = sc.next();
System.out.println("请输入手机号码进行验证");
String phone = sc.next();
User user = list.get(index);//获取要修改的用户对象
boolean flag2 = checkUserInfo(list, idCard, phone);//验证身份证号和手机号
if (!flag2) {
System.out.println("账号信息不匹配,修改失败");
return;
}
String pwd;
while (true) {
System.out.println("账号信息匹配,请输入新的密码");
pwd = sc.next();
System.out.println("请确认密码");
String truePwd = sc.next();
if (pwd.equals(truePwd)) {
break;
} else {
System.out.println("两次密码不一致,请重新输入");
continue;
}
}
user.setPassword(pwd);
System.out.println("修改成功");
}
//验证身份证和手机号
private static boolean checkUserInfo(ArrayList<User> list, String idCard, String phone) {
for (int i = 0; i < list.size(); i++) {
User user1 = list.get(i);
if ((user1.getIdCard().equals(idCard))
&& (user1.getPhone().equals(phone))
) {
return true;
}
}
return false;
}
//判断用户名是否唯一
private static boolean contains(ArrayList<User> list, String username) {
//根据索引判断用户名是否存在
return getIndex(list, username) >= 0;
}
//获取用户对象对应的索引,判断用户是否存在
private static int getIndex(ArrayList<User> list, String username) {
for (int i = 0; i < list.size(); i++) {
// User user = list.get(i);//依次获取集合元素
// String name = user.getUsername();
// if (name.equals(username)){//比较
// return i;
// }
boolean flag = list.get(i).getUsername().equals(username);//可以使用链式编程
if (flag) {
return i;
}
}
return -1;
}
}
User类
package studentMange;
public class User {
private String username;
private String password;
private String idCard;
//如果把phone定义成int类型
//那么在后续的手机号验证中
//需要将其放到StringBuilder容器,再转成String类型,然后获取长度
//但是这样在输入的时候,一旦输入非数字字符,就会产出异常,需要进行异常处理,比较麻烦
//所有这里定义成String类型
private String phone;
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 getIdCard() {
return idCard;
}
public void setIdCard(String idCard) {
this.idCard = idCard;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public User() {
}
public User(String username, String password, String idCard, String phone) {
this.username = username;
this.password = password;
this.idCard = idCard;
this.phone = phone;
}
}