图书管理系统(含登录验证码操作)

文章目录

  • 登录
    • 需求
    • 分析
      • 登录界面
      • 注册功能:
      • 登录功能:
      • 忘记密码:
      • 验证码规则:
  • 图书管理系统
    • 需求
    • Book包
      • Book类
      • BookList类
    • IOperation包
      • IOperation接口
      • 查找图书
      • 新增图书
      • 删除图书
      • 显示图书
      • 借阅图书
      • 归还图书
      • 退出系统
    • User包
      • user类
      • Users类
      • adminUser类
      • normalUser类
    • Main类
    • 注册
    • 登录
    • 忘记密码
  • Main类源码
  • 总结

登录

需求

为学生管理系统书写一个登陆注册忘记密码的功能。

​ 只有用户登录成功之后,才能进入到图书管理系统中进行增删改查操作。

分析

登录界面

System.out.println("欢迎来到学生管理系统");
System.out.println("请选择操作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. 键盘录入验证码

验证要求:

​ 用户名如果未注册,直接结束方法,并提示:用户名未注册,请先注册

​ 判断验证码是否正确,如不正确,重新输入

​ 再判断用户名和密码是否正确,有3次机会

忘记密码:

  1. 键盘录入用户名,判断当前用户名是否存在,如不存在,直接结束方法,并提示:未注册
  2. 键盘录入身份证号码和手机号码
  3. 判断当前用户的身份证号码和手机号码是否一致
  4. 如果一致,则提示输入密码,进行修改。
  5. 如果不一致,则提示:账号信息不匹配,修改失败。

验证码规则:

  1. 长度为5
  2. ​ 由4位大写或者小写字母和1位数字组成,同一个字母可重复
  3. 数字可以出现在任意位置
  4. 比如:
    ​ aQa1K

图书管理系统

需求

实现以下操作,不同的用户对应不同的界面,以及对图书不同的操作
在这里插入图片描述
在这里插入图片描述
我们在设计图书管理系统的过程中会使用封装思想,向上转型,抽象类和接口的知识,也就是对之前所学的进行了融合,更好的理解面向对象的思想,对不同的对象,封装成不同的包

Book包

书包中包含了书和书架,书是放在书架上的,而书一本一本放在书架上,是有序的,我们可以理解为数组
在这里插入图片描述

Book类

属性:书名,作者,价格,类型,是否已借出

	private String name;
    private String athour;
    private int price;
    private String type;
    private boolean isBorrowed;
    //构造方法,这里不建议把isBorrowed进行引用
    //在默认情况下是false也就是未借出
    public Book(String name, String athour, int price, String type) {
        this.name = name;
        this.athour = athour;
        this.price = price;
        this.type = type;
    }

我们使用了private修饰符,只能在本类中使用,若想被外界访问需要提供get和set方法
我们还可以重写ToString()方法,在是否借出中使用了三目运算符,需要注意优先级,记得加()

public String toString() {
        return "Book{" +
                "name='" + name + '\'' +
                ", athour='" + athour + '\'' +
                ", price=" + price +
                ", type='" + type + '\'' +
                (isBorrowed==true?"已借出":"未借出")+
               // ", isBorrowed=" + isBorrowed +
                '}';
    }

BookList类

我们可以先在书架中放几本书,方便下面的操作,在书架上创建数组,用来放书,还需要定义一个属性usedSize,用来记录有效的数据个数

 private int usesized;
    private Book[] books=new Book[10];

通过书架的构造方法创建对象也就是实例化数组,我们在这放四本书,放四大名著

public BookList() {
       this.books[0]=new Book("三国演义","罗贯中",10,"小说");
       this.books[1]=new Book("西游记","吴承恩",12,"小说");
       this.books[2]=new Book("红楼梦","曹雪芹",11,"小说");
       this.books[3]=new Book("水浒传","施耐庵",13,"小说");
       this.usesized=4;
    }

并相应的提供获取数组和设置数组的get和set方法,我们需要获取的是某个位置下的某一本书,以及新增图书是把书放到书架上

   public Book getBooks(int pos) {
        return books[pos];
    }

    public void setBooks(int pos,Book book) {
        this.books[pos] = book;
    }

    public Book[] getBooks() {
        return books;
    }

IOperation包

这里面包含了IOperation接口,以及增删改查的操作类

IOperation接口

定义work方法,实现IOperation接口就要重写work方法,而我们进行操作的对象是书架,所以需要传书架作为参数

public interface IOperation {
    void work(BookList bookList);
}

查找图书

查找图书需要你输入的书名与书架中的书名一致,才可以找到,通过equal()方法

public class Findioperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你要查找的图书的名字:");
        String name=scanner.nextLine();
        int currentSize=bookList.getUsesized();
        int i = 0;
        for (; i < currentSize; i++) {
            if(bookList.getBooks(i).getName().equals(name)){
                System.out.println("找到了");
                System.out.println(bookList.getBooks(i));
                return;
            }
        }
        System.out.println("没找到你要查找的书!");
    }
}

