一、项目概述
本文将详细介绍一个功能完善的图书管理系统,该项目采用前后端分离架构,实现了学生借书还书、图书检索、管理员图书管理等功能。
源码下载地址:免费,无需积分 :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 学生管理(仅管理员能访问)

如有问题欢迎交流讨论!