一、学生管理系统
1.需求文档
## 学生管理系统
### 需求:
采取控制台的方式去书写学生管理系统。
### 分析:
#### 初始菜单:
```java
"-------------欢迎来到黑马学生管理系统----------------"
"1:添加学生"
"2:删除学生"
"3:修改学生"
"4:查询学生"
"5:退出"
"请输入您的选择:"
```
#### 学生类:
属性:id、姓名、年龄、家庭住址
#### 添加功能:
键盘录入每一个学生信息并添加,需要满足以下要求:
* id唯一
#### 删除功能:
键盘录入要删除的学生id,需要满足以下要求:
* id存在删除
* id不存在,需要提示不存在,并回到初始菜单
#### 修改功能:
键盘录入要修改的学生id,需要满足以下要求
* id存在,继续录入其他信息
* id不存在,需要提示不存在,并回到初始菜单
#### 查询功能:
打印所有的学生信息,需要满足以下要求
* 如果没有学生信息,提示:当前无学生信息,请添加后再查询
* 如果有学生信息,需要按照以下格式输出。(不用过于纠结对齐的问题)
```java
id 姓名 年龄 家庭住址
heima001 张三 23 南京
heima002 李四 24 北京
heima003 王五 25 广州
heima004 赵六 26 深圳
```
## 学生管理系统升级版
### 需求:
为学生管理系统书写一个登陆、注册、忘记密码的功能。
只有用户登录成功之后,才能进入到学生管理系统中进行增删改查操作。
### 分析:
#### 登录界面:
```java
System.out.println("欢迎来到学生管理系统");
System.out.println("请选择操作1登录 2注册 3忘记密码");
```#### 用户类:
属性:用户名、密码、身份证号码、手机号码
#### 注册功能:
1,用户名需要满足以下要求:
验证要求:
用户名唯一
用户名长度必须在3~15位之间
只能是字母加数字的组合,但是不能是纯数字
2,密码键盘输入两次,两次一致才可以进行注册。
3,身份证号码需要验证。
验证要求:
长度为18位
不能以0为开头
前17位,必须都是数字
最为一位可以是数字,也可以是大写X或小写x
4,手机号验证。
验证要求:
长度为11位
不能以0为开头
必须都是数字
#### 登录功能:
1,键盘录入用户名
2,键盘录入密码
3,键盘录入验证码
验证要求:
用户名如果未注册,直接结束方法,并提示:用户名未注册,请先注册
判断验证码是否正确,如不正确,重新输入
再判断用户名和密码是否正确,有3次机会
#### 忘记密码:
1,键盘录入用户名,判断当前用户名是否存在,如不存在,直接结束方法,并提示:未注册
2,键盘录入身份证号码和手机号码
3,判断当前用户的身份证号码和手机号码是否一致,
如果一致,则提示输入密码,进行修改。
如果不一致,则提示:账号信息不匹配,修改失败。
#### 验证码规则:
长度为5
由4位大写或者小写字母和1位数字组成,同一个字母可重复
数字可以出现在任意位置
比如:
aQa1K
2.主函数
import java.util.*;
public class ProjectDemo1 {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
//学生管理系统
User user=new User();
ArrayList<User> users=new ArrayList<>();
users=LoginPanel(users);//必须登录成功,才能继续下去,因为没有退出这一选项
Begin();//初始菜单
ArrayList<Student> list=new ArrayList<>();
while(in.hasNextInt())//若是输入不属于int的其它类型,就直接退出系统
{
int bum=in.nextInt();//输入一个数作为选择
if(bum==5)//如果输入的数为5,退出系统
break;
else if(bum>5 || bum<=0)//如果输入的数不在规定的区间内,就重新输入
{
System.out.println("您需要输入在1~5之间的数,请重新输入");
Begin();//再次返回初始菜单
continue;
}
list=Choice(bum,list);//根据操作结果更新集合
System.out.println("您已回到初始菜单");
Begin();//再次返回初始菜单
}
System.out.println("您已退出系统");
}
3.登录界面设计
A.登录面板
public static ArrayList<User> LoginPanel(ArrayList<User> users)
{//登录面板
Scanner in=new Scanner(System.in);
System.out.println("-------------欢迎来到学生管理系统----------------");
System.out.println("请选择操作 1-登录 2-注册 3-忘记密码");
while(in.hasNext())
{
int bum=in.nextInt();
int flag=0;
switch (bum)
{
case 1:
{//登录
if(Login(users))
{
System.out.println("登陆成功!打开系统中");
return users;
}
System.out.println("登录失败,返回登录界面\n"+"(温馨提示:若您尚未注册过,请先注册后登录;若您忘记密码,请申请修改密码)");
flag=1;
break;
}
case 2:
{//注册
users=Register(users);
break;
}
case 3:
{//忘记密码
users=ForgetPw(users);
break;
}
}
System.out.println("-------------欢迎来到学生管理系统----------------");
System.out.println("请选择操作 1-登录 2-注册 3-忘记密码");
if(flag==1)
continue;
}
return users;
}
B.登录操作
public static boolean Login(ArrayList<User> users)
{//登录操作
Scanner in=new Scanner(System.in);
System.out.println("请输入用户名:");
String username=in.next();
System.out.println("请输入密码:");
String password=in.next();
//System.out.println("这是测验程序"+users.size());
for (int i = 0; i < users.size(); i++) {
User a=users.get(i);//提取集合中每一个位置的User元素
if(a.getUsername().equals(username))
{
//System.out.println("这是用户名相同了,看看我执行了没");
for (int i1 = 0; i1 < 3; i1++) {
if(a.getPassword().equals(password))
{
//System.out.println("这是密码相同了,看看我执行了没");
for(int i2=0;i2<3;i2++)
{
//存一下验证码的值
String ran=Rancode();
System.out.println("请输入验证码:"+ran);
String rancode=in.next();
//验证码检验
if(rancode.equals(ran))
return true;//全部输入成功后返回true
System.out.println("验证码错误,请重新输入");
}
System.out.println("验证码错误,登录失败,返回登录界面");
return false;
}
if(i1<2)
System.out.println("密码错误,您还有"+(2-i1)+"次机会");
else
System.out.println("密码错误,您已用尽三次机会");
}
return false;
}
}
System.out.println("您所输入的用户名不存在");
return false;
}
C.注册操作
public static ArrayList<User> Register(ArrayList<User> users) {
Scanner in = new Scanner(System.in);
String username="";
int i=0;
while (true) {
System.out.println("欢迎来到注册界面,请输入符合要求的用户名\n(1.用户名长度3~15位\n2.只能是字母加数字的组合,但是不能是纯数字)");
i++;
if(i==3)
{
System.out.println("创建失败,返回登录界面");
break;
}
username = in.next();
//判断用户名是否符合条件
if(!isUserName(username))
{
System.out.println("你还有"+(3-i)+"次机会");
continue;
}
//判断用户名是否唯一
if(!isOnlyUser(username,users))
{
System.out.println("用户名已存在,请直接登录");
return users;
}
else//用户名唯一,那就退出循环继续下面的程序
break;
}
if(i==3)
return users;
String password="";
while(true)
{
System.out.println("请输入符合要求的密码");
password = in.next();
System.out.println("请再输入一次,保证两次一致");
if (in.next().equals(password)) {
System.out.println("密码设置成功");
break;
}
else
System.out.println("两次密码不一致,请重新输入");
}
String userid="";
while(true)
{
System.out.println("请输入您的身份证号进行验证");
userid=in.next();
//验证身份证号
if(isUserId(userid))
break;
else
System.out.println("您输入的身份证号不符合要求,请重新输入");
}
String phone_number="";
while(true)
{
System.out.println("请留存您的手机号");
phone_number=in.next();
//验证手机号
if(isPhoneNumber(phone_number))
break;
else
System.out.println("您输入的手机号不符合要求,请重新输入");
}
User user=new User(username,password,userid,phone_number);
users.add(user);
System.out.println("注册成功,请返回登录界面登录");
return users;
}
D.忘记密码操作
public static ArrayList<User> ForgetPw(ArrayList<User> users)
{
Scanner in=new Scanner(System.in);
System.out.println("请输入用户名");
String username=in.next();
//判断用户名是否存在,若存在,继续;若不存在,返回
if(isOnlyUser(username,users))
{
System.out.println("用户不存在,请先注册");
return users;//user唯一,说明集合内没有此用户,也就是不存在
}
//保存用户名所在集合的位置
User user=users.get(OnlyUser(username,users));
System.out.print("请输入身份证号码和手机号码验证:\n");
String userid="";
String phone_number="";
int i=0;
while(true)
{
if(i==3)
{
System.out.println("身份证号验证失败,返回登录界面");
return users;
}
i++;
System.out.println("身份证号码:");
userid=in.next();
//验证身份证号码
if(!isOnlyUserId(userid,users))
break;
else
System.out.println("身份证号验证失败,请重新输入,您还有"+(3-i)+"次机会");
}
i=0;
while(true)
{
if(i==3)
{
System.out.println("手机号验证失败,返回登录界面");
return users;
}
i++;
System.out.print("手机号码:");
phone_number=in.next();
//验证手机号码
if(!isOnlyPhone(phone_number,users))//手机号不唯一,说明已经存在,匹配成功
break;
else
System.out.println("手机号验证失败,请重新输入,您还有"+(3-i)+"次机会");
}
System.out.println("验证成功,请重新设置密码");
String password="";
while(true)
{
System.out.println("请输入符合要求的密码");
password = in.next();
System.out.println("请再输入一次,保证两次一致");
if (in.next().equals(password)) {
System.out.println("密码设置成功");
break;
}
else
{
System.out.println("两次密码不一致,请重新设置");
}
}
user.setPassword(password);
users.set(OnlyUser(username,users),user);//修改用户信息
System.out.println("密码修改成功,返回登录界面");
return users;
}
E.生成验证码
public static String Rancode()
{//生成验证码:四位字母,一位数字,位置完全任意
Scanner in=new Scanner(System.in);
Random r=new Random();
char[] word=new char[52];
for (int i = 0; i < 52; i++) {
if(i<26)
word[i]=(char)('a'+i);
else
word[i]=(char)('A'+i-26);
}
StringBuilder rancode=new StringBuilder();
for (int i = 0; i < 4; i++)
{
int ran=r.nextInt(52);
rancode.append(word[ran]);
//不用判断是否重复,够四位字母就行
}
int ran=r.nextInt(10);
int i=r.nextInt(4);
rancode.insert(i,ran);//把ran插入到i序号上
return rancode.toString();
}
F.方法:判断用户名是否符合条件
public static boolean isUserName(String username)
{//判断用户名是否符合条件:用户名长度必须在3~15位之间,只能是字母加数字的组合,但是不能是纯数字
if(username.length()<3 || username.length()>15)
{
System.out.println("用户名长度不符合要求");
return false;
}
char[] user=username.toCharArray();
int digit=0,word=0,other=0;
for (int i = 0; i < user.length; i++) {
if(user[i]>='0' && user[i]<='9')
digit++;
else if((user[i]>='A' && user[i]<='Z')||(user[i]>='a' && user[i]<='z'))
word++;
else
other++;
}
if(other>0 || word==0)
{
System.out.println("用户名不符合要求,创建失败");
return false;
}
return true;
}
G.方法:判断用户名是否唯一(输入的形参在集合里否是存在)
public static boolean isOnlyUser(String username,ArrayList<User> users)
{//集合内若存在与形参相同的用户,那么用户不唯一,返回错误
for (int i = 0; i < users.size(); i++) {
if(users.get(i).getUsername().equals(username))
return false;
}
return true;
}
H.方法:判断用户身份证号是否唯一(输入的形参在集合里否是存在)
public static boolean isOnlyUserId(String userid,ArrayList<User> users)
{//集合内若存在与形参相同的用户身份证号,那么用户不唯一,返回错误(也就是存在)
for (int i = 0; i < users.size(); i++) {
if(users.get(i).getUserid().equals(userid))
return false;
}
return true;
}
I.方法:判断用户手机号是否唯一(输入的形参在集合里否是存在)
public static boolean isOnlyPhone(String phone_number,ArrayList<User> users)
{//返回错误表示存在
for (int i = 0; i < users.size(); i++) {
if(users.get(i).getPhone_number().equals(phone_number))
return false;
}
return true;
}
J.方法:查询用户在库里的位置
public static int OnlyUser(String username,ArrayList<User> users)
{
for (int i = 0; i < users.size(); i++) {
if(users.get(i).getUsername().equals(username))
return i;
}
return -1;
}
K.方法:判断手机号是否符合条件
public static boolean isPhoneNumber(String phone_number)
{//手机号验证:长度为11位,不能以0为开头,必须都是数字
if(phone_number.length()!=11)
return false;
char[] number=phone_number.toCharArray();
int other=0;
int flag=0;
if(number[0]=='0')
return false;
for (int i = 0; i < number.length; i++) {
if(number[i]<'0' || number[i]>'9')
{
other++;
}
if(other>0)
return false;
}
return true;
}
L.方法:判断身份证号是否符合条件
public static boolean isUserId(String userid)
{//身份证号码验证:长度18位,不能以0开头,前17位必须都是数字,最后一位可以是数字也可以是X或x
if(userid.length()!=18)
return false;
char[] id=userid.toCharArray();
int other=0;
int flag=0;
if(id[0]=='0')
return false;
for (int i = 0; i < id.length-1; i++) {
if(id[i]<'0' || id[i]>'9')
{
other++;
}
if(other>0)
return false;
}
if((id[17]=='X' || id[17] == 'x')||(id[17]>='0' && id[17]<='9'))
return true;
return false;
}
4.学生管理系统
A.方法:初始菜单
public static void Begin()
{//初始菜单界面
System.out.println("-------------欢迎来到学生管理系统----------------");
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("请输入您的选择:");
}
B.方法:操作界面
public static ArrayList<Student> Choice(int choice,ArrayList<Student> list)
{//操作界面,是操作的遥控器
list=switch (choice)
{
case 1->Add(list);//选1添加学生信息
case 2->Delete(list);//选2删除学生信息
case 3->Set(list);//选3修改学生信息
case 4->Get(list);//选4获取学生信息
default->list;//选5返回初始菜单
};
return list;
}
C.方法:添加学生信息
public static ArrayList<Student> Add(ArrayList<Student> list)
{//添加学生信息
Scanner in=new Scanner(System.in);
System.out.println("您选择添加学生,请输入学生信息:");
System.out.print("id:");
String id=in.next();
if(!isOnlyID(list,id))//判断id是否唯一
{
System.out.println("此学生id已存在,返回初始菜单");
return list;//返回list本身,等同于函数未运行
}
System.out.print("姓名:");
String name=in.next();
System.out.print("年龄:");
int age=in.nextInt();
System.out.print("家庭住址:");
String homeland=in.next();//这里不能用nextLine
Student stu=new Student(id,name,age,homeland);
list.add(stu);//把新输入的学生信息存入集合
System.out.println("添加成功,是否继续添加?(继续添加按1 返回初始菜单按2)");
if(in.nextInt()==1)
Add(list);
return list;//更新集合
}
D.方法:删除学生信息
public static ArrayList<Student> Delete(ArrayList<Student> list)
{//删除学生信息
Scanner in=new Scanner(System.in);
System.out.println("您选择删除学生,请输入学生id");
String id=in.next();
if(isOnlyID(list,id))
{
System.out.println("此ID不存在,返回初始菜单");
return list;
}
list.remove(OnlyID(list,id));
System.out.println("您已成功删除ID为"+id+"的"+list.get(OnlyID(list,id)).getName()+"同学的信息\n请问是否需要继续删除?(继续删除按1 返回初始菜单按2)");
if(in.nextInt()==1)
Delete(list);
return list;
}
E.方法: 修改学生信息
public static ArrayList<Student> Set(ArrayList<Student> list)
{//修改学生信息
Scanner in=new Scanner(System.in);
System.out.println("您选择修改学生信息,请输入学生id");
String id=in.next();
if(isOnlyID(list,id))
{
System.out.println("此ID不存在,返回初始菜单");
return list;
}
System.out.println("已找到这名学生,他的信息如下,请继续输入需要修改的信息");
int x=OnlyID(list,id);//这名学生在集合中的位置
System.out.print("姓名:"+list.get(x).getName()+" 修改为:");
String name=in.next();
System.out.print("年龄:"+list.get(x).getAge()+" 修改为:");
int age=in.nextInt();
System.out.print("家庭住址:"+list.get(x).getHomeland()+" 修改为:");
String homeland=in.next();
Student stu=new Student(id,name,age,homeland);
list.set(x,stu);
System.out.println("学生信息修改成功,请问是否继续修改?(继续修改按1 返回初始菜单按2)");
return list;
}
F.方法:查询学生信息
public static ArrayList<Student> Get(ArrayList<Student> list)
{//查询学生信息
Scanner in=new Scanner(System.in);
System.out.println("您选择查询学生信息,请问您是想查询单个学生信息,还是所有学生信息?(单个学生按1 所有学生按2)");
int bum=in.nextInt();
if(bum==1)
{
System.out.println("您选择查询单个学生信息,请输入学生id");
String id=in.next();
if(isOnlyID(list,id))
{
System.out.println("当前无学生信息,请添加后再查询");
return list;
}
System.out.println("已找到这名学生,他的信息如下:");
int x=OnlyID(list,id);//这名学生在集合中的位置
Student stu=list.get(x);
System.out.println("查询成功");
System.out.printf("%-15s %-5s %-5s %3s\n","id","姓名","年龄","家庭住址");
System.out.printf("%-15s %-5s %-5d %6s\n",stu.getId(),stu.getName(),stu.getAge(),stu.getHomeland());
System.out.println("请问是否继续查询?(继续查询按1 返回初始菜单按2)");
if(in.nextInt()==1)
Get(list);
}
else if(bum==2)
{
System.out.println("您选择查询所有学生信息,学生列表如下");
for (int i = 0; i < list.size(); i++) {
Student stu=list.get(i);
if(i==0)
System.out.printf("%-15s %-5s %-5s %3s\n","id","姓名","年龄","家庭住址");
System.out.printf("%-15s %-5s %-5d %6s\n",stu.getId(),stu.getName(),stu.getAge(),stu.getHomeland());
}
}
return list;
}
G.方法:判断ID是否唯一
public static boolean isOnlyID(ArrayList<Student> list,String id)
{//判断ID是否唯一
for (int i = 0; i < list.size(); i++) {
if(list.get(i).getId().equals(id))
return false;
}
return true;
}
H.方法:判断ID存不存在,若存在返回其在集合中的位置
public static int OnlyID(ArrayList<Student> list,String id)
{//判断ID是否存在于集合内的学生信息中,若存在,返回在集合中的序号
for (int i = 0; i < list.size(); i++) {
if(list.get(i).getId().equals(id))
return i;
}
return -1;
}
5.学生类
public class Student {
private String id;
private String name;
private int age;
private String homeland;
public Student() {
}
public Student(String id, String name, int age, String homeland) {
this.id = id;
this.name = name;
this.age = age;
this.homeland = homeland;
}
/**
* 获取
* @return id
*/
public String getId() {
return id;
}
/**
* 设置
* @param id
*/
public void setId(String id) {
this.id = id;
}
/**
* 获取
* @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 homeland
*/
public String getHomeland() {
return homeland;
}
/**
* 设置
* @param homeland
*/
public void setHomeland(String homeland) {
this.homeland = homeland;
}
public String toString() {
return "Student{id = " + id + ", name = " + name + ", age = " + age + ", homeland = " + homeland + "}";
}
}