新增图书

  1. 判满
  2. 匹配已有不放
  3. 最后放书
public class Addioperation implements IOperation{

    @Override
    public void work(BookList bookList) {

        Scanner scanner = new Scanner(System.in);
        int currentSize = bookList.getUsesized();
        //判满
        if(currentSize==bookList.getBooks().length){
            System.out.println("书架满了,不能放了!");
        }
        //创建对象
        System.out.println("请输入你要添加的图书的名字:");
        String name=scanner.nextLine();
        System.out.println("请输入你要添加的图书的作者:");
        String author=scanner.nextLine();
        System.out.println("请输入你要添加的图书的价格:");
        int price=scanner.nextInt();
        System.out.println("请输入你要添加的图书的类型:");
        String type=scanner.nextLine();
        //添加
        Book book=new Book(name,author,price,type);
        int i=0;
        for (; i < currentSize; i++) {
            if(bookList.getBooks(i).getName().equals(name)){
                System.out.println("有这本书不能新增");
                return;
            }
        }
        bookList.setBooks(currentSize,book);
        //size++
        bookList.setUsesized(currentSize+1);
        System.out.println("添加成功!");

    }
}

删除图书

但是要注意,数组下标不能越界
在这里插入图片描述

public class Deleteioperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你要删除的图书的名字:");
        String name=scanner.nextLine();
        int currentSize=bookList.getUsesized();
        int pos=-1;
        int i=0;
        for (; i < currentSize; i++) {
            Book books = bookList.getBooks(i);
            if(books.getName().equals(name)){
              pos=i;
              break;
            }
        }
       if(i==currentSize){
        System.out.println("没有你要删除的书!");
        return;
        }
        //不能是currentSize,若把最后一本书删掉时,会越界
        for (int j = pos; j < currentSize-1; j++) {
            Book books = bookList.getBooks(j+1);
            bookList.setBooks(j,books);
        }
        bookList.setBooks(currentSize-1,null);
        bookList.setUsesized(currentSize-1);
        System.out.println("删除成功!");
    }
}

显示图书

public class Showioperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        int current = bookList.getUsesized();
        for (int i = 0; i < current; i++) {
            Book books = bookList.getBooks(i);
            System.out.println(books);
        }
    }
}

借阅图书

借阅就需要改变isBorrowed的状态

public class Borrowioperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你要借阅的图书的名字:");
        String name=scanner.nextLine();
        int currentSize=bookList.getUsesized();
        for (int i=0; i < currentSize; i++) {
            Book books = bookList.getBooks(i);
            if(books.getName().equals(name)){
                if(books.isBorrowed()==true){
                    System.out.println("这本书已经被借出了");
                }else {
                    books.setBorrowed(true);
                    System.out.println("借阅成功");
                    return;
                }
            }
        }
        System.out.println("没有你要借的书!");

    }
}

归还图书

归还同样需要改变isBorrowed的状态

