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;
}
}
作者:爱是小小的癌