从我开始学习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; }}