JAVA基础-Day5-黑马跟课题目-简单项目

一、学生管理系统

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 + "}";
    }
}

  • 13
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值