public class Returnioperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你要归还的图书的名字:");
        String name=scanner.nextLine();
        int currentSize=bookList.getUsesized();
        for (int i=0; i < currentSize; i++) {
            Book books = bookList.getBooks(i);
            if(books.getName().equals(name)){
                if(books.isBorrowed()==true) {
                    books.setBorrowed(false);
                    return;
                }
       	 }
        	System.out.println("没有你要归还的书!");

    	}
    }
}

退出系统

public class Exitioperation implements IOperation
{
    @Override
    public void work(BookList bookList) {
        System.out.println("退出系统");
        System.exit(0);//程序正常退出
    }
}

User包

User由于有不同的用户对象,所以需要放在包里,还需要创建user类,把共性的信息抽取出来,封装成抽象类,并让管理员和普通用户继承user类
由于我们在设置菜单的时候有不同的用户,而不同的用户都是继承于父类user,所以我们把menu()作为抽象方法,因为继承了抽象类,抽象类中抽象方法和构造方法是一定要被重写的
在由于我们进行增删改查的过程中需要是对象去操作书架而书架去调用方法,所以我们需要在user中创建接口数组,在user中的Ioperation是未进行初始化的

user类

 protected String name;
 public IOperation[] Ioperations;
 public abstract int menu();
 public User(String name) {
        this.name = name;
    }

Users类

这里是对登录界面Users的定义
属性:用户名、密码、身份证号码、手机号码

	private String name;
    private String password;
    private String IdNumber;
    private String phoneNumber;
    //同样需要提供get和set方法

adminUser类

对于Ioperatoin进行初始化(实例化对象),把对应的操作作为数组的对象,对象具有对应的下标,通过对应的下标就可以访问具体的操作了

public class adiminUser extends User{

    @Override
    public int menu() {
        System.out.println("欢迎"+this.name+"来到图书系统");
        System.out.println("*******管理员菜单*******");
        System.out.println("1. 查找图书");
        System.out.println("2. 新增图书");
        System.out.println("3. 删除图书");
        System.out.println("4. 显示图书");
        System.out.println("0. 退出系统");
        System.out.println("************************");
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入你的操作:");
        int choice=scanner.nextInt();
        return choice;
    }

    public adiminUser(String name) {
        super(name);
        this.Ioperations=new IOperation[]{
                new Exitioperation(),
                new Findioperation(),
                new Addioperation(),
                new Deleteioperation(),
                new Showioperation()
        };
    }
}

normalUser类

public class normalUser extends User{
    public normalUser(String name) {
        super(name);
        this.Ioperations=new IOperation[]{
                new Exitioperation(),
                new Findioperation(),
                new Borrowioperation(),
                new Returnioperation()
        };
    }

    @Override
    public int menu() {
        System.out.println("欢迎"+this.name+"来到图书系统");
        System.out.println("*******普通用户菜单*******");
        System.out.println("1. 查找图书");
        System.out.println("2. 借阅图书");
        System.out.println("3. 归还图书");
        System.out.println("0. 退出系统");
        System.out.println("************************");
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你的操作:");
        int choice=scanner.nextInt();
        return choice;
    }
}

Main类

程序的入口,写login方法,创建书架的对象,登录由于是不同的对象来调用,需要向上转型,再通过需要doIoperation调用work方法,doIoperation是由user调用的,所以在user类中写doIoperation方法

public class Main {
    public static User login(){

            System.out.println("请输入你的名字:");
            Scanner scanner = new Scanner(System.in);
            String name = scanner.nextLine();
            System.out.println("请输入你的身份:1.管理员   2:普通用户");
            int choice = scanner.nextInt();
            if (choice == 1) {
                return new adiminUser(name);
            } else {
                return new normalUser(name);
            }

    }
    public static void main(String[] args) {
        BookList bookList=new BookList();
        User user = login();
        while (true) {
            int choice = user.menu();
            user.doIoperation(choice, bookList);
        }
    }
}

