Java开发 | 图书管理系统 | 小程序 | 小练习
Posted 程序猿爱打拳
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java开发 | 图书管理系统 | 小程序 | 小练习相关的知识,希望对你有一定的参考价值。
前言
大家好,我还是那个不会打拳的程序猿。在我们掌握大量的知识后如果不实现出一些小程序实属可惜,因此今天我分享给大家一个图书管理系统小程序。此练习涉及到数据类型、数组、方法、封装、继承、多态、接口、抽象类等知识,效果展示以及源码放在下方了,快去看看吧~
目录
1.效果及源码展示
效果展示:
以上代码,只是管理员身份进行操作。当然你也可以进行测试用户操作,以下为源码展示:
(1)Book.java文件
//Book.java文件下
package Book;
//书的属性
public class Book
//书名
private String bookName;
//作者
private String author;
//价钱
private int price;
//类型
private String type;
//是否被借出
private boolean isLend;
public Book(String bookName, String author, int price, String type)
this.bookName = bookName;
this.author = author;
this.price = price;
this.type = type;
public String getType()
return type;
public void setType(String type)
this.type = type;
public String getBookName()
return bookName;
public void setBookName(String bookName)
this.bookName = bookName;
public String getAuthor()
return author;
public void setAuthor(String author)
this.author = author;
public int getPrice()
return price;
public void setPrice(int price)
this.price = price;
public void setLend(boolean lend)
isLend = lend;
@Override
public String toString()
return "Book" +
"bookName='" + bookName + '\\'' +
",author='" + author + '\\'' +
",price="+ price +
",type='" + type + '\\'' +
",isLend="
+(isLend == true ? "已被借出":"未被借出")+
'';
(2)BookList.java文件下
//BookList.java文件下
package Book;
//书架
public class BookList
//书架容纳数量
protected static final int DEFAULE_SIZE = 10;
//书架数组
private Book[] books = new Book[DEFAULE_SIZE];
protected int useSize;
public BookList()
books[0] = new Book("三国演义","罗贯中",25,"小说");
books[1] = new Book("朝花夕拾","鲁迅",26,"小说");
books[2] = new Book("阿Q正传","鲁迅",24,"小说");
this.useSize = 3;
public Book getBook (int i)
return this.books[i];
public void setBooks(Book book)
this.books[useSize] = book;
public void setBooks(int pos,Book book)
this.books[pos] = book;
public int getUseSize()
return useSize;
public void setUseSize(int useSize)
this.useSize = useSize;
(3)AddBook.java文件下
//AddBook.java文件下
package BookOperation;
import Book.Book;
import Book.BookList;
import java.util.Scanner;
public class AddBook implements IOperation
@Override
public void work(BookList bookList)
Scanner scanner = new Scanner(System.in);
System.out.print("请输入书名:>");
String name = scanner.nextLine();
System.out.print("请输入作者:>");
String author = scanner.nextLine();
System.out.print("请输入价格:>");
int price = scanner.nextInt();
scanner.nextLine();
System.out.print("请输入类型:>");
String type = scanner.nextLine();
System.out.println("存入成功");
Book books = new Book(name,author,price,type);
int size = bookList.getUseSize();
bookList.setBooks(books);
bookList.setUseSize(size+1);
(4)BorrowBook.java文件下
//BorrowBook.java文件下
package BookOperation;
import Book.Book;
import Book.BookList;
import java.util.Scanner;
public class BorrowBook implements IOperation
@Override
public void work(BookList bookList)
System.out.println("请输入你要借阅的书籍");
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
int size = bookList.getUseSize();
for (int i = 0; i <size ; i++)
Book book = bookList.getBook(i);
if (name.equals(book.getBookName()))
book.setLend(true);
return;
System.out.println("没有此书");
(5)DelBook.java文件下
//DelBook.java文件下
package BookOperation;
import Book.Book;
import Book.BookList;
import java.util.Scanner;
public class DelBook implements IOperation
@Override
public void work(BookList bookList)
System.out.print("请输入你要删除的书名:>");
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
int size = bookList.getUseSize();
int index = -1;
for (int i = 0; i < size; i++)
Book book = bookList.getBook(i);
if (name.equals(book.getBookName()))
index = 1;
break;
for (int i = index; i < size -1; i++)
Book tmp = bookList.getBook(i+1);
bookList.setBooks(index,tmp);
bookList.setUseSize(size-1);
bookList.setBooks(size-1,null);
System.out.println("删除成功");
(6)ExitBook.java文件下
//ExitBook.java文件下
package BookOperation;
import Book.BookList;
public class ExitBms implements IOperation
@Override
public void work(BookList bookList)
System.out.println("你已退出系统");
System.exit(0);
(7)FindBook.java文件下
//FindBook.java文件下
package BookOperation;
import Book.Book;
import Book.BookList;
import java.util.Scanner;
public class FindBook implements IOperation
@Override
public void work(BookList bookList)
int size = bookList.getUseSize();
System.out.print("请输入书名:>");
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
for (int i = 0; i < size; i++)
Book book = bookList.getBook(i);
if (name.equals(book.getBookName()))
System.out.println(book);
return;
System.out.println("没有此书");
(8)IOperation.java文件下
//IOperation.java文件下
package BookOperation;
import Book.BookList;
public interface IOperation
void work(BookList bookList);
(9)ShowBook.java文件下
//ShowBook.java文件下
package BookOperation;
import Book.Book;
import Book.BookList;
public class ShowBook implements IOperation
@Override
public void work(BookList bookList)
int size = bookList.getUseSize();
for (int i = 0; i < size; i++)
Book book = bookList.getBook(i);
System.out.println(book);
(10)Admini.java文件下
//Admini.java文件下
package User;
import Book.BookList;
import BookOperation.*;
import java.util.Scanner;
public class Admini extends Control
public Admini(String name)
super(name);
this.iOperations = new IOperation[]
new ExitBms(),
new AddBook(),
new DelBook(),
new FindBook(),
new ShowBook(),
;
public int menu()
System.out.println("======================");
System.out.println("欢迎["+name+"]来到图书管理系统");
System.out.println("1.增加图书");
System.out.println("2.删除图书");
System.out.println("3.查找图书");
System.out.println("4.展示图书");
System.out.println("0.退出系统");
System.out.println("======================");
System.out.print("请输入你的操作:>");
Scanner scanner = new Scanner(System.in);
int choice = scanner.nextInt();
return choice;
(11)Control.java文件下
//Control.java文件下
package User;
import Book.BookList;
import BookOperation.IOperation;
public abstract class Control
protected String name;
protected IOperation[] iOperations;
public Control(String name)
this.name = name;
public abstract int menu();
public void work(int pos, BookList bookList)
iOperations[pos].work(bookList);
(12)User.java文件下
//User.java文件下
package User;
import Book.Book;
import Book.BookList;
import BookOperation.*;
import java.util.Scanner;
public class User extends Control
public User(String name)
super(name);
this.iOperations = new IOperation[]
new ExitBms(),
new FindBook(),
new BorrowBook(),
new ShowBook(),
;
public int menu()
System.out.println("======================");
System.out.println("欢迎[" + name + "]来到图书管理系统!");
System.out.println("1.查找图书");
System.out.println("2.借阅图书");
System.out.println("3.展示图书");
System.out.println("0.退出系统");
System.out.println("=======================");
System.out.print("请输入你的操作:>");
Scanner scanner = new Scanner(System.in);
int choice = scanner.nextInt();
return choice;
(13)Main.java文件下
//Main.java文件下
import Book.BookList;
import User.Admini;
import User.Control;
import User.User;
import java.util.Scanner;
//主操作
public class Main
public static Control login()
System.out.print("请输入你的姓名:>");
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
System.out.print("请输入你的选择[1.管理员 0.用户]:>");
int choice = scanner.nextInt();
if (choice == 1)
return new Admini(name);
else
return new User(name);
public static void main(String[] args)
BookList bookList = new BookList();
Control control = login();
while(true)
int ret = control.menu();
control.work(ret,bookList);
2.设计思想
图书管理系统的功能大致为:增加图书,删除图书,修改图书,查找图书,借阅图书,显示图书,退出系统。这几方面,当然这只是最基本的几个功能,你也可以增加其他功能如排序等等。
在图书管理系统中,我们分为两个操作者一个为管理员一个为用户。管理员可以增加图书、删除图书、修改图书、显示图书、退出系统。而用户能查找图书、借阅图书、显示图书、退出系统。
当然,本次的图书管理系统只是一个小小的程序没有连接数据库以及前端页面。实现的效果因此也只是黑框框的展示,但内容很丰富。适合初学者,以及练习使用。
本期博客到这里就结束了,大家可以复制粘贴到编译器上试试。
下期预告:String
微图书销售小程序--测试心得(个人部分)
我们的团队项目是微图书销售小程序,而我负责的是图书详情,创建订单,订单管理者3个大模块的测试。
其实一开始,在微信web开发者工具上模拟,是没有问题的,但是那时真的心态很年轻,一旦进入真机调试里面就发现很多问题和BUG,接下来上测试表格:
开发小组 |
|||||||||||||||||
开发小组 |
3班6组 灵魂架构者开发小组 |
指导老师 |
周军海 |
||||||||||||||
测试文档属性 |
|||||||||||||||||
测试系统名称 |
微信图书销售小程序 |
测试人 |
刘明杰 |
测试日期 |
2018-12-24 |
||||||||||||
测试状态 |
|||||||||||||||||
[√]正在测试 [ ]错误修改 |
|||||||||||||||||
测试环境 |
|||||||||||||||||
操作系统 |
(IOS/ANDROID) |
版本 |
IOS 12.1 / ANDROID7.0 |
微信版本号 |
7.0 |
||||||||||||
CPU |
高通 / A9 |
内存 |
2G |
测试分辨率 |
1920*1080 |
||||||||||||
数据库 |
MySQL |
运行时环境 |
PHP5.6.30 + Nginx1.10.2 |
||||||||||||||
测试过程 |
|||||||||||||||||
序号 |
出错模块 |
操作步骤 |
错误描述 |
错误类型 |
重现率 |
影响 |
是否修改 |
修改人 |
备注 |
||||||||
1 |
图书详情 |
极短时间内快速点击收藏,最后停止点击是确保是已收藏状态,将会出现BUG |
图书详情中的图书收藏和店铺收藏,极短时间内联系点击,在服务器反应过来内,会出现同一本书,同一间店铺被重复收藏 |
C |
100% |
D |
是 |
刘明杰 |
对这两个点击触发函数添加一个全局标志位,让每次请求完成前不能重复触发请求 |
||||||||
2 |
创建订单 |
无 |
当图书名称过长的时候会出现部分书名被遮盖 |
A |
100% |
C |
是 |
刘明杰 |
重新布局,设置容器的大小和字体的大小 |
||||||||
3 |
订单管理 |
点击进入订单详情 |
订单详情里面的地址没有换行,过长没有显示省略号 |
A |
100% |
C |
是 |
刘明杰 |
给容器的属性新增换行和省略 |
【注】
- 该表前面所填信息为测试表所提格式规范,请测试者依据自身信息认真填写
- “测试系统名称”为测试系统部件名称,并在相应的“[ ]”上打勾;
- “出错模块”编号参照 附录
- “操作步骤”为出现错误的操作步骤
- “错误描述”填写错误的表现
- “错误类型”分类:A.页面布局 B.数据库关联 C.系统功能
- “重现率”以百分号为单位,填写1-100间的整数。该值为估计值,测试者根据测试出错的次数和测试的次数之比来估计一个值
- “影响”分类:A.影响网站运行 B. 影响系统运行 C.不影响网站运行但必须修改 D.不影响系统运行但必须修改 E.建议修改;
- “备注”由修改人填写
如果有出错图示或出错详细信息,请粘贴(填写到)下面的“出错提示一栏”,并在图下行居中处注明“图1”、“表1”等字样 ,并在测试表中填写相应的注释,说明是哪张图或表等等。
首先是图书详情收藏书籍和收藏店铺问题,一开始没有考虑到真机中调用网络api的响应时间特别长,而在模拟器上的响应时间特别短,但是真机上响应时间长会暴露问题,就是在请求完成前再一次点击收藏可能会出现同一本书或店铺出现重复收藏问题,解决办法就是利用一个全局的标记位(作为一个锁),让一个请求完成前,只能发送一次请求就能解决问题。
而对于创建订单和订单管理的问题,就是在模拟器的演示效果并没有考虑一些比较少的情况,比如书名过长不能显示完整,或者是在不同的系统手机上(Android和ios)也有不同的效果,所以页面排版要重新布局适应。
经过这次测试,深深领悟一点:在模拟器上看到的结果往往只是模拟,落到真机上往往会出现一些未知的BUG,同时产品落到使用,往往会出现一些很特别的情况,在写代码的时候要考虑到这些问题。要考虑现实环境下会出现哪些问题,这些都要在写代码的时候考虑进去。
以上是关于Java开发 | 图书管理系统 | 小程序 | 小练习的主要内容,如果未能解决你的问题,请参考以下文章