基于Java的图书管理系统实现方案
一、系统需求分析
- 用户角色
- 管理员:管理图书、用户、借阅记录,查看统计报表。
- 普通用户:查询图书、借阅/归还书籍、查看个人借阅记录。
- 核心功能
- 图书管理:增删改查图书信息(ISBN、书名、作者、分类、库存等)。
- 用户管理:注册/登录、权限控制(RBAC)、个人信息维护。
- 借阅归还:借书、还书、超期罚款计算(按天计费)。
- 查询统计:图书模糊搜索、借阅排行榜、分类借阅统计。
二、技术选型
模块 | 技术栈 |
---|---|
后端框架 | Spring Boot + Spring Security |
数据库 | MySQL + Redis(缓存) |
ORM框架 | MyBatis/MyBatis-Plus |
前端框架 | Vue.js 3(前后端分离) |
构建工具 | Maven/Gradle |
安全认证 | JWT + Spring Security |
其他工具 | Swagger(API文档)、Docker(部署) |
三、系统架构设计
+-----------------+
| 前端 (Vue.js) |
+-----------------+
|
| HTTP/HTTPS
v
+-----------------+
| Spring Boot |
| (RESTful API) |
+-----------------+
|
| JDBC/MyBatis
v
+-----------------+
| MySQL/Redis |
+-----------------+
四、数据库设计(核心表)
- 用户表 (
user
)
CREATE TABLE `user` (
`id` INT PRIMARY KEY AUTO_INCREMENT,
`username` VARCHAR(50) UNIQUE NOT NULL,
`password` VARCHAR(100) NOT NULL, -- BCrypt加密
`role` ENUM('ADMIN','USER') NOT NULL,
`email` VARCHAR(100),
`phone` VARCHAR(20)
);
- 图书表 (
book
)
CREATE TABLE `book` (
`id` INT PRIMARY KEY AUTO_INCREMENT,
`isbn` VARCHAR(20) UNIQUE NOT NULL,
`title` VARCHAR(200) NOT NULL,
`author` VARCHAR(100),
`category` VARCHAR(50), -- 分类(如计算机、文学)
`stock` INT DEFAULT 0 -- 库存数量
);
- 借阅记录表 (
borrow_record
)
CREATE TABLE `borrow_record` (
`id` INT PRIMARY KEY AUTO_INCREMENT,
`user_id` INT NOT NULL,
`book_id` INT NOT NULL,
`borrow_time` DATETIME NOT NULL,
`due_time` DATETIME NOT NULL, -- 应还时间(借书时计算)
`return_time` DATETIME, -- 实际归还时间
`fine` DECIMAL(10,2) DEFAULT 0, -- 超期罚款
FOREIGN KEY (`user_id`) REFERENCES `user`(`id`),
FOREIGN KEY (`book_id`) REFERENCES `book`(`id`)
);
五、关键功能实现
- 用户登录与JWT认证
- 使用Spring Security + JWT生成Token。
- 示例代码:
java @PostMapping("/login") public ResponseEntity<?> login(@RequestBody LoginRequest request) { Authentication authentication = authenticationManager.authenticate( new UsernamePasswordAuthenticationToken(request.getUsername(), request.getPassword()) ); String token = jwtUtils.generateToken(authentication); return ResponseEntity.ok(new JwtResponse(token)); }
- 借书逻辑(事务控制)
@Transactional
public BorrowRecord borrowBook(Integer userId, Integer bookId) {
// 1. 检查库存
Book book = bookMapper.selectById(bookId);
if (book.getStock() <= 0) {
throw new RuntimeException("库存不足");
}
// 2. 减少库存
bookMapper.decrementStock(bookId);
// 3. 创建借阅记录
BorrowRecord record = new BorrowRecord();
record.setUserId(userId);
record.setBookId(bookId);
record.setBorrowTime(LocalDateTime.now());
record.setDueTime(LocalDateTime.now().plusDays(30)); // 借期30天
borrowRecordMapper.insert(record);
return record;
}
- 超期罚款计算
public BigDecimal calculateFine(BorrowRecord record) {
LocalDateTime dueTime = record.getDueTime();
LocalDateTime returnTime = record.getReturnTime();
if (returnTime.isAfter(dueTime)) {
long days = ChronoUnit.DAYS.between(dueTime, returnTime);
return BigDecimal.valueOf(days * 0.5); // 每天0.5元
}
return BigDecimal.ZERO;
}
六、扩展优化建议
- 性能优化
- 使用Redis缓存热门图书查询结果。
- 对
book.title
和book.author
字段添加全文索引。
- 安全增强
- 敏感操作(如删除图书)记录审计日志。
- 启用HTTPS防止数据泄露。
- 功能扩展
- 增加图书预约功能(库存为0时允许预约)。
- 集成第三方登录(微信、支付宝)。
七、部署方案
- 本地开发
# 启动MySQL和Redis
docker-compose up -d mysql redis
# 启动Spring Boot
mvn spring-boot:run
# 启动Vue前端
npm run serve
- 生产环境
- 使用Docker打包镜像,通过Nginx反向代理。
- 数据库主从复制 + 读写分离。
八、测试策略
- 单元测试:JUnit + Mockito测试Service层。
- 接口测试:Postman + Swagger文档自动化测试。
- 压力测试:JMeter模拟高并发借阅场景。
通过以上方案,可快速搭建一个高可用、易扩展的图书管理系统。