注册

 public static void register(ArrayList<Users> users){
        String username;
        Scanner sc=new Scanner(System.in);
        while (true) {
            System.out.println("请输入用户名:");
            username = sc.next();
            boolean flag1=checkUsername(username);
            if(!flag1){
                System.out.println("当前格式满不足要求,请重新输入");
                continue;
            }
            boolean flag=contains(users,username);
            if(flag){
                System.out.println("用户名"+username+"当前用户已存在,无法注册,请重新输入,");
            }else {
                System.out.println("用户名"+username+"可用");
                break;
            }
        }
        String password;
        while (true) {
            System.out.println("请输入密码:");
            password= sc.next();
            System.out.println("请再次输入密码:");
            String password2 = sc.next();
            if(!(password.equals(password2))){
                System.out.println("两次密码输入不一致,请重新输入");
                continue;
            }else {
                System.out.println("请继续录入数据");
                break;
            }
        }
        String idNumber;
        while (true) {
            System.out.println("请输入身份证号码");
            idNumber=sc.next();
            boolean flag3= checkIdnumber(idNumber);
            if(flag3){
                System.out.println("当前的身份证号码符合要求");
                break;
            }else {
                System.out.println("当前的身份证号码不符合要求,请重新输入");
                continue;
            }
        }
        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;
            }
        }

        Users user=new Users(username,password,idNumber,phoneNumber);
        users.add(user);
        System.out.println("注册成功");
        printList(users);

    }

登录

我们在main方法里通过switch语句调用不同方法,我们是直接创建了集合,用于存储对象用户对象,由于我们实现图书管理系统用的是数组,这里是集合,不同的方法都可以实现存储对象的效果

    private static void denglu(ArrayList<Users> users) {
        Scanner sc=new Scanner(System.in);
        for (int i = 0; i < 3; i++) {
            System.out.println("请输入用户名:");
            String username=sc.next();
            boolean result = contains(users, username);
            if(!result){
                System.out.println("用户名未注册,请先注册");
                return;
            }
            System.out.println("请输入密码:");
            String password=sc.next();

            while (true) {

                String code = getCode();
                System.out.println("正确的验证码为:"+code);
                System.out.println("请输入验证码:");
                String input=sc.next();
                if(input.equalsIgnoreCase(code)){
                    System.out.println("输入正确");
                    break;
                }else {
                    System.out.println("验证码错误");
                    continue;
                }
            }
            Users userinfo=new Users(username,password,null,null);
            //封装的思想,把零散的数据放到一个整体的对象中
            boolean res = checkUserInfo(users, username, password);
            if(res){
                System.out.println("登录成功,你可以使用图书管理系统了");
                //创建对象调方法
                BookList bookList=new BookList();
                User user = login();
                //不同的对象有不同的菜单
                while(true){
                    int choice = user.menu();
                    user.doIoperation(choice,bookList);
                }

            }else {
                System.out.println("登录失败");
                if(i==2){
                    System.out.println("系统被锁定,请等待两分钟后在输入");
                    return;
                }else {
                    System.out.println("用户名和密码错误,你还有"+(2-i)+"次机会");
                }
            }
        }
    }

忘记密码

private static void forgetNumber(ArrayList<Users> users) {
        Scanner sc=new Scanner(System.in);
        System.out.println("请输入用户名:");
        String username=sc.next();
        boolean result = contains(users, username);
        if(!result){
            System.out.println("用户名未注册,请先注册");
            return;
        }
        System.out.println("请输入身份证号码:");
        String IdNumber=sc.next();
        System.out.println("请输入手机号码:");
        String phoneNumber=sc.next();
        //需要把用户对象对应的索引身份证和手机号获取出来
        int index = getIndex(users, username);
        Users user = users.get(index);
        //考虑到还要再输入密码,还有验证操作,我们需要取反
        if(!(user.getIdNumber().equalsIgnoreCase(IdNumber)&&user.getPhoneNumber().equalsIgnoreCase(phoneNumber))) {
            System.out.println("身份证号码和手机号码错误,修改失败");
            return;
        }
        String newPassword1;
        while (true) {
            System.out.println("请输入新的密码:");
            newPassword1=sc.next();
            System.out.println("请再次输入新的密码:");
            String newPassword2=sc.next();
            if(newPassword1.equals(newPassword2)){
                System.out.println("两次密码输入一致");
                break;
            }else{
                System.out.println("两次密码输入不一致,请重新输入");
                continue;
            }
        }
        user.setPassword(newPassword1);
        System.out.println("修改成功");
    }

