一个简易Java开发的图书管理系统
来源:互联网 发布:人工智能方向 知乎 编辑:程序博客网 时间:2024/06/07 01:16
一个简易Java开发的图书管理系统
1概述
这是一个综合的Java开发的图书管理系统,拥有普通用户和会员用户,以及管理员用户的登陆方式,主要可以买书,租书,管理员可以入库出库,新增书籍等。。。。当用户买书消费达到100元时,自动升级为会员,享受85折优惠!如果用户租书超期未还,将产生额外的费用,同时拖欠达到30天以上的用户将被拉入黑名单,停止使用买书租书服务,除非缴清费用并额外缴纳100元钱来重新开启服务,数据使用本地文件存储,使用了字节流方式,对象序列化接口等,同时有日志和文件记录用户的操作信息,如登陆,买书,租书等。
2效果图如下:
3主要功能
主要可以买书,租书,管理员可以入库出库,新增书籍等。。。。当用户买书消费达到100元时,自动升级为会员,享受85折优惠!如果用户租书超期未还,将产生额外的费用,同时拖欠达到30天以上的用户将被拉入黑名单,停止使用买书租书服务,除非缴清费用并额外缴纳100元钱来重新开启服务
图书管理相关操作
仅使用会员卡付款可以优惠
租书时先付款,如果还书超期将在还书时额外收取超期部分的金额
用户如果没有没有按时还书,超期天数将收取双倍的租金
超期30天则将该用户加入黑名单,如果想恢复,需要缴纳100元超期金
会员一级是买书总金额达到100元(租书费用不算)
4实现方式
需要建立实体类和工具类
程序入口方法如下:
//程序入口方法
publicstaticvoid ShowHome() {
//初始化图书和用户信息文件
InitBooksFile();
UserOperation.InitUsersFile();
InitbuyBookRecordFile();
InitRentBookRecordFile();
sbbrs = FileOperation.GetInfo(buyBookRecordAddr);
rbbrs = FileOperation.GetInfo(rentBookRecordAddr);
//执行登录注册
nowUser = UserOperation.LoginAndRegist();
//判断用户是否有已经超期的租赁图书
if (UserOperation.BeyondTheDeadline(nowUser)) {
System.out.println("您有图书已经超过租赁期限,超出的天数将双倍收取租金!");
if (UserOperation.IsBlackList(nowUser)) {
System.out.println("对不起,您已经被加入了黑名单,系统将停止和您交易,请先还书!并缴清费用!");
}
}
if (nowUser.getRight() == -1) {
System.out.println("登陆或注册失败,系统退出!");
//记录日志
log.info(nowUser.getUserName() + "登陆失败");
}elseif (nowUser.getRight() == 0) {//普通用户
//记录日志
log.info(nowUser.getUserName() + "用户,登陆成功");
System.out.println("*****欢迎光临图书系统*****");
System.out.println("书号\t书名\t作者\t发布日期\t\t价格(元)\t日租金(元)\t库存");
ShowBooks(showNum);
//显示操作
booleango =true;
do {
go =ShowUserMenu();
}while (go);
}elseif (nowUser.getRight() == 1) {
//记录日志
log.info(nowUser.getUserName() + "管理员,登陆成功");
System.out.println("*****欢迎登陆库存管理系统*****");
System.out.println("书号\t书名\t作者\t发布日期\t\t价格(元)\t日租金(元)\t库存");
ShowBooks(showNum);
//显示操作
booleango =true;
do {
go =ShowADMenu();
}while (go);
}
}
登陆注册如下:
//登陆和注册,权限:-1表示没有找到,0表示普通用户,1表示管理员
publicstatic UserLoginAndRegist(){
UsernowUser =new User();
nowUser.setRight(-1);
users = FileOperation.GetInfo(userAddr);
for (Useru :users) {
u.ShowUser();
}
System.out.println("请选择登陆还是注册:1.登陆\t2.注册");
@SuppressWarnings("resource")
Scannerinput =new Scanner(System.in);
intgo =input.nextInt();
//登陆
if (go == 1) {
System.out.println("请输入您的用户名:");
StringuserName =input.next();
UserfileUser =null;
//判断用户名是否存在
booleanexit =false;
for (Useru :users) {
if (u.getUserName().equals(userName)) {
fileUser =u;
nowUser.setUserName(u.getUserName());
exit =true;
}
}
if (!exit) {
System.out.println("对不起该用户名不存在!");
returnnowUser =LoginAndRegist();//递归调用
}
//用户名存在
intindex = 0;
do {
System.out.println("请输入密码:");
StringpassWord =input.next();
if (passWord.equals(fileUser.getPassWord())) {
nowUser =fileUser;
break;//登陆成功
}elseif (index < 2) {
System.out.println("密码错误,请重新输入!");
}
index++;
}while (index <= 2);
returnnowUser;//返回登陆结果
}elseif (go == 2) {//注册
System.out.println("用户注册");
Useruser =new User();
user.setRight(-1);
booleanexit =false;
intindexn = 0;
do {
exit =false;
System.out.println("请输入用户名:");
user.setUserName(input.next());
//判断用户名是否存在
for (Useru :users) {
if (u.getUserName().equals(user.getUserName())) {
exit =true;
if (indexn < 2)
System.out.println("对不起该用户名已存在!请重新输入!");
}
}
indexn++;
}while (indexn <= 2 && exit);
if (indexn > 2) {
returnnowUser;//注册失败权限是==-1
}
intindexp = 0;
do {
System.out.println("请输入密码:");
StringpassWord =input.next();
System.out.println("请确认密码:");
StringpassWord2 =input.next();
if (passWord2.equals(passWord)) {
System.out.println("是否需要管理员全选?1.是\t0.否");
inttemRight =input.nextInt();
user.setPassWord(passWord);
user.setRight(temRight);
nowUser =user;
users.add(user);
FileOperation.updateInfo(users,userAddr);
break;
}elseif (indexp < 2) {
System.out.println("两次密码不一样,请重新输入!");
}
indexp++;
}while (indexp <= 2);
returnnowUser;//返回注册结果
}else {
System.out.println("输入有误!请重新输入!");
nowUser =LoginAndRegist();//递归调用
}
returnnowUser;//返回其他结果
}
显示菜单:
//显示用户操作菜单
@SuppressWarnings("resource")
publicstaticbooleanShowUserMenu() {
intoperator = 0;
Scannerinput =new Scanner(System.in);
System.out.println(
"\n请选择进行的操作:\n1.查看所有图书\t2.买书\t\t3.按名称查询书\t4.按作者查询书\t5.查看购买记录\n6.会员卡充值\t7.查看卡内余额\t8.租书\t\t9.查看租书相关信息\t0.退出");
operator =input.nextInt();
switch (operator) {
case 0:
log.info(nowUser.getUserName() + "用户,退出系统");
System.out.println("系统退出");
returnfalse;
case 1:
//查看所有图书
System.out.println("书号\t书名\t作者\t发布日期\t\t价格(元)\t日租金(元)\t库存");
ShowBooks(books.size());
break;
case 2:
if (UserOperation.IsBlackList(nowUser)) {
System.out.println("黑名单用户不能买书!");
returntrue;
}
TransactionBooks(1);//买书,参数为1是买书,为2是租书
break;
case 3:
SearchBooksByNameOper();//按名称查询书
break;
case 4:
SearchBooksByAuthorOper();//按作者查询书
break;
case 5:
GetPurchaseHistory();//查看购买记录
break;
case 6:
VipRecharge();//会员卡充值
break;
case 7:
//查看卡内余额
intmony = UserOperation.GetVipMoney(nowUser);
if (mony != -1) {
System.out.println("您的卡上余额为:" + mony +"元");
}else {
System.out.println("您不是VIP没有会员卡!");
}
break;
case 8:
if (UserOperation.IsBlackList(nowUser)) {
System.out.println("黑名单用户不能租书!");
returntrue;
}
TransactionBooks(2);//租书,参数为1是买书,为2是租书
break;
case 9:
GetRentMenu();//租书相关信息菜单
break;
default:
System.out.println("您输入的操作编号不正确,请重新输入:");
ShowUserMenu();
break;
}
returntrue;
}
//显示管理员操作菜单
publicstaticboolean ShowADMenu() {
intoperator = 0;
@SuppressWarnings("resource")
Scannerinput =new Scanner(System.in);
System.out.println("\n请选择进行的操作:\n1.图书入库\t2.图书出库\t3.查询全部图书\t4.新增图书\t0.退出");
operator =input.nextInt();
switch (operator) {
case 0:
log.info(nowUser.getUserName() + "管理员,退出系统");
System.out.println("系统退出");
returnfalse;
case 1:
LibraryDelivery("+");//图书入库
break;
case 2:
LibraryDelivery("-");//图书出库
break;
case 3:
//查询全部图书
System.out.println("书号\t书名\t作者\t发布日期\t\t价格(元)\t日租金(元)\t库存");
ShowBooks(books.size());
break;
case 4:
AddLibraryBooks();//新增图书
break;
default:
System.out.println("您输入的操作编号不正确,请重新输入:");
ShowADMenu();
break;
}
returntrue;
}
显示书籍:
//展示前num本书
publicstaticvoid ShowBooks(intnum) {
books = FileOperation.GetInfo(bookAddr);
if (num > books.size()) {
num =books.size();
}
for (inti = 0;i <num;i++) {
books.get(i).Show();
}
if (books.size() > num) {
System.out.println("......");
}
}
买书:
staticintfrequency = 0;//标记,标记着是不是递归调用的TransactionBooks,是递归调用的就不进入付款
//交易书,参数为1是买书,为2是租书
publicstatic List<Book> TransactionBooks(intflag) {
List<Book>tempbooks =new ArrayList<Book>();
System.out.println("书号\t书名\t作者\t发布日期\t\t价格(元)\t日租金(元)\t库存");
ShowBooks(books.size());
System.out.println("请输入想要买/租的书的编号:");
@SuppressWarnings("resource")
Scannerinput =new Scanner(System.in);
intid =input.nextInt();
BooktemBook =SearchBookById(id);
intmaxNum =temBook.getNum();
Bookbook =new Book(temBook.getId(),temBook.getBookName(),temBook.getAuthor(),temBook.getPubDate(),
temBook.getPrice(),temBook.getRent(), 0);
if (book.getId() == -1) {
System.out.println("您输入的id不存在!请重新输入!");
returnTransactionBooks(flag);
}else {
frequency++;
intnum;
while (true) {
System.out.println("请输入需要的数量(不买/租了,输入0退出!)");
num =input.nextInt();
if (num < 0 || num >maxNum) {
System.out.println("您输入的数量不在正确范围之内,请重新输入!(不买/租了,输入0退出!)");
}else {
break;
}
}
book.setNum(num);
if (book.getNum() > 0) {
temBook.setNum(temBook.getNum() - book.getNum());//减去库存数量
FileOperation.updateInfo(books,bookAddr);
book.Show();
System.out.println("是否继续购买/租?1.是\t2.否");
intgo =input.nextInt();
if (go == 1) {
List<Book>lb =TransactionBooks(flag);//递归调用
frequency--;
for (Bookb :lb) {
booleanexit =false;
for (inti = 0;i <tempbooks.size();i++) {
if (tempbooks.get(i).getId() == b.getId()) {
exit =true;
//向临时列表中存在的书增加数量
tempbooks.get(i).setNum(tempbooks.get(i).getNum() + b.getNum());
}
}
if (!exit) {
tempbooks.add(b);//向books中增加书
}
}
}
//增加书
booleanexit =false;
for (inti = 0;i <tempbooks.size();i++) {
if (tempbooks.get(i).getId() == book.getId()) {
exit =true;
//向临时列表中存在的书增加数量
tempbooks.get(i).setNum(tempbooks.get(i).getNum() + book.getNum());
}
}
if (!exit) {
tempbooks.add(book);//向books中增加书
}
if (frequency == 1) {
PayBooks(tempbooks,flag);
frequency = 0;
}
}
}
returntempbooks;
}
。。。。由于篇幅影响,函数不能一一介绍。。。。
五、添加本地数据存储
这里用到一个自己写的文件操作类,向一个路径写入或读出List
这两个泛型函数还是比较实用的,用处非常的大!!!!
/**
*文件操作类,负责更新文件和创建文件
*
*@author TY
*
*/
publicclass FileOperation {
//从文件读取一个List,T表示List的类型,返回所有T类型的List
//从文件读取,返回所有书的List
//从文件读取,返回所有User的List
@SuppressWarnings("unchecked")
publicstatic <T> List<T> GetInfo(Stringpath) {
List<T>list =new ArrayList<T>();
Filefile =new File(path);
if (!file.exists()) {
returnlist;
}
FileInputStreamin;
ObjectInputStreamobjIn;
try {
in =new FileInputStream(path);
objIn =new ObjectInputStream(in);
list = (List<T>)objIn.readUnshared();
} catch (IOException | ClassNotFoundExceptione) {
//TODO Auto-generated catch block
e.printStackTrace();
}
returnlist;
}
//向文件写入一个List,T表示List的类型
publicstatic <T>void updateInfo(Tt, Stringpath) {
FileOutputStreamout =null;
ObjectOutputStreamobjOut =null;
try {
//创建文件和文件夹
Filefile =new File(path);
Filedir =new File(file.getParent());
if (!dir.exists()) {
dir.mkdirs();
}
if (!file.exists()) {
file.createNewFile();
}
out =new FileOutputStream(path);
objOut =new ObjectOutputStream(out);
objOut.writeObject(t);
objOut.flush();
} catch (IOExceptione1) {
//TODO Auto-generated catch block
e1.printStackTrace();
} finally {
try {
out.close();
objOut.close();
}catch (IOExceptione) {
//TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
- 一个简易Java开发的图书管理系统
- 简易图书管理系统
- MVP模式下开发的一个图书管理系统(由JAVA修改而来)
- 简易图书管理系统总结
- 基于RFID的简易图书管理系统设计与实现
- 简易图书管理系统(主要是jsp的练习)
- shell实现的一个图书管理系统
- java-图书管理系统
- java-图书管理系统
- 图书管理系统Java
- Java图书管理系统
- java图书管理系统
- 利用Java GUI 实现一个简易的用户管理系统
- Java实现简单的图书管理系统
- JAVA实现简单的图书管理系统
- java系统-图书管理系统
- java简易图书管理之三层模式
- 使用JavaEE开发的一个内部图书管理系统(1)
- Unity 漫反射
- HandlerThread
- Struts2 开发步骤
- easyui-validatebox 验证
- 从零开始深度学习 T1. Regression Case Study
- 一个简易Java开发的图书管理系统
- ssh整合
- 谷歌翻译是如何获得突破性进展?
- 训练总结 9.10
- Javascript原型——类的实现机制
- angualr2——dom操作
- 欢迎使用CSDN-markdown编辑器
- noip2016D1T1 玩具谜题
- cable cable cable(水题)