25.text--学生管理系统
学生管理系统
一、登录界面
1.需求文档
需求:为学生管理系统书写一个登陆、注册、忘记密码的功能
只有用户登录成功之后,才能进入到学生管理系统中进行增删改查操作
分析:登录界面:“欢迎来到学生管理系统!”
“请选择操作1.登录,2.注册,3.忘记密码”
用户类:属性有,用户名、密码、身份证号码、手机号码
注册功能:1.用户名需要满足以下要求:1.用户名唯一
2.用户名长度必须在3~15位之间
3.只能是字母加数字的组合,但是不能是纯数字
2.密码键盘输入两次,两次一致才可以进行注册
3.身份证号码需要满足以下要求:1.长度为18位
2.不能为0开头
3.前17位,必须都是数字
4.最后一位可以是数字,也可以是大写X或者小写x
4.手机号需要满足以下要求:1.长度为11位
2.不能为0开头
3.必须都是数字
登录功能:1.键盘录入用户名
2.键盘录入密码
3.键盘录入验证码
4.验证要求:用户名如果未注册,直接结束方法,并提示:用户名未注册,请先注册
判断验证码是否正确,如不正确,重新输入
再判断用户名和密码是否正确,有3次机会
忘记密码:1.键盘录入用户名,判断当前用户名是否存在,如不存在,直接结束方法,并提示:未注册
2.键盘录入身份证号码和手机号码
3.判断当前用户的身份证号码和手机号码是否一致,如果一致,则提示输入密码,进行修改,
如果不一致,则提示:账号信息不匹配,修改失败
验证码规则:长度为5,由4位大写或者小写字母和1位数字组成,同一个字母可重复,数字可以出现在任意位置
2.JavaBean
public class User {
private String name;
private String password;
private String ID;
private String phoneNum;
public User() {
}
public User(String name, String password, String ID, String phoneNum) {
this.name = name;
this.password = password;
this.ID = ID;
this.phoneNum = phoneNum;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getID() {
return ID;
}
public void setID(String ID) {
this.ID = ID;
}
public String getPhoneNum() {
return phoneNum;
}
public void setPhoneNum(String phoneNum) {
this.phoneNum = phoneNum;
}
}
3.测试类
public class UserTest {
public static void main(String[] args) {
//创建集合
ArrayList<User> list = new ArrayList<>();
while (true) {
System.out.println("-------------欢迎来到学生管理系统登录界面!-------------");
System.out.println("请选择操作:1.登录,2.注册,3.忘记密码,4.退出");
//键盘录入选择
Scanner s = new Scanner(System.in);
String choose = s.next();
switch (choose){
case "1":
login(list);
break;
case "2":
register(list);
break;
case "3":
forgetPW(list);
break;
case "4":
System.out.println("退出!");
return;
default:
System.out.println("没有这个选项!");
break;
}
}
}
//登录功能
private static void login(ArrayList<User> list){
Scanner s = new Scanner(System.in);
//------------------------------1.键盘录入用户名并验证-----------------------------
System.out.println("请输入用户名:");
String username = s.next();
//判断集合中是否为空,若为空直接提示未注册
if(list.size() == 0){
System.out.println("用户名未注册,请先注册!");
}
//验证是否在集合中存在,即是否注册
for (int i = 0; i < list.size(); i++) {
User user = list.get(i);
if(!(username.equals(user.getName()))){
//不存在,直接结束方法
System.out.println("用户名未注册,请先注册!");
return;
}else{
//存在,继续录入和判断验证码和密码
//------------------------------2.键盘录入密码并验证,键盘录入验证码并验证------------------------------
String password = user.getPassword();
for (int i1 = 0; i1 < 3; i1++) {
boolean flag = matchLogin(password);
if(flag){
System.out.println("登录成功!");
StudentTest ss = new StudentTest();
ss.startStudentSystem();
break;
}else{
System.out.println("你还有" + (2-i1) + "次机会!");
}
}
}
}
}
//注册功能
private static void register(ArrayList<User> list){
User user = new User();
Scanner s = new Scanner(System.in);
//------------------------------1.用户名验证------------------------------
while (true) {
//键盘录入用户名username
System.out.println("请输入用户名:");
String username = s.next();
//判断长度是否符合要求 3~15
if(username.length() >= 3 && username.length() <= 15){
//判断username的格式是否正确
boolean flag = adequateName(username);
if(flag){
//调用方法进行判断唯一性
int index = getIndex(list, username);
if(index == -1){
//-1代表不存在,可以存入
System.out.println("用户名输入成功!");
user.setName(username);
break;
}else{
//不等于-1代表已存在,不能存入,需要重新输入
System.out.println("用户名已存在,请重新输入!");
}
}else{
System.out.println("用户名输入错误,请重新输入!");
}
}else{
System.out.println("用户名长度有误,请重新输入!");
}
}
//------------------------------2.密码验证------------------------------
System.out.println("接下来进行密码校验!");
while (true) {
System.out.println("请输入密码:");
String firstPW = s.next();
System.out.println("请再次输入密码:");
String secondPW = s.next();
if(secondPW.equals(firstPW)){
user.setPassword(firstPW);
System.out.println("密码设置成功!");
break;
}else{
System.out.println("第二次输入的密码与第一次不一致,请重新输入!");
}
}
//------------------------------3.身份证验证------------------------------
System.out.println("请进行身份证校验!");
while (true) {
System.out.println("请输入身份证:");
String userID = s.next();
boolean flag = adequateID(userID);
if(flag){
user.setID(userID);
System.out.println("身份证验证成功!");
break;
}else {
System.out.println("身份证格式有误,请重新输入!");
}
}
//------------------------------4.手机号验证------------------------------
System.out.println("进行手机号码验证!");
while (true) {
System.out.println("请输入手机号码:");
String userPhone = s.next();
boolean flag = adequatePhoneNum(userPhone);
if(flag){
user.setPhoneNum(userPhone);
System.out.println("手机号验证成功!");
break;
}else {
System.out.println("手机号格式有误,请重新输入!");
}
}
//------------------------------所有验证完成后,存入集合中------------------------------
System.out.println("注册成功!");
list.add(user);
}
//忘记密码功能
private static void forgetPW(ArrayList<User> list){
Scanner s = new Scanner(System.in);
//------------------------------1.键盘录入用户名并验证-----------------------------
System.out.println("请输入用户名:");
String username = s.next();
//判断集合中是否为空,若为空直接提示未注册
if(list.size() == 0){
System.out.println("用户名未注册,请先注册!");
}
//验证是否在集合中存在,即是否注册
for (int i = 0; i < list.size(); i++) {
User user = list.get(i);
if (!(username.equals(user.getName()))) {
//不存在,直接结束方法
System.out.println("用户名未注册,请先注册!");
return;
} else {
//存在,调用方法判断身份证号码、手机号码
//------------------------------2.键盘录入密码并验证,键盘录入验证码并验证------------------------------
for (int i1 = 0; i1 < 3; i1++) {
boolean flag = matchForgetPW(user);
if(flag){
//返回true,即可修改密码
System.out.println("请输入新的密码:");
String novelPW = s.next();
user.setPassword(novelPW);
System.out.println("修改成功!");
break;
}else{
//返回false,即提示错误
System.out.println("账号信息不匹配,修改失败!");
System.out.println("你还有" + (2-i1) + "次机会!");
}
}
}
}
}
//判断方法,判断在集合中是否存在,若存在则返回索引,不存在则返回-1
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.getName();
if(name.equals(username)){
return i;
}
}
return -1;
}
//功能方法,判断注册时username是否符合要求
private static boolean adequateName(String username) { //adequate 满足要求的
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++;
}
if ( !((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9')) ) {
//如果有一个字符不在字母和数字中,那么当前用户名不符合要求,返回false
return false;
}
}
//在for循环判断个数,以保证每个字符都在格式要求内
if (count >= 1) {
//至少存在一个字母,返回true
return true;
}else {
//不存在至少一个字母,返回false
return false;
}
}
//功能方法,验证身份证号码,若通过验证则返回true,若不符合其中任何一项要求,则返回false
private static boolean adequateID(String userID){
//要求长度为18位
if(userID.length() != 18){
return false;
}
//不能以0为开头
if(userID.startsWith("0")){
return false;
}
//前17位必须都是数字
for (int i = 0; i < userID.length()-1; i++) {
char c = userID.charAt(i);
if(!(c >= '0' && c <= '9')){
return false;
}
}
//最后一位可以是数字也可以是大写X或小写x
char c = userID.charAt(17);
if( !((c >= '0' && c <= '9') || c == 'X' || c == 'x') ){
return false;
}
//当代码走到这里,证明符合要求
return true;
}
//功能方法,验证手机号码,若通过验证则返回true,若不符合其中任何一项要求,则返回false
private static boolean adequatePhoneNum(String userPhoneNum){
//要求长度为11位
if(userPhoneNum.length() != 11){
return false;
}
//不能以0为开头
if(userPhoneNum.startsWith("0")){
return false;
}
//必须都是数字
for (int i = 0; i < userPhoneNum.length(); i++) {
char c = userPhoneNum.charAt(i);
if(!(c >= '0' && c <= '9')){
return false;
}
}
//当代码走到这里,证明符合要求
return true;
}
//功能方法,验证键盘录入的验证码和密码是否正确匹配
private static boolean matchLogin(String password){
Scanner s = new Scanner(System.in);
//先录入密码进行验证
System.out.println("请输入密码:");
String userPW = s.next();
if(userPW.equals(password)){
System.out.println("密码验证成功!");
}else{
System.out.println("密码输入有误,请重新输入!");
return false;
}
//再录入验证码进行验证
String randomNums = getRandomNums();
System.out.println("验证码是" + randomNums);
System.out.println("请输入验证码:");
String userRandomNums = s.next();
if(userRandomNums.equals(randomNums)){
System.out.println("验证码验证成功!");
}else{
System.out.println("验证码输入有误,请重新输入!");
return false;
}
return true;
}
//功能方法,验证键盘录入的身份证号码和手机号码是否正确匹配
private static boolean matchForgetPW(User user){
Scanner s = new Scanner(System.in);
System.out.println("请输入身份证号码:");
String userID = s.next();
if( !(userID.equals(user.getID())) ){
//不匹配直接返回false
System.out.println("身份证号码输入有误,请重新输入!");
return false;
}
System.out.println("请输入手机号码:");
String userPhoneNums = s.next();
if( !(userPhoneNums.equals(user.getPhoneNum())) ){
//不匹配直接返回false
System.out.println("手机号码输入有误,请重新输入!");
return false;
}
return true;
}
//生成验证码
private static String getRandomNums(){
Random r = new Random();
StringBuilder sb = new StringBuilder();
//创建一个含有大小写字母的字符集合
ArrayList<Character> list = new ArrayList<>();
for (int i = 0; i < 26; i++) {
list.add((char)('a' + i));
list.add((char)('A' + i));
}
//在含有大小写的字符数组中随机抽取五个并添加到字符串中
for (int i = 0; i < 5; i++) {
int index = r.nextInt(list.size());
sb.append(list.get(index));
}
//获取一个随机数字,并转变为字符串形式
int randomNum = r.nextInt(10);
String str = randomNum + "";
//在已生成的全部是字母的字符串中,通过随机索引,替换一个字母为数字
int randomIndex = r.nextInt(5);
String result = sb.replace(randomIndex, randomIndex+1, str).toString();
return result;
}
}
二、系统界面
1.需求文档
需求:采用控制台的方式去书写学生管理系统
分析:初始菜单:------------------欢迎来到学生管理系统------------------
1.添加学生
2.删除学生
3.修改学生
4.查询学生
5.退出
请输入您的选择:
学生类:属性有,id、姓名、年龄、家庭住址
添加功能:键盘录入每一个学生信息并添加,需要满足以下要求:
> id唯一
删除功能:键盘录入要删除的学生id,需要满足以下要求:
> id存在删除
> id不存在,需要提示不存在,并回到初始菜单
修改功能:键盘录入要修改的学生id,需要满足以下要求:
> id存在,继续录入其他信息
> id不存在,需要提示不存在,并回到初始菜单
查询功能:打印所有的学生信息,需要满足以下要求
> 如果没有学生信息,提示:当前无学生信息,请添加后再查询
> 如果有学生信息,需要按照以下格式输出
id 姓名 年龄 家庭住址
heima001 张三 23 南京
heima002 李四 24 北京
heima003 王五 25 广州
2.JavaBean
public class Student {
private String id;
private String name;
private int age;
private String address;
public Student() {
}
public Student(String id, String name, int age, String address) {
this.id = id;
this.name = name;
this.age = age;
this.address = address;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
3.测试类
放的是我自己写的,比较有成就感
public class StudentTest {
public static void startStudentSystem() {
//实现键盘录入
Scanner s = new Scanner(System.in);
//将用户输入的数据存入集合中
ArrayList<Student> list = new ArrayList<>();
//4.用循环包裹,增加可用性
while (true) {
//1.先把初始菜单打印出来
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("请输入您的选择:");
//2.实现键盘录入选择
String choose = s.next();
//3.根据用户输入,选择方法
switch (choose){
//加入break以防穿透
case "1":
addStudent(list);
break;
case "2":
deleteStudent(list);
break;
case "3":
upsetStudent(list);
break;
case "4":
searchStudent(list);
break;
case "5":
System.out.println("退出!");
return;
default:
System.out.println("没有这个选项!");
}
}
//5.查询功能要求比较简单,先完成查询方法
//6.查询功能需要和添加功能共同测试,故接着完成添加功能
//7.完成删除功能
//8.完成修改功能
}
//添加功能
public static void addStudent(ArrayList<Student> list){
//键盘录入,实例化类
Scanner s = new Scanner(System.in);
Student stu = new Student();
//输入学生的各项信息
while (true) {
//调用方法进行唯一性的判断,包裹循环,若存在则重新输入
System.out.println("请输入学生的id:");
String id = s.next();
int index = getIndex(list,id);
if(index >= 0){
System.out.println("id已存在,请重新输入!");
}else{
stu.setId(id);
//正确输入后,结束循环
break;
}
}
System.out.println("请输入学生的姓名:");
stu.setName(s.next());
System.out.println("请输入学生的年龄:");
stu.setAge(s.nextInt());
System.out.println("请输入学生的家庭住址:");
stu.setAddress(s.next());
//将学生信息存放在集合中
list.add(stu);
//提示成功添加
System.out.println("学生信息添加成功!");
}
//删除功能
public static void deleteStudent(ArrayList<Student> list){
//键盘录入要删除的学生id
Scanner s = new Scanner(System.in);
System.out.println("请输入要删除的学生id:");
String id = s.next();
//调用判断方法,判断在集合中是否存在,若存在,根据索引删除
int index = getIndex(list,id);
if(index == -1){
//无索引,即不存在,提示错误
System.out.println("当前学生id不存在!");
//返回初始菜单
return;
}else{
//存在,执行删除操作
list.remove(index);
System.out.println("id为:" + id + "删除成功!");
}
}
//修改功能
public static void upsetStudent(ArrayList<Student> list){
//键盘录入要修改的学生id
Scanner s = new Scanner(System.in);
System.out.println("请输入要修改的学生id:");
String id = s.next();
//调用判断方法,判断在集合中是否存在,若存在,根据索引修改
int index = getIndex(list,id);
if(index == -1){
System.out.println("当前学生id不存在!");
return;
}else{
Student stu = list.get(index);
System.out.println("请输入修改后的姓名:");
stu.setName(s.next());
System.out.println("请输入修改后的年龄:");
stu.setAge(s.nextInt());
System.out.println("请输入修改后的家庭住址:");
stu.setAddress(s.next());
}
System.out.println("修改成功!");
}
//查询功能
public static void searchStudent(ArrayList<Student> list){
//先进行判断是否为空
if(list.size() == 0){
System.out.println("当前无学生信息,请添加后再查询!");
return;
}
//集合证明不为空,进行遍历
System.out.println("id\t\t姓名\t\t年龄\t\t家庭住址");
for (int i = 0; i < list.size(); i++) {
Student stu = list.get(i);
System.out.println(stu.getId() + "\t" + stu.getName() + "\t"
+ stu.getAge() + "\t" + stu.getAddress());
}
}
//判断id在集合中是否存在,存在则返回索引,不存在则返回-1
public static int getIndex(ArrayList<Student> list, String id){
//遍历集合
for (int i = 0; i < list.size(); i++) {
Student stu = list.get(i);
String sid = stu.getId();
if(id.equals(sid)){
//已存在,返回索引
return i;
}
}
//遍历集合后,无匹配项,即不存在,返回-1
return -1;
}
}