Main类源码

import Book.BookList;
import Book.Book;
import User.AdiminUser;
import User.NormalUser;
import User.User;
import User.Users;

import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;
public class Main {
    //登录入口
    public static User login(){
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入你的名字:");
        String  name= scanner.nextLine();
        System.out.println("请选择你的身份:1.管理员  2.普通用户");
        int choice = scanner.nextInt();
        //返回对象,使用到了向上转型
        if(choice==1){
            return new AdiminUser(name);
        }else {
            return new NormalUser(name);
        }
    }
    public static void main(String[] args) {
        ArrayList<Users> users=new ArrayList<>();
        Scanner sc=new Scanner(System.in);
        while(true){
            System.out.println("欢迎来到图书管理系统");
            System.out.println("请选择操作1登录 2注册 3忘记密码");
            String input=sc.next();
            switch (input){
                case "1"->denglu(users);
                case "2"->register(users);
                case "3"->forgetNumber(users);
                case "4"->{
                    System.out.println("拜拜");
                    System.exit(-1);
                }
                default -> System.out.println("没有这个选项");
            }
        }
    }
    private static void denglu(ArrayList<Users> users) {
        Scanner sc=new Scanner(System.in);
        for (int i = 0; i < 3; i++) {
            System.out.println("请输入用户名:");
            String username=sc.next();
            boolean result = contains(users, username);
            if(!result){
                System.out.println("用户名未注册,请先注册");
                return;
            }
            System.out.println("请输入密码:");
            String password=sc.next();

            while (true) {

                String code = getCode();
                System.out.println("正确的验证码为:"+code);
                System.out.println("请输入验证码:");
                String input=sc.next();
                if(input.equalsIgnoreCase(code)){
                    System.out.println("输入正确");
                    break;
                }else {
                    System.out.println("验证码错误");
                    continue;
                }
            }
            Users userinfo=new Users(username,password,null,null);
            //封装的思想,把零散的数据放到一个整体的对象中
            boolean res = checkUserInfo(users, username, password);
            if(res){
                System.out.println("登录成功,你可以使用图书管理系统了");
                //创建对象调方法
                BookList bookList=new BookList();
                User user = login();
                //不同的对象有不同的菜单
                while(true){
                    int choice = user.menu();
                    user.doIoperation(choice,bookList);
                }
            }else {
                System.out.println("登录失败");
                if(i==2){
                    System.out.println("系统被锁定,请等待两分钟后在输入");
                    return;
                }else {
                    System.out.println("用户名和密码错误,你还有"+(2-i)+"次机会");
                }
            }
        }
    }
    private static String getCode(){
        //先把a-z和A-Z的26个字母放到集合中泛型写字符
        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.append(c);
        }
        int endIndex = r.nextInt(10);
        sb.append(endIndex);
        //改变字符串的内容,通过字符数组
        char[] chars = sb.toString().toCharArray();
        //获取随机索引
        int randomIndex=r.nextInt(chars.length);
        //最大跟随机索引进行交换
        char tmp=chars[randomIndex];
        chars[randomIndex]=chars[chars.length-1];
        chars[chars.length-1]=tmp;
        //返回新的字符串
        return new String(chars);
    }
    private static boolean checkUserInfo(ArrayList<Users> users, String username, String password) {
        for (int i = 0; i < users.size(); i++) {
            if(users.get(i).getPassword().equals(password)&&users.get(i).getName().equals(username)){
                return true;
            }
        }
        return false;
    }
    public static boolean contains(ArrayList<Users> users, String username){
        return getIndex(users,username)>=0;

    }
    public static int getIndex(ArrayList<Users> users, String username){
        for (int i = 0; i < users.size(); i++) {
            Users user=users.get(i);
            if(user.getName().equals(username)){
                return i;
            }
        }
        return -1;
    }
    public static void register(ArrayList<Users> users){
        String username;
        Scanner sc=new Scanner(System.in);
        while (true) {
            System.out.println("请输入用户名:");
            username = sc.next();
            boolean flag1=checkUsername(username);
            if(!flag1){
                System.out.println("当前格式满不足要求,请重新输入");
                continue;
            }
            boolean flag=contains(users,username);
            if(flag){
                System.out.println("用户名"+username+"当前用户已存在,无法注册,请重新输入,");
            }else {
                System.out.println("用户名"+username+"可用");
                break;
            }
        }
        String password;
        while (true) {
            System.out.println("请输入密码:");
            password= sc.next();
            System.out.println("请再次输入密码:");
            String password2 = sc.next();
            if(!(password.equals(password2))){
                System.out.println("两次密码输入不一致,请重新输入");
                continue;
            }else {
                System.out.println("请继续录入数据");
                break;
            }
        }
        String idNumber;
        while (true) {
            System.out.println("请输入身份证号码");
            idNumber=sc.next();
            boolean flag3= checkIdnumber(idNumber);
            if(flag3){
                System.out.println("当前的身份证号码符合要求");
                break;
            }else {
                System.out.println("当前的身份证号码不符合要求,请重新输入");
                continue;
            }
        }
        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;
            }
        }

        Users user=new Users(username,password,idNumber,phoneNumber);
        users.add(user);
        System.out.println("注册成功");
        printList(users);

    }
    private static boolean checkIdnumber(String idnumber){
        int len=idnumber.length();
        if(len!=18){
            return false;
        }
        if(idnumber.charAt(0)=='0'){
            return false;
        }
        for (int i = 0; i < len-1; i++) {
            char c = idnumber.charAt(i);
            if(!(c>='0'&&c<='9')){
                return false;
            }
        }
        char endchar = idnumber.charAt(len-1);
        if((endchar>='0'&&endchar<='9')||(endchar=='X')||(endchar=='x')){
            return true;
        }else {
            return false;
        }
    }
    private static boolean checkUsername(String username) {
        int len=username.length();
        if(len<=3||len>=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'||c>'0'&&c<='9')){
                return false;
            }
        }
        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 checkPhonenumber(String phoneNumber){
        if(phoneNumber.length()!=11){
            return false;
        }
        //startsWith如果第一个是0返回true
        if( phoneNumber.startsWith("0")){
            return false;
        }
        for (int i = 0; i < phoneNumber.length(); i++) {
            char c = phoneNumber.charAt(i);
            if(!(c>='0'&&c<='9')){
                return false;
            }

        }
        return true;
    }
    private static void printList(ArrayList<Users> users) {
        for (int i = 0; i < users.size(); i++){
            Users user = users.get(i);
            System.out.println(user.getName()+","+user.getPassword()+","+user.getIdNumber()+","+user.getPhoneNumber());
        }
    }
    private static void forgetNumber(ArrayList<Users> users) {
        Scanner sc=new Scanner(System.in);
        System.out.println("请输入用户名:");
        String username=sc.next();
        boolean result = contains(users, username);
        if(!result){
            System.out.println("用户名未注册,请先注册");
            return;
        }
        System.out.println("请输入身份证号码:");
        String IdNumber=sc.next();
        System.out.println("请输入手机号码:");
        String phoneNumber=sc.next();
        //需要把用户对象对应的索引身份证和手机号获取出来
        int index = getIndex(users, username);
        Users user = users.get(index);
        //考虑到还要再输入密码,还有验证操作,我们需要取反
        if(!(user.getIdNumber().equalsIgnoreCase(IdNumber)&&user.getPhoneNumber().equalsIgnoreCase(phoneNumber))) {
            System.out.println("身份证号码和手机号码错误,修改失败");
            return;
        }
        String newPassword1;
        while (true) {
            System.out.println("请输入新的密码:");
            newPassword1=sc.next();
            System.out.println("请再次输入新的密码:");
            String newPassword2=sc.next();
            if(newPassword1.equals(newPassword2)){
                System.out.println("两次密码输入一致");
                break;
            }else{
                System.out.println("两次密码输入不一致,请重新输入");
                continue;
            }
        }
        user.setPassword(newPassword1);
        System.out.println("修改成功");
    }
}

