Java毕业设计实战:基于Spring Boot的在线图书管理系统(完整版)

前言

毕业设计是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 运行步骤

  1. 创建数据库 library_db,执行上述SQL脚本。

  2. 修改 application.yml 中的数据库连接信息。

  3. 在项目根目录执行 mvn clean package 打包。

  4. 运行 java -jar target/library-0.0.1-SNAPSHOT.jar

  5. 访问 http://localhost:8080,默认管理员账号:admin / 123456(需提前插入)。

5.3 效果截图(示意)

  • 登录页:简洁的Bootstrap表单。

  • 管理员后台:图书增删改查、借阅记录管理。

  • 用户首页:显示所有图书,支持按分类筛选。


六、常见问题与解决方案

  1. 登录后无权限访问 :检查Spring Security角色配置,确保数据库user.role字段为ROLE_ADMINROLE_USER

  2. 借书时库存未更新 :确认事务注解@Transactional是否生效,或在Service层手动管理事务。

  3. 中文乱码 :在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(示例链接)

欢迎大家在评论区交流,如果有任何问题,我会及时回复!

相关推荐
yaaakaaang2 小时前
二、工厂方法模式
java·工厂方法模式
tumeng07112 小时前
跟据spring boot版本,查看对应的tomcat,并查看可支持的tomcat的版本范围
spring boot·后端·tomcat
2601_949816352 小时前
解决报错net.sf.jsqlparser.statement.select.SelectBody
java
Seven972 小时前
MVC中的拦截器实现案例
java
源码之屋2 小时前
计算机毕业设计:新能源汽车多维度数据分析系统 Django框架 Scrapy爬虫 可视化 数据分析 大数据 大模型 机器学习(建议收藏)✅
大数据·python·scrapy·django·汽车·课程设计·美食
尽兴-2 小时前
Elasticsearch 生产集群最佳实践:模板治理、ILM 生命周期与运维体系
java·运维·elasticsearch·容量规划·ccs·分片设计
大数据新鸟2 小时前
Java 泛型(Generic)完整使用指南
java·windows·python
狼与自由2 小时前
AQS介绍
java·开发语言