项目内容:
项目功能结构图:
项目功能如下:
(1)读者信息管理:包括读者信息添加和读者信息查询与修改功能。用户登录成功之后,可以浏览所有读者的信息,也可以检索特定读者的信息;同时,可以对读者信息进行维护,包括增加、删除及修改。具体信息包括读者类型(读者的类型决定着他可以借到书的最大数量和最大归还天数)、读者姓名、出生日期、性别、电话、所在院系、注册日期等。(相关存储数据可通过I/O流直接存在文件,可也直接在文件里读的数据)
(2)图书信息管理:包括图书信息添加和图书信息查询与修改功能。用户登录成功之后,可以浏览所有图书信息和检索特定图书的信息;也可以对图书信息进行维护。包括添加图书、删除图书以及修改图书信息。具体信息包括:图书ISBN、图书名称、作者、出版社、出版日期、印刷次数、单价、图书类别等。(相关存储数据可通过I/O流直接存在文件,可也直接在文件里读的数据)
(3)图书借阅管理:包括图书借阅和图书归还功能。图书借阅功能,先输入读者的编号,然后输入要借阅的图书的信息,记录系统当前时间即借阅时间;图书归还功能,输入读者的编号,选择其名下已借阅的图书,判断当前日期即归还日期与借阅日期的差值是否超过了规定的期限,计算罚金,从而进行图书的归还操作。具体信息包括:借阅日期、归还日期、罚金。由于要计算罚金,故需要知道该读者的读者类型,根据类型判断其可借图书天数、可借图书数量等。(相关存储数据可通过I/O流直接存在文件,可也直接在文件里读的数据)
(4)基础信息维护:包括图书类别设置、读者类别设置及罚金设置。图书类别设置,可以对图书的类别进行增加、删除、修改和查询;读者类别设置可以对读者的类别进行增加、删除、修改和查询;罚金设置,可以指定超期一天的罚金标准。(相关存储数据可通过I/O流直接存在文件,可也直接在文件里读的数据)
(5)用户管理:包括修改密码、用户添加和删除。修改密码,是指当前用户修改自己的密码;用户添加和删除,是对新增和去除系统用户时对用户信息的维护。(相关存储数据可通过I/O流直接存在文件,可也直接在文件里读的数据)
项目思路:
我的项目文件结构如下:
整个项目下来,查询、添加、修改、删除都进行了多次,完全可以套模板。
现在拿图书信息管理模块说明:
图书文件内容如下:
文件中每一行是一个图书对象,获取文件每一行数据:
for (int i = 0; i < array.size(); i++) {
Book b = (Book) array.get(i);
}
此时每一个 i 获取的是一个图书对象,也就是文件中的一行数据
新建两个类读取文件内容和存储内容到文件
从文件读取数据到集合
public static void readData(String fileName, ArrayList array)throws IOException {
BufferedReader br = new BufferedReader(new FileReader(fileName));
String line;
while ((line=br.readLine())!=null){
String[] strArray = line.split(",");
Book b = new Book();
b.setISBN(strArray[0]);
b.setTypeid(Integer.parseInt(strArray[1]));
b.setBookname(strArray[2]);
b.setAuthor(strArray[3]);
b.setPublish(strArray[4]);
b.setPublishdate(strArray[5]);
b.setPrinttime(Integer.parseInt(strArray[6]));
b.setUnitprice(Double.parseDouble(strArray[7]));
b.setTypename(strArray[8]);
array.add(b);
}
br.close();
}
把集合中的数据存储到文件中
public static void writeData(String fileName, ArrayList array) throws IOException{
BufferedWriter bw=new BufferedWriter(new FileWriter(fileName));
for (int i = 0; i < array.size(); i++) {
Book b = (Book) array.get(i);
StringBuilder sb= new StringBuilder();
sb.append(b.getISBN()).append(",").append(b.getTypeid()).append(",").append(b.getBookname())
.append(",").append(b.getAuthor()).append(",").append(b.getPublish()).append(",").append(b.getPublishdate())
.append(",").append(b.getPrinttime()).append(",").append(b.getUnitprice()).append(",").append(b.getTypename());
bw.write(sb.toString());
bw.newLine();
bw.flush();
}
bw.close();
}
这两个文件的格式都是通用的,只需要修改读取和写入部分,就能对不同的文件进行读取写入
写好这两个读取存入类后,就可以对图书信息进行查询、添加,修改和删除操作
下面讲整个系统下来的需要注意的地方:
1)图书借阅信息:被借阅的图书不能被修改,删除
我们拿删除来说,首先获取借阅情况文件中图书的ISBN存入集合arrayList2,当在删除图书的时候,要删除的图书ISBN不存在集合arrayList2,就可以进行删除,当还需判断要删除的图书ISBN存不存在。反之,存在就不能删除。同样的,修改也可以这样写。
for (int i = 0; i < arrayList.size(); i++) {
BorrowBook bb = (BorrowBook) arrayList.get(i);
arrayList2.add(bb.getISBN());
}
boolean flag = true;
while (flag){
try {
if(!arrayList2.contains(ISBN)){
flag = false;
int index = -1;
while (true){
for (int i = 0; i < array.size(); i++) {
Book b = (Book)array.get(i);
if(b.getISBN().equals(ISBN)){
index=i;
break;
}
}
if(index==-1){
System.out.println("图书不存在");
break;
}else {
System.out.println("你要删除的图书如下:");
selectBookByISBN(ISBN);
System.out.print("确认要删除吗?(Y/N):");
char yn = TSUtility.readConfirmSelection();
if (yn == 'Y') {
array.remove(index);
writeData(fileName,array);
System.out.println("删除成功");
}
break;
}
}
}else{
flag = true;
throw new Exception("当前图书有借阅情况,不能删除");
}
}catch (Exception e){
System.out.println(e.getMessage());
break;
}
}
2)图书借阅后,数量需要减少。图书借阅数量减少就是一个修改功能,当添加了图书借阅情况,通过借阅的图书ISBN,就可以修改图书的数量减一。
3)计算罚金首先需要计算借阅日期和归还日期相差的天数,知道如何时间格式化就行。然后判断读者的类别,通过类别获取读者最大借阅天数,从而计算出罚金。
总结:
作为javaSE基础部分的一个过渡项目,还是有些逻辑需要好好考虑的,做完项目会遇到一些Bug,都是在做之前没考虑到的。这次的项目给我的教训就是,在做之前,一定要好好规划,好好想做完之后存在的明显的Bug,在做之前就想到并解决它。