一个简易Java开发的图书管理系统

来源:互联网 发布:人工智能方向 知乎 编辑:程序博客网 时间:2024/06/07 01:16


一个简易Java开发的图书管理系统

1概述

   这是一个综合的Java开发的图书管理系统,拥有普通用户和会员用户,以及管理员用户的登陆方式,主要可以买书,租书,管理员可以入库出库,新增书籍等。。。。当用户买书消费达到100元时,自动升级为会员,享受85折优惠!如果用户租书超期未还,将产生额外的费用,同时拖欠达到30天以上的用户将被拉入黑名单,停止使用买书租书服务,除非缴清费用并额外缴纳100元钱来重新开启服务,数据使用本地文件存储,使用了字节流方式,对象序列化接口等,同时有日志和文件记录用户的操作信息,如登陆,买书,租书等

2效果图如下:

 

3主要功能

   主要可以买书,租书,管理员可以入库出库,新增书籍等。。。。当用户买书消费达到100元时,自动升级为会员,享受85折优惠!如果用户租书超期未还,将产生额外的费用,同时拖欠达到30天以上的用户将被拉入黑名单,停止使用买书租书服务,除非缴清费用并额外缴纳100元钱来重新开启服务
 

图书管理相关操作

仅使用会员卡付款可以优惠

租书时先付款,如果还书超期将在还书时额外收取超期部分的金额

用户如果没有没有按时还书,超期天数将收取双倍的租金

超期30天则将该用户加入黑名单,如果想恢复,需要缴纳100元超期金

会员一级是买书总金额达到100元(租书费用不算)

4实现方式

 

需要建立实体类和工具类

  1. 程序入口方法如下:

 

//程序入口方法

 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. 登陆注册如下:

//登陆和注册,权限:-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;//返回其他结果

}

  1. 显示菜单:

//显示用户操作菜单

@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;

 }


 

  1. 显示书籍:

     //展示前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("......");

   }

 }
  1.      买书:

       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

//从文件读取,返回所有UserList

@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();

    }

 

  }

 

}

}

 

             

 

原创粉丝点击