总结

欢迎小伙伴在评论区指导!
💕💕请添加图片描述💕💕

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/767491.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

干货分享|如何将前端代理服务器(BFF)接入身份认证(3完结篇)

续集3 前篇文章在前面发布&#xff0c;同学们可以自行找一下。 本篇文章将继续通过实例来详细讲解如何将前端代理服务器&#xff08;BFF&#xff09;接入身份认证。我们将使用一个示例应用来演示 BFF 与身份认证的集成过程。 3 在 Full BFF 中接入认证平台 本小节将介绍如何…

矢量绘图设计Sketch中文 Sketch直装安装包

Sketch是一款专为UI设计师和UX专家打造的矢量图形设计软件&#xff0c;以其简洁的界面、强大的功能和高效的协作能力而闻名。Sketch支持快速创建高质量的UI界面、图标、图形和插画&#xff0c;其矢量绘图工具让设计细节更加精准。同时&#xff0c;Sketch内置丰富的插件和组件库…

设计模式-结构型-08-组合模式

文章目录 1、学校院系展示需求2、组合模式基本介绍3、组合模式示例3.1、 解决学校院系展示&#xff08;透明模式1&#xff09;3.2、高考的科目&#xff08;透明模式2&#xff09;3.3、高考的科目&#xff08;安全组合模式&#xff09; 4、JDK 源码分析5、注意事项和细节 1、学校…

