当前位置: 首页 > article >正文

Java-梦幻图书店(图书管理系统)

从我开始学习java到如今,也已经有了一个月的时间,那么为了验证一个月里我们学习到的知识是否有真的学习透彻,今天我将试着使用之前学到的几乎所有知识,来试着做一个"图书管理系统"的小小练习,此篇文章也比较适合java的初学者进行阅读和复习哦~

一、思路梳理

📚 既然想要实现一个" 图书管理系统 ",我们首先就需要思考一下:我们日常生活中的" 图书管理系统 ",应该具备哪些功能呢?

① 用户角度

⭐ 就像图书馆一样,我们的" 图书管理系统 "中也应该要摆放很多的书籍(展示图书)

⭐ 来往的顾客应该能查看各种书籍,并且借书还书

⭐ 那么既然要借书,还书,我们就需要做到查找想要找的书

⭐ 我们还需要做到对书籍个数,以及是否有库存进行判断

⭐ 在当下书籍种类繁多的情况下,我们最好根据书籍热度,来展现图书热门榜为读者提供建议

⭐ 那么图书热度榜,自然就是需要读者来点赞决定,需要实现读者图书点赞和统计个数功能

② 管理员角度

⭐ 首先,管理员和普通用户有着本质的区别,管理员登录是需要密码(以及验证码)的

⭐ 为了便于图书管理,我们应该将图书统计到一起并且一次性展示出来

⭐ 而管理员管理图书,也需要时常下架图书上架图书

⭐ 同时,为了方便管理,管理员也要能查找图书

⭐ 为了防止有时图书导入信息错误,需要做到修改图书信息

⭐ 时下图书种类众多,难免有重名出现,因此我们需要为图书加上书号,通过书号分辨

③ 总结思路图

📚 我们想要实现的效果

📌 思路图:

📕 user 包

这个思路很简单,就是 User,底下分支一个"管理员"和"普通用户"就好了~

📕 operation 包

为了方便操作,以及增加代码的可读性和可维护性,我们可以将(用户)(管理员)方法分别放入两个对应的数组,数组下标代表的就是对应的方法。

而为了将各种方法都产生关联,并能够通过此关联来将其变成数组,我们就需要:

⭐ 创建各种方法的方法类

⭐ 创建接口,使所有方法类实现该接口

⭐ 在方法类中分别实现该方法,最后放在对应的方法数组中

 

📕 book 包

此类也是很简单的定义,既然要管理图书,肯定要定义Book类以及相关信息:

"书名","书号","数量","作者","类型“"等等......

然后我们还需要一个用于存放图书的"书架",BookList:

"书架容量","已有图书数量"等等......

二、定义重要的类

① Book类

📚 Book类所拥有的属性"书名","书号","数量","作者","类型","热度"。

那么我们就写出它们,并且写出对应的get和set方法,以及空参构造无参构造,还有重写toString~

② BookList类

📚 既然是"书架类",那么就需要存储图书

📕 我们可以使用ArrayList<Book>创建一个集合"books";

📕 可以创建一个书店的最大图书容量(不可变);

📕 我们可以在调用构造方法时,初始化一些书籍;

然后实现get set 构造方法~

③ User类

User 是"普通用户"和"管理员"的父类,但虽然是父类,有些方法却不能在User中清晰的定义,比如"当我们想使用 普通用户 或 管理员 时,两者的使用方法与菜单并不相同"

并且,在我们的设计思想中,"管理员"是需要登陆的,而"普通用户"是不需要登陆的,两者之间有着本质的差别~

所以我们的User类需要是一个抽象类,并且决定使用哪个身份的方法DoUser()需要是抽象方法

④ NormalUser(用户)类

对于NormalUser类,是User的子类,所以我们需要在其中实现DoUser()方法,而用户类的使用方法很简单,我们只需要在选择用户类后,new一个用户类对象,并调出其菜单就可以了:

