看完的朋友们如果觉得还不错,给博主一个赞吧,你的一个赞,会给博主很大的支持~蟹蟹! 项目代码链接,提取码: 35xa
项目梳理
【项目前提】
掌握java基本语法 熟悉使用流程控制 理解面向对象思想 熟练封装,继承,多态 熟悉使用接口,异常 熟悉使用集合 熟悉掌握I/o流相关操作
?
【项目内容】
项目功能结构图:
项目功能如下: (1)读者信息管理:包括读者信息添加和读者信息查询与修改功能。用户登录成功之后,可以浏览所有读者的信息,也可以检索特定读者的信息;同时,可以对读者信息进行维护,包括增加、删除及修改。具体信息包括读者类型(读者的类型决定着他可以借到书的最大数量和最大归还天数)、读者姓名、出生日期、性别、电话、所在院系、注册日期等。(相关存储数据可通过I/O流直接存在文件,可也直接在文件里读的数据)
(2)图书信息管理:包括图书信息添加和图书信息查询与修改功能。用户登录成功之后,可以浏览所有图书信息和检索特定图书的信息;也可以对图书信息进行维护。包括添加图书、删除图书以及修改图书信息。具体信息包括:图书ISBN、图书名称、作者、出版社、出版日期、印刷次数、单价、图书类别等。(相关存储数据可通过I/O流直接存在文件,可也直接在文件里读的数据)
(3)图书借阅管理:包括图书借阅和图书归还功能。图书借阅功能,先输入读者的编号,然后输入要借阅的图书的信息,记录系统当前时间即借阅时间;图书归还功能,输入读者的编号,选择其名下已借阅的图书,判断当前日期即归还日期与借阅日期的差值是否超过了规定的期限,计算罚金,从而进行图书的归还操作。具体信息包括:借阅日期、归还日期、罚金。由于要计算罚金,故需要知道该读者的读者类型,根据类型判断其可借图书天数、可借图书数量等。(相关存储数据可通过I/O流直接存在文件,可也直接在文件里读的数据)
(4)基础信息维护:包括图书类别设置、读者类别设置及罚金设置。图书类别设置,可以对图书的类别进行增加、删除、修改和查询;读者类别设置可以对读者的类别进行增加、删除、修改和查询;罚金设置,可以指定超期一天的罚金标准。(相关存储数据可通过I/O流直接存在文件,可也直接在文件里读的数据)
(5)用户管理 :包括修改密码、用户添加和删除。修改密码,是指当前用户修改自己的密码;用户添加和删除,是对新增和去除系统用户时对用户信息的维护。(相关存储数据可通过I/O流直接存在文件,可也直接在文件里读的数据)
?
【项目注意】
1、注意命名(类名,包名,方法名,注释等),请严格遵循Java命名规则完成项目。 参考文献:https://blog.csdn.net/yang_best/article/details/42169549 ? 2、每一个业务逻辑操作需要加上日志打印功能(用I/o流实现,比如什么时候进行了增删改等操作,需要有记录,或者发现异常了也需要将信息同步在日志文件里) ? 3、每个功能模块,如果有异常抛出,需要自定义异常来进行处理
?
【结构设计】
首先结合功能设计,设计6个实体类(存放在Entity_class文件夹):
图书实体:图书编号ISBN、图书名称、作者、出版社、出版日期、印刷次数、单价、图书类型 图书类型:图书类型编号、图书类型名称 读者实体:读者编号、读者姓名、出生日期、性别、电话、所在院系、注册日期 读者类型:读者类型编号、读者类型名称、可借阅天数、可借阅数量 用户:用户编号、用户名、密码 用户类型:用户账号、用户密码 借阅类型:读者编号、书籍编号、借阅日期、归还日期、罚金
? 然后根据操作设计,创建操作类(存放在operate文件夹里)
图书信息操作:BookDao 图书类型操作:BookTypeDao 读者信息操作:ReaderDao 读者类型操作:ReaderTypeDao 用户管理操作:UserDao 借阅管理操作:BookBorrowDao
? 然后创建工具包Tool_class,存放自己创建的异常 BookException 和工具类 TSUtility
? 再创建一个包存放我们进行读写的txt文件 ? 最后创建我们的视图包view,里面存放了有关界面的类
图书操作界面类:BookView 读者操作界面类:ReaderView 用户操作界面类:UserView 主界面类:Menu
? ?
创建后的大致结构如下:
信息管理
用户管理
方法创建
(一)先将 User 类补充完整,创建了三个成员变量 id、name、password,然后创建构造方法和set/get方法
(二)再补充 UserDao 类,这里我创建了如下方法:(注意:这里的异常都是后面写代码时补充上去的,开始创建时不用添加)
public static Users check(String name, String password) throws IOException, ClassNotFoundException{}
public static void initialization() throws IOException{}
public static List<Users> selectUser() throws IOException, ClassNotFoundException{}
public static int insertUser(String name, String password) throws IOException, ClassNotFoundException, BookException{}
public static int updateUserPWD(Integer id, String pwd) throws IOException, ClassNotFoundException, BookException{}
public static int deleteUser(Integer id) throws IOException, ClassNotFoundException, BookException{}
(三)最后补充 LoginView 类,因为系统是需要登录的,所以我们需要创建两个界面:login 和 usersManagement
public static void login() throws IOException, ClassNotFoundException, EOFException, InterruptedException{}
public static void usersManagement() throws IOException, ClassNotFoundException, BookException{}
?
设计思路(整个项目都适用)
敲黑板了!!!重点来了,这是贯穿整个项目的中心思想
(一)读写数据
因为该项目主要是基于文件IO流进行读写的,所以我在工具类中写了两个新的方法,用于从文件中读取和存储数据到文件,这样就避免了代码的重复使用。
而在该项目里我读写数据用的文件IO流主要是对象序列化流,先将所有数据存储到一个集合中,然后将集合存入文件中,因为需要与所有实体类相匹配,我们返回和传入的对象都是设计的Object对象
下列代码就是工具类TSUtility中新建的两个方法
public static Object readFile(File file) throws IOException, ClassNotFoundException {
ObjectInputStream ois=new ObjectInputStream(new FileInputStream(file));
Object o=ois.readObject();
ois.close();
return o;
}
public static void returnFile(Object obj,File file) throws IOException {
ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream(file));
oos.writeObject(obj);
oos.close();
}
但是这样使用序列化存储数据后,就发现了一个问题,若文件内容为空,就会报 EOFException 异常,我的解决方法是:先用 try/catch 将该异常捕获并抛出,然后存入初始数据值,这样后面存入其他数据时就不会再报这个异常
(二)增删改查
后面的增删改查操作,都是差不多的一个结构(如下代码),为什么要这么写呢,因为需要判断该成员的数据是否存在于文件中,根据对应的情况作异常的抛出
boolean flag=false;
for{
if(){
flag=true;
}else{
}
}
if(flag){
}else{
throw new BookException();
}
?
运行界面
(一)登录界面:(------>LoginView类中的Login方法)
该图将账号输入错误、密码输入错误、账号密码正确三种情况都展现出来了 ?
? (二)用户管理界面(----->LoginView中的usersManagement方法)
具体怎么实现的代码就不说了,上面设计思路已经讲了大部分结构
? ? ?
图书管理
方法创建
(一) 先将实体类 BookType 和 Book 补充完整,创建成员变量、构造方法和set/get方法
Book的成员变量:
private String ISBN;
private String bookname;
private String author;
private String publish;
private String publishdate;
private int printtime;
private double unitprice;
private BookType typename;
BookType的成员变量:
private String typeid;
private String typename;
? (二)为 BookTypeDao创建方法
public static void printInfor(List<BookType> list){}
public static void initialization() throws IOException {}
public static List<BookType> selectBookType() throws IOException, ClassNotFoundException {}
public static int insertBookType(Integer id, String typename) throws IOException, ClassNotFoundException, BookException {}
public static int deleteBookType(Integer id) throws IOException, ClassNotFoundException, BookException {}
? 为BookDao创建方法
public static void printInfor(List<Book> list){}
public static void initialization() throws IOException, ClassNotFoundException {}
public static int insertBook(String ISBN, String bookname, String author, String publish, String publishdate, String printtime, String unitprice, BookType bt) throws IOException, ClassNotFoundException, BookException {}
public static List<Book> selectBook() throws IOException, ClassNotFoundException {}
public static List<Book> selectBookByISBN(String ISBN) throws IOException, ClassNotFoundException, BookException {}
public static List<Book> selectBookByName(String bookname) throws IOException, ClassNotFoundException, BookException {}
public static List<Book> selectBookByType(String type) throws IOException, ClassNotFoundException, BookException {}
public static List<Book> selectBookByAuthor(String author) throws IOException, ClassNotFoundException, BookException {}
public static List<Book> selectBookByPublish(String Publish) throws IOException, ClassNotFoundException, BookException {}
public static int update(String ISBN, String bookname, String author, String publish, String publishdate, int printtime, double unitprice, BookType bt) throws IOException, ClassNotFoundException, BookException {}
public static int delete(String ISBN) throws IOException, ClassNotFoundException, BookException {}
(三)为BookView创建方法
(这里的借阅方法会在后面借阅时用到,它属于图书视图的一部分,故在这里就进行创建)
public static void bookTypeManagement() throws IOException, ClassNotFoundException{}
public static void bookInforManagement() throws IOException, ClassNotFoundException{}
public static void bookBorrowingManagement() throws IOException, ClassNotFoundException, ParseException, BookException{}
?
设计思路(补充)
这里的增删改查操作的设计跟上面用户管理的设计原理是一样的,这里我们对它进行补充
在设计BookDao之前要先把BookTypeDao设计好,因为Book实体类的成员变量中有一个是BookType的对象,关系到BookType的调用,如果不先设计好,后面就无法对BookDao进行测试
在项目注意的内容里面有一点,要求每一个业务逻辑操作需要加上日志打印功能,所以我在工具类里写了一个新的方法,每做一次逻辑操作就调用一次这个方法,就能随时更新日志了,代码如下:
public static void logging(String op) throws IOException {
SimpleDateFormat sdf=new SimpleDateFormat();
String s=sdf.format(new Date());
String ss=s+"——"+op;
FileWriter fw=new FileWriter("D:\\JavaSE_Code\\Java_SE_Practice project2\\src\\txtFile\\journal.txt",true);
fw.write(ss);
fw.flush();
fw.write("\r\n");
fw.close();
}
截取文件内一部分日志如下图: ?
运行界面
(一)图书类型管理系统
???????????第一步: ???????????第二步: ???????????最终界面: ? (二)图书信息管理系统
?
? ?
读者管理
方法创建
(一)先补充 Reader类和 ReaderType类的内容
Reader类的成员变量
private String readerid;
private String name;
private String sex;
private int age;
private String phone;
private String depart;
private String regdat;
private ReaderType type;
ReaderType类的成员变量
private String typeid;
private String typename;
private int limit;
private int maxborrownum;
? (二)再补充 ReaderDao 类和 ReaderTypeDao 类的方法
ReaderTypeDao的方法:
(注意这里的罚金设置将在图书借阅和信息维护处用到,且是与读者类型相关联的)
public static void printInfor(List<ReaderType> list){}
public static void initialization() throws IOException, ClassNotFoundException {}
public static List<ReaderType> selectReaderType() throws IOException, ClassNotFoundException {}
public static List<ReaderType> selectReaderType(String type) throws IOException, ClassNotFoundException, BookException {}
public static int insertReaderType(Integer id, String typename, Integer num, Integer limit) throws IOException, ClassNotFoundException, BookException {}
public static int updateReaderType(Integer id, String typename, Integer num, Integer limit) throws IOException, ClassNotFoundException, BookException {}
public static int deleteReaderType(Integer id) throws IOException, ClassNotFoundException, BookException {}
public static Properties fineInsert(String typename,Double fine) throws IOException {}
? ReaderDao的方法:
public static void printInfor(List<Reader> list){}
public static void initialization() throws BookException, IOException, ClassNotFoundException {}
public static int insertReader(String id, List<ReaderType> list,String name,String age,String sex, String phone, String dept, String reg) throws BookException, IOException, ClassNotFoundException {}
public static List<Reader> selectReader() throws IOException, ClassNotFoundException {}
public static List<Reader> selectReaderById(String id) throws IOException, ClassNotFoundException, BookException {}
public static List<Reader> selectReaderByName(String name) throws IOException, ClassNotFoundException, BookException {}
public static List<Reader> selectReaderByType(String type) throws IOException, ClassNotFoundException, BookException {}
public static List<Reader> selectReaderByDept(String dept) throws IOException, ClassNotFoundException, BookException {}
public static int updateReader(String id, String typename, String name, Integer age,String sex, String phone, String dept, String reg) throws IOException, ClassNotFoundException, BookException {}
public static int deleteReader(String id) throws IOException, ClassNotFoundException, BookException {}
? (三)补充ReaderView里面的方法
(注意这里的罚金设置将在图书借阅和信息维护处用到,且是与读者类型相关联的)
public static void readerManagement() throws IOException, ClassNotFoundException, BookException{}
public static void readerCategorySetting() throws BookException, IOException, ClassNotFoundException{}
public static void fineSetting(){}
?
设计思路(补充)
设计思路与前面提到的相同,这里暂时无其他补充 ? ?
运行界面
读者信息管理系统的界面: ?
? ?
操作执行
借阅操作
包括图书借阅和图书归还功能。图书借阅功能,先输入读者的编号,然后输入要借阅的图书的信息,记录系统当前时间即借阅时间;图书归还功能,输入读者的编号,选择其名下已借阅的图书,判断当前日期即归还日期与借阅日期的差值是否超过了规定的期限,计算罚金,从而进行图书的归还操作。具体信息包括:借阅日期、归还日期、罚金。由于要计算罚金,故需要知道该读者的读者类型,根据类型判断其可借图书天数、可借图书数量等。
?
方法创建
(一)补充BookBorrowDao类中的方法(该类执行的借阅操作)
public static void initialization() throws IOException, ParseException, BookException, ClassNotFoundException {}
public static List<BorrowBook> selectBorrowByReaderId(String readerid) throws BookException, IOException, ClassNotFoundException {}
public static void selectAllBorrow() throws IOException, ClassNotFoundException {}
public static int borrowBook(String readerid,String ISBN, String borrowdate) throws IOException, ClassNotFoundException, BookException, ParseException {}
public static int returnBook(String readerid,String ISBN,String returndate,List<BorrowBook> list) throws BookException, IOExceptio{}
? (二)BookView中的借阅操作视图已创建好
?
设计思想(补充)
之前所讲所有设计思想均适用
这里要补充的一个点是:由于借阅和归还时,图书的数量是要跟着+1和-1的,所以在代码中是有通过ForEach对列表内容进行修改的,因此也发现了一个异常 ConcurrentModificationException,详情可以查看博主写的有关该异常的博客(点击此处,查看异常ConcurrentModificationException)
修改前的代码:
for (BorrowBook b:bbl){
String readerid1 = b.getReaderid();
String isbn = b.getISBN();
Date borrowdate1 = b.getBorrowdate();
if (readerid1.equals(readerid) && isbn.equals(ISBN)){
if (b.getBorrowdate()!=null && b.getReturndate()!=null){
num++;
}else {
num++;
flag=false;
}
}
}
? 修改后的代码:(为何这样修改,可以参考迭代器的使用)
ListIterator<BorrowBook> iterator = bbl.listIterator();
while (iterator.hasNext()){
BorrowBook b=iterator.next();
String readerid1 = b.getReaderid();
String isbn = b.getISBN();
Date borrowdate1 = b.getBorrowdate();
if (readerid1.equals(readerid) && isbn.equals(ISBN)){
if (b.getBorrowdate()!=null && b.getReturndate()!=null){
num++;
}else {
num++;
flag=false;
}
}
}
?
运行界面
图书借阅和归还管理界面: ? ? ?
信息维护
信息的维护主要是对图书类型、读者类型和罚金进行设置,这里就不作多的阐述,设计思想都是一致的,相比于信息管理,是较简单的。这里要注意的是,罚金的文件读写方式并不是用的对象序列化,而是采用的 Properties 类,想要了解该类,可以参考博主的文件IO流(点击该链接,查看文件IO流)博文 ? ?
总结
写完整个项目下来,我最大的感受就是:一定要先把需要的类和方法都列出来,这样在后面写代码的时候,能有一个完整的架构让我们去设计。这个项目的内容比我上一个项目要更多和更复杂,但是我却只用了跟上次一样的时间就写完了,这都是因为我在刚开始的时候就列出了所有需要的类,后面写代码的时候一目了然
? ? ? ?
|