JavaEE 图书管理系统

基于阿里巴巴的fastjson框架搭建的JavaEE版本的图书管理系统,项目架构如下:

fastjson包的阿里云下载镜像如下:

Central Repository: com/alibaba/fastjson2/fastjson2/2.0.8

运行效果:

Bean

Book.java

复制代码
package Bean;

public class Book {
	private String title;// 书名
	private String author;// 作者名
	private double price;// 价格
	private String type;// 书籍类型
	private boolean borrowed;// 借阅状态,默认为false

	public Book(String title, String author, double price, String type) {
		this.title = title;
		this.author = author;
		this.price = price;
		this.type = type;
		this.borrowed = false;// 默认为false
	}

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public String getAuthor() {
		return author;
	}

	public void setAuthor(String author) {
		this.author = author;
	}

	public double getPrice() {
		return price;
	}

	public void setPrice(double price) {
		this.price = price;
	}

	public String getType() {
		return type;
	}

	public void setType(String type) {
		this.type = type;
	}

	public boolean isBorrowed() {
		return borrowed;
	}

	public void setBorrowed(boolean borrowed) {
		this.borrowed = borrowed;
	}

	@Override
	public String toString() {
		return "Book{" + "title='" + title + '\'' + ", author='" + author + '\'' + ", price=" + price + ", type='"
				+ type + '\'' + ", borrowed=" + borrowed + '}';
	}
}

Book.java

复制代码
package Bean;

public class User {
	private String username;// 用户名
	private String password;// 密码
	private String role;// 角色

	public String getUsername() {
		return username;
	}

	public User(String username, String password, String role) {
		this.username = username;
		this.password = password;
		this.role = role;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String getRole() {
		return role;
	}

	public void setRole(String role) {
		this.role = role;
	}
}

Dao

BookDao

复制代码
package Dao;

import Bean.Book;
import java.util.List;

public interface BookDao {
	// 读取json文件信息
	List<Book> getAllBooks();

	// 保存图书信息
	void saveBooks(List<Book> books);

	// 添加图书
	void addBook(Book book);

	// 删除图书
	void removeBook(String title);

	// 查找图书
	Book findBook(String title);

	// 更新图书借阅状态
	void updateBookStatus(String title, boolean borrowed);

	// 更新图书信息
	void updateBookDetails(String newTitle, String newAuthor, double newPrice, String newType);
}

UserDao

复制代码
package Dao;

import Bean.User;
import java.util.List;

public interface UserDao {
	// 读取文件信息
	List<User> getAllUsers();

	// 添加用户
	void addUser(User user);

	// 查找用户
	User findUser(String username);
}

Dao.Impl

BookDaoImpl.java

复制代码
package Dao.Impl;

import Bean.Book;
import Dao.BookDao;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;

import java.io.*;
import java.util.ArrayList;
import java.util.List;

public class BookDaoImpl implements BookDao {
	private static final String PATH = "books.txt";

	/**
	 * @author Stringzhua
	 * @exception 将books通过json解析为List集合中的数据
	 */
	@Override
	public List<Book> getAllBooks() {
		StringBuilder jsonString = new StringBuilder();
		try (BufferedReader reader = new BufferedReader(new FileReader(PATH))) {
			String line;
			while ((line = reader.readLine()) != null) {
				jsonString.append(line);
			}
		} catch (IOException e) {
			e.printStackTrace();
			return new ArrayList<>();
		}
		// 从一个json数组字符串中解析出多个jsonObjects,并将存储在一个 List<JSONObject> 中
		List<JSONObject> jsonObjects = JSON.parseArray(jsonString.toString(), JSONObject.class);
		List<Book> books = new ArrayList<>();
		// 遍历list集合
		for (JSONObject jsonObject : jsonObjects) {
			Book book = new Book(jsonObject.getString("title"), jsonObject.getString("author"),
					jsonObject.getDoubleValue("price"), jsonObject.getString("type"));
			book.setBorrowed(jsonObject.getBooleanValue("borrowed"));
			books.add(book);
		}
		return books;
	}

