图书管理系统
本项目是一个功能完整的图书管理系统,采用前后端分离架构,使用目前最流行的技术栈开发。系统实现了用户管理、图书管理、分类管理、借阅管理等核心功能,并提供了数据统计和可视化功能。












# 📚 Vue3 + NestJS 图书管理系统
> 🎓 适合毕业设计/课程设计的完整全栈项目
>
> 前后端分离 · 企业级架构 · 开箱即用
📖 项目简介
本项目是一个功能完整的图书管理系统,采用前后端分离架构,使用目前最流行的技术栈开发。系统实现了用户管理、图书管理、分类管理、借阅管理等核心功能,并提供了数据统计和可视化功能。
🎯 适用场景
- ✅ 大学毕业设计 - 完整的前后端代码 + 文档 + PPT
- ✅ 课程设计项目 - 功能完善,技术栈现代化
- ✅ 技术学习参考 - 代码规范,注释详细
- ✅ 二次开发基础 - 模块化设计,易于扩展
⭐ 项目亮点
- 🏗️ 企业级架构 - NestJS 模块化设计,TypeORM ORM框架
- 🔐 安全认证 - JWT Token认证,bcryptjs密码加密
- 📱 响应式设计 - Element Plus组件库,适配移动端
- 📊 数据可视化 - ECharts图表,直观展示统计数据
- 🐳 容器化部署 - Docker Compose一键启动
- 📚 完整文档 - Swagger API文档 + 毕业设计论文模板 + 答辩PPT
🚀 快速开始(3步启动)
📋 环境要求
| 工具 | 版本要求 | 说明 |
|---|---|---|
| Docker Desktop | 最新版 | 用于运行MySQL和Redis |
| Node.js | >= 18.0 | JavaScript运行环境 |
| pnpm / npm | 最新版 | 包管理工具(推荐pnpm) |
⚡ 启动步骤
第 1 步:启动数据库
双击运行:
1-启动数据库.bat
自动执行:
- ✅ 启动 MySQL 8.0(端口 3306)
- ✅ 启动 Redis 7.0(端口 6379)
- ✅ 自动导入数据库表结构(schema.sql)
- ✅ 自动导入测试数据(data.sql)
等待提示: "数据库服务已准备就绪!"
第 2 步:启动应用
双击运行:
2-启动应用.bat
自动执行:
- ✅ 启动 NestJS 后端(端口 3000)
- ✅ 启动 Vue3 前端(端口 5173)
- ✅ 打开两个命令行窗口(后端 + 前端)
等待提示:
- 后端:
🚀 图书管理系统后端启动成功! - 前端:
VITE ready in xxx ms
第 3 步:访问系统
浏览器打开:
http://localhost:5173
👤 测试账号
| 角色 | 用户名 | 密码 | 权限 |
|---|---|---|---|
| 管理员 | admin |
123456 |
所有权限(增删改查图书、管理用户等) |
| 普通用户 | zhangsan |
123456 |
浏览图书、借阅图书、查看个人记录 |
| 普通用户 | lisi |
123456 |
浏览图书、借阅图书、查看个人记录 |
| 普通用户 | wangwu |
123456 |
浏览图书、借阅图书、查看个人记录 |
📂 项目结构详解
01-library-management-system/ # 项目根目录
│
├─ 📁 backend/ # ⚙️ 后端项目(NestJS)
│ ├─ src/ # 源代码目录
│ │ ├─ modules/ # 功能模块
│ │ │ ├─ auth/ # 🔐 认证模块(登录、注册、JWT)
│ │ │ ├─ users/ # 👥 用户管理模块
│ │ │ ├─ books/ # 📚 图书管理模块
│ │ │ ├─ categories/ # 🏷️ 分类管理模块
│ │ │ ├─ borrow-records/ # 📝 借阅记录模块
│ │ │ └─ upload/ # 📤 文件上传模块
│ │ ├─ common/ # 公共模块
│ │ │ ├─ decorators/ # 装饰器
│ │ │ ├─ dto/ # 数据传输对象
│ │ │ └─ filters/ # 异常过滤器
│ │ ├─ health/ # 健康检查
│ │ ├─ main.ts # 入口文件
│ │ └─ app.module.ts # 根模块
│ ├─ uploads/ # 📷 上传文件存储目录
│ │ └─ covers/ # 图书封面
│ ├─ .env # 环境变量配置
│ ├─ package.json # 依赖配置
│ ├─ tsconfig.json # TypeScript配置
│ └─ nest-cli.json # NestJS CLI配置
│
├─ 📁 frontend/ # 🎨 前端项目(Vue3)
│ ├─ src/ # 源代码目录
│ │ ├─ views/ # 页面组件
│ │ │ ├─ Login.vue # 登录/注册页面
│ │ │ ├─ Home.vue # 首页(数据统计)
│ │ │ ├─ Books.vue # 图书管理
│ │ │ ├─ BookDetail.vue # 图书详情
│ │ │ ├─ Categories.vue # 分类管理
│ │ │ ├─ Users.vue # 用户管理
│ │ │ ├─ MyBorrow.vue # 我的借阅
│ │ │ ├─ BorrowRecords.vue # 借阅记录(管理员)
│ │ │ └─ Profile.vue # 个人中心
│ │ ├─ api/ # API接口封装
│ │ │ ├─ auth.js # 认证接口
│ │ │ ├─ users.js # 用户接口
│ │ │ ├─ books.js # 图书接口
│ │ │ ├─ categories.js # 分类接口
│ │ │ ├─ borrow.js # 借阅接口
│ │ │ └─ upload.js # 上传接口
│ │ ├─ stores/ # 状态管理(Pinia)
│ │ │ └─ user.js # 用户状态
│ │ ├─ router/ # 路由配置
│ │ │ └─ index.js # 路由定义
│ │ ├─ utils/ # 工具函数
│ │ │ └─ request.js # Axios封装
│ │ ├─ layouts/ # 布局组件
│ │ │ └─ MainLayout.vue # 主布局
│ │ ├─ styles/ # 样式文件
│ │ └─ main.js # 入口文件
│ ├─ package.json # 依赖配置
│ └─ vite.config.js # Vite配置
│
├─ 📁 database/ # 💾 数据库文件
│ ├─ schema.sql # 📊 数据库表结构(DDL)
│ ├─ data.sql # 📦 初始演示数据(DML)
│ └─ ER图设计.md # 📐 数据库设计文档
│
├─ 📁 docs/ # 📚 文档目录
│ ├─ 功能说明文档.md # 📖 详细功能说明 + FAQ
│ ├─ 毕业设计论文模板.docx # 📄 论文模板(12000字)
│ └─ Vue3+NestJS图书管理系统.pptx # 📊 答辩PPT模板(17页)
│
├─ 🔧 docker-compose.yml # Docker编排配置
│
├─ 🚀 1-启动数据库.bat # 一键启动MySQL+Redis
├─ 🚀 2-启动应用.bat # 一键启动前端+后端
├─ ⏹️ 3-停止数据库.bat # 停止Docker服务
├─ 🔄 4-重置数据库.bat # 重置数据库(删除并重新导入)
├─ 📋 5-查看日志.bat # 查看Docker日志
│
└─ 📖 README.md # 本文档
💡 功能模块详解
🔐 1. 用户认证模块
功能列表:
- ✅ 用户注册(邮箱验证、用户名唯一性)
- ✅ 用户登录(JWT Token生成)
- ✅ 自动登录(Token持久化)
- ✅ 退出登录
- ✅ 路由守卫(未登录自动跳转)
技术实现:
- JWT Token认证(有效期7天)
- bcryptjs密码加密(哈希+盐)
- Passport.js认证策略
- localStorage持久化存储
👥 2. 用户管理模块(管理员)
功能列表:
- ✅ 用户列表(分页、搜索)
- ✅ 添加用户(表单验证)
- ✅ 编辑用户(角色管理、借阅上限)
- ✅ 删除用户(二次确认、不能删除自己)
- ✅ 查看用户详情
字段说明:
- ID、用户名、邮箱、手机号、真实姓名
- 角色(管理员/普通用户)
- 借阅上限(可自定义)
- 注册时间
📚 3. 图书管理模块
功能列表:
- ✅ 图书列表(分页、搜索、筛选)
- ✅ 添加图书(ISBN、书名、作者、出版社等)
- ✅ 编辑图书(修改信息、调整库存)
- ✅ 删除图书(检查借阅记录)
- ✅ 图书详情(完整信息展示)
- ✅ 封面上传(本地上传 + URL输入)
- ✅ 库存管理(总库存、可借数量)
搜索功能:
- 按书名搜索(模糊匹配)
- 按作者搜索
- 按ISBN搜索
- 按分类筛选
管理员权限: 增删改查、上传封面
普通用户权限: 浏览、搜索、借阅
🏷️ 4. 分类管理模块
功能列表:
- ✅ 分类列表(显示图书数量)
- ✅ 添加分类
- ✅ 编辑分类
- ✅ 删除分类(检查是否有图书)
默认分类:
- 计算机
- 文学
- 历史
- 科学
- 艺术
📝 5. 借阅管理模块
借阅功能:
- ✅ 一键借阅(库存检查)
- ✅ 自动扣减库存
- ✅ 借阅期限:30天
- ✅ 借阅上限:5本(可配置)
归还功能:
- ✅ 一键归还
- ✅ 自动恢复库存
- ✅ 记录归还时间
记录查询:
我的借阅(普通用户)
- 借阅中 / 已归还 / 已逾期
- 剩余天数提示
借阅记录(管理员)
- 所有用户的借阅记录
- 搜索、筛选、导出
逾期管理:
- 自动检测逾期(超过30天)
- 状态标记(红色警告)
- 可扩展:邮件提醒、罚金计算
📊 6. 数据统计模块
统计卡片(首页):
- 📚 图书总数
- 👥 用户总数
- 📖 借阅中数量
- 📈 总借阅次数
图表展示(ECharts):
- 📈 借阅趋势图 - 最近7天借阅趋势(折线图)
- 📊 分类分布图 - 各分类图书数量(柱状图)
- 🥧 借阅状态图 - 借阅中/已归还/逾期(饼图)
- 🏆 热门排行榜 - 借阅次数Top 10
👤 7. 个人中心模块
功能列表:
- ✅ 查看个人信息
- ✅ 编辑个人信息(邮箱、手机号、真实姓名)
- ✅ 修改密码(验证原密码)
- ✅ 查看借阅历史
🛠️ 技术栈详解
前端技术
| 技术 | 版本 | 用途 |
|---|---|---|
| Vue 3 | 3.3+ | 核心框架(Composition API) |
| Element Plus | 2.4+ | UI组件库 |
| Pinia | 2.1+ | 状态管理 |
| Vue Router | 4.2+ | 路由管理 |
| Axios | 1.6+ | HTTP请求 |
| ECharts | 5.4+ | 数据可视化 |
| Vite | 5.0+ | 构建工具 |
| dayjs | 1.11+ | 日期处理 |
后端技术
| 技术 | 版本 | 用途 |
|---|---|---|
| NestJS | 10.0+ | 核心框架 |
| TypeORM | 0.3+ | ORM框架 |
| MySQL | 8.0+ | 关系数据库 |
| Redis | 7.0+ | 缓存数据库 |
| JWT | - | Token认证 |
| bcryptjs | - | 密码加密 |
| Swagger | - | API文档 |
| class-validator | - | 数据验证 |
| Passport | - | 认证策略 |
| Multer | - | 文件上传 |
开发工具
| 工具 | 用途 |
|---|---|
| VS Code | 代码编辑器 |
| Docker Desktop | 容器化工具 |
| Git | 版本控制 |
| Postman | API测试 |
🎮 管理脚本详解
📜 启动脚本
🚀 1-启动数据库.bat
功能:
- 检查 Docker Desktop 是否运行
- 启动 MySQL 容器(端口 3306)
- 启动 Redis 容器(端口 6379)
- 等待 MySQL 完全启动(约15秒)
- 自动导入
schema.sql(创建表) - 自动导入
data.sql(插入测试数据)
提示信息:
✅ Docker 服务正常
✅ 容器已启动
✅ schema.sql 导入成功
✅ data.sql 导入成功
数据库服务已准备就绪!
🚀 2-启动应用.bat
功能:
打开后端窗口
- 切换到
backend目录 - 执行
pnpm install(首次运行) - 执行
pnpm run start:dev - 监听端口 3000
- 切换到
打开前端窗口
- 切换到
frontend目录 - 执行
pnpm install(首次运行) - 执行
pnpm run dev - 监听端口 5173
- 切换到
提示信息:
后端:🚀 图书管理系统后端启动成功!
前端:VITE ready in xxx ms
⏹️ 3-停止数据库.bat
功能:
- 停止 MySQL 容器
- 停止 Redis 容器
- 保留数据(数据持久化在 Docker volume 中)
🔄 4-重置数据库.bat
功能:
- 停止所有容器
- 删除所有容器
- 删除所有数据卷(清空数据)
- 重新启动容器
- 重新导入 schema.sql 和 data.sql
⚠️ 警告: 此操作会清空所有数据,请谨慎使用!
📋 5-查看日志.bat
功能:
- 实时查看 Docker 容器日志
- 用于排查数据库启动问题
快捷键:
Ctrl + C- 停止查看日志
📊 数据库设计
数据表结构
1. users(用户表)
| 字段 | 类型 | 说明 |
|---|---|---|
| id | INT | 主键,自增 |
| username | VARCHAR(50) | 用户名,唯一 |
| password | VARCHAR(255) | 密码(加密) |
| VARCHAR(100) | 邮箱,唯一 | |
| phone | VARCHAR(20) | 手机号 |
| real_name | VARCHAR(50) | 真实姓名 |
| role | ENUM | 角色(admin/user) |
| max_borrow_count | INT | 最大借阅数量 |
| created_at | TIMESTAMP | 创建时间 |
2. books(图书表)
| 字段 | 类型 | 说明 |
|---|---|---|
| id | INT | 主键,自增 |
| isbn | VARCHAR(20) | ISBN编号,唯一 |
| title | VARCHAR(200) | 书名 |
| author | VARCHAR(100) | 作者 |
| publisher | VARCHAR(100) | 出版社 |
| publish_date | DATE | 出版日期 |
| category_id | INT | 分类ID(外键) |
| cover_image | VARCHAR(500) | 封面图片URL |
| description | TEXT | 简介 |
| price | DECIMAL(10,2) | 价格 |
| total_stock | INT | 总库存 |
| available_stock | INT | 可借数量 |
| borrowed_count | INT | 借阅次数 |
| location | VARCHAR(50) | 存放位置 |
| created_at | TIMESTAMP | 创建时间 |
3. categories(分类表)
| 字段 | 类型 | 说明 |
|---|---|---|
| id | INT | 主键,自增 |
| name | VARCHAR(50) | 分类名称,唯一 |
| description | VARCHAR(200) | 分类描述 |
| created_at | TIMESTAMP | 创建时间 |
4. borrow_records(借阅记录表)
| 字段 | 类型 | 说明 |
|---|---|---|
| id | INT | 主键,自增 |
| user_id | INT | 用户ID(外键) |
| book_id | INT | 图书ID(外键) |
| borrow_date | TIMESTAMP | 借阅时间 |
| due_date | TIMESTAMP | 应还时间 |
| return_date | TIMESTAMP | 实际归还时间 |
| status | ENUM | 状态(borrowing/returned/overdue) |
数据库连接信息
MySQL 8.0
地址: localhost
端口: 3306
用户: root
密码: root123
数据库: library_db
字符集: utf8mb4
Redis 7.0
地址: localhost
端口: 6379
密码: redis123
🌐 API 接口文档
启动后端后,访问 Swagger 文档:
http://localhost:3000/api/docs
主要接口
认证接口
POST /auth/register- 用户注册POST /auth/login- 用户登录GET /auth/profile- 获取当前用户信息
用户管理
GET /users- 获取用户列表POST /users- 创建用户GET /users/:id- 获取用户详情PUT /users/:id- 更新用户信息DELETE /users/:id- 删除用户
图书管理
GET /books- 获取图书列表(分页、搜索)POST /books- 创建图书GET /books/:id- 获取图书详情PUT /books/:id- 更新图书信息DELETE /books/:id- 删除图书
借阅管理
POST /borrow-records- 借阅图书PUT /borrow-records/:id/return- 归还图书GET /borrow-records/my- 我的借阅记录GET /borrow-records- 所有借阅记录(管理员)
文件上传
POST /upload/cover- 上传图书封面
❓ 常见问题解决
Q1: Docker Desktop 未启动
错误提示:
❌ Docker Desktop 未运行或未安装
解决方案:
- 打开 Docker Desktop 应用
- 等待 Docker 引擎启动完成
- 系统托盘会显示 Docker 图标(白色=运行中)
- 重新运行
1-启动数据库.bat
Q2: 端口被占用
错误提示:
Error: bind: address already in use
解决方案:
方法一:查找并关闭占用端口的程序
# 查看端口占用
netstat -ano | findstr "3306" # MySQL
netstat -ano | findstr "3000" # 后端
netstat -ano | findstr "5173" # 前端
# 杀死进程
taskkill /PID 进程号 /F
方法二:修改端口(不推荐,需改多处配置)
Q3: 数据库连接失败
错误提示:
[Nest] ERROR [TypeOrmModule] Unable to connect to the database
解决方案:
- 确认数据库已启动:
docker ps - 检查
backend/.env文件配置:DATABASE_HOST=localhost DATABASE_PORT=3306 DATABASE_USER=root DATABASE_PASSWORD=root123 DATABASE_NAME=library_db - 重置数据库:运行
4-重置数据库.bat
Q4: 前端页面空白/接口404
原因分析:
- 后端未启动
- 后端端口不是 3000
- 跨域问题
解决方案:
- 确认后端已启动:访问
http://localhost:3000/api/health- 正常返回:
{"status":"ok"}
- 正常返回:
- 查看浏览器控制台(F12)错误信息
- 检查
frontend/vite.config.js代理配置
Q5: 无法上传图片
错误提示:
文件上传失败
解决方案:
- 检查
backend/uploads/covers目录是否存在 - 检查文件类型:只支持 jpg、png、gif、webp
- 检查文件大小:不能超过 5MB
Q6: TypeScript 编译错误
错误示例:
error TS2322: Type 'string' is not assignable to type 'UserRole'
解决方案:
- 确保使用枚举类型而非字符串字面量
- 检查
UserRole的导入和使用 - 重启 VS Code TypeScript 服务
Q7: 密码忘记/无法登录
解决方案:
重置数据库并使用默认账号:
- 运行
4-重置数据库.bat - 使用默认账号登录:
admin/123456
Q8: Docker 镜像拉取失败
错误提示:
failed to do request: dial tcp: connect timeout
解决方案:
配置 Docker 镜像加速器:
- 打开 Docker Desktop
- Settings → Docker Engine
- 添加镜像源:
{ "registry-mirrors": [ "https://mirror.ccs.tencentyun.com" ] } - Apply & Restart
🎓 适合毕业设计的理由
✅ 功能完整
- 前后端分离架构
- 8大功能模块
- RESTful API 设计
- 数据库设计规范
✅ 技术先进
- Vue3 Composition API(最新)
- NestJS 企业级框架
- TypeScript 类型安全
- Docker 容器化部署
✅ 文档齐全
- 📖 功能说明文档(1000+行)
- 📄 毕业设计论文模板(12000字)
- 📊 答辩PPT模板(17页)
- 📚 Swagger API 文档(自动生成)
✅ 易于答辩
- 系统架构清晰
- 技术亮点突出
- 演示效果直观
- PPT 内容完整
📚 配套文档
1. 功能说明文档.md
内容:
- 详细功能说明(每个模块)
- 技术实现细节
- 代码示例
- 常见问题 FAQ(Q1-Q15)
- 二次开发指南
位置: docs/功能说明文档.md
2. 毕业设计论文模板.docx
内容:
- 论文完整结构(6章)
- 摘要(中英文)
- 需求分析
- 系统设计
- 系统实现
- 系统测试
- 总结与展望
- 参考文献
字数: 约 12,000 字
位置: docs/毕业设计论文模板.docx
3. Vue3+NestJS图书管理系统.pptx
内容:
- 封面 + 目录
- 研究背景与意义
- 系统设计(架构图、数据库设计)
- 核心功能展示(截图 + 演示流程)
- 关键技术实现(JWT、文件上传)
- 系统测试(功能测试、性能测试)
- 项目总结 + 致谢
页数: 17 页
位置: docs/Vue3+NestJS图书管理系统.pptx
4. Swagger API 文档
访问地址: http://localhost:3000/api/docs
内容:
- 所有 API 接口
- 请求参数
- 响应示例
- 在线测试
🎯 学习建议
前端学习路径
Vue3 基础
- Composition API
- 响应式原理
- 生命周期钩子
组件开发
- Element Plus 组件库
- 自定义组件
- 组件通信
状态管理
- Pinia 使用
- 状态持久化
路由管理
- Vue Router 4
- 路由守卫
- 动态路由
后端学习路径
NestJS 基础
- 模块化设计
- 依赖注入
- 装饰器
数据库操作
- TypeORM
- 实体定义
- 关系映射
认证授权
- JWT Token
- Passport 策略
- 权限守卫
API 设计
- RESTful 规范
- DTO 验证
- Swagger 文档
🤝 技术支持
如遇到问题,可以:
- 查看
docs/功能说明文档.md中的 FAQ - 检查 Swagger API 文档
- 查看后端/前端控制台错误信息
- 查看 Docker 日志:运行
5-查看日志.bat
📄 许可协议
本项目仅供学习和毕业设计使用,未经许可不得用于商业用途。
购买源码保证可本地运行,如需协助运行或定制开发,请 联系作者