“Java图书管理系统,课程设计必用(源码+文档)”是一款Java语言编写的图书管理系统,它拥有完整的源码和开发文档,可供学生们作为课程设计的参考资料。下面将详细讲解该系统的开发和使用过程。
功能介绍
该系统主要实现了图书管理系统的基本功能,包括图书的添加、修改、删除和查询,读者的注册、借阅、归还和查询,管理员的登录和注销等。此外,该系统还实现了权限管理和数据统计功能,使管理员能够更加方便地管理图书馆。
开发环境
- 操作系统:Windows 10
- Java版本:jdk1.8.0_201
- 数据库:MySQL 5.7.26
- 开发工具:Eclipse 2019-03
- 项目构建工具:Maven
开发过程
1. 数据库设计
该系统需要用到一个数据库来存储图书、读者和管理员的信息。下面是数据库设计:
CREATE TABLE `book` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(100) NOT NULL,
`author` varchar(100) NOT NULL,
`publisher` varchar(100) NOT NULL,
`price` float(10,2) NOT NULL,
`num` int(11) NOT NULL,
`total` int(11) NOT NULL,
`intro` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
CREATE TABLE `reader` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`sex` varchar(10) NOT NULL,
`birth` date NOT NULL,
`address` varchar(100) NOT NULL,
`tel` varchar(20) DEFAULT NULL,
`email` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
CREATE TABLE `admin` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`password` varchar(50) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
CREATE TABLE `borrow` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`bookId` int(11) NOT NULL,
`readerId` int(11) NOT NULL,
`borrowDate` date NOT NULL,
`returnDate` date DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `bookId` (`bookId`),
KEY `readerId` (`readerId`),
CONSTRAINT `borrow_ibfk_1` FOREIGN KEY (`bookId`) REFERENCES `book` (`id`),
CONSTRAINT `borrow_ibfk_2` FOREIGN KEY (`readerId`) REFERENCES `reader` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
2. 系统架构
系统采用MVC架构,分为数据模型、控制器和用户界面三部分。其中数据模型负责与数据库中的表进行交互,控制器负责将用户界面与数据模型联系起来,并实现系统的具体功能,用户界面则提供给用户进行操作的界面。
3. 实现代码
系统的具体实现涉及到很多代码,包括数据模型的实现、控制器的实现和用户界面的实现。这里只介绍部分代码,具体代码可参考源码。
3.1 数据模型
数据模型包括对数据库表的操作以及相关bean的定义。下面是Book表对应的bean定义和相关操作:
public class Book {
private Integer id;
private String name;
private String author;
private String publisher;
private Float price;
private Integer num;
private Integer total;
private String intro;
//省略getter和setter方法
}
public class BookDao {
//添加图书
public boolean addBook(Book book) {
String sql = "insert into book(name, author, publisher, price, num, total, intro) values(?,?,?,?,?,?,?)";
return JDBCUtil.executeUpdate(sql, book.getName(), book.getAuthor(), book.getPublisher(), book.getPrice(), book.getNum(), book.getTotal(), book.getIntro());
}
//修改图书信息
public boolean modifyBook(Book book) {
String sql = "update book set name=?, author=?, publisher=?, price=?, num=?, total=?, intro=? where id=?";
return JDBCUtil.executeUpdate(sql, book.getName(), book.getAuthor(), book.getPublisher(), book.getPrice(), book.getNum(), book.getTotal(), book.getIntro(), book.getId());
}
//删除图书
public boolean deleteBook(Integer id) {
String sql = "delete from book where id=?";
return JDBCUtil.executeUpdate(sql, id);
}
//查询所有图书
public List<Book> queryAll() {
String sql = "select * from book";
return JDBCUtil.executeQuery(sql, Book.class);
}
//查询图书总数量
public Integer getTotalNum() {
String sql = "select sum(num) from book";
return JDBCUtil.queryForInt(sql);
}
//查询图书总价值
public Float getTotalPrice() {
String sql = "select sum(price*total) from book";
return JDBCUtil.queryForFloat(sql);
}
//借出图书
public boolean lendOut(Integer bookId, Integer readerId) {
//判断库存数量是否足够
if (queryById(bookId).getNum() <= 0) {
return false;
}
String sql = "insert into borrow(bookId, readerId, borrowDate) values(?,?,?)";
boolean flag = JDBCUtil.executeUpdate(sql, bookId, readerId, new Date());
if (flag) {
//库存数量减1
updateNum(bookId, -1);
}
return flag;
}
//归还图书
public boolean returnBook(Integer bookId, Integer readerId) {
String sql = "update borrow set returnDate=? where bookId=? and readerId=? and returnDate is null";
boolean flag = JDBCUtil.executeUpdate(sql, new Date(), bookId, readerId);
if (flag) {
//库存数量加1
updateNum(bookId, 1);
}
return flag;
}
//根据图书ID查询图书
public Book queryById(Integer id) {
String sql = "select * from book where id=?";
return JDBCUtil.queryForOne(sql, Book.class, id);
}
//更新图书库存数量
private boolean updateNum(Integer bookId, Integer num) {
String sql = "update book set num=num+? where id=?";
return JDBCUtil.executeUpdate(sql, num, bookId);
}
}
3.2 控制器
控制器实现了系统的具体功能,它负责将用户的操作转化为对数据模型的具体操作,并将结果反馈给用户界面。下面是管理员登录的实现:
public class AdminServiceImpl implements AdminService {
private AdminDao adminDao = new AdminDao();
//管理员登录
public boolean login(String name, String password) {
Admin admin = adminDao.queryByName(name);
if (admin == null) {
//账号不存在
return false;
} else if (!admin.getPassword().equals(password)) {
//密码错误
return false;
} else {
//登录成功
return true;
}
}
}
3.3 用户界面
用户界面提供了便捷的操作界面,使得用户的操作更加方便。下面是管理员登录界面的实现:
public class LoginFrame extends JFrame {
private JTextField nameField;
private JPasswordField passwordField;
//登录按钮
private ActionListener loginAction = new ActionListener() {
public void actionPerformed(ActionEvent e) {
String name = nameField.getText();
String password = new String(passwordField.getPassword());
if (name.length() == 0 || password.length() == 0) {
JOptionPane.showMessageDialog(LoginFrame.this, "用户名或密码不能为空!");
return;
}
AdminService adminService = new AdminServiceImpl();
if (adminService.login(name, password)) {
JOptionPane.showMessageDialog(LoginFrame.this, "登录成功!");
new MainFrame().setVisible(true);
LoginFrame.this.dispose();
} else {
JOptionPane.showMessageDialog(LoginFrame.this, "用户名或密码错误!");
}
}
};
public LoginFrame() {
setTitle("管理员登录");
setSize(300, 200);
setLocationRelativeTo(null);
setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//用户名
JLabel nameLabel = new JLabel("用户名:");
nameField = new JTextField(20);
JPanel namePanel = new JPanel();
namePanel.add(nameLabel);
namePanel.add(nameField);
//密码
JLabel passwordLabel = new JLabel("密码:");
passwordField = new JPasswordField(20);
JPanel passwordPanel = new JPanel();
passwordPanel.add(passwordLabel);
passwordPanel.add(passwordField);
//登录按钮
JButton loginButton = new JButton("登录");
JPanel buttonPanel = new JPanel();
buttonPanel.add(loginButton);
loginButton.addActionListener(loginAction);
//整合所有组件
JPanel panel = new JPanel(new GridLayout(3, 1, 5, 5));
panel.add(namePanel);
panel.add(passwordPanel);
panel.add(buttonPanel);
add(panel);
}
}
使用说明
该系统可以通过以下步骤进行使用:
- 下载并导入源代码到Eclipse。
- 创建数据库,并修改/src/main/resources/jdbc.properties中的相关配置。
- 运行程序,登录管理员账号,开始进行图书管理。
示例
下面是两个示例,一个是添加图书,一个是借阅图书:
示例1:添加图书
- 登录管理员账号。
- 在主菜单中选择“添加图书”。
- 在弹出的对话框中填写图书信息,点击“确认”。
- 图书添加成功,返回主菜单。
示例2:借阅图书
- 登录读者账号。
- 在主菜单中选择“借阅图书”。
- 在弹出的对话框中选择需要借阅的图书,点击“确认借阅”。
- 借阅成功,返回主菜单。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java图书管理系统,课程设计必用(源码+文档) - Python技术站