基于Spring Boot + Vue.js的图书管理系统

一、项目概述

本文将详细介绍一个功能完善的图书管理系统,该项目采用前后端分离架构,实现了学生借书还书、图书检索、管理员图书管理等功能。

源码下载地址:免费,无需积分https://download.csdn.net/download/2501_94750201/92660519

技术选型

  • 后端:Spring Boot 2.7.x + MyBatis-Plus 3.5.x + MySQL 8.0
  • 前端:Vue 3 + Element Plus + Axios + Vue Router
  • 安全:JWT身份认证,HS512加密算法
  • 构建工具:Maven

二、系统架构设计

2.1 前后端分离架构

复制代码
前端(Vue) ←→ API接口 ←→ 后端(Spring Boot) ←→ 数据库(MySQL)

2.2 项目目录结构

复制代码
library-system/
├── src/main/java/com/library/
│   ├── annotation/        # 自定义注解
│   ├── common/            # 通用类(Result、PageResult、Constants)
│   ├── config/            # 配置类
│   ├── controller/        # 控制器层
│   ├── dto/               # 数据传输对象
│   ├── entity/            # 实体类
│   ├── exception/         # 异常处理
│   ├── mapper/            # MyBatis-Plus Mapper接口
│   ├── service/           # 服务层
│   └── utils/             # 工具类
├── src/main/resources/
│   └── application.yml    # 应用配置
└── frontend/              # Vue前端项目
    ├── src/
    │   ├── views/         # 页面组件
    │   ├── components/    # 公共组件
    │   ├── router/        # 路由配置
    │   └── utils/         # 工具函数
    └── package.json

三、核心功能模块

3.1 用户认证模块

  • 用户注册:支持学生用户注册
  • 用户登录:JWT Token认证机制
java 复制代码
// JWT工具类 - 支持HS512加密算法
public class JwtUtil {
    // 使用固定密钥,保证服务重启后token仍有效
    private static final String SECRET = "librarySecretKeyLibrarySecretKeyLibrarySecretKeyLibrarySecretKey";
    private static final Key SIGNING_KEY = Keys.hmacShaKeyFor(SECRET.getBytes());
    
    // JWT过期时间:24小时
    private static final long EXPIRATION_TIME = 24 * 60 * 60 * 1000;
}

3.2 图书管理模块(管理员)

  • 图书上架:添加新图书到系统
  • 图书下架:将图书状态改为不可借
  • 图书编辑:修改图书信息
  • 图书删除:从系统中移除图书
  • 图书查询:支持按书名、作者、分类搜索

3.3 图书检索模块(学生/管理员)

  • 浏览所有在架图书
  • 多条件筛选:按书名、作者、分类搜索
  • 查看图书详情
  • 借阅图书(需登录)

3.4 借阅管理模块

  • 借书:学生可借阅在架图书
  • 还书:归还已借图书
  • 借阅记录:查看个人借阅历史
  • 分页展示:支持大量借阅记录的分页浏览

3.5 用户管理模块(管理员)

  • 查看所有用户
  • 修改用户角色(学生/管理员)
  • 启用/禁用用户账号
  • 用户信息管理

四、关键技术实现

4.1 权限控制设计

java 复制代码
@RequiresRole(value = Constants.ROLE_ADMIN)
public Result<String> addBook(@RequestBody @Valid BookDTO bookDTO) {
    return bookService.add(bookDTO);
}

通过自定义注解实现方法级别的权限控制,确保只有管理员能访问敏感接口。

4.2 JWT身份认证

java 复制代码
// 生成JWT Token
String token = JwtUtil.generateToken(username, role);

// 从Token解析用户信息
String username = JwtUtil.getUsernameFromToken(token);

使用JWT实现无状态认证,支持Token自动续期,提升系统安全性。

4.3 智能图书可见性控制

  • 学生视角:只能看到在架图书,下架图书自动过滤
  • 管理员视角:可以看到所有图书,包括已下架的,方便管理
java 复制代码
// 控制是否显示所有图书(包括下架的)
@GetMapping
public Result<PageResult<Book>> getBooks(
        @RequestParam(required = false) String title,
        @RequestParam(required = false) String author,
        @RequestParam(required = false) String category,
        @RequestParam(defaultValue = "1") Integer page,
        @RequestParam(defaultValue = "10") Integer pageSize,
        @RequestParam(defaultValue = "false") Boolean showAll) {
    return bookService.getList(title, author, category, page, pageSize, showAll);
}

4.4 分页功能优化

自定义PageResult封装分页结果:

java 复制代码
public class PageResult<T> {
    private List<T> records;  // 当前页数据
    private long total;       // 总记录数
    private long current;     // 当前页码
    private long size;        // 每页大小
    private long pages;       // 总页数
}

4.5 关联查询优化

借阅记录自动关联图书信息:

java 复制代码
for (BorrowRecord borrow : resultPage.getRecords()) {
    Book book = bookMapper.selectById(borrow.getBookId());
    borrow.setBook(book);  // 非数据库字段,使用@TableField(exist = false)
}

五、数据库设计

核心表结构

user表 - 用户信息

sql 复制代码
CREATE TABLE user (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50) NOT NULL UNIQUE,
    password VARCHAR(100) NOT NULL,
    real_name VARCHAR(50),
    student_id VARCHAR(20),
    email VARCHAR(100),
    phone VARCHAR(20),
    role VARCHAR(20) DEFAULT 'student',
    status VARCHAR(20) DEFAULT 'active',
    create_time DATETIME
);

book表 - 图书信息

sql 复制代码
CREATE TABLE book (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    title VARCHAR(200) NOT NULL,
    author VARCHAR(100),
    isbn VARCHAR(20),
    publisher VARCHAR(100),
    publish_date DATE,
    category VARCHAR(50),
    total_count INT DEFAULT 0,
    available_count INT DEFAULT 0,
    status VARCHAR(20) DEFAULT 'available',
    location VARCHAR(50),
    description TEXT,
    create_time DATETIME
);

borrow_record表 - 借阅记录

sql 复制代码
CREATE TABLE borrow_record (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    user_id BIGINT NOT NULL,
    book_id BIGINT NOT NULL,
    borrow_date DATETIME,
    due_date DATETIME,
    return_date DATETIME,
    status VARCHAR(20) DEFAULT 'borrowed',
    create_time DATETIME
);

六、前端界面设计

6.1 响应式布局

使用Element Plus组件库,提供美观的响应式界面:

  • 登录页面:简洁的登录/注册界面
  • 首页:根据用户角色显示不同功能入口
  • 图书检索:支持多种筛选条件的图书列表
  • 借阅管理:个人借阅记录及操作界面
  • 管理后台:图书管理和用户管理界面

6.2 角色差异化界面

javascript 复制代码
// 根据用户角色动态显示功能入口
data() {
  return {
    isAdmin: false
  }
},
created() {
  const userInfoStr = localStorage.getItem('userInfo')
  if (userInfoStr) {
    const userInfo = JSON.parse(userInfoStr)
    this.isAdmin = userInfo.role === 'admin'
  }
}

6.3 自动跳转机制

当Token失效时,系统会自动跳转到登录页面:

javascript 复制代码
// 路由守卫验证Token有效性
router.beforeEach(async (to, from, next) => {
  const token = localStorage.getItem('token');
  if (token) {
    try {
      await request.get('/users/profile');
      next();
    } catch (error) {
      localStorage.removeItem('token');
      localStorage.removeItem('userInfo');
      ElMessage.error('登录已过期,请重新登录');
      next('/login');
    }
  } else {
    next('/login');
  }
});

七、运行

7.1 后端启动

bash 复制代码
# 进入项目根目录
cd library-system
# 启动后端服务
mvn spring-boot:run   ,  也可直接在 idea 中点击启动按钮

7.2 前端启动

bash 复制代码
# 进入前端目录
cd library-system/frontend
# 安装依赖   需要 node.js 环境
npm install
# 启动开发服务器
npm run dev

八、截图展示

8.1 首页信息

8.2 图书浏览界面

8.3 图书管理界面(仅管理员能访问)

8.4 借阅记录

8.5 学生管理(仅管理员能访问)

如有问题欢迎交流讨论!

相关推荐
扶苏10022 小时前
Vue 3 的组合式 API(Composition API)优势
前端·javascript·vue.js
银发控、2 小时前
Builder Pattern
spring boot·spring·建造者模式
Tong Z2 小时前
Spring Boot 请求处理链路
java·spring boot·后端
虫师c2 小时前
Spring Boot自动配置黑魔法:手写Starter实现原理深度解析
java·spring boot·后端·自动配置·starter
树獭叔叔2 小时前
大模型对齐终极指南:RLHF 与DPO
后端·openai
code袁2 小时前
基于Springboot+Vue的家教小程序的设计与实现
vue.js·spring boot·小程序·vue·家教小程序
code_YuJun2 小时前
Servlet
后端
扶苏10022 小时前
Vue 3 新增内置组件详解与实战
前端·javascript·vue.js
程序猿阿越2 小时前
Kafka4(一)KRaft下的Controller
java·后端·源码阅读