	/**
	 * @author Stringzhua
	 * @exception 保存集合中的所有图书信息到json文件中
	 */
	@Override
	public void saveBooks(List<Book> books) {
		List<JSONObject> jsonObjects = new ArrayList<>();
		for (Book book : books) {
			JSONObject jsonObject = new JSONObject();
			jsonObject.put("title", book.getTitle());
			jsonObject.put("author", book.getAuthor());
			jsonObject.put("price", book.getPrice());
			jsonObject.put("type", book.getType());
			jsonObject.put("borrowed", book.isBorrowed());
			jsonObjects.add(jsonObject);
		}

		try (Writer writer = new FileWriter(PATH)) {
			writer.write(JSON.toJSONString(jsonObjects));
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	// 添加图书方法
	@Override
	public void addBook(Book book) {
		List<Book> books = getAllBooks();
		books.add(book);
		saveBooks(books);
	}

	// 删除图书
	@Override
	public void removeBook(String title) {
		List<Book> books = getAllBooks();
		books.removeIf(book -> book.getTitle().equals(title));
		saveBooks(books);
	}

	// 查找图书
	@Override
	public Book findBook(String title) {
		for (Book book : getAllBooks()) {
			if (book.getTitle().equals(title)) {
				return book;
			}
		}
		return null;
//		return getAllBooks().stream().filter(book -> book.getTitle().equals(title)).findFirst().orElse(null);
	}

	// 借书
	@Override
	public void updateBookStatus(String title, boolean borrowed) {
		List<Book> books = getAllBooks();
		for (Book book : books) {
			if (book.getTitle().equals(title)) {
				book.setBorrowed(borrowed);
				break;
			}
		}
		// 借书后保存信息到json文件中
		saveBooks(books);
	}

	// 更新图书
	@Override
	public void updateBookDetails(String title, String newAuthor, double newPrice, String newType) {
		List<Book> books = getAllBooks();
		for (Book book : books) {
			if (book.getTitle().equals(title)) {
				book.setAuthor(newAuthor);
				book.setPrice(newPrice);
				book.setType(newType);
				break;
			}
		}
		// 更新后保存到json文件中
		saveBooks(books);
	}
}

UserDaoImpl.java

复制代码
package Dao.Impl;

import Bean.User;
import Dao.UserDao;

import java.io.*;
import java.util.ArrayList;
import java.util.List;

public class UserDaoImpl implements UserDao {
	private static final String PATH = "users.txt";

	/**
	 * @author Stringzhua
	 * @exception 将txt文件中的数据添加到users集合中
	 */
	@Override
	public List<User> getAllUsers() {
		List<User> users = new ArrayList<>();
		try (BufferedReader reader = new BufferedReader(new FileReader(PATH))) {
			String line;
			while ((line = reader.readLine()) != null) {
				String[] userInfo = line.split(",");
				if (userInfo.length == 3) {
					users.add(new User(userInfo[0], userInfo[1], userInfo[2]));
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		return users;
	}

	/**
	 * @author Stringzhua
	 * @exception 将新注册的用户信息写入到books.txt文件中
	 */
	@Override
	public void addUser(User user) {
		try (BufferedWriter writer = new BufferedWriter(new FileWriter(PATH, true))) {
			writer.write(user.getUsername() + "," + user.getPassword() + "," + user.getRole());
			writer.newLine();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * @author Stringzhua
	 * @exception 根据username去遍历集合中符合条件的user对象,返回该对象
	 */
	@Override
	public User findUser(String username) {
		for (User user : getAllUsers()) {
			if (user.getUsername().equals(username)) {
				return user;
			}
		}
		// 没有找到
		return null;
//		return getAllUsers().stream().filter(user -> user.getUsername().equals(username)).findFirst().orElse(null);
	}
}

Service

BookService.java

复制代码
package Service;

import Bean.Book;
import java.util.List;

//TODO:同名的一本书借书的问题
public interface BookService {
	// 读取json文件信息
	List<Book> getAllBooks();

	// 添加图书
	void addBook(Book book);

	// 删除图书
	void removeBook(String title);

	// 查找图书
	Book findBook(String title);

	// 更新图书借阅状态
	void updateBookStatus(String title, boolean borrowed);

	// 更新图书信息
	void updateBookDetails(String title, String newAuthor, double newPrice, String newType);
}

UserService.java

复制代码
package Service;

import Bean.User;
import java.util.List;

public interface UserService {
	// 读取文件信息
	List<User> getAllUsers();

	// 添加用户
	void addUser(User user);

	// 查找用户
	User findUser(String username);
}

Service.Impl

BookServiceImpl.java

复制代码
package Service.Impl;

import Bean.Book;
import Dao.BookDao;
import Service.BookService;
import java.util.List;

public class BookServiceImpl implements BookService {
	private BookDao bookDao;

	// 有参构造方法
	public BookServiceImpl(BookDao bookDao) {
		this.bookDao = bookDao;
	}

	// 读取json文件信息
	@Override
	public List<Book> getAllBooks() {
		return bookDao.getAllBooks();
	}

	// 添加图书
	@Override
	public void addBook(Book book) {
		bookDao.addBook(book);
	}

	// 删除图书
	@Override
	public void removeBook(String title) {
		bookDao.removeBook(title);
	}

	// 查找图书
	@Override
	public Book findBook(String title) {
		return bookDao.findBook(title);
	}

	// 更新图书借阅状态
	@Override
	public void updateBookStatus(String title, boolean borrowed) {
		bookDao.updateBookStatus(title, borrowed);
	}

	// 更新图书信息
	@Override
	public void updateBookDetails(String newtitle, String newAuthor, double newPrice, String newType) {
		bookDao.updateBookDetails(newtitle, newAuthor, newPrice, newType);
	}
}

UserServiceImpl.java

复制代码
package Service.Impl;

import Bean.User;
import Dao.UserDao;
import Service.UserService;
import java.util.List;

public class UserServiceImpl implements UserService {
	private UserDao userDao;

	// 有参构造方法
	public UserServiceImpl(UserDao userDao) {
		this.userDao = userDao;
	}

	// 读取文件信息
	@Override
	public List<User> getAllUsers() {
		return userDao.getAllUsers();
	}

	// 添加用户
	@Override
	public void addUser(User user) {
		userDao.addUser(user);
	}

	// 查找用户
	@Override
	public User findUser(String username) {
		return userDao.findUser(username);
	}
}

Utils

复制代码
package Utils;

import java.text.SimpleDateFormat;
import java.util.Date;

public class Message {
	// 展示用户名和当前时间
	public static void WelcomeMessage(String username) {
		SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String currentTime = formatter.format(new Date());
		System.out.println("欢迎 " + username + "! 当前时间: " + currentTime);
	}
}

View

View.Impl

AdminMenu.java

复制代码
package View.Impl;

import Bean.Book;
import Service.BookService;

import java.util.Scanner;

public class AdminMenu {
	public static void adminMenu(Scanner sc, BookService bookService) {
		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.print("请输入选择: ");
			int choice = sc.nextInt();
			sc.nextLine(); // 换行
			switch (choice) {
			case 1:
				addBook(sc, bookService);
				break;
			case 2:
				removeBook(sc, bookService);
				break;
			case 3:
				editBook(sc, bookService);
				break;
			case 4:
				searchBook(sc, bookService);
				break;
			case 5:
				return;
			default:
				System.out.println("无效的选择,请重新选择!");
			}
		}
	}

	private static void addBook(Scanner sc, BookService bookService) {
		System.out.println("============添加书籍============");
		System.out.print("请输入书名: ");
		String title = sc.nextLine();
		System.out.print("请输入作者: ");
		String author = sc.nextLine();
		System.out.print("请输入价格: ");
		double price = sc.nextDouble();
		sc.nextLine(); // 换行
		System.out.print("请输入类型: ");
		String type = sc.nextLine();
		Book book = new Book(title, author, price, type);
		bookService.addBook(book);
		System.out.println(book.getTitle() + "图书添加成功!");
	}

	private static void removeBook(Scanner sc, BookService bookService) {
		System.out.println("============删除书籍============");
		System.out.print("请输入要删除的书名: ");
		String title = sc.nextLine();
		bookService.removeBook(title);
		System.out.println("图书删除成功!");
	}

	private static void editBook(Scanner sc, BookService bookService) {
		System.out.println("============修改书籍============");
		System.out.print("请输入要编辑的书名: ");
		String title = sc.nextLine();
		Book book = bookService.findBook(title);
		if (book != null) {
			System.out.print("请输入新的作者:( 原书作者" + book.getAuthor() + ")");
			String newAuthor = sc.nextLine();
			System.out.print("请输入新的价格: (原书价格" + book.getPrice() + ")");
			double newPrice = sc.nextDouble();
			sc.nextLine(); // 换行
			System.out.print("请输入新的类型:(原书类型" + book.getType() + ")");
			String newType = sc.nextLine();
			bookService.updateBookDetails(title, newAuthor, newPrice, newType);
			System.out.println(title + "图书信息更新成功!");
		} else {
			System.out.println("书库中未找到这本《" + title + "》,请确认书名是否正确!");
		}
	}

	static void searchBook(Scanner sc, BookService bookService) {
		System.out.println("查询图书菜单");
		System.out.println("1. 查询全部图书");
		System.out.println("2. 按书名查询");
		System.out.println("3. 按作者查询");
		System.out.println("4. 按类型查询");
		System.out.print("请输入选择: ");
		int choice = sc.nextInt();
		sc.nextLine(); // 换行
		switch (choice) {
		case 1:
			System.out.println("===========查找所有书籍=============");
			for (Book book : bookService.getAllBooks()) {
				System.out.println(book);
			}
			break;
		case 2:
			System.out.println("===========根据书名查找书籍=============");
			System.out.print("请输入书名: ");
			String title = sc.nextLine();
			for (Book book : bookService.getAllBooks()) {//根据书名查找集合中的book对象
				if (book.getTitle().contains(title)) {
					System.out.println(book);
				}
			}
			break;
		case 3:
			System.out.println("===========根据作者名查找书籍=============");
			System.out.print("请输入作者: ");
			String author = sc.nextLine();
			for (Book book : bookService.getAllBooks()) {
				if (book.getAuthor().contains(author)) {//根据作者查找集合中的book对象
					System.out.println(book);
				}
			}
			break;
		case 4:
			System.out.println("===========根据书籍类型名查找书籍=============");
			System.out.print("请输入类型: ");
			String type = sc.nextLine();
			for (Book book : bookService.getAllBooks()) {
				if (book.getType().contains(type)) {//根据书籍类型查找集合中的book对象
					System.out.println(book);
				}
			}
			break;
		default:
			System.out.println("无效的选择,请重新选择!");
		}
	}
}

BorrowMenu.java

复制代码
package View.Impl;

import Bean.Book;
import Service.BookService;

import java.util.Scanner;

public class BorrowMenu {
	public static void userMenu(Scanner sc, BookService bookService) {
		while (true) {
			System.out.println("图书借阅系统菜单");
			System.out.println("1. 借阅图书");
			System.out.println("2. 归还图书");
			System.out.println("3. 查询图书");
			System.out.println("4. 退出图书借阅系统");
			System.out.print("请输入选择: ");
			int choice = sc.nextInt();
			sc.nextLine(); // 换行
			switch (choice) {
			case 1:
				borrowBook(sc, bookService);
				break;
			case 2:
				returnBook(sc, bookService);
				break;
			case 3:
				AdminMenu.searchBook(sc, bookService);
				break;
			case 4:
				return;
			default:
				System.out.println("无效的选择,请重新选择!");
			}
		}
	}

	private static void borrowBook(Scanner sc, BookService bookService) {
		System.out.println("============借阅书籍============");
		System.out.print("请输入要借阅的书名: ");
		String title = sc.nextLine();
		Book book = bookService.findBook(title);
		if (book != null && !book.isBorrowed()) {
			bookService.updateBookStatus(title, true);
			System.out.println(title + "图书借阅成功!");
		} else if (book != null && book.isBorrowed()) {
			System.out.println(title + "该图书已被借阅!");
		} else {
			System.out.println("书库中未找到这本《" + title + "》,请确认书名是否正确!");
		}
	}

	private static void returnBook(Scanner sc, BookService bookService) {
		System.out.println("============归还书籍============");
		System.out.print("请输入要归还的书名: ");
		String title = sc.nextLine();
		Book book = bookService.findBook(title);
		if (book != null && book.isBorrowed()) {
			bookService.updateBookStatus(title, false);
			System.out.println(title + "图书归还成功!");
		} else if (book != null && !book.isBorrowed()) {
			System.out.println(title + "该图书未被借阅!");
		} else {
			System.out.println("书库中未找到这本《" + title + "》,请确认书名是否正确!");
		}
	}
}

MainMenu.java

复制代码
package View.Impl;

public class MainMenu {
    public static void MainMenu() {
        System.out.println("欢迎使用图书管理系统!");
        System.out.println("1. 登录");
        System.out.println("2. 注册");
        System.out.println("3. 退出");
        System.out.print("请输入选择: ");
    }
}

启动类:Application.java

复制代码
package View;

import java.util.Scanner;

import Bean.User;
import Dao.Impl.BookDaoImpl;
import Dao.Impl.UserDaoImpl;
import Service.BookService;
import Service.UserService;
import Service.Impl.BookServiceImpl;
import Service.Impl.UserServiceImpl;
import Utils.Message;
import View.Impl.AdminMenu;
import View.Impl.BorrowMenu;
import View.Impl.MainMenu;

public class Application {
	private static BookService bookService = new BookServiceImpl(new BookDaoImpl());
	private static UserService userService = new UserServiceImpl(new UserDaoImpl());
	private static User user;

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		while (true) {
			MainMenu.MainMenu();
			int choice = sc.nextInt();
			sc.nextLine(); // 换行
			switch (choice) {
			case 1:
				login(sc);
				break;
			case 2:
				register(sc);
				break;
			case 3:
				System.out.println("正在退出系统中........");
				try {
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				System.out.println();
				System.out.println("已退出系统,感谢您的使用!再见!");
				return;
			default:
				System.out.println("无效的选择,请重新选择!");
			}
		}
	}

	private static void login(Scanner sc) {
		System.out.println("============登录============");
		System.out.println("管理员用户请使用管理员账户登录");
		System.out.println("普通用户请使用个人账户登录");
		System.out.println("==========================");
		System.out.print("请输入用户名: ");
		String username = sc.nextLine();
		System.out.print("请输入密码: ");
		String password = sc.nextLine();
		User user = userService.findUser(username);
		if (user != null && user.getPassword().equals(password)) {
			user = user;
			Message.WelcomeMessage(username);
			// 判断是管理员还是普通用户
			if ("admin".equals(user.getRole())) {
				AdminMenu.adminMenu(sc, bookService);
			} else if ("user".equals(user.getRole())) {
				BorrowMenu.userMenu(sc, bookService);
			}
		} else {
			System.out.println("用户名或密码错误,请重试!");
		}
	}

	// 用户注册
	private static void register(Scanner scanner) {
		System.out.println("============注册============");
		System.out.print("请输入用户名: ");
		String username = scanner.nextLine();
		System.out.print("请输入密码: ");
		String password = scanner.nextLine();
		User user = new User(username, password, "user"); // 默认角色是普通用户
		userService.addUser(user);
		System.out.println(username + "注册成功,请登录!");
	}
}

Books.txt

复制代码
[{"title":"三国演义","author":"罗贯中","price":89.9,"type":"小说","borrowed":false},{"title":"红楼梦","author":"曹雪芹","price":49.8,"type":"小说","borrowed":false},{"title":"java从入门到放弃","author":"黑马程序员","price":90.6,"type":"科学与技术","borrowed":true},{"title":"测试","author":"我","price":96.8,"type":"测试","borrowed":false},{"title":"4","author":"4","price":4.0,"type":"4","borrowed":false},{"title":"1","author":"1","price":1.0,"type":"1","borrowed":true},{"title":"1","author":"1","price":1.0,"type":"1","borrowed":false}]

Users.txt

复制代码
admin,admin,admin
user,user,user
1,1,user
2,2,user
3,3,user
4,4,user
1,1,user
相关推荐
程序猿乐锅1 分钟前
【苍穹外卖|Day01】项目初识:从多模块结构到 OpenAPI 接口文档踩坑
java·spring·maven·mybatis
李白的天不白4 分钟前
针对你遇到的 Client.Timeout exceeded 问题,我判断是防火墙拦截了 HTTPS 流量
java
linweidong8 分钟前
Java 后端开发面试 50 个高频易混淆知识点详解
java·spring boot·spring·spring cloud·面试·mybatis·spring事务
码语智行8 分钟前
应用启动和关闭监听器功能分析
java·spring boot
Resky08188 分钟前
什么是 Spring IOC:倒过来让容器帮你 new,而不是你到处 new
java·spring
AutumnWind04208 分钟前
【JDK动态代理源码梳理】
java·后端·spring
暗夜猎手-大魔王17 分钟前
转载--Hermes Agent 10 | 7 层安全防线:从用户授权到输入净化
java·数据库·安全
idolao2 小时前
Oligo 7.60 安装教程:引物设计+Java 环境配置
java·开发语言
做个文艺程序员5 小时前
第04篇:K8s 弹性伸缩实战:HPA、VPA、KEDA——Java SaaS 应对流量洪峰的秘密武器
java·容器·kubernetes·弹性伸缩·自动扩容·ai 推理伸缩
石山代码9 小时前
ArrayList / HashMap / ConcurrentHashMap
java·开发语言