前言
毕业设计是Java学习过程中最重要的综合实践环节。本文将带大家从零开始,开发一个完整的在线图书管理系统,采用当前主流的Spring Boot + MyBatis + Thymeleaf技术栈,涵盖前后端交互、数据库设计、权限控制等核心模块。项目代码结构清晰,注释详细,非常适合作为毕业设计或课程设计参考。
一、项目概述
1.1 项目背景
随着高校图书馆藏书的增多,传统人工管理方式效率低下且易出错。本系统旨在提供一个轻量级的在线图书管理平台,实现图书信息的数字化管理、借阅流程自动化,并支持多用户角色(管理员、普通用户)操作。
1.2 系统功能
-
用户模块:注册、登录、个人信息修改、密码重置。
-
图书管理:图书增删改查、分类管理、批量导入导出。
-
借阅管理:用户借书、还书、续借、查看借阅历史。
-
权限控制:基于Spring Security实现角色权限区分(管理员可管理图书和用户,普通用户仅可借阅)。
-
数据统计:图书借阅排行榜、用户活跃度统计(可选)。
二、技术选型
| 技术 | 说明 | 版本 |
|---|---|---|
| Spring Boot | 后端基础框架 | 2.7.0 |
| MyBatis | 持久层框架 | 3.5.10 |
| Thymeleaf | 模板引擎 | 3.0.15 |
| Spring Security | 安全与权限控制 | 5.7.3 |
| MySQL | 关系型数据库 | 8.0 |
| Bootstrap | 前端UI框架 | 5.1 |
| Maven | 项目管理工具 | 3.8+ |
三、数据库设计
3.1 E-R图(简略)
系统主要包含三张核心表:user(用户)、book(图书)、borrow_record(借阅记录),以及辅助表category(图书分类)。
3.2 表结构
user表
sql
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL COMMENT '用户名',
`password` varchar(100) NOT NULL COMMENT '密码(加密后)',
`email` varchar(100) DEFAULT NULL,
`role` varchar(20) DEFAULT 'ROLE_USER' COMMENT '角色',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
book表
sql
CREATE TABLE `book` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(200) NOT NULL,
`author` varchar(100) DEFAULT NULL,
`isbn` varchar(20) DEFAULT NULL,
`category_id` int(11) DEFAULT NULL,
`publisher` varchar(100) DEFAULT NULL,
`publish_date` date DEFAULT NULL,
`total` int(11) DEFAULT '1' COMMENT '总库存',
`available` int(11) DEFAULT '1' COMMENT '可借数量',
PRIMARY KEY (`id`),
KEY `category_id` (`category_id`),
CONSTRAINT `book_ibfk_1` FOREIGN KEY (`category_id`) REFERENCES `category` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
borrow_record表
sql
CREATE TABLE `borrow_record` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`book_id` int(11) NOT NULL,
`borrow_time` datetime DEFAULT CURRENT_TIMESTAMP,
`return_time` datetime DEFAULT NULL,
`status` tinyint(1) DEFAULT '1' COMMENT '1-借出 0-已归还',
PRIMARY KEY (`id`),
KEY `user_id` (`user_id`),
KEY `book_id` (`book_id`),
CONSTRAINT `borrow_record_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`),
CONSTRAINT `borrow_record_ibfk_2` FOREIGN KEY (`book_id`) REFERENCES `book` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
category表
sql
CREATE TABLE `category` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
四、项目结构与核心实现
4.1 项目结构(Maven)
text
src/main/java/com/library/
├── config/ # 配置类(Security、WebMvc)
├── controller/ # 控制器
│ ├── BookController.java
│ ├── BorrowController.java
│ └── UserController.java
├── mapper/ # MyBatis接口
│ ├── BookMapper.java
│ ├── BorrowRecordMapper.java
│ └── UserMapper.java
├── model/ # 实体类
│ ├── Book.java
│ ├── User.java
│ └── BorrowRecord.java
├── service/ # 业务层
│ ├── BookService.java
│ └── UserService.java
└── LibraryApplication.java # 启动类
4.2 关键代码示例
4.2.1 Spring Security配置
java
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/", "/register", "/css/**", "/js/**").permitAll()
.requestMatchers("/admin/**").hasRole("ADMIN")
.anyRequest().authenticated()
)
.formLogin(form -> form
.loginPage("/login")
.defaultSuccessUrl("/")
.permitAll()
)
.logout(logout -> logout.permitAll());
return http.build();
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
4.2.2 借书业务逻辑(Service层)
java
@Service
@Transactional
public class BorrowService {
@Autowired
private BookMapper bookMapper;
@Autowired
private BorrowRecordMapper borrowRecordMapper;
public boolean borrowBook(Integer userId, Integer bookId) {
// 检查图书是否可借
Book book = bookMapper.selectById(bookId);
if (book == null || book.getAvailable() <= 0) {
return false;
}
// 创建借阅记录
BorrowRecord record = new BorrowRecord();
record.setUserId(userId);
record.setBookId(bookId);
record.setBorrowTime(new Date());
record.setStatus(1);
borrowRecordMapper.insert(record);
// 更新库存
book.setAvailable(book.getAvailable() - 1);
bookMapper.updateById(book);
return true;
}
}
4.2.3 Controller示例(图书管理)
java
@Controller
@RequestMapping("/admin/books")
public class BookController {
@Autowired
private BookService bookService;
@GetMapping
public String list(Model model,
@RequestParam(defaultValue = "1") int page,
@RequestParam(defaultValue = "10") int size) {
PageInfo<Book> pageInfo = bookService.findByPage(page, size);
model.addAttribute("pageInfo", pageInfo);
return "admin/book_list";
}
@GetMapping("/add")
public String addForm(Model model) {
model.addAttribute("book", new Book());
return "admin/book_form";
}
@PostMapping("/save")
public String save(Book book) {
bookService.save(book);
return "redirect:/admin/books";
}
}
4.3 前端页面(Thymeleaf片段)
借书列表页(user/books.html)
html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>图书列表</title>
<link rel="stylesheet" th:href="@{/css/bootstrap.min.css}">
</head>
<body>
<div class="container mt-4">
<h2>可借阅图书</h2>
<table class="table table-bordered">
<thead>
<tr>
<th>书名</th>
<th>作者</th>
<th>可借数量</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<tr th:each="book : ${books}">
<td th:text="${book.title}">书名</td>
<td th:text="${book.author}">作者</td>
<td th:text="${book.available}">可借数量</td>
<td>
<a th:href="@{/borrow/{id}(id=${book.id})}" class="btn btn-sm btn-primary">借阅</a>
</td>
</tr>
</tbody>
</table>
</div>
</body>
</html>
五、项目部署与运行
5.1 环境要求
-
JDK 1.8+
-
MySQL 8.0+
-
Maven 3.5+
5.2 运行步骤
-
创建数据库
library_db,执行上述SQL脚本。 -
修改
application.yml中的数据库连接信息。 -
在项目根目录执行
mvn clean package打包。 -
运行
java -jar target/library-0.0.1-SNAPSHOT.jar。 -
访问
http://localhost:8080,默认管理员账号:admin / 123456(需提前插入)。
5.3 效果截图(示意)
-
登录页:简洁的Bootstrap表单。
-
管理员后台:图书增删改查、借阅记录管理。
-
用户首页:显示所有图书,支持按分类筛选。
六、常见问题与解决方案
-
登录后无权限访问 :检查Spring Security角色配置,确保数据库
user.role字段为ROLE_ADMIN或ROLE_USER。 -
借书时库存未更新 :确认事务注解
@Transactional是否生效,或在Service层手动管理事务。 -
中文乱码 :在
application.yml中配置字符编码:yaml
spring: datasource: url: jdbc:mysql://localhost:3306/library_db?useUnicode=true&characterEncoding=utf8
七、项目总结
通过这个完整的在线图书管理系统,我们实践了Spring Boot整合MyBatis、Thymeleaf、Spring Security等主流技术,掌握了MVC分层架构、数据库设计、权限控制等核心技能。本系统可以作为毕业设计的基础,后续可扩展功能如:邮件通知、图书预约、Excel导出、RESTful API等。
项目完整代码 已上传至GitHub:https://github.com/yourname/library-system(示例链接)
欢迎大家在评论区交流,如果有任何问题,我会及时回复!