前言
因为还没有学习到MVC三层架构模式,代码结构上就显得很凌乱,也没有学习到数据库,使用的IO流进行的本地文件存储。
项目功能结构图
项目代码展示
文件存储的核心代码
使用BufferedReader和 BufferedWrite进行文件的读写
public class Dao {
//把书本信息从文件读入集合中
public static void readDate(String fileName, ArrayList<Book> array) throws IOException {
//创建输入缓冲流对象
BufferedReader br = new BufferedReader(new FileReader(fileName));
String line;
while ((line = br.readLine()) != null) {
String[] datas = new String[7];
datas = line.split(",");
Book b = new Book();
b.setBookName(datas[0]);
b.setAuthor(datas[1]);
b.setPublish(datas[2]);
b.setPublishDate(datas[3]);
b.setPrintTime(datas[4]);
b.setTypeName(datas[5]);
b.setUnitPrice(datas[6]);
b.setISBN(datas[7]);
b.setState(datas[8]);
array.add(b);
}
br.close();
}
//把集合中的数据写入文件
public static void writeDate(String fileName, ArrayList<Book> array) throws IOException {
//创建输入缓冲流对象
BufferedWriter bw = new BufferedWriter(new FileWriter(fileName));
for (int i = 0; i < array.size(); i++) {
Book b = array.get(i);
StringBuilder sb = new StringBuilder();
sb.append(b.getBookName()).append(",")
.append(b.getAuthor()).append(",")
.append(b.getPublish()).append(",")
.append(b.getPublishDate()).append(",")
.append(b.getPrintTime()).append(",")
.append(b.getTypeName()).append(",")
.append(b.getUnitPrice()).append(",")
.append(b.getISBN()).append(",")
.append(b.getState());
bw.write(sb.toString());
bw.newLine();
bw.flush();
}
bw.close();
}
//把文件中的用户信息读入数组
public static void readUser(String userName, ArrayList<Users> user) throws IOException {
//创建输入缓冲流对象
BufferedReader brUser = new BufferedReader(new FileReader(userName));
String line;
while ((line = brUser.readLine()) != null) {
String[] dataUser = line.split(",");
Users u = new Users();
u.setId(dataUser[0]);
u.setPassword(dataUser[1]);
user.add(u);
}
brUser.close();
}
//把用户的信息存入文件
public static void writeUser(String userName, ArrayList<Users> user) throws IOException {
BufferedWriter bw = new BufferedWriter(new FileWriter(userName));
for (int i = 0; i < user.size(); i++) {
Users u = user.get(i);
StringBuilder sb = new StringBuilder();
sb.append(u.getId()).append(",").append(u.getPassword());
bw.write(sb.toString());
bw.newLine();
bw.flush();
}
bw.close();
}
//把文件中的借书信息读入数组
public static void readBorrow(String borrowName, ArrayList<Book> borrows) throws IOException {
BufferedReader brBorrow = new BufferedReader(new FileReader(borrowName));
String line;
while ((line = brBorrow.readLine()) != null) {
String[] dataBorrow = line.split(",");
Book b = new Book();
b.setId(dataBorrow[0]);
b.setBookName(dataBorrow[1]);
b.setBorrowDate(dataBorrow[2]);
b.setRevertDate(dataBorrow[3]);
borrows.add(b);
}
brBorrow.close();
}
//把用户的借书信息写入文件
public static void writeBorrow(String borrowName, ArrayList<Book> borrows) throws IOException {
BufferedWriter bw = new BufferedWriter(new FileWriter(borrowName, true));
for (int i = 0; i < borrows.size(); i++) {
Book b = borrows.get(i);
StringBuilder sb = new StringBuilder();
sb.append(b.getId()).append(",").append(b.getBookName()).append(",").append(b.getBorrowDate()).append(",").append(b.getRevertDate());
bw.write(sb.toString());
bw.newLine();
bw.flush();
}
bw.close();
}
}
图书馆包含的内容
图书类
包含书本的所有属性,get、set方法。
public class Book {
private String bookName;//书名
private String author;//作者
private String publish;//出版社
private String publishDate;//出版日期
private String printTime;//印刷次数
private String unitPrice;//单价
private String typeId;//类型id
private String typeName;//类型名
private String ISBN;//ISBN
private String state;//是否借出
private String id;//用户的借书id
private String borrowDate;//借书时间
private String revertDate;//还书时间
public Book() {
}
public Book(String bookName, String author, String publish, String publishDate, String printTime, String unitPrice, String typeId, String typeName, String ISBN, String state, String id, String borrowDate, String revertDate) {
this.bookName = bookName;
this.author = author;
this.publish = publish;
this.publishDate = publishDate;
this.printTime = printTime;
this.unitPrice = unitPrice;
this.typeId = typeId;
this.typeName = typeName;
this.ISBN = ISBN;
this.state = state;
this.id = id;
this.borrowDate = borrowDate;
this.revertDate = revertDate;
}
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 String getPublish() {
return publish;
}
public void setPublish(String publish) {
this.publish = publish;
}
public String getPublishDate() {
return publishDate;
}
public void setPublishDate(String publishDate) {
this.publishDate = publishDate;
}
public String getPrintTime() {
return printTime;
}
public void setPrintTime(String printTime) {
this.printTime = printTime;
}
public String getUnitPrice() {
return unitPrice;
}
public void setUnitPrice(String unitPrice) {
this.unitPrice = unitPrice;
}
public String getTypeId() {
return typeId;
}
public void setTypeId(String typeId) {
this.typeId = typeId;
}
public String getTypeName() {
return typeName;
}
public void setTypeName(String typeName) {
this.typeName = typeName;
}
public String getISBN() {
return ISBN;
}
public void setISBN(String ISBN) {
this.ISBN = ISBN;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getBorrowDate() {
return borrowDate;
}
public void setBorrowDate(String borrowDate) {
this.borrowDate = borrowDate;
}
public String getRevertDate() {
return revertDate;
}
public void setRevertDate(String revertDate) {
this.revertDate = revertDate;
}
}
对书本操作
包含增删查改
public class BookOperation {
//查看所有图书
public static void findAllBook(String fileName) throws IOException {
Dao dao = new Dao();
//创建集合对象
ArrayList<Book> array = new ArrayList<Book>();
//从文件中把数据独到集合中
dao.readDate(fileName, array);
//首先判断集合中是否有数据,如果没有数据,就给出提示,并让该方法不继续向下执行
if (array.size() == 0) {
System.out.println("没有图书信息可供查询,请返回重新选择操作");
return;
}
System.out.println("书名\t\t\t\t作者\t\t\t\t出版社\t\t\t\t出版日期\t\t\t\t印刷次数\t\t\t单价\t\t\t\t类型名\t\t\t\tISBN\t\t\t\t是否借出");
for (int i = 0; i < array.size(); i++) {
Book b = array.get(i);
System.out.println(b.getBookName() +
"\t\t\t" + b.getAuthor() +
"\t\t\t\t" + b.getPublish() +
"\t\t\t" + b.getPublishDate() +
"\t\t\t" + b.getPrintTime() +
"\t\t\t\t" + b.getUnitPrice() +
"\t\t\t" + b.getTypeName() +
"\t\t\t\t" + b.getISBN() +
"\t\t\t\t" + b.getState());
}
}
/*
* @Description 添加图书
* @Param [array]
* @return void
**/
public static void addBook(String fileName) throws IOException {
Dao dao = new Dao();
//创建集合对象
ArrayList<Book> array = new ArrayList<Book>();
//从文件中把数据独到集合中
dao.readDate(fileName, array);
//创建键盘录入的对象
Scanner scanner = new Scanner(System.in);
//为了让bookname能够被访问到,我们就把id定义在了循环的外面
String bookname;
//为了让代码能够回到这里来,使用循环
while (true) {
System.out.println("请输入书名");
bookname = scanner.nextLine();
//判断书名是否重复
//定义标记
boolean flag = false;
//遍历集合,得到每一本书
for (int i = 0; i < array.size(); i++) {
Book b = array.get(i);
//获取图书的书名,和键盘录入的书名进行比较
if (b.getBookName().equals(bookname)) {
flag = true;//说明书名被占用了
break;
}
}
if (flag) {
System.out.println("你输入的书本已存在,请重新输入");
} else {
break;//结束循环
}
}
System.out.println("请输入作者");
String author = scanner.nextLine();
System.out.println("请输入出版社");
String publish = scanner.nextLine();
System.out.println("请输入出版日期");
String publishDate = scanner.nextLine();
System.out.println("请输入印刷次数");
String printTime = scanner.nextLine();
System.out.println("请输入单价");
String unitPrice = scanner.nextLine();
System.out.println("请输入类型名称");
String typeName = scanner.nextLine();
System.out.println("请输入ISBN");
String ISBN = scanner.nextLine();
Book book = new Book();
book.setBookName(bookname);
book.setAuthor(author);
book.setPublish(publish);
book.setPublishDate(publishDate);
book.setPrintTime(printTime);
book.setTypeName(typeName);
book.setUnitPrice(unitPrice);
book.setISBN(ISBN);
book.setState("否");
array.add(book);
//把集合中的数据重新写回到文件
dao.writeDate(fileName, array);
System.out.println("添加图书成功");
}
//删除书本
public static void deleteBook(String filename) throws IOException {
//删除书本的思路:键盘录入一个书本名,到集合中去查找,看是否有书本的名称使用,有就删除
Dao dao = new Dao();
//创建集合对象
ArrayList<Book> array = new ArrayList<Book>();
//从文件中把数据独到集合中
dao.readDate(filename, array);
//创建键盘输入对象
Scanner scanner = new Scanner(System.in);
System.out.println("请输入你要删除的书本名称");
String bookname = scanner.nextLine();
//定义一个索引
int index = -1;
//遍历集合
for (int i = 0; i < array.size(); i++) {
//获取每一本书对象
Book b = array.get(i);
//那这个书本对象的名称和键盘录入的,名称进行比较
if (b.getBookName().equals(bookname) && b.getState().equals("否")) {
index = i;
break;
}
}
if (index == -1) {
System.out.println("不好意思,你要删除的书本对应的名称不存在或已被借出,请回去重新你的选择");
} else {
array.remove(index);
//把集合中的数据重新写回到文件
dao.writeDate(filename, array);
System.out.println("删除图书成功");
}
}
//修改书本
public static void updateBook(String fileName) throws IOException {
//思路:键盘录入一个书名,到集合中去查找,看是否有图书使用书名,有就修改
Dao dao = new Dao();
//创建集合对象
ArrayList<Book> array = new ArrayList<Book>();
//从文件中把数据独到集合中
dao.readDate(fileName, array);
//创建键盘录入对象
Scanner scanner = new Scanner(System.in);
System.out.println("请输入你要修改书本的书名:");
String bookname = scanner.nextLine();
//定义一个索引
int index = -1;
int i;
//遍历集合
for (i = 0; i < array.size(); i++) {
//获取每一个书本对象
Book b = array.get(i);
//拿书本对象的书名和键盘录入的名称进行比较
if (b.getBookName().equals(bookname)) {
index = i;
break;
}
}
if (index == -1) {
System.out.println("不好意思,你要修改的书本对应的名称不存在,请回去重新你的选择");
} else {
System.out.println("请输入新的作者");
String author = scanner.nextLine();
System.out.println("请输入新的出版社");
String publish = scanner.nextLine();
System.out.println("请输入新的出版日期");
String publishDate = scanner.nextLine();
System.out.println("请输入新的印刷次数");
String printTime = scanner.nextLine();
System.out.println("请输入新的单价");
String unitPrice = scanner.nextLine();
System.out.println("请输入新的类型名称");
String typeName = scanner.nextLine();
System.out.println("请输入新的ISBN");
String ISBN = scanner.nextLine();
//创建书本对象
Book b = new Book();
b.setBookName(bookname);
b.setAuthor(author);
b.setPublish(publish);
b.setPublishDate(publishDate);
b.setPrintTime(printTime);
b.setUnitPrice(unitPrice);
b.setTypeName(typeName);
b.setISBN(ISBN);
b.setState(array.get(i).getState());
//修改集合中的学生对象
array.set(index, b);
//把集合中的数据重新写回到文件
dao.writeDate(fileName, array);
//给出提示
System.out.println("修改书本成功");
}
}
}
用户
用户类
包含他所有的属性和get、set方法
public class Users {
private String id;//账号
private String password;//密码
public Users() {
}
public Users(String id, String password) {
this.id = id;
this.password = password;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
用户操作
public class UsersOperation {
AdminMenu adminMenu = new AdminMenu();
UserMenu userMenu = new UserMenu();
Scanner sc = new Scanner(System.in);
String id;
String password;
//登录
public void logIn(String userName) throws IOException {
Dao dao = new Dao();
ArrayList<Users> user = new ArrayList<Users>();
dao.readUser(userName, user);
// Scanner sc = new Scanner(System.in);
boolean flag2 = true;
while (flag2) {
System.out.println("请输入你的账号:");
id = sc.nextLine();
if (id.equals("admin")) {
System.out.println("请输入你的账户密码:");
password = sc.nextLine();
if (password.equals("admin")) {
adminMenu.Menu(id);
} else {
System.out.println("密码错误");
break;
}
}
boolean flag = false;
for (int i = 0; i < user.size(); i++) {
Users u = user.get(i);
if (u.getId().equals(id)) {
flag = true;
break;
}
}
if (flag) {
System.out.println("请输入你的账户密码:");
flag2 = false;
password = sc.nextLine();
boolean flag1 = false;
Users u;
for (int i = 0; i < user.size(); i++) {
u = user.get(i);
if (u.getPassword().equals(password)) {
flag1 = true;
break;
}
}
if (flag1) {
System.out.println("登录成功");
userMenu.userMenu(id);
break;
} else {
System.out.println("密码错误,请重新输入密码");
continue;
}
} else {
System.out.println("还没有注册账号,请先注册。");
break;
}
}
}
//注册
public void logOn(String userName) throws IOException {
Dao dao = new Dao();
ArrayList<Users> user = new ArrayList<Users>();
dao.readUser(userName, user);
Scanner sc = new Scanner(System.in);
String id;
while (true) {
System.out.println("请输入想要注册的账号:");
id = sc.nextLine();
boolean flag = false;
for (int i = 0; i < user.size(); i++) {
Users u = user.get(i);
if (u.getId().equals(id)) {
flag = true;
break;
}
}
if (flag) {
System.out.println("你输入的账号已经存在,请重新输入。");
} else {
break;
}
}
System.out.println("请输入密码:");
String password = sc.nextLine();
Users users = new Users();
users.setId(id);
users.setPassword(password);
user.add(users);
dao.writeUser(userName, user);
System.out.println("注册成功");
}
//查看已借阅的书籍
// public void showBorrower(String borrowName,String id) throws IOException {
//
// Dao dao = new Dao();
//
// ArrayList<Book> show = new ArrayList<>();
// dao.readBorrow(borrowName,show);
//
// int index = -1;
//
// //遍历集合
// for (int i = 0; i < show.size(); i++) {
// Book b = show.get(i);
// if (b.getId().equals(id)) {
// index = i;
// break;
// }
// }
//
//
// }
//修改信息
public void updateUser(String userName) throws IOException {
Dao dao = new Dao();
ArrayList<Users> users = new ArrayList<Users>();
dao.readUser(userName, users);
int i;
for (i = 0; i < users.size(); i++) {
Users u = users.get(i);
break;
}
System.out.println("请输入新的密码:");
String password = sc.nextLine();
Users u = new Users();
u.setId(users.get(i).getId());
u.setPassword(password);
users.set(i, u);
dao.writeUser(userName, users);
System.out.println("修改信息成功");
}
//借书
public void borrowBook(String fileName, String borrowName, String id) throws IOException {
UsersOperation usersOperation = new UsersOperation();
// SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
Scanner scanner = new Scanner(System.in);
Dao dao = new Dao();
BookOperation bookOperation = new BookOperation();
bookOperation.findAllBook(fileName);
//把书本信息加入books数组中
ArrayList<Book> books = new ArrayList<>();
dao.readDate(fileName, books);
//新建借书的数组,好存入借书信息
ArrayList<Book> borrow = new ArrayList<>();
System.out.println("请输入你想借书的书名:");
String bookName = scanner.nextLine();
boolean flag = false;
int i;
for (i = 0; i < books.size(); i++) {
Book b = books.get(i);
if (b.getBookName().equals(bookName) && b.getState().equals("否")) {
flag = true;
break;
}
}
if (flag) {
Book b = new Book();
b.setId(id);
b.setBookName(bookName);
b.setBorrowDate(usersOperation.borrowTime());
b.setRevertDate(usersOperation.revertTime());
borrow.add(b);
dao.writeBorrow(borrowName, borrow);
b.setBookName(books.get(i).getBookName());
b.setAuthor(books.get(i).getAuthor());
b.setPublish(books.get(i).getPublish());
b.setPublishDate(books.get(i).getPublishDate());
b.setPrintTime(books.get(i).getPrintTime());
b.setUnitPrice(books.get(i).getUnitPrice());
b.setTypeName(books.get(i).getTypeName());
b.setISBN(books.get(i).getISBN());
b.setState("是");
books.set(i, b);
dao.writeDate(fileName, books);
System.out.println("借书成功");
} else {
System.out.println("书本不存在或被借出请重新选择");
}
}
//还书
public void revertBook(String fileName, String borrowName, String id) throws IOException {
Dao dao = new Dao();
//创建集合对象
ArrayList<Book> revert = new ArrayList<Book>();
//从文件中把数据独到集合中
dao.readBorrow(borrowName, revert);
ArrayList<Book> books = new ArrayList<>();
dao.readDate(fileName, books);
Scanner scanner = new Scanner(System.in);
String bookname;
System.out.println("请输入书名");
bookname = scanner.nextLine();
//判断书名是否重复
//定义标记
boolean flag = false;
//遍历集合,得到每一本书
for (int i = 0; i < revert.size(); i++) {
Book b = revert.get(i);
//获取图书的书名,和键盘录入的书名进行比较
if (b.getBookName().equals(bookname) && b.getId().equals(id)) {
flag = true;//说明书名被占用了
break;
}
}
if (flag) {
int i;
for (i = 0; i < books.size(); i++) {
Book b = books.get(i);
//获取图书的书名,和键盘录入的书名进行比较
if (b.getBookName().equals(bookname)) {
break;
}
}
Book b1 = new Book();
b1.setBookName(books.get(i).getBookName());
b1.setAuthor(books.get(i).getAuthor());
b1.setPublish(books.get(i).getPublish());
b1.setPublishDate(books.get(i).getPublishDate());
b1.setPrintTime(books.get(i).getPrintTime());
b1.setUnitPrice(books.get(i).getUnitPrice());
b1.setTypeName(books.get(i).getTypeName());
b1.setISBN(books.get(i).getISBN());
b1.setState("否");
books.set(i, b1);
dao.writeDate(fileName, books);
System.out.println("还书成功");
} else {
System.out.println("书本不存在或不是你借走的");
}
}
//借书时间
public String borrowTime() {
Calendar calendar = Calendar.getInstance();
long createTime = calendar.getTimeInMillis();
SimpleDateFormat form1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String res = form1.format(createTime);
return res;
}
//还书时间
public String revertTime() {
Calendar calendar = Calendar.getInstance();
long createTime = calendar.getTimeInMillis();
SimpleDateFormat form1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String res = form1.format(createTime);
calendar.set(Calendar.DAY_OF_YEAR, calendar.get(Calendar.DAY_OF_YEAR) + 7);
Date today = calendar.getTime();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String result = format.format(today);
return result;
}
}
UI界面
管理员登录界面
public class AdminMenu {
public void Menu(String id) throws IOException {
BookOperation book = new BookOperation();
//创建集合对象,用于存储图书数据
String fileName = "F:\\java\\MyLibraryManager\\src\\Book.txt";
//为了让程序能够回到这里来,使用循环
while (true) {
//主界面
System.out.println("--------欢迎来到图书管理系统--------");
System.out.println("1.查看所有图书");
System.out.println("2.添加图书");
System.out.println("3.删除图书");
System.out.println("4.修改图书");
System.out.println("5.退出系统");
System.out.println("请输入你的选择:");
//创建键盘录入的对象
Scanner scanner = new Scanner(System.in);
String choiceString = scanner.nextLine();
//用switch语句实现选择
switch (choiceString) {
case "1":
//查看所有图书
book.findAllBook(fileName);
continue;
case "2":
//添加图书
book.addBook(fileName);
continue;
case "3":
//删除图书
book.deleteBook(fileName);
continue;
case "4":
//修改图书
book.updateBook(fileName);
continue;
case "5":
//退出
//System.out.println("谢谢你的使用");
//break;
default:
System.out.println("谢谢你的使用");
System.exit(0);//JVM退出
continue;
}
}
}
}
登录界面
也是程序的入口
public class Login {
public static void main(String[] args) throws IOException {
UsersOperation usersOperation = new UsersOperation();
String userName = "F:\\java\\MyLibraryManager\\src\\User.txt";
while (true) {
System.out.println("--------欢迎来到图书管理系统--------");
System.out.println("1.登录");
System.out.println("2.注册");
System.out.println("3.退出系统");
Scanner sc = new Scanner(System.in);
String choiceLogin = sc.nextLine();
switch (choiceLogin) {
case "1":
//登录
usersOperation.logIn(userName);
break;
case "2":
//注册
usersOperation.logOn(userName);
break;
case "3":
//退出
default:
System.out.println("谢谢你的使用");
System.exit(0);//JVM退出
break;
}
}
}
}
用户登录界面
public class UserMenu {
public void userMenu(String id) throws IOException {
UsersOperation usersOperation = new UsersOperation();
String fileName = "F:\\java\\MyLibraryManager\\src\\Book.txt";
String userName = "F:\\java\\MyLibraryManager\\src\\User.txt";
String borrowName = "F:\\java\\MyLibraryManager\\src\\Borrow.txt";
BookOperation bookOperation = new BookOperation();
while (true) {
System.out.println("--------欢迎来到图书管理系统--------");
System.out.println("1.查看所有图书");
// System.out.println("2.查看已借阅书籍");
System.out.println("2.修改个人信息");
System.out.println("3.借书");
System.out.println("4.还书");
System.out.println("5.退出系统");
Scanner scanner = new Scanner(System.in);
String choiceString = scanner.nextLine();
switch (choiceString) {
case "1":
//查看所有图书
bookOperation.findAllBook(fileName);
continue;
// case "2":
// //查看已借阅书籍
// continue;
case "2":
//修改个人信息
usersOperation.updateUser(userName);
continue;
case "3":
//借书
usersOperation.borrowBook(fileName, borrowName,id);
continue;
case "4":
//还书
usersOperation.revertBook(fileName,borrowName,id);
continue;
case "5":
//退出
//System.out.println("谢谢你的使用");
//break;
default:
System.out.println("谢谢你的使用");
System.exit(0);//JVM退出
break;
}
}
}
}
总结
第一个项目对于我来说难度还是有点大,IO流这一块是卡的最久的地方,有想法但是难以实现在代码上,编程的语感不够,基础还是有点不牢固。但是在最后也还是完成了项目,实现了大部分的功能。继续学习以后完善这个项目。