前言
毕业设计是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(示例链接)
欢迎大家在评论区交流,如果有任何问题,我会及时回复!