而其中DoUser()就是我们需要的实现选择方法的主体代码,之后我们会通过:

⭐ 使用一个User类变量user接收创建出的(管理员/普通用户);

⭐ 循环调用user.DoUser(),依次进行每次的菜单打印以及选项选择;

怎么样~是不是很巧妙呢(作者是萌新..所以作者觉得还挺巧妙的..)

⑤ AdminUser(管理)类

到了管理员类,就并没有那么普通用户那么简单了,因为在我们的计划当中,管理员是需要进行登录操作的

📚 那么我们来理清一下登录操作的注意点

⭐ 一次程序运行当中,只需要登录一次。

⭐ 验证码的格式为(4个随机大小写的英文字母和1个随机位置出现的数字)。

接下来就让我们一步步的去将管理员类写出来吧~

📕 首先,密码不一定只有一个,所以我们可以使用 ArrayList<Integer> list 创建一个整型变量的集合可以先设置一个初始密码,如果忘记了初始密码,我们可以通过"创建密码"来 add 一个集合成员,作为新的密码:

📕 接下来我们需要做的就是将" 登录 "功能也创建出来,这需要我们" 输入正确的密码 "并且" 输入正确的验证码 ":

验证码:通过Random()的方法,使字母大小写,数字出现位置,字母的Ascii值都变成一个范围内的随机数,由此生成符合要求的五位数验证码:

⭐ 登录:传入 " 密码集合 list ",判断输入的密码是否在list中,然后再随机生成一个验证码,通过用户输入字符串查看是否与验证码相同,如果相同则提示登陆成功,并且使用菜单方法:

📕 然后我们要注意,一次程序运行当中,只需要登录一次,就需要我们定义一个"被static 修饰的 int 类变量计数器"在第一次登陆成功时,使计数器++,防止后续有可能出现的"再次使用菜单时可能会重新登陆..."等失误操作:

最后就是我们的菜单啦,这个和刚刚的普通用户没什么区别,大家看一看格式就好:

三、完成主函数的基本框架

由我们最开始的代码思路设计可以看出,在代码运行之初,我们需要依次输入"名字","选择身份",然后通过(直接/间接)的方式进入对应身份菜单通过对应身份user.DoUser() 得到操作的方法下标,然后进行操作...

📚 我们进行一个思路梳理

⭐ 输入名字(1次)

⭐ 输入身份(1次)

⭐ 打印菜单与选择(n次)

这样看就有思路了吧~这就是思路梳理的重要性~

📕 登陆方法 login()

需要注意的是,在login()方法中,我们没法确定,返回值到底使NormalUser还是AdminUser,所以我们使用之前所学到的"向上转型"~使用父类User去接收子类,使子类发生自动的向上转型~

📕 主函数main

我们通过 int choice 接收每一次做出的选择,然后就可以通过这个选择,对图书管理系统中的

bookList进行各种各样的操作啦,至此,普通用户和管理员,以及主函数的基本架构已经基本大

功告成接下来我们只需要一步步的将我们想要实现的方法代码写出来,并通过接口进行分装数

组,最后加入到主函数基本框架中就ok啦~

(感觉只是迈出了一步啊喂...)

四、实现方法代码

初步工作 : 创建方法类数组

首先,我们需要按照最开始的思路导图来创建一个接口IOPeration用于使各种方法类产生关联,从而达到创建方法数组的目的

📌 需要注意的是:

⭐ 因为每个方法类里也只会填入一个方法,所以此接口中只需要一个方法就足够;

⭐ 因为需要对书架中的书进行操作,所以我们需要在接口中的方法设定一个(BookList)参数;

我们定义好了接口之后,就需要将所有的方法类都实现这个接口,并且重写方法

以此类推......