MySQL之应用层优化(二)

应用层优化 Web服务器问题 寻找最优并发度 每个Web服务器都有一个最佳并发度——就是说&#xff0c;让进程处理请求尽可能快&#xff0c;并且不超过系统负载的最优的并发连接数。这就是前面说的最大系统容量。进行一个简单的测量和建模&#xff0c;或者只是反复试验&#xf…

Python基础入门知识

目录 引言 简要介绍Python语言 为什么要学习Python Python的应用领域 Python安装和环境配置 Python的下载和安装(Windows, macOS, Linux) 配置Python环境变量 安装和使用IDE(如PyCharm, VS Code) Python基本语法 注释 变量和数据类型(数字,字符串,列表,元组,字典,…

互联网医院系统源码解析:如何打造智能数字药店APP?

在互联网技术飞速发展的今天&#xff0c;医疗行业也在不断与之融合&#xff0c;互联网医院系统应运而生。特别是智能数字药店APP的兴起&#xff0c;使得医疗服务变得更加便捷、高效。本文将深入解析互联网医院系统源码&#xff0c;探讨如何打造一个智能的数字药店APP。 一、互…

思维,CF 739A - Alyona and mex

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 739A - Alyona and mex 二、解题报告 1、思路分析 我们考虑区间mex运算的值最大也就是区间长度&#xff0c;所以我们最大值的上界就是所有区间中的最小长度&#xff0c;假如记为mi 我们一定可以构造出答案…

【C++】const详解

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &#x1f4e2;本文作为 JohnKi &#xff0c;引用了部分大佬的案例 &#x1f4e2;未来很长&#xff0c;…

RabbitMQ 更改服务端口号

需求 windows环境下&#xff0c;将RabbitMQ默认的端口号 5672 改为 11001 实现 本机RabbitMQ版本为3.8.16&#xff0c;找到配置文件位置&#xff0c;路径为&#xff1a;C:\Users\%USERNAME%\AppData\Roaming\RabbitMQ\advanced.config 配置文件默认内容为空 填写修改端口号…

QGC添加添加QML可访问的单例

文章目录 前言一、添加文件二、修改qgroundcontrol.pro三、修改QGCApplication.cc四、修改QGroundControlQmlGlobal.h五、修改QGroundControlQmlGlobal.cc六、测试前言 QGC 4.2 一、添加文件 在src目录下添加文件夹SingletonTest,在里面新建SingletonTest.cc和SingletonTes…

【Sklearn-驯化】一文搞懂很难的EM算法以及实践

【Sklearn-驯化】一文搞懂很难的EM算法以及实践 本次修炼方法请往下查看 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合&#xff0c;智慧小天地&#xff01; &#x1f387; 免费获取相关内容文档关注&#xff1a;微信公…

Unity扩展 Text支持超链接文本

重点提示&#xff1a;当前的文本扩展支持多个超链接&#xff0c;支持修改超链接规则和支持修改超链接颜色。 近期在邮件文本中用到了超链接。最初是在邮件窗口中新加一个按钮用来超链接跳转&#xff0c;之后发现效果表现不如直接在文本中添加&#xff0c;后经过几个小时的资料…

两步解决Hugging Face下载模型速度慢/连接超时/无法下载问题

博主使用的配置是 x86_64 Linux服务器 第一步设置代理镜像: export HF_ENDPOINT=https://hf-mirror.com 第二步(使用代码时,删除引号): --token参数表示下载的模型是否需要登录验证(部分模型需要token) huggingface-cli download --token "获取的hf_*******token…

如何选择优质模型?SD3性能究竟如何?

遇到难题不要怕&#xff01;厚德提问大佬答&#xff01; 厚德提问大佬答12 厚德提问大佬答第十二期 你是否对AI绘画感兴趣却无从下手&#xff1f;是否有很多疑问却苦于没有大佬解答带你飞&#xff1f;从此刻开始这些问题都将迎刃而解&#xff01;你感兴趣的话题&#xff0c;厚德…

vivado联合modelsim仿真

一. 编译Vivado仿真库 打开Vivado&#xff0c;Tools -> Compile Simulation Libraries 二. 设置仿真工具和库路径 因为新建工程的默认仿真工具是Vivado Simulator&#xff0c;所以要使用Modelsim仿真&#xff0c;每个新工程都要设置一次&#xff0c;方法如下&#xff1a; …

2024年【安全生产监管人员】考试题及安全生产监管人员试题及解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 安全生产监管人员考试题根据新安全生产监管人员考试大纲要求&#xff0c;安全生产模拟考试一点通将安全生产监管人员模拟考试试题进行汇编&#xff0c;组成一套安全生产监管人员全真模拟考试试题&#xff0c;学员可通…

现代工作场所中的睡岗检测算法应用

在现代职场环境中&#xff0c;员工的工作状态直接影响到公司的整体效益。睡岗现象&#xff0c;即员工在工作时间内打瞌睡或睡觉&#xff0c;不仅降低了生产力&#xff0c;还可能带来安全隐患。因此&#xff0c;如何有效地检测和预防睡岗行为成为了企业管理中的一个重要课题。随…

真的,今年我劝各位真的别轻易离职

前言 在当前的职业浪潮中&#xff0c;把握时机深入学习大模型技术无疑是明智之举。随着行业对这类专业人才的渴求日益增长&#xff0c;无论是巨头企业还是新兴初创&#xff0c;都在加速推进大模型的应用实践&#xff0c;而真正能将技术有效落地并转化为业务价值的专家却供不应…

详细解释下flutter初始示例的代码

详细解释下flutter初始示例的代码 main 首句导入需要的包 类似于其他语言的import main函数为入口函数 包裹MyApp类 MyApp 这个类继承自无状态类 可见myapp不管理任何状态 build方法是所有widget内必须实现的方法 此处返回一个 ChangeNotferiProvider 可以看到它用于管理应…

理解 REST API 和 GraphQL 的区别

你可能听说过 GraphQL&#xff0c;但对它与 REST 的区别还不完全确定。今天我们将介绍 REST 和 GraphQL 的一些基本原理&#xff0c;以及它们的不同使用场景。 GraphQL 作为 REST API 的替代品越来越受欢迎&#xff0c;不过它不一定是完全的“替代品”。 根据你的使用情景&am…