图书管理系统(Library Management System, LMS)是一个基于 前后端分离架构 的企业级图书馆管理平台。针对传统图书馆管理中存在的效率低下、数据分散、统计困难等痛点,本系统采用现代化的技术栈,提供了一套完整的数字化解决方案。
- 🎯 高效管理 - 全流程自动化处理借阅、归还、续借业务
- 📊 数据驱动 - ECharts可视化图表实时展示运营数据
- 🔒 安全可靠 - JWT认证 + AOP日志 + 统一异常处理机制
- ⚡ 易于部署 - 一键启动,支持Docker容器化部署
- 🌐 响应式设计 - 适配多终端访问体验
- ✅ 用户注册、登录(支持JWT Token认证)
- ✅ 个人中心信息维护
- ✅ 管理员资料管理
- ✅ 密码重置功能(邮箱验证码)
- ✅ 图书CRUD操作(增删改查)
- ✅ 分类管理与层级展示
- ✅ 图书详情查看与搜索
- ✅ 收藏功能(用户个性化推荐)
- ✅ 封面上传与管理
- ✅ 借书流程控制
- ✅ 还书与逾期检测
- ✅ 续借申请处理
- ✅ 我的借阅记录查询
- ✅ 逾期自动提醒(定时任务)
- ✅ 批量还书/续书操作
- ✅ 借阅趋势分析图表
- ✅ 图书分类占比可视化
- ✅ 用户活跃度统计
- ✅ 词云展示热门书籍标签
- ✅ ECharts 6.0 动态交互图表
- ✅ 公告管理 - 发布、编辑、删除公告
- ✅ 轮播图管理 - 首页轮播配置
- ✅ 系统配置 - 参数动态调整
- ✅ 操作日志 - AOP注解自动记录(谁、何时、做了什么)
- ✅ 系统监控 - OSHI库实时监控CPU、内存、磁盘
- ✅ 数据管理 - Excel导入导出(Apache POI)
- ✅ 名言增删改查
- ✅ 首页随机展示
- ✅ 分类标签管理
| 技术 | 版本 | 说明 |
|---|---|---|
| Spring Boot | 3.1.10 | 核心框架 |
| Java | 17 | 运行环境 (LTS) |
| MyBatis-Plus | 3.5.5 | ORM框架 |
| MySQL | 8.0+ | 关系型数据库 |
| JWT (jjwt) | 0.12.3 | 身份认证 |
| Hutool | 5.8.23 | 工具类库 |
| Apache POI | 5.2.3 | Excel处理 |
| Lombok | 1.18.30 | 代码简化 |
| OSHI | 6.4.0 | 系统监控 |
| 技术 | 版本 | 说明 |
|---|---|---|
| Vue.js | 3.4.21 | 渐进式框架 |
| Vite | 5.2.0 | 构建工具 |
| Element Plus | 2.7.0 | UI组件库 |
| ECharts | 6.0.0 | 数据可视化 |
| vue-echarts | 8.0.1 | Vue封装 |
| echarts-wordcloud | 2.1.0 | 词云插件 |
| Vue Router | 4.3.0 | 路由管理 |
| Axios | 1.6.8 | HTTP客户端 |
| Sass | 1.72.0 | CSS预处理器 |
┌─────────────────────────────────────────────────────────────┐
│ 用户浏览器 │
│ (Chrome / Firefox / Edge) │
└───────────────────────┬─────────────────────────────────────┘
│ HTTP/HTTPS
▼
┌─────────────────────────────────────────────────────────────┐
│ 前端应用 (Vue 3) │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────────┐ │
│ │ Element+ │ │ ECharts │ │ Router │ │ Axios │ │
│ │ UI组件 │ │ 可视化 │ │ 路由管理 │ │ HTTP请求 │ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────────┘ │
│ :3000 │
└───────────────────────┬─────────────────────────────────────┘
│ API Proxy (/library/*)
▼
┌─────────────────────────────────────────────────────────────┐
│ 后端服务 (Spring Boot 3.1) │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Controller 层 (RESTful API) │ │
│ │ Auth | Book | Borrow | User | System | Statistics │ │
│ └───────────────────────┬─────────────────────────────┘ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Service 层 (业务逻辑) │ │
│ │ 业务处理 + JWT验证 + 权限控制 │ │
│ └───────────────────────┬─────────────────────────────┘ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Mapper 层 (MyBatis-Plus) │ │
│ │ CRUD + 分页 + 逻辑删除 │ │
│ └───────────────────────┬─────────────────────────────┘ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ MySQL 8.0 (library_system) │ │
│ └─────────────────────────────────────────────────────┘ │
│ 辅助组件: │
│ • AOP 操作日志记录 │
│ • GlobalExceptionHandler 统一异常处理 │
│ • OverdueTask 定时任务 (逾期检查) │
│ • OSHI 系统监控 │
└─────────────────────────────────────────────────────────────┘
:8080/library
- 前后端独立开发、独立部署
- 通过 RESTful API 进行通信
- 支持跨域请求配置
Controller → Service → Mapper → Database
↓ ↓ ↓
参数校验 业务逻辑 SQL执行
- JWT认证:无状态Token验证,24小时过期
- AOP日志:自动记录关键操作(@OperationLogAnnotation)
- 统一响应:Result封装所有API返回值
- 全局异常:GlobalExceptionHandler捕获并友好提示
- MyBatis-Plus简化CRUD操作
- 逻辑删除保护历史数据
- 自动填充创建/更新时间
确保你的开发环境已安装以下软件:
| 软件 | 最低版本 | 推荐版本 | 下载地址 |
|---|---|---|---|
| JDK | 17+ | 17 LTS | OpenJDK |
| Maven | 3.8+ | 3.9.x | Apache Maven |
| Node.js | 18+ | 20.x LTS | Node.js |
| MySQL | 8.0+ | 8.0.35+ | MySQL |
| Git | 最新版 | 最新版 | Git |
# 使用SSH方式克隆(推荐)
git clone git@gitee.com:cx330-private/lms.git
# 或使用HTTPS方式克隆
git clone https://gitee.com/cx330-private/lms.git
# 进入项目目录
cd lms-- 1. 创建数据库
CREATE DATABASE library_system DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 2. 创建用户并授权(可选,建议生产环境使用)
CREATE USER 'lms_user'@'localhost' IDENTIFIED BY 'your_secure_password';
GRANT ALL PRIVILEGES ON library_system.* TO 'lms_user'@'localhost';
FLUSH PRIVILEGES;
-- 3. 导入SQL脚本(按顺序执行)
-- 进入 backend/src/main/resources/db/ 目录
-- 依次执行:
-- - banner.sql
-- - alter_borrow_record.sql
-- - alter_operation_log.sql
-- - auto_refresh_config.sql
-- - health_monitor_config.sql💡 提示:SQL脚本位于
backend/src/main/resources/db/目录下,请按照文件名顺序依次导入。
# 1. 进入后端目录
cd backend
# 2. 配置数据库连接(修改 application.yml)
# 编辑 src/main/resources/application.yml
# 修改 spring.datasource.url, username, password
# 3. 安装依赖并编译
mvn clean install -DskipTests
# 4. 启动应用(方式一:Maven命令)
mvn spring-boot:run
# 或(方式二:直接运行JAR包)
java -jar target/library-management-system-1.0.0.jar✅ 成功标志:看到以下日志输出表示启动成功
Started LibraryApplication in X.XXX seconds
Tomcat started on port 8080 (http)
# 1. 新开一个终端,进入前端目录
cd frontend
# 2. 安装依赖
npm install
# 3. 启动开发服务器
npm run dev✅ 成功标志:看到以下输出表示启动成功
VITE v5.2.0 ready in XXX ms
➜ Local: http://localhost:3000/
| 服务 | 地址 | 说明 |
|---|---|---|
| 前端界面 | http://localhost:3000 | 用户访问入口 |
| 后端API | http://localhost:8080/library | API接口基础路径 |
| Swagger文档 | 暂未启用 | 可后续集成Swagger |
lms/ # 项目根目录
│
├── backend/ # 后端工程(Spring Boot)
│ ├── pom.xml # Maven依赖配置
│ ├── src/
│ │ └── main/
│ │ ├── java/com/library/
│ │ │ ├── LibraryApplication.java # 启动类
│ │ │ │
│ │ │ ├── annotation/ # 自定义注解
│ │ │ │ └── OperationLogAnnotation.java # 操作日志注解
│ │ │ │
│ │ │ ├── aspect/ # AOP切面
│ │ │ │ └── OperationLogAspect.java # 日志记录切面
│ │ │ │
│ │ │ ├── common/ # 公共类
│ │ │ │ └── Result.java # 统一响应封装
│ │ │ │
│ │ │ ├── config/ # 配置类
│ │ │ │ ├── AsyncConfig.java # 异步任务配置
│ │ │ │ ├── CustomMetaObjectHandler.java # MP自动填充
│ │ │ │ ├── GlobalExceptionHandler.java # 全局异常处理
│ │ │ │ ├── MybatisPlusConfig.java # MP分页插件
│ │ │ │ ├── OverdueTask.java # 逾期检查定时任务
│ │ │ │ ├── SessionConfig.java # Session/CORS配置
│ │ │ │ └── WebConfig.java # Web MVC配置
│ │ │ │
│ │ │ ├── controller/ # 控制器层
│ │ │ │ ├── AuthController.java # 认证接口
│ │ │ │ ├── BannerController.java # 轮播图管理
│ │ │ │ ├── BookController.java # 图书管理
│ │ │ │ ├── BookFavoriteController.java # 收藏管理
│ │ │ │ ├── BorrowRecordController.java # 借阅管理
│ │ │ │ ├── CategoryController.java # 分类管理
│ │ │ │ ├── DataManagementController.java # 数据导入导出
│ │ │ │ ├── NoticeController.java # 公告管理
│ │ │ │ ├── OperationLogController.java # 操作日志查询
│ │ │ │ ├── QuoteController.java # 名言警句
│ │ │ │ ├── StatisticsController.java # 数据统计
│ │ │ │ ├── SystemConfigController.java # 系统配置
│ │ │ │ ├── SystemMonitorController.java # 系统监控
│ │ │ │ ├── UploadController.java # 文件上传
│ │ │ │ └── UserController.java # 用户管理
│ │ │ │
│ │ │ ├── dto/ # 数据传输对象
│ │ │ │ ├── LoginDTO.java # 登录请求体
│ │ │ │ ├── RegisterDTO.java # 注册请求体
│ │ │ │ ├── BorrowRecordDTO.java # 借阅记录DTO
│ │ │ │ ├── ResetPasswordDTO.java # 重置密码DTO
│ │ │ │ ├── SendRegisterCodeDTO.java # 发送注册码DTO
│ │ │ │ └── SendResetCodeDTO.java # 发送重置码DTO
│ │ │ │
│ │ │ ├── entity/ # 实体类
│ │ │ │ ├── User.java # 用户实体
│ │ │ │ ├── Book.java # 图书实体
│ │ │ │ ├── Category.java # 分类实体
│ │ │ │ ├── BorrowRecord.java # 借阅记录实体
│ │ │ │ ├── BookFavorite.java # 收藏实体
│ │ │ │ ├── Notice.java # 公告实体
│ │ │ │ ├── Banner.java # 轮播图实体
│ │ │ │ ├── Quote.java # 名言实体
│ │ │ │ ├── OperationLog.java # 操作日志实体
│ │ │ │ └── SystemConfig.java # 系统配置实体
│ │ │ │
│ │ │ ├── mapper/ # 数据访问层
│ │ │ │ └── *Mapper.java # 各实体Mapper接口
│ │ │ │
│ │ │ ├── service/ # 业务逻辑层
│ │ │ │ ├── *Service.java # 服务接口
│ │ │ │ └── impl/ # 服务实现
│ │ │ │ └── *ServiceImpl.java # 具体实现类
│ │ │ │
│ │ │ └── util/ # 工具类
│ │ │ ├── JwtUtil.java # JWT工具类
│ │ │ └── SystemConfigCache.java # 系统配置缓存
│ │ │
│ │ └── resources/
│ │ ├── db/ # SQL脚本
│ │ │ ├── banner.sql
│ │ │ ├── alter_borrow_record.sql
│ │ │ ├── alter_operation_log.sql
│ │ │ ├── auto_refresh_config.sql
│ │ │ └── health_monitor_config.sql
│ │ ├── mapper/ # MyBatis XML映射
│ │ │ └── BorrowRecordMapper.xml
│ │ └── application.yml # 应用配置文件
│ │
├── frontend/ # 前端工程(Vue 3)
│ ├── package.json # NPM依赖配置
│ ├── vite.config.js # Vite构建配置
│ ├── index.html # HTML入口
│ ├── src/
│ │ ├── main.js # 应用入口
│ │ ├── App.vue # 根组件
│ │ │
│ │ ├── api/ # API接口层
│ │ │ ├── request.js # Axios封装
│ │ │ ├── auth.js # 认证接口
│ │ │ ├── book.js # 图书接口
│ │ │ ├── borrow.js # 借阅接口
│ │ │ ├── category.js # 分类接口
│ │ │ ├── banner.js # 轮播图接口
│ │ │ ├── quote.js # 名言接口
│ │ │ ├── statistics.js # 统计接口
│ │ │ └── user.js # 用户接口
│ │ │
│ │ ├── router/ # 路由配置
│ │ │ └── index.js # 路由定义
│ │ │
│ │ ├── views/ # 页面视图
│ │ │ ├── Home.vue # 首页
│ │ │ ├── Landing.vue # 登录落地页
│ │ │ ├── Login.vue # 登录页
│ │ │ ├── Register.vue # 注册页
│ │ │ ├── Profile.vue # 个人中心
│ │ │ ├── AdminProfile.vue # 管理员资料
│ │ │ ├── Book.vue # 图书列表
│ │ │ ├── BookDetail.vue # 图书详情
│ │ │ ├── Category.vue # 分类管理
│ │ │ ├── Borrow.vue # 借阅管理
│ │ │ ├── ReturnBooks.vue # 还书页面
│ │ │ ├── RenewBooks.vue # 续借页面
│ │ │ ├── MyBorrows.vue # 我的借阅
│ │ │ ├── MyOverdue.vue # 逾期记录
│ │ │ ├── Favorite.vue # 我的收藏
│ │ │ ├── Statistics.vue # 数据统计
│ │ │ ├── Notice.vue # 公告管理
│ │ │ ├── Banner.vue # 轮播图管理
│ │ │ ├── Quote.vue # 名言管理
│ │ │ ├── SystemConfig.vue # 系统配置
│ │ │ ├── SysLog.vue # 操作日志
│ │ │ ├── SystemMonitor.vue # 系统监控
│ │ │ ├── DataManagement.vue # 数据管理
│ │ │ └── User.vue # 用户管理
│ │ │
│ │ ├── components/ # 公共组件
│ │ │ ├── UserHeader.vue # 用户头部
│ │ │ ├── LoadingOverlay.vue # 加载遮罩
│ │ │ └── ErrorBoundary.vue # 错误边界
│ │ │
│ │ ├── assets/ # 静态资源
│ │ │ └── background.jpg # 背景图片
│ │ │
│ │ ├── styles/ # 全局样式
│ │ │ └── global.css # CSS变量和通用样式
│ │ │
│ │ └── utils/ # 工具函数
│ │ ├── jwt.js # JWT解析工具
│ │ ├── loading.js # 加载状态管理
│ │ └── confirm.js # 确认对话框
│ │
├── images/ # 项目截图/文档图片
│
├── .gitignore # Git忽略规则
├── LICENSE # 开源许可证(MIT)
└── README.md # 本文档
# 服务器端口配置
server:
port: 8080
servlet:
context-path: /library # API前缀路径
# 数据源配置
spring:
datasource:
url: jdbc:mysql://localhost:3306/library_system?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8
username: root
password: 123456 # ⚠️ 请修改为你的密码!
driver-class-name: com.mysql.cj.jdbc.Driver
# MyBatis-Plus配置
mybatis-plus:
global-config:
db-config:
logic-delete-field: deleted # 逻辑删除字段
logic-delete-value: 1 # 已删除
logic-not-delete-value: 0 # 未删除
# JWT配置
jwt:
secret: your-secret-key-here # ⚠️ 请修改为强密钥!
expiration: 86400000 # Token有效期(毫秒)= 24小时
# 文件上传配置
upload:
path: ../upload/ # 上传文件存储路径
prefix: /upload/ # 访问URL前缀
max-size: 5 # 最大文件大小(MB)
allowed-types: image/jpeg,image/png,image/gif # 允许的文件类型export default defineConfig({
server: {
port: 3000,
proxy: {
'/library': { // 匹配以/library开头的请求
target: 'http://localhost:8080', // 代理目标地址
changeOrigin: true // 修改请求头中的Origin
}
}
}
})当前 application.yml 文件包含以下敏感信息:
| 配置项 | 当前值 | 风险等级 | 建议 |
|---|---|---|---|
spring.datasource.password |
123456 |
🔴 高危 | 使用强密码或环境变量 |
jwt.secret |
明文密钥 | 🔴 高危 | 生成随机256位密钥 |
方案一:使用环境变量(推荐)
# application.yml
spring:
datasource:
username: ${DB_USERNAME:root}
password: ${DB_PASSWORD}
jwt:
secret: ${JWT_SECRET}设置环境变量:
# Windows PowerShell
$env:DB_PASSWORD="YourSecurePassword123!"
$env:JWT_SECRET="your-random-256-bit-secret-key-here"
# Linux/macOS
export DB_PASSWORD="YourSecurePassword123!"
export JWT_SECRET="your-random-256-bit-secret-key-here"方案二:创建配置模板
# 复制配置文件为模板
cp backend/src/main/resources/application.yml \
backend/src/main/resources/application.yml.example
# 编辑application.yml.example,将敏感信息替换为占位符
# 将application.yml添加到.gitignore
echo "backend/src/main/resources/application.yml" >> .gitignore方案三:Spring Cloud Config(微服务场景)
对于企业级部署,建议使用配置中心统一管理敏感配置。
本项目遵循 RESTful 设计规范,所有API均以 /library 为前缀:
| HTTP方法 | 用途 | 示例 |
|---|---|---|
GET |
获取资源 | GET /library/books |
POST |
创建资源 | POST /library/books |
PUT |
更新资源 | PUT /library/books/{id} |
DELETE |
删除资源 | DELETE /library/books/{id} |
所有API返回统一的JSON格式:
{
"code": 200, // 状态码:200成功,其他失败
"message": "success", // 提示消息
"data": {} // 业务数据(可为null或数组)
}常见状态码说明:
| code | 含义 | 场景 |
|---|---|---|
| 200 | 成功 | 正常业务操作 |
| 400 | 请求参数错误 | 缺少必填字段、格式错误 |
| 401 | 未认证 | Token无效或已过期 |
| 403 | 无权限 | 角色权限不足 |
| 404 | 资源不存在 | ID对应的数据不存在 |
| 500 | 服务器内部错误 | 异常情况 |
curl -X POST http://localhost:8080/library/auth/login \
-H "Content-Type: application/json" \
-d '{
"username": "admin",
"password": "admin123"
}'响应示例:
{
"code": 200,
"message": "登录成功",
"data": {
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"user": {
"id": 1,
"username": "admin",
"role": "ADMIN"
}
}
}# 在Header中添加Authorization字段
curl -X GET http://localhost:8080/library/books \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."Token有效期为 24小时,过期后需重新登录获取新Token。
| 端点 | 方法 | 说明 | 权限 |
|---|---|---|---|
/auth/login |
POST | 用户登录 | 公开 |
/auth/register |
POST | 用户注册 | 公开 |
/auth/send-code |
POST | 发送验证码 | 公开 |
| 端点 | 方法 | 说明 | 权限 |
|---|---|---|---|
/books |
GET | 获取图书列表 | 已登录 |
/books/{id} |
GET | 获取图书详情 | 已登录 |
/books |
POST | 新增图书 | 管理员 |
/books/{id} |
PUT | 更新图书 | 管理员 |
/books/{id} |
DELETE | 删除图书 | 管理员 |
| 端点 | 方法 | 说明 | 权限 |
|---|---|---|---|
/borrows |
GET | 获取借阅记录 | 已登录 |
/borrows |
POST | 借书 | 已登录 |
/borrows/{id}/return |
PUT | 还书 | 已登录 |
/borrows/{id}/renew |
PUT | 续借 | 已登录 |
| 模块 | 端点前缀 | 主要功能 |
|---|---|---|
| 公告 | /notices |
CRUD操作 |
| 轮播图 | /banners |
图片管理 |
| 系统配置 | /configs |
参数读写 |
| 操作日志 | /logs |
日志查询 |
| 系统监控 | /monitor |
性能指标 |
| 数据管理 | /data |
导入导出 |
1. 打包后端
cd backend
mvn clean package -DskipTests
# 生成的JAR文件在 target/library-management-system-1.0.0.jar2. 打包前端
cd frontend
npm run build
# 生成的静态文件在 dist/ 目录3. 配置Nginx反向代理
server {
listen 80;
server_name your-domain.com;
# 前端静态文件
location / {
root /path/to/frontend/dist;
index index.html;
try_files $uri $uri/ /index.html;
}
# API代理到后端
location /library {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
# 文件上传路径
location /upload {
alias /path/to/upload/files;
}
}4. 启动服务
# 启动后端(后台运行)
nohup java -jar target/library-management-system-1.0.0.jar --spring.profiles.active=prod > app.log 2>&1 &
# 启动Nginx
sudo systemctl start nginx
# 或
sudo nginx1. 创建 Dockerfile(后端)
# Dockerfile.backend
FROM eclipse-temurin:17-jre-alpine
WORKDIR /app
COPY target/library-management-system-1.0.0.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]2. 创建 Dockerfile(前端)
# Dockerfile.frontend
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]3. 创建 docker-compose.yml
version: '3.8'
services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
MYSQL_DATABASE: library_system
ports:
- "3306:3306"
volumes:
- mysql_data:/var/lib/mysql
restart: always
backend:
build:
context: ./backend
dockerfile: Dockerfile.backend
ports:
- "8080:8080"
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/library_system
SPRING_DATASOURCE_USERNAME: root
SPRING_DATASOURCE_PASSWORD: ${DB_PASSWORD}
JWT_SECRET: ${JWT_SECRET}
depends_on:
- mysql
restart: always
frontend:
build:
context: ./frontend
dockerfile: Dockerfile.frontend
ports:
- "80:80"
depends_on:
- backend
restart: always
volumes:
mysql_data:4. 启动服务
# 创建环境变量文件
cat > .env << EOF
DB_PASSWORD=YourSecurePasswordHere
JWT_SECRET=YourRandomSecretKeyHere
EOF
# 一键启动所有服务
docker-compose up -d --build
# 查看日志
docker-compose logs -f# 手动备份
mysqldump -u root -p library_system > backup_$(date +%Y%m%d_%H%M%S).sql
# 定时备份(Cron任务)
# 每天凌晨2点自动备份
0 2 * * * mysqldump -u root -p'password' library_system | gzip > /backup/db_$(date +\%Y\%m\%d).sql.gz# 上传的图片文件备份
tar -czf upload_backup_$(date +%Y%m%d).tar.gz ../upload/
# 完整项目备份(含代码)
tar -czf lms_project_backup_$(date +%Y%m%d).tar.gz --exclude='node_modules' --exclude='target' .# 1. 恢复数据库
mysql -u root -p library_system < backup_20240101_020000.sql
# 2. 恢复上传文件
tar -xzf upload_backup_20240101.tar.gz -C ../
# 3. 重启服务
docker-compose restartA: 确保已完成以下步骤:
- MySQL服务正在运行
- 已创建
library_system数据库 - 已正确导入SQL脚本
- 检查
application.yml中的数据库连接配置
# 检查MySQL是否运行
mysql -u root -p -e "SHOW DATABASES;"A: 确认以下几点:
- 后端服务已在8080端口启动
- Vite代理配置正确(
vite.config.js中的proxy设置) - 浏览器开发者工具Network面板查看具体错误
// 检查vite.config.js配置
proxy: {
'/library': {
target: 'http://localhost:8080', // 确认此地址正确
changeOrigin: true
}
}A: 当前Token有效期为24小时。过期后会收到401错误,需要:
- 重新调用登录接口获取新Token
- 前端会自动跳转到登录页面
如需修改有效期,编辑 application.yml:
jwt:
expiration: 172800000 # 修改为48小时(单位:毫秒)A: 检查以下配置:
- 上传目录是否存在且有写权限
- 文件大小是否超过限制(默认10MB)
- 文件类型是否符合要求(仅允许jpg/png/gif)
# application.yml
upload:
path: ../upload/ # 确保此目录存在
max-size: 5 # 单位:MB
allowed-types: image/jpeg,image/png,image/gifA: 管理员账号在数据库初始化脚本中创建。你可以:
- 直接修改数据库中的
user表 - 或通过注册接口创建新账号,然后手动将role字段改为
ADMIN
UPDATE user SET role = 'ADMIN' WHERE username = 'your_username';A: 确认:
OverdueTask.java中的定时表达式配置正确- 应用正常运行(未被停止)
- 查看日志是否有定时任务执行的记录
// 默认配置为每天凌晨3点执行
@Scheduled(cron = "0 0 3 * * ?")
public void checkOverdueBooks() {
// ...
}A: 建议采取以下措施:
- 数据库优化:添加索引、开启慢查询日志
- JVM调优:根据服务器内存调整堆大小
- Nginx缓存:配置静态资源缓存策略
- CDN加速:使用CDN分发静态资源
- 连接池配置:优化数据库连接池参数
# JVM参数示例
java -Xms512m -Xmx1024m -jar app.jar我们欢迎任何形式的贡献!无论是Bug修复、新功能还是文档改进。
-
Fork 本仓库
git clone git@gitee.com:cx330-private/lms.git
-
创建特性分支
git checkout -b feature/AmazingFeature
-
提交更改
git commit -m 'Add some AmazingFeature' -
推送到分支
git push origin feature/AmazingFeature
-
提交 Pull Request
- 后端:遵循阿里巴巴Java开发手册
- 前端:遵循Vue.js风格指南
- 提交信息:使用Conventional Commits规范
feat:新功能fix:Bug修复docs:文档更新style:代码格式调整refactor:代码重构test:测试相关chore:构建/工具变更
如果发现Bug或有功能建议,请通过以下方式反馈:
- 提交 GitHub Issues
- 详细描述问题现象和复现步骤
- 附上相关日志或截图
本项目采用 MIT License 开源协议。
MIT License
Copyright (c) 2024 Library Management System
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
详细许可条款请参见 LICENSE 文件。
如有任何问题或合作意向,欢迎通过以下方式联系:
- 项目仓库: Gitee
- 邮箱: [your-email@example.com]
- Issue反馈: Issues
感谢使用图书管理系统! 🎉
如果这个项目对你有帮助,欢迎给一个 ⭐ Star 支持一下!
Made with ❤️ by Library Management System Team