而后我们就可以实现:通过IOPeration[]数组的形式,为"管理员"创建一个存放对应功能的数组,同样也为"普通用户"创建一个存放对应功能的数组;在其中存放实现了IOPeration接口中的work方法的方法,存入IOPeration[]数组中的方法就会自动发生向上转型,从而实现了"多态"的效果;

📌 注意:我们需要在父类User中补充一个定义IOPeration[] ioPerations的方法数组,便于后续"管理员"和"普通用户"进行方法数组实现的操作;

 

然后我们回到(管理员)中,在构造方法中同时为管理员加上"方法数组"

同时回到(普通用户)中,在构造方法中同时为普通用户加上"方法数组":

然后我们再回到main中:续写我们之前马上完成的主函数框架

我们知道,之前的主函数基本框架中,我们写到:

接下来我们就使用 choice 来调用 user 中的 ioPerations[] 数组中的 [choice] 下标对应的方法

这段思路或许有些绕,我们将这些信息总理起来统计成图片,便于大家理解

① ShowBook(展示图书)

展示图书还是比较简单的一步,只需要注意这一点

⭐ 展示图书需要根据书号的先后进行排序;

那么Book类是一个我们自己定义的类,想要让它能够使用Arrays.sort方法,就需要我们对compareTo进行重写,或者自己写几个排序的方法~这也就用到了我们上一篇"抽象类和接口"中所讲到的知识了。

📚 注:(因为我们后面还需要做一个"热度排行榜",所以我们需要有两种排序方式,因此我们不采用通过Comparable接口重写"compareTo"的方法,而是自己创建两个"::sort排序方法"~)

然后通过该排序方法,对Book[]进行排序后输出

我们测试一下:

看来我们排序成功了~

② Leave(离开图书店)

这个就是最简单的方法了,我们只需要一个exit(0)表示程序正常结束就ok啦~

ok呀,没有问题~

③ FindBook(查找图书)

这需要(用户/管理员)输入图书的名字,然后再通过查找图书方法,打印出要找出的书

📌 注意点:

⭐ 有时会出现相同名字的图书,相同名字的书也要列出,并通过书号排序。

⭐ 如生活中的搜索一致,并非完全输入才能显示图书,如:

如果输入"斗破苍穹",会显示出"斗破苍穹缘起","斗破苍穹三上云岚宗","斗破苍穹年番"...等;

⭐ Books[]中不能有多余数据出现,因为"id"是"String类"而非"int类",默认为"null"而非"0",无法使用compareTo重写方法进行排序!

(如果不去除多余数据,当进行排序时会报错)

④ BorrowBook(借阅图书)

对于借阅图书,也并不需要过多繁琐的工作,需要注意的有以下几点

⭐ 由于可能拥有"同名书籍",故不通过书名借阅,而是通过书号借阅;

⭐ 每次借阅需要判断余量,如果此书已无余量则借书失败;

对于已借过的书籍需要在其名字后加上一个"已借";

(书籍有限,同一个用户只能对同一本书借阅一本);

我们可以看到,借阅书籍成功的进行了标记,并且余量也成功的减少了~

⑤ ReturnBook(归还图书)

想要归还图书,就要先有借阅图书的记录,所以归还图书是要基于借阅图书的前提下的

归还图书有以下注意事项

⭐ 通过输入书号查找对应书籍,如果没有(已借)标记,则归还失败;

⭐ 如果拥有(已借)标记,则归还图书,并删除标记,余量+1;

⑥ SupportBook(支持图书)

支持图书,顾名思义,就像我们在网上给博客"点赞!收藏!!关注!!!"一样~

我们需要做的是对"目标图书"进行投票,使其热度up up up~

支持图书的注意事项:

⭐ 其实没啥注意事项...只要能找到图书就能够进行支持

⑦ Rankings(热度排行榜)

实现热度排行榜就需要我们定义一个compareTo方法,使得Arrays.sort()方法会让Book[]数组中的书,热度从高到低排序打印

通过热度进行比较的compareTohot()方法重写:

方法实现:

至此~普通用户的功能就全部完成了

⑧ AddBook(上架图书)

上架图书需要我们输入"书名","书号","上架数量","作者","类型","初始热度"

上架图书需要注意的是:

⭐ "书号"必须是数字,所以我们需要对"书号"进行判断,如果不是数字则上架失败;

⭐ 判断是否已有该"书号",如果已有,则上架失败;

⭐ 还记得我们最开始定义了一个被 static final 保护的图书容量嘛?

 

我们的书店总图书数量不能超过这个图书容量,所以如果(原有书数量 + 上架书数量 > MAX_SIZE)

则上架失败;

⑨ DeleteBook(删除图书)

这个没什么好说的啦~通过id查找图书并删除就好了~

⑩ ReviseBook(修改图书信息)

同样的,先用id找到图书,然后输入新的各种信息

需要注意的是:

⭐ 只能修改书号,书名,热度以外的其他数据;

⭐ 记得判断图书数量,不能超过图书容量;

最终效果

📖 管理员:

📖 普通用户:

源码:

📖 BookMain:

import book.Book;
import book.BookList;
import user.AdminUser;
import user.NormalUser;
import user.User;

import java.util.ArrayList;
import java.util.Scanner;
public class BookMain {
    public static void main(String[] args) {
        BookList bookList = new BookList();
        User user = login();
        while (true) {
            int choice = user.DoUser();
            //使用choice调用方法数组对应下标方法的操作...
            if(choice < user.ioPerations.length) {
                user.ioPerations[choice].work(bookList);
            }else {
                System.out.println("选项输入错误,请重新输入");
            }
        }
    }
    public static User login() {
        Scanner scan = new Scanner(System.in);
        System.out.println("请输入您的名字:");
        String name = scan.next();
        while(true) {
            System.out.println("请输入您的身份:");
            System.out.println("1: 管理员 2: 普通用户");
            int use = scan.nextInt();
            if (use == 1) {
                return new AdminUser(name);
            } else if (use == 2) {
                return new NormalUser(name);
            } else {
                System.out.println("输入错误");
                continue;
            }
        }
    }
}

📖 book package

Book.java:
package book;

public class Book {
    public String name;
    public String id;
    public int num;
    public String writer;
    public String type;
    public int hot;

    public int getHot() {
        return hot;
    }

    public void setHot(int hot) {
        this.hot = hot;
    }

    public Book(String name, String id, int num, String writer, String type, int hot) {
        this.name = name;
        this.id = id;
        this.num = num;
        this.writer = writer;
        this.type = type;
        this.hot = hot;
    }

    public Book() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }

    public String getWriter() {
        return writer;
    }

    public void setWriter(String writer) {
        this.writer = writer;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    @Override
    public String toString() {
        return "Book{" +
                "书名='" + name + '\'' +
                ", 书号='" + id + '\'' +
                ", 余量=" + num +
                ", 作者='" + writer + '\'' +
                ", 类型='" + type + '\'' +
                ", 热度='" + hot + '\'' +
                '}';
    }
    //根据(书号)进行排序
    public int compareToid(Book book) {
        return Integer.valueOf(this.id) - Integer.valueOf(book.id);
    }
    //根据(热度)进行排序
    public int compareTohot(Book book){
        return book.hot - this.hot;
    }
}
BookList.java:
package book;

import java.util.ArrayList;

public class BookList {
    //存储图书的集合
    public ArrayList<Book> books = new ArrayList<>();
    //书店的最大图书容量(不可变)
    public static final int MAX_SIZE = 999;
    public BookList(){
        books.add(new Book("海贼王","001",88,"尾田荣一郎","冒险",487));
        books.add(new Book("刀剑神域","002",100,"川原砾","战斗",427));
        books.add(new Book("火影忍者","003",60,"岸本齐史","冒险",441));
        books.add(new Book("进击的巨人","004",19,"谏山创","剧情",429));
        books.add(new Book("碧蓝之海","005",73,"井上坚二","搞笑",399));
    }

    public BookList(ArrayList<Book> books) {
        this.books = books;
    }

    public ArrayList<Book> getBooks() {
        return books;
    }

    public void setBooks(ArrayList<Book> books) {
        this.books = books;
    }
}

📖 operation package:

上架图书:
package operation;

import book.Book;
import book.BookList;

import java.util.Scanner;

public class AddBook implements IOPeration{
    @Override
    public void work(BookList bookList){
        Scanner scan = new Scanner(System.in);
        System.out.println("请输入你要上架的书名:");
        String name0 = scan.next();
        System.out.println("请输入书号:");
        String id0 = scan.next();
        //判断id是否符合条件
        for (int i = 0; i < id0.length(); i++) {
            if(!(id0.charAt(i) >= '0' && id0.charAt(i) <= '9')){
                System.out.println("id不符合条件,上架失败");
                return;
            }
        }
        //判断id是否重复
        Book[] books = bookList.books.toArray(new Book[0]);
        for (int i = 0; i < books.length; i++) {
            if(books[i].getId().equals(id0)){
                System.out.println("该id重复,上架失败");
                return;
            }
        }
        System.out.println("请输入上架数量:");
        int num0 = scan.nextInt();
        //用于判断是否超过图书容量
        int Num = num0;
        for (int i = 0; i < books.length; i++) {
            Num += books[i].getNum();
        }
        if(Num > bookList.MAX_SIZE){
            System.out.println("超过书店图书容量,上架失败");
            return;
        }
        System.out.println("请输入作者:");
        String writer0 = scan.next();
        System.out.println("请输入类型:");
        String type0 = scan.next();
        System.out.println("请输入初始热度:");
        int hot0 = scan.nextInt();
        Book book = new Book(name0,id0,num0,writer0,type0,hot0);
        bookList.books.add(book);
        System.out.println("上架成功");
    }
}
借阅图书:
package operation;

import book.Book;
import book.BookList;

import java.util.Scanner;

public class BorrowBook implements IOPeration{
    @Override
    public void work(BookList bookList){
        Scanner scan = new Scanner(System.in);
        System.out.println("请输入你要借阅的图书书号:");
        String id0 = scan.next();
        //用于记录借阅图书的索引位置
        int num = -1;
        for (int i = 0; i < bookList.books.size(); i++) {
            //检查是否有该书号的书
            Book Book = bookList.books.get(i);
            if (Book.id.equals(id0)) {
                num = i;
                System.out.println(Book);
            }
        }
        if(num == -1){
            System.out.println("未找到该书号的书");
            return;
        }
        if(bookList.books.get(num).num <= 0){
            System.out.println("库存不足,借阅失败");
        }else{
            Book Book = bookList.books.get(num);
            //为书名后添加标记
            Book.setName(Book.getName() + "(已借)");
            //减少相应的库存
            Book.setNum(Book.getNum() - 1);
            bookList.books.set(num,Book);
            System.out.println("借阅成功");
        }
    }
}
删除图书:
package operation;

import book.Book;
import book.BookList;

import java.util.Scanner;

public class DeleteBook implements IOPeration{
    @Override
    public void work(BookList bookList){
        Scanner scan = new Scanner(System.in);
        System.out.println("请输入要删除的图书书号");
        String id0 = scan.next();
        //用于记录删除图书的索引位置
        int num = -1;
        for (int i = 0; i < bookList.books.size(); i++) {
            //检查是否有该书号的书
            Book Book = bookList.books.get(i);
            if (Book.id.equals(id0)) {
                num = i;
                System.out.println(Book);
            }
        }
        if(num == -1){
            System.out.println("未找到该书号的书");
            return;
        }
        System.out.println("删除成功");
        bookList.books.remove(num);
    }
}
查找图书:
package operation;

import book.Book;
import book.BookList;

import java.util.Arrays;
import java.util.Scanner;

public class FindBook implements IOPeration{
    @Override
    public void work(BookList bookList) {
        Scanner scan = new Scanner(System.in);
        System.out.println("请输入你要查找的图书名:");
        //记录找到几本同名的图书
        int num = 0;
        //用于存放查找出的图书
        Book[] Books = new Book[bookList.books.size()];
        String name = scan.next();
        for (int i = 0; i < bookList.books.size(); i++) {
            //检查是否重名
            Book book = bookList.books.get(i);
            if (book.name.contains(name)) {
                Books[num] = book;
                num++;
            }
        }
        //(id = null会无法进行排序,所以定义新数组去除null)
        Book[] BOOKS = Arrays.copyOf(Books,num);
        Arrays.sort(BOOKS, Book::compareToid);
        if (num > 0) {
            System.out.println("找到了" + num + "本与 '" + name + "' 相关的图书:");
            for(int i = 0 ;i < num;i++){
                System.out.println(BOOKS[i]);
            }
        }else{
            System.out.println("没有找到该名的图书");
        }
    }
}
离开图书店:
package operation;

import book.BookList;

public class Leave implements IOPeration{
    @Override
    public void work(BookList bookList){
        System.out.println("你离开了图书店...");
        System.exit(0);
    }
}
热度排行榜:
package operation;

import book.Book;
import book.BookList;

import java.util.Arrays;

public class Rankings implements IOPeration{
    @Override
    public void work(BookList bookList){
        Book[] Books = bookList.books.toArray(new Book[0]);
        Arrays.sort(Books,Book::compareTohot);
        //小于<图书集合>的长度
        System.out.println("---------------热度排行榜---------------");
        for (int i = 0; i < Books.length; i++) {
            System.out.println("Top" + (i + 1) + ":" + Books[i]);
        }
        System.out.println("--------------------------------------");
    }
}
归还图书:
package operation;

import book.Book;
import book.BookList;

import java.util.Scanner;

public class ReturnBook implements IOPeration{
    @Override
    public void work(BookList bookList){
        Scanner scan = new Scanner(System.in);
        System.out.println("请输入你要归还图书的书号");
        String id0 = scan.next();
        //用于记录归还图书的索引位置
        int num = -1;
        for (int i = 0; i < bookList.books.size(); i++) {
            //检查是否有该书号的书
            Book Book = bookList.books.get(i);
            if (Book.id.equals(id0)) {
                num = i;
                System.out.println(Book);
            }
        }
        if(num == -1){
            System.out.println("未找到该书号的书");
            return;
        }
        Book Book = bookList.books.get(num);
        if(Book.name.contains("(已借)")) {
            //为书名后删除标记
            //(已借)长度为4,删除只需要取(原长度-4)的字段修改书名就好了
            String name0 = (String) Book.name.subSequence(0, Book.name.length() - 4);
            Book.setName(name0);
            //增加相应的库存
            Book.setNum(Book.getNum() + 1);
            bookList.books.set(num, Book);
            System.out.println("归还成功");
        }else {
            System.out.println("该书未被借阅,归还失败");
        }
    }
}
修改图书:
package operation;

import book.Book;
import book.BookList;

import java.util.Scanner;

public class ReviseBook implements IOPeration{
    @Override
    public void work(BookList bookList){
        Scanner scan = new Scanner(System.in);
        System.out.println("请输入要修改的图书书号");
        String id0 = scan.next();
        //用于记录修改图书的索引位置
        int num = -1;
        for (int i = 0; i < bookList.books.size(); i++) {
            //检查是否有该书号的书
            Book Book = bookList.books.get(i);
            if (Book.id.equals(id0)) {
                num = i;
                System.out.println(Book);
            }
        }
        Book[] books = bookList.books.toArray(new Book[0]);
        if(num == -1){
            System.out.println("未找到该书号的书");
            return;
        }
        System.out.println("请输入修改后的余量:");
        int num0 = scan.nextInt();
        int Num = num0;
        for (int i = 0; i < books.length; i++) {
            Num += books[i].getNum();
        }
        Num -= books[num].getNum();
        if(Num > bookList.MAX_SIZE){
            System.out.println("超过书店图书容量,修改失败");
            return;
        }
        System.out.println("请输入修改后的作者:");
        String writer0 = scan.next();
        System.out.println("请输入修改后的类型:");
        String type0 = scan.next();
        Book book = books[num];
        book.setNum(num0);
        book.setType(type0);
        book.setWriter(writer0);
        bookList.books.set(num,book);
        System.out.println("修改成功");
    }
}
展示图书:
package operation;

import book.Book;
import book.BookList;

import java.util.Arrays;

public class ShowBook implements IOPeration{
    @Override
    public void work(BookList bookList){
        Book[] Books = bookList.books.toArray(new Book[0]);
        Arrays.sort(Books,Book::compareToid);
        //小于<图书集合>的长度
        for (int i = 0; i < Books.length; i++) {
            System.out.println(Books[i]);
        }
    }
}
支持图书:
package operation;

import book.Book;
import book.BookList;

import java.util.Scanner;

public class SupportBook implements IOPeration{
    @Override
    public void work(BookList bookList){
        Scanner scan = new Scanner(System.in);
        System.out.println("请输入你要支持的图书书号:");
        String id0 = scan.next();
        //用于记录支持图书的索引位置
        int num = -1;
        for (int i = 0; i < bookList.books.size(); i++) {
            //检查是否有该书号的书
            Book Book = bookList.books.get(i);
            if (Book.id.equals(id0)) {
                num = i;
                System.out.println(Book);
            }
        }
        if(num == -1){
            System.out.println("未找到该书号的书");
            return;
        }
        Book Book = bookList.books.get(num);
        Book.setHot(Book.getHot() + 100);
        bookList.books.set(num,Book);
        System.out.println("支持成功~");
    }
}

📖 user package:

用户(User):
package user;

import operation.IOPeration;

public abstract class User {
    public String name;
    public abstract int DoUser();
    //继承给(管理者)和(普通用户)的方法数组
    public IOPeration[] ioPerations;
    public User(String name) {
        this.name = name;
    }

    public User() {
    }

}
管理员(AdminUser):
package user;

import operation.*;

import java.util.*;

public class AdminUser extends User{

    Scanner scan = new Scanner(System.in);
    public AdminUser(String name) {
        super(name);
        this.ioPerations = new IOPeration[] {
                new Leave(),
                new ShowBook(),
                new FindBook(),
                new AddBook(),
                new DeleteBook(),
                new ReviseBook()
        };
    }
    static int temp = 0;//表示未登录(管理员)
    //管理员的总和用法
    public int DoUser() {
        if (temp == 0) {
            ArrayList<Integer> list = new ArrayList<>();
            //初始密码
            list.add(123456789);
            while (true) {
                System.out.println("请输入:");
                System.out.println("1.登录   2.创建密码");
                int N = scan.nextInt();
                if (N == 1) {//登录
                    if (Log(list)) {//密码和验证码正确
                        break;
                    } else {
                        System.out.println("输入错误");
                    }
                } else if (N == 2) {//修改密码
                    System.out.println("请输入新密码(9位):");
                    list.add(scan.nextInt());
                }
            }
        }
            return menu();
    }
    //登录部分方法
    public boolean Log(ArrayList<Integer> list) {
        System.out.println("请输入密码:");
        int log = scan.nextInt();
        if (list.indexOf(log) >= 0) {
            if(random()) {
                System.out.println("登录成功!");
                temp++;
                return true;
            }
        }
        return false;
    }
    //验证码部分方法
    public boolean random(){
        System.out.println("请输入验证码:");
        Random random = new Random();
        StringBuilder sb = new StringBuilder();
        int num1 = random.nextInt(5);//唯一数字出现的位置
        for (int i = 0; i < 5; i++) {
            int num2 = random.nextInt(2);//字母的大小写
            if(i == num1){
                int n = random.nextInt(10)+48;//数字的Ascii
                sb.append((char)n);
            }else if(num2 == 0){
                int n = random.nextInt(26)+97;//小写字母的Ascii
                sb.append((char)n);
            }else if(num2 == 1){
                int n = random.nextInt(26)+65;//小写字母的Ascii
                sb.append((char)n);
            }
        }
        String s = sb.toString();
        System.out.println("验证码:" + s);
        String s0 = scan.next();
        return s0.equals(s);
    }
    //菜单部分方法
    public int menu(){
        System.out.println("欢迎 " + name + " 来到梦幻图书店");
        System.out.println("------管理员菜单------");
        System.out.println("1.展示图书   2.查找图书");
        System.out.println("3.上架图书   4.下架图书");
        System.out.println("5.修改图书信息        ");
        System.out.println("      0.离开书店      ");
        System.out.println("--------------------");
        System.out.println("请输入操作:");
        int n = scan.nextInt();
        return n;
    }
}
普通用户(NormalUser):
package user;

