1 整体框架
2 初级版
学生类属性:
package com.bjpowernode;
import java.util.ArrayList;
import java.util.Scanner;
public class StudentSystem {
public static void main(String[] args) {
//创建集合 保存学生信息
ArrayList<Student> list = 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 choose = sc.next();
switch (choose){
case "1":
addStuudent(list);
break;
case "2":
delectStuudent(list);
break;
case "3":
updateStuudent(list);
break;
case "4":
queryStuudent(list);
break;
case "5":
System.out.println("已经退出");
// break; // break 只会退出单层 switch,不会退出 while
//break loop;
System.exit(0); //停止虚拟机运行
default:
System.out.println("没有这个选项");
}
}
}
//添加学生
public static void addStuudent(ArrayList<Student> list){
//创建学生对象
Student stu = new Student();
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("请输入学生的 id:");
String id = sc.next();
//判断 id 的唯一性 抽成方法
boolean flag = contains(list,id);
if(flag){ //id 不存在
stu.setId(id);
break;
} else { //已经存在,重 新录入
System.out.println("ID已经存在,请重新输入");
}
}
System.out.println("请输入学生的姓名:");
String name = sc.next();
stu.setName(name);
System.out.println("请输入学生的年龄:");
int age = sc.nextInt();
stu.setAge(age);
System.out.println("请输入学生的家庭住址:");
String address = sc.next();
stu.setAddress(address);
//再把学生对象添加到集合中
list.add(stu);
//提示用户
System.out.println("学生信息添加成功");
}
//删除学生
public static void delectStuudent(ArrayList<Student> list){
Scanner sc = new Scanner(System.in);
System.out.println("请输入要删除的学生的 id:");
String id = sc.next();
// 判断 id 是否存在,如果存在,还需要拿到 id 对应的索引,方便删除
int index = getIndex(list, id);
if(index == -1){ //id 不存在
System.out.println("ID 不存在,删除失败");
return;
} else {
list.remove(index); //集合的 remove() 删除方法
System.out.println("ID 为:" + id + "的学生删除成功");
}
}
//修改学生
public static void updateStuudent(ArrayList<Student> list){
Scanner sc = new Scanner(System.in);
System.out.println("请输入要修改学生信息的ID:");
String id = sc.next();
int index = getIndex(list, id);
if(index != -1){ //学生存在,需要修改 ID
//获取要修改的学生对象
Student stu = list.get(index);
System.out.println("请输入要修改的学生姓名");
String newName = sc.next();
stu.setName(newName);
System.out.println("请输入要修改的学生年龄");
int newAge = sc.nextInt();
stu.setAge(newAge);
System.out.println("请输入要修改的学生住址");
String newAddress = sc.next();
stu.setAddress(newAddress);
System.out.println("学生信息修改成功");
} else {
System.out.println("要修改的 ID" + id + "不存在,请重新输入");
return;
}
}
//查询学生
public static void queryStuudent(ArrayList<Student> list){
if(list.size() == 0){
System.out.println("当前无学生信息,请添加后再查询");
return;
}
System.out.println("id\t\t姓名\t年龄\t家庭住址");
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i).getId() + "\t" + list.get(i).getName() + "\t" +
list.get(i).getAge() + "\t" + list.get(i).getAddress());
}
}
//获取 ID 的索引
public static int getIndex(ArrayList<Student> list, String id){
for (int i = 0; i < list.size(); i++) {
if(id.equals(list.get(i).getId())){ //ID存在
return i; //返回索引
}
}
return -1;
}
//判断 ID 在集合中是否存在
public static boolean contains(ArrayList<Student> list, String id){
// 这段 for 循环和 getIndex 方法内重复,可以调用 getIndex()
// for (int i = 0; i < list.size(); i++) {
// if(id.equals(list.get(i).getId())){ //id重复
// return false;
// }
// }
// return true;
//调用 getIndex() !!
if(getIndex(list,id) == -1){ //id 不存在
return true;
} else {
return false;
}
}
}
3 升级版
用户类属性:
package com.bjpowernode;
import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;
public class StudentSystem {
public static void main(String[] args) {
//创建用户集合 保存用户信息
ArrayList<User> userList = new ArrayList<>();
//创建集合 保存学生信息
ArrayList<Student> list = new ArrayList<>();
Scanner sc = new Scanner(System.in); //创建对象可以移到循环外边,没有必要反复创建
while (true) {
System.out.println("----------------欢迎来到学生管理系统----------------");
System.out.println("请选择操作:1登录 2注册 3忘记密码 4退出");
String select = sc.next();
switch (select){
case "1":
//先登录
boolean flag = login(userList); //为真则登录成功,跳转学生界面
if(flag) {
menu(list);
}
//登录成功进菜单
break;
case "2":
///注册
register(userList);
break;
case "3":
//修改密码
updatePasswprd(userList);
break;
case "4":
System.exit(0);
default:
System.out.println("没有这个选项");
}
}
}
//菜单
public static void menu(ArrayList<Student> list){
Scanner sc = new Scanner(System.in);
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("请输入您的选择: ");
String choose = sc.next();
switch (choose){
case "1":
addStuudent(list);
break;
case "2":
delectStuudent(list);
break;
case "3":
updateStuudent(list);
break;
case "4":
queryStuudent(list);
break;
case "5":
System.out.println("已经退出");
// break; // break 只会退出单层 switch,不会退出 while
//break loop;
System.exit(0); //停止虚拟机运行
default:
System.out.println("没有这个选项");
}
}
}
//添加学生
public static void addStuudent(ArrayList<Student> list){
//创建学生对象
Student stu = new Student();
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("请输入学生的 id:");
String id = sc.next();
//判断 id 的唯一性 抽成方法
boolean flag = contains(list,id);
if(flag){ //id 不存在
stu.setId(id);
break;
} else { //已经存在,重 新录入
System.out.println("ID已经存在,请重新输入");
}
}
System.out.println("请输入学生的姓名:");
String name = sc.next();
stu.setName(name);
System.out.println("请输入学生的年龄:");
int age = sc.nextInt();
stu.setAge(age);
System.out.println("请输入学生的家庭住址:");
String address = sc.next();
stu.setAddress(address);
//再把学生对象添加到集合中
list.add(stu);
//提示用户
System.out.println("学生信息添加成功");
}
//删除学生
public static void delectStuudent(ArrayList<Student> list){
Scanner sc = new Scanner(System.in);
System.out.println("请输入要删除的学生的 id:");
String id = sc.next();
// 判断 id 是否存在,如果存在,还需要拿到 id 对应的索引,方便删除
int index = getIndex(list, id);
if(index == -1){ //id 不存在
System.out.println("ID 不存在,删除失败");
return;
} else {
list.remove(index); //集合的 remove() 删除方法
System.out.println("ID 为:" + id + "的学生删除成功");
}
}
//修改学生
public static void updateStuudent(ArrayList<Student> list){
Scanner sc = new Scanner(System.in);
System.out.println("请输入要修改学生信息的ID:");
String id = sc.next();
int index = getIndex(list, id);
if(index != -1){ //学生存在,需要修改 ID
//获取要修改的学生对象
Student stu = list.get(index);
System.out.println("请输入要修改的学生姓名");
String newName = sc.next();
stu.setName(newName);
System.out.println("请输入要修改的学生年龄");
int newAge = sc.nextInt();
stu.setAge(newAge);
System.out.println("请输入要修改的学生住址");
String newAddress = sc.next();
stu.setAddress(newAddress);
System.out.println("学生信息修改成功");
} else {
System.out.println("要修改的 ID" + id + "不存在,请重新输入");
return;
}
}
//查询学生
public static void queryStuudent(ArrayList<Student> list){
if(list.size() == 0){
System.out.println("当前无学生信息,请添加后再查询");
return;
}
System.out.println("id\t\t姓名\t年龄\t家庭住址");
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i).getId() + "\t" + list.get(i).getName() + "\t" +
list.get(i).getAge() + "\t" + list.get(i).getAddress());
}
}
//登录
public static boolean login(ArrayList<User> userList){
Scanner sc = new Scanner(System.in);
System.out.println("请输入用户名");
String name = sc.next();
//判度用户名是否注册 判度唯一性
boolean flagName = containsUser(userList, name);
if(flagName){ //不存在返回 true
System.out.println("用户名未注册,请先注册");
return false;
}
//验证密码
for (int i = 0; i < 3; i++) {
boolean flag = true;
System.out.println("请输入密码");
String password = sc.next();
//判度密码是否输入正确
//返回用户名对应的索引
int index = getIndexUser(userList, name);
if(!password.equals(userList.get(index).getPassword())){ //密码正确
flag = false;
}
//验证验证码
System.out.println("验证码为");
String rightYzm = randomNunber(); //生成验证码
System.out.println(rightYzm);
System.out.println("请输入验证码:");
String yzm = sc.next();
if(!yzm.equals(rightYzm)){ // 字符串对象
flag = false;
}
if(flag){
System.out.println("登录成功");
break;
} else {
System.out.println("密码或者验证码有误,请重新输入");
}
}
return true;
}
//注册
public static void register(ArrayList<User> userList){
//创建用户对象
User user = new User();
Scanner sc = new Scanner(System.in);
//验证用户名
while (true) {
System.out.println("请输入用户名:");
String name = sc.next();
//要对用户名做一些判断,才可以存入用户对象
//判断唯一性
boolean flag = judgeUsername(userList, name);
if(flag){ //用户名没有重复
user.setUsername(name);
break;
} else {
System.out.println("用户名输入错误,请重新输入");
}
}
//验证密码
while (true) {
System.out.println("请输入密码:");
String password1 = sc.next();
System.out.println("请再次输入密码:");
String password2 = sc.next();
if(password1.equals(password2)){ //一样 则密码正确
user.setPassword(password1);
break;
} else {
System.out.println("两次密码输入不一致,请重新输入");
}
}
//验证身份证号
while (true) {
System.out.println("请输入身份证号:");
String ID = sc.next();
//判度身份证是否符合要求
boolean flagID = judgeID(ID);
if(flagID){ //符合要求
user.setID(ID);
break;
} else {
System.out.println("身份证输入有误,请重新输入");
}
}
//验证手机号
while (true) {
System.out.println("请输入手机号:");
String phone = sc.next();
//判度手机号是否符合要求
boolean flagPhone = judgePhone(phone);
if(flagPhone){
user.setPhone(phone);
break;
} else {
System.out.println("手机号输入有误,请重新输入");
}
}
//将用户对象添加进集合中
userList.add(user);
//注册成功
System.out.println("注册成功");
}
//修改密码
public static void updatePasswprd(ArrayList<User> userList){
Scanner sc = new Scanner(System.in);
System.out.println("请输入用户名");
String name = sc.next();
//判度用户名是否注册 判度唯一性
boolean flagName = containsUser(userList, name);
if(flagName){ //不存在返回 true
System.out.println("用户名未注册,请先注册");
return;
}
//获取用户对应的索引号
int index = getIndexUser(userList, name);
System.out.println("请输入身份证号");
String id = sc.next();
System.out.println("请输入手机号");
String phone = sc.next();
if(id.equals(userList.get(index).getID()) && phone.equals(userList.get(index).getPhone())){
//可以修改密码
System.out.println("请输入新密码:");
String newPasswprd = sc.next();
User u1 = new User();
u1.setUsername(name);
u1.setID(id);
u1.setPhone(phone);
u1.setPassword(newPasswprd);
userList.set(index, u1); //这个集合添加的只能是对象
System.out.println("修改成功");
} else {
System.out.println("账号信息不匹配,修改失败");
}
}
//获取 用户类 对应 的索引
public static int getIndexUser(ArrayList<User> userList, String name){
for (int i = 0; i < userList.size(); i++) {
if(name.equals(userList.get(i).getUsername())){ //ID存在
return i; //返回索引
}
}
return -1;
}
//判断 用户类 是否唯一
public static boolean containsUser(ArrayList<User> list, String name){
if(getIndexUser(list,name) == -1){ //id 不存在
return true;
} else {
return false;
}
}
//获取 学生类 的索引
public static int getIndex(ArrayList<Student> list, String id){
for (int i = 0; i < list.size(); i++) {
if(id.equals(list.get(i).getId())){ //ID存在
return i; //返回索引
}
}
return -1;
}
//判断 学生类内 是否存在 可以判度一切 String 类型
public static boolean contains(ArrayList<Student> list, String id){
//调用 getIndex() !!
if(getIndex(list,id) == -1){ //id 不存在
return true;
} else {
return false;
}
}
// 验证用户名 验证要求:
//用户名唯一、用户名长度必须在3~15位之间、只能是字母加数字的组合,但是不能是纯数字
public static boolean judgeUsername(ArrayList<User> userList, String name){
//判度长度
boolean flag2 = false;
int len = name.length();
if(len >= 3 && len <= 15){
flag2 = true;
}
//只能是字母加数字的组合,不能是纯数字
boolean flag3 = judgeUsernameLN(name);
//判断唯一性
boolean flag = containsUser(userList, name);
if(flag && flag2 && flag3){
return true;
} else {
return false;
}
}
//判度用户名是不是字母加数字的组合
public static boolean judgeUsernameLN(String name){
int num = 0;
int c = 0;
for (int i = 0; i < name.length(); i++) {
if((name.charAt(i) >= '0' && name.charAt(i) <= '9') ||
(name.charAt(i) >= 'a' && name.charAt(i) <= 'z') ||
(name.charAt(i) >= 'A' && name.charAt(i) <= 'Z')){ //是字母或者数字
if((name.charAt(i) >= '0' && name.charAt(i) <= '9') ){
num++; //是数字,num++
} else {
c++; //是字母,c++
}
} else { //不是字母也不是数字
return false;
}
}
if(num != 0 && c != 0){
return true; //有字母有数字
} else {
return false; //只有字母或者只有数字
}
}
//判度身份证号是否合法
public static boolean judgeID(String ID){
if(ID.length() != 18){
return false;
}
if(ID.charAt(0) == '0'){
return false;
}
for (int i = 0; i < ID.length(); i++) {
if(i == ID.length() -1){
if((ID.charAt(i) >= '0' && ID.charAt(i) <= '9') || ID.charAt(i) == 'x'
|| ID.charAt(i) == 'X'){
return true;
} else {
return false;
}
}
if(ID.charAt(i) >= '0' && ID.charAt(i) <= '9'){
continue;
} else {
return false;
}
}
return true;
}
//判断手机号是否合法
public static boolean judgePhone(String phone){
if(phone.length() != 11){
return false;
}
if(phone.charAt(0) == '0'){
return false;
}
for (int i = 0; i < phone.length(); i++) {
if(phone.charAt(i) >= '0' && phone.charAt(i) <= '9'){
continue;
} else {
return false;
}
}
return true;
}
//生成一个五位数的验证码并返回
public static String randomNunber(){
//随机生成一个验证码 可以抽成一个方法
String[] str = new String[5];
String[] a = {"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z",
"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"};
String [] b ={"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"};
//先在0-4随机生成一个下标来保存一位数字
Random r1 = new Random(); //随机生成一个保存数字的下标
int indexNumber = r1.nextInt(5);
int indexNumber_b = r1.nextInt(10);
str[indexNumber] = b[indexNumber_b];
for (int i = 0; i < 5; i++) {
if(i == indexNumber) continue;
Random r = new Random();
int index = r.nextInt(52);
str[i] = a[index];
}
String rightYzm = "";
for (int i = 0; i < str.length; i++) {
rightYzm = rightYzm + str[i]; //字符串数组转成字符串,方便比较
}
return rightYzm;
}
}
运行结果
3.1 注册
3.2 登录
3.3 修改密码
4 小的开发细节
4.1 校验
先验证格式是否正确,再验证是否唯一
因为在以后所有的数据,都是存在数据库中,如果我们要校验,需要使用到网络资源。
4.2 会两次调用方法
两次调用 length() 方法,可以事先将 length 先保存一下
if(name.length() >= 3 && name.length() <= 15){
flag2 = true;
}
改写为:
int len = name.length();
if(len >= 3 && len) <= 15){
flag2 = true;
}
4.3 通过集合自动添加所有大小写字母
String[] a = {"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z",
"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"};
可以改为:
//创建一个集合添加所有的大小写字母
ArrayList<Character> a = new ArrayList<>();
for (int i = 0; i < 26; i++) {
a.add((char)('a' + i)); // 'a' + 0 = 97 强转成字符 还是 a
a.add((char)('A' + i));
}
4.4 黑马的随机生成验证码
随机生成 3 次验证码
要求:
- 长度为5
- 由4位大写或者小写字母和1位数字组成,同一个字母可重复
- 数字可以出现在任意位置
package com.bjpowernode;
import java.util.ArrayList;
import java.util.Random;
public class GetCode {
public static void main(String[] args) {
for (int i = 0; i < 3; i++) {
String str = getCode();
System.out.println(str);
}
}
public 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); //最后再创建一个新的字符串,把 arr 传入 !!
}
}
4.5 封装思想在传参时的应用
封装思想的应用:
我们可以把一些零散的数据,封装成一个对象,进行传参
以后传递参数的时候,只要传递一个整体就可以了,不需要管这些零散的数据。
//验证用户名和密码是否正确
1/集合中是否包含用户名和密码
1/定义一个方法验证用户名和密码是否正确
//封装思想的应用:
//我们可以把一些零散的数据,封装成一个对象
//以后传递参数的时候,只要传递一个整体就可以了,不需要管这些零散的数据。
User useInfo = new User(username,password, personlD: null, phoneNumber: null);
boolean result = checkUserInfo(useInfo);
参考链接: