java后端开发day19--学生管理系统升级
(以下内容全部来自上述课程)
1.要求及思路
1.总体框架
2.注册
3.登录
4.忘记密码
2.代码
1.javabean
public class User1 {
private String username;
private String password;
private String personID;
private String phoneNumber;
public User1() {
}
public User1(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 "User1{username = " + username + ", password = " + password + ", personID = " + personID + ", phoneNumber = " + phoneNumber + "}";
}
}
2.测试类
1.注册
1.检查用户名是否唯一
private static boolean checkUsernameIsExist(String username, ArrayList<User1> list) {
//遍历集合,获取每一个用户名,和输入的用户名进行比较
for (int i = 0; i < list.size(); i++) {
User1 user = list.get(i);
String name = user.getUsername();
if (name.equals(username)) {
return true;
}
}
return false;
}
2.检查用户名格式是否正确
private static boolean checkUsername (String username){
//用户名必须是3-15位的数字和字母
int length = username.length();
if (length < 3 || length > 15) {
System.out.println("用户名必须是5-15位的数字和字母");
return false;
}
//用户名必须是数字和字母组成
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++;
break;
}
}
//用户名满足要求
return count > 0;
}
3.检查身份证号格式是否正确
private static boolean checkPersonID(String personID) {
//身份证号必须是18位的数字和字母
int length = personID.length();
if (length != 18) {
System.out.println("身份证号必须是18位的数字和字母");
return false;
}
//不能以0开头
if (personID.startsWith("0")) {
System.out.println("身份证号不能以0开头");
return false;
}
//前17位必须是数字
for (int i = 0; i < personID.length() - 1; i++) {
char c = personID.charAt(i);
if (!(c >= '0' && c <= '9')) {
System.out.println("身份证号前17位必须是数字");
return false;
}
}
//最后一位可以是数字或者大写X或者小写x
char c = personID.charAt(personID.length() - 1);
if ((c >= '0' && c <= '9') || (c == 'X') || (c =='x')) {
return true;
} else {
return false;
}
}
4.检查手机格式是否正确
private static boolean checkPhoneNumber(String phoneNumber) {
//手机号必须是11位的数字
int length = phoneNumber.length();
if (length!= 11) {
System.out.println("手机号必须是11位的数字");
return false;
}
//不能以0开头
if (phoneNumber.startsWith("0")) {
System.out.println("手机号不能以0开头");
return false;
} else {
return true;
}
}
5.注册完整代码
//注册
public static void register(ArrayList<User1> list) {
System.out.println("注册");
User1 user = new User1();
//1.键盘录入用户名
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 = checkUsernameIsExist(username, list);
if (flag2) {
//用户名已存在
System.out.println("用户名"+username+"已经存在,请重新输入:");
} else {
//不存在,可用
System.out.println("用户名"+username+"可以使用");
}
break;
}
//2.键盘录入密码
String password ;
while (true) {
System.out.println("请输入密码:");
password = sc.next();
System.out.println("请再次输入密码:");
String password2 = sc.next();
if (password.equals(password2)) {
System.out.println("密码输入正确");
break;
} else {
System.out.println("密码输入错误,请重新输入:");
continue;
}
}
//3.键盘录入身份证号
String personID ;
while (true) {
System.out.println("请输入身份证号:");
personID = sc.next();
boolean flag3 = checkPersonID(personID);
if (flag3) {
System.out.println("身份证号格式正确");
break;
} else {
System.out.println("身份证号格式不正确,请重新输入:");
continue;
}
}
//4.键盘录入手机号
String phoneNumber ;
while (true) {
System.out.println("请输入手机号:");
phoneNumber = sc.next();
boolean flag4 = checkPhoneNumber(phoneNumber);
if (flag4) {
System.out.println("手机号格式正确");
break;
} else {
System.out.println("手机号格式不正确,请重新输入:");
continue;
}
}
//将用户对象添加到集合中
User1 user1 = new User1(username, password, personID, phoneNumber);
list.add(user1);
System.out.println("注册成功");
}
2.登录
1.检查用户名和密码是否正确
private static boolean checkUserInfo(User1 userInfo, ArrayList<User1> list) {
//遍历集合,判断用户是否存在,如果不存在登陆失败
for (int i = 0; i < list.size(); i++) {
User1 user = list.get(i);
if (user.getUsername().equals(userInfo.getUsername()) && user.getPassword().
equals(userInfo.getPassword())) {
return true;
}
}
return false;
}
2.生成随机验证码
public static String getRandomCode() {
//1.创建一个集合添加所有的大写字母和小写字母
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();
//2.随机抽取4个字母
Random r = new Random();
String code = "";
for (int i = 0; i < 4; i++) {
//获取随机索引
int index = r.nextInt(list.size());
//获取随机字符
char c = list.get(index);
//添加到字符串中
sb.append(c);
}
//3.把一个随机数字添加到末尾
int number = r.nextInt(10);
sb.append(number);
//4.如果我们要修改字符串中的内容
//先把字符串变成字符数组,在数组中修改,然后把字符数组变成字符串
char[] chars = sb.toString().toCharArray();
//拿着最后一个索引,跟随机索引进行交换
int index2 = r.nextInt(chars.length);
char temp = chars[index2];
chars[index2] = chars[chars.length - 1];
chars[chars.length - 1] = temp;
//5.把字符数组变成字符串
String result = new String(chars);
return result;
}
登录完整代码
private static void login(ArrayList<User1> list) {
System.out.println("登录");
Scanner sc = new Scanner(System.in);
//1.键盘录入用户名
while (true) {
System.out.println("请输入用户名:");
String username = sc.next();
//判断用户名是否存在
boolean result = checkUsernameIsExist(username, list);
if (!result) {
System.out.println("用户名"+username+"不存在,请先注册再登录");
return;
}
//2.输入密码和验证码
System.out.println("请输入密码:");
String password = sc.next();
while (true) {
//输入验证码
String rightcode = getRandomCode();
System.out.println("验证码:"+rightcode);
System.out.println("请输入验证码:");
String code = sc.next();
//比较验证码
String randomCode = getRandomCode();
if (code.equalsIgnoreCase(rightcode)) {
System.out.println("验证码正确");
break;
} else {
System.out.println("验证码错误");
return;
}
}
//3.判断用户名和密码是否正确
//封装思想的应用:
//我们把一些零散的数据,封装成一个对象
//以后传递参数的时候,只要传递一个整体就可以了,不需要管这些零散的数据
User1 userInfo = new User1(username, password,null,null);
if (checkUserInfo(userInfo, list)) {
System.out.println("登录成功,欢迎使用学生管理系统");
} else {
System.out.println("用户名或密码错误");
}
}
}
3.忘记密码
1.根据用户名和身份证号和手机号查找用户的索引
private static int findUserIndex(String username, ArrayList<User1> list) {
for (int i = 0; i < list.size(); i++) {
User1 user = list.get(i);
if (user.getUsername().equals(username)) {
return i;
}
}
return -1;
}
2.忘记密码整体代码
private static void forgetPassword(ArrayList<User1> list) {
System.out.println("忘记密码");
Scanner sc = new Scanner(System.in);
System.out.println("请输入用户名:");
String username = sc.next();
boolean flag = checkUsernameIsExist(username, list);
if (!flag) {
System.out.println("用户名"+username+"不存在,请先注册再登录");
return;
}
System.out.println("请输入身份证号:");
String personID = sc.next();
System.out.println("请输入手机号:");
String phoneNumber = sc.next();
//比较用户名和身份证号和手机号是否正确
int index = findUserIndex(username, list);
User1 user = list.get(index);
if (user.getPhoneNumber().equals(phoneNumber) && user.getPersonID().equalsIgnoreCase(personID)) {
System.out.println("用户名或身份证号或手机号错误");
return;
}
//修改密码
String password;
while (true) {
System.out.println("请输入新密码:");
password = sc.next();
System.out.println("请再次输入新密码:");
String password2 = sc.next();
if (password.equals(password2)) {
System.out.println("两次密码一致,修改成功");
break;
} else {
System.out.println("密码输入错误,请重新输入:");
continue;
}
}
//修改密码
user.setPassword(password);
System.out.println("密码修改成功");
}
3.测试类完整代码
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;
public class StudentUpdate {
public static void main(String[] args) {
//1.登录界面
System.out.println("欢迎使用学生管理系统");
System.out.println("请选择操作:1.登录 2.注册 3.忘记密码 4.退出");
ArrayList<User1> list = new ArrayList<>();
Scanner sc = new Scanner(System.in);
String choose = sc.next();
while (true) {
switch (choose) {
case "1":
login(list);
break;
case "2":
register(list);
break;
case "3":
forgetPassword(list);
break;
case "4":
System.out.println("退出系统");
System.exit(0);
default:
System.out.println("输入有误");
}
//重新获取输入
System.out.println("请选择操作:1.登录 2.注册 3.忘记密码 4.退出");
choose = sc.next();
}
}
//注册
public static void register(ArrayList<User1> list) {
System.out.println("注册");
User1 user = new User1();
//1.键盘录入用户名
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 = checkUsernameIsExist(username, list);
if (flag2) {
//用户名已存在
System.out.println("用户名"+username+"已经存在,请重新输入:");
} else {
//不存在,可用
System.out.println("用户名"+username+"可以使用");
}
break;
}
//2.键盘录入密码
String password ;
while (true) {
System.out.println("请输入密码:");
password = sc.next();
System.out.println("请再次输入密码:");
String password2 = sc.next();
if (password.equals(password2)) {
System.out.println("密码输入正确");
break;
} else {
System.out.println("密码输入错误,请重新输入:");
continue;
}
}
//3.键盘录入身份证号
String personID ;
while (true) {
System.out.println("请输入身份证号:");
personID = sc.next();
boolean flag3 = checkPersonID(personID);
if (flag3) {
System.out.println("身份证号格式正确");
break;
} else {
System.out.println("身份证号格式不正确,请重新输入:");
continue;
}
}
//4.键盘录入手机号
String phoneNumber ;
while (true) {
System.out.println("请输入手机号:");
phoneNumber = sc.next();
boolean flag4 = checkPhoneNumber(phoneNumber);
if (flag4) {
System.out.println("手机号格式正确");
break;
} else {
System.out.println("手机号格式不正确,请重新输入:");
continue;
}
}
//将用户对象添加到集合中
User1 user1 = new User1(username, password, personID, phoneNumber);
list.add(user1);
System.out.println("注册成功");
}
//检查用户名格式是否正确
private static boolean checkUsername (String username){
//用户名必须是3-15位的数字和字母
int length = username.length();
if (length < 3 || length > 15) {
System.out.println("用户名必须是5-15位的数字和字母");
return false;
}
//用户名必须是数字和字母组成
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++;
break;
}
}
//用户名满足要求
return count > 0;
}
//检查用户名是否唯一
private static boolean checkUsernameIsExist(String username, ArrayList<User1> list) {
//遍历集合,获取每一个用户名,和输入的用户名进行比较
for (int i = 0; i < list.size(); i++) {
User1 user = list.get(i);
String name = user.getUsername();
if (name.equals(username)) {
return true;
}
}
return false;
}
//检查身份证号格式是否正确
private static boolean checkPersonID(String personID) {
//身份证号必须是18位的数字和字母
int length = personID.length();
if (length != 18) {
System.out.println("身份证号必须是18位的数字和字母");
return false;
}
//不能以0开头
if (personID.startsWith("0")) {
System.out.println("身份证号不能以0开头");
return false;
}
//前17位必须是数字
for (int i = 0; i < personID.length() - 1; i++) {
char c = personID.charAt(i);
if (!(c >= '0' && c <= '9')) {
System.out.println("身份证号前17位必须是数字");
return false;
}
}
//最后一位可以是数字或者大写X或者小写x
char c = personID.charAt(personID.length() - 1);
if ((c >= '0' && c <= '9') || (c == 'X') || (c =='x')) {
return true;
} else {
return false;
}
}
//检查手机号格式是否正确
private static boolean checkPhoneNumber(String phoneNumber) {
//手机号必须是11位的数字
int length = phoneNumber.length();
if (length!= 11) {
System.out.println("手机号必须是11位的数字");
return false;
}
//不能以0开头
if (phoneNumber.startsWith("0")) {
System.out.println("手机号不能以0开头");
return false;
} else {
return true;
}
}
//登录
private static void login(ArrayList<User1> list) {
System.out.println("登录");
Scanner sc = new Scanner(System.in);
//1.键盘录入用户名
while (true) {
System.out.println("请输入用户名:");
String username = sc.next();
//判断用户名是否存在
boolean result = checkUsernameIsExist(username, list);
if (!result) {
System.out.println("用户名"+username+"不存在,请先注册再登录");
return;
}
//2.输入密码和验证码
System.out.println("请输入密码:");
String password = sc.next();
while (true) {
//输入验证码
String rightcode = getRandomCode();
System.out.println("验证码:"+rightcode);
System.out.println("请输入验证码:");
String code = sc.next();
//比较验证码
String randomCode = getRandomCode();
if (code.equalsIgnoreCase(rightcode)) {
System.out.println("验证码正确");
break;
} else {
System.out.println("验证码错误");
return;
}
}
//3.判断用户名和密码是否正确
//封装思想的应用:
//我们把一些零散的数据,封装成一个对象
//以后传递参数的时候,只要传递一个整体就可以了,不需要管这些零散的数据
User1 userInfo = new User1(username, password,null,null);
if (checkUserInfo(userInfo, list)) {
System.out.println("登录成功,欢迎使用学生管理系统");
} else {
System.out.println("用户名或密码错误");
}
}
}
//检查用户名和密码是否正确
private static boolean checkUserInfo(User1 userInfo, ArrayList<User1> list) {
//遍历集合,判断用户是否存在,如果不存在登陆失败
for (int i = 0; i < list.size(); i++) {
User1 user = list.get(i);
if (user.getUsername().equals(userInfo.getUsername()) && user.getPassword().
equals(userInfo.getPassword())) {
return true;
}
}
return false;
}
//生成随机验证码
public static String getRandomCode() {
//1.创建一个集合添加所有的大写字母和小写字母
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();
//2.随机抽取4个字母
Random r = new Random();
String code = "";
for (int i = 0; i < 4; i++) {
//获取随机索引
int index = r.nextInt(list.size());
//获取随机字符
char c = list.get(index);
//添加到字符串中
sb.append(c);
}
//3.把一个随机数字添加到末尾
int number = r.nextInt(10);
sb.append(number);
//4.如果我们要修改字符串中的内容
//先把字符串变成字符数组,在数组中修改,然后把字符数组变成字符串
char[] chars = sb.toString().toCharArray();
//拿着最后一个索引,跟随机索引进行交换
int index2 = r.nextInt(chars.length);
char temp = chars[index2];
chars[index2] = chars[chars.length - 1];
chars[chars.length - 1] = temp;
//5.把字符数组变成字符串
String result = new String(chars);
return result;
}
//忘记密码
private static void forgetPassword(ArrayList<User1> list) {
System.out.println("忘记密码");
Scanner sc = new Scanner(System.in);
System.out.println("请输入用户名:");
String username = sc.next();
boolean flag = checkUsernameIsExist(username, list);
if (!flag) {
System.out.println("用户名"+username+"不存在,请先注册再登录");
return;
}
System.out.println("请输入身份证号:");
String personID = sc.next();
System.out.println("请输入手机号:");
String phoneNumber = sc.next();
//比较用户名和身份证号和手机号是否正确
int index = findUserIndex(username, list);
User1 user = list.get(index);
if (user.getPhoneNumber().equals(phoneNumber) && user.getPersonID().equalsIgnoreCase(personID)) {
System.out.println("用户名或身份证号或手机号错误");
return;
}
//修改密码
String password;
while (true) {
System.out.println("请输入新密码:");
password = sc.next();
System.out.println("请再次输入新密码:");
String password2 = sc.next();
if (password.equals(password2)) {
System.out.println("两次密码一致,修改成功");
break;
} else {
System.out.println("密码输入错误,请重新输入:");
continue;
}
}
//修改密码
user.setPassword(password);
System.out.println("密码修改成功");
}
//根据用户名和身份证号和手机号查找用户的索引
private static int findUserIndex(String username, ArrayList<User1> list) {
for (int i = 0; i < list.size(); i++) {
User1 user = list.get(i);
if (user.getUsername().equals(username)) {
return i;
}
}
return -1;
}
}
3.总结思考
1.总体框架
这个其实比较好思考,switch直接分几个板块,然后再分别写方法类。
难的是具体代码的实现,需要用到的条件判断,关系语句,还有各种循环嵌套。
尤其是continue,break,return各自运用的时候。(是的,总踩坑。)
while(true)一定要记得break,否则下面的代码就会报错。(无法到达此语句)
2.具体细节
调用的API必须明白同类不同名之间的不同,比如equals和另外一个不区分大小写的。
心里必须清楚自己所命名的各个变量表示的真实含义,比较做判断的时候避免误用。
条件语句中,重要的是字符之间的表现形式:都是数字,必须有字母,大小写什么的。
想结束后能重新输入,就需要用到while(true)。
循环结束后才能进行判断的,需要在循环外返回。
flag作为判断值,要自己弄明白true和false各具体代表什么,不同板块需要换不同的名称表示判断值。
还有,方法类中不要加输出语句。(痛)
3.最后
总之就是多动脑。
写不出来就画个图,然后想想每个变量之间的联系。
每个代码块感觉可以变成简单的算法题,所以又拆开复制了一遍。
其实每个大的系统都是由这种基础的代码块拼凑成的。
(终于搞完了,谢天谢地)