import operation.*;

import java.util.Scanner;

public class NormalUser extends User{
    Scanner scan = new Scanner(System.in);

    public NormalUser(String name) {
        super(name);
        this.ioPerations = new IOPeration[] {
                new Leave(),
                new ShowBook(),
                new FindBook(),
                new BorrowBook(),
                new ReturnBook(),
                new SupportBook(),
                new Rankings()
        };
    }
    public int DoUser(){
        System.out.println("欢迎 " + name + " 来到梦幻图书店");
        System.out.println("-------用户菜单-------");
        System.out.println("1.展示图书   2.查找图书");
        System.out.println("3.借阅图书   4.归还图书");
        System.out.println("5.支持图书   6.热度排行");
        System.out.println("      0.离开书店      ");
        System.out.println("--------------------");
        System.out.println("请输入操作:");
        int n = scan.nextInt();
        return n;
    }
}

http://www.kler.cn/news/367391.html

相关文章:

  • 对角线遍历矩阵模板
  • 学习笔记:黑马程序员JavaWeb开发教程(2024.10.26)
  • 编写一个简单的Iinput_dev框架
  • 【Spring MVC】响应结果和设置
  • docker安装postgres扩展age以及使用nodejs连接
  • IPC 进程间通信 信号量集合 Linux环境 C语言实现
  • LDR6328:助力小家电实现TYPE-C接口快充输入
  • 无人机喊话器详解!
  • 乐维网管平台(一):如何精准掌控 IP 管理
  • PHPOK 4.8.338 后台任意文件上传漏洞(CVE-2018-12941)复现
  • Spring MVC 知识点全解析
  • Ubuntu 上安装 Redmine 5.1 指南
  • vue实现语音合成功能,Android和wap端
  • word中的内容旋转90度
  • 深度学习中的迁移学习:优化训练流程与提高模型性能的策略,预训练模型、微调 (Fine-tuning)、特征提取
  • springboot056教学资源库(论文+源码)_kaic
  • unity中的组件(Component)
  • 基于卷积神经网络的花卉分类系统,resnet50,mobilenet模型【pytorch框架+python源码】
  • SQL 随笔记: 常见的表连接方式
  • 宠物健康监测的技术创新
  • C# 实现进程间通信的几种方式(完善)
  • 构建基于Spring Boot的现代论坛平台
  • 【mysql进阶】4-4. 行结构
  • 背包九讲——二维费用背包问题
  • asp.net core 入口 验证token,但有的接口要跳过验证
  • 无人机之自主降落系统篇