一个前后端分离的图书馆管理系统,后端基于 Go + Gin + GORM,前端基于 Vue 3 + Vite。
项目覆盖了图书管理、借阅管理、预约排队、用户管理和统计分析等核心场景,适合用作课程设计、毕业设计、练手项目或二次开发基础工程。
- 用户注册、登录、刷新 Token、退出登录
- 浏览图书列表、查看图书详情、按条件搜索筛选
- 借阅图书、归还图书、续借图书
- 查看当前借阅和历史借阅记录
- 在图书无库存时发起预约排队
- 查看和取消我的预约
- 查看热门图书排行
- 查看个人资料和个人借阅统计
- 用户管理:列表、创建、编辑、删除、禁用
- 图书管理:新增、编辑、删除、批量新增
- 分类管理:增删改查
- 借阅记录管理与查询
- 数据统计总览
- 借阅趋势统计
- 分类统计
- Go
- Gin
- GORM
- MySQL
- Redis
- JWT
- robfig/cron
- Vue 3
- Vue Router 4
- Axios
- Vite
library-system/
├── app/ # 应用初始化
├── common/ # 通用响应、业务错误、校验错误
├── config/ # 配置读取
├── controller/ # HTTP 控制器
├── database/ # MySQL / Redis 初始化
├── dto/ # 请求与响应 DTO
├── middleware/ # 鉴权、错误处理中间件
├── model/ # GORM 数据模型
├── repository/ # 数据访问层
├── router/ # 路由注册
├── scheduler/ # 定时任务
├── service/ # 业务服务层
├── static/ # 静态资源
├── utils/ # JWT、密码工具
├── library-web/ # Vue 前端
├── main.go # 后端启动入口
└── README.md
- 普通用户默认最多可借
5本书 - 默认借阅期限为
30天 - 每条借阅记录最多续借
2次 - 图书有库存时不能预约,只能直接借阅
- 图书归还后会自动通知下一位预约用户
- 预约变为“可借阅”后,用户需在
48小时内完成借阅 - 逾期罚金当前规则为
1 元 / 天
- 每天
02:00执行逾期检查,同步所有用户的逾期数量 - 每小时执行一次预约过期处理,释放超时未借阅的预约名额
- Go
1.25+ - Node.js
20+ - MySQL
8.x - Redis
6+
项目没有内置 .env 加载逻辑,启动前请先在 shell 中导出环境变量。
| 变量名 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|
MYSQL_DSN |
否 | root:@tcp(127.0.0.1:3306)/librarySystem?charset=utf8mb4&parseTime=True&loc=Local |
MySQL 连接串 |
REDIS_ADDR |
否 | localhost:6379 |
Redis 地址 |
REDIS_PASSWORD |
否 | 空 | Redis 密码 |
JWT_ACCESS_SECRET |
是 | 无 | Access Token 密钥 |
JWT_REFRESH_SECRET |
是 | 无 | Refresh Token 密钥 |
export MYSQL_DSN='root:123456@tcp(127.0.0.1:3306)/librarySystem?charset=utf8mb4&parseTime=True&loc=Local'
export REDIS_ADDR='127.0.0.1:6379'
export REDIS_PASSWORD=''
export JWT_ACCESS_SECRET='your-access-secret'
export JWT_REFRESH_SECRET='your-refresh-secret'先在 MySQL 中创建数据库:
CREATE DATABASE librarySystem DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;项目启动时会自动执行 GORM AutoMigrate,创建或更新以下表:
userscategoriesbooksborrow_recordsreservations
在项目根目录执行:
go mod tidy
go run main.go默认监听地址:
http://localhost:8080
cd library-web
npm install
npm run dev默认访问地址:
http://localhost:5173
前端开发环境已在 library-web/vite.config.js 中将 /api 代理到 http://localhost:8080。
- 后端接口统一前缀为
/api - 前端通过
Authorization: Bearer <token>携带访问令牌 - 静态资源通过
/static暴露,示例封面位于static/covers/
POST /api/users/register注册POST /api/users/login登录POST /api/users/refresh-token刷新 TokenPOST /api/users/logout退出登录GET /api/users/me获取当前用户信息PUT /api/users/me修改当前用户信息POST /api/users/change-password修改密码
GET /api/users用户列表POST /api/users创建用户PUT /api/users/:id更新用户DELETE /api/users/:id删除用户
GET /api/books图书列表GET /api/books/:id图书详情POST /api/books新增图书POST /api/books/batch批量新增图书PUT /api/books/:id编辑图书DELETE /api/books/:id删除图书
POST /api/borrow借书POST /api/borrow/:borrow_id/return还书POST /api/borrow/:borrow_id/renew续借GET /api/borrow借阅记录列表GET /api/borrow/current当前借阅
POST /api/reservations创建预约DELETE /api/reservations/:id取消预约GET /api/reservations/my我的预约
GET /api/categories分类列表GET /api/categories/:id分类详情POST /api/categories创建分类PUT /api/categories/:id更新分类DELETE /api/categories/:id删除分类
GET /api/stats/popular-books热门图书GET /api/stats/user/:user_id用户借阅统计GET /api/stats/overview系统总览GET /api/stats/borrow借阅统计GET /api/stats/categories分类统计
{
"username": "reader01",
"password": "12345678",
"email": "reader01@example.com",
"phone": "13800138000"
}{
"username": "reader01",
"password": "12345678"
}{
"book_id": 1,
"borrow_days": 30
}{
"book_id": 1
}接口统一返回 JSON,整体结构类似:
{
"code": 200,
"message": "success",
"data": {},
"errors": [],
"details": {},
"timestamp": "2026-06-05T12:00:00Z"
}其中:
code:业务码或 HTTP 风格状态码message:结果说明data:成功返回的数据errors:参数校验错误列表details:业务错误附加信息
普通用户页面:
- 图书列表
- 图书详情
- 当前借阅
- 借阅历史
- 我的预约
- 热门图书
- 个人资料
管理员页面:
- 数据看板
- 用户管理
- 图书管理
- 借阅管理
- 分类管理
- 建议先启动 MySQL 和 Redis,再启动后端
- 首次运行后可手动在数据库中插入一个
admin角色用户,便于进入后台页面 - 如果前端端口或后端地址变化,请同步修改 library-web/vite.config.js
- 后端入口:main.go
- 路由定义:router/router.go
- 应用初始化:app/init.go
- 前端说明:library-web/README.md
当前仓库未声明 License,如需开源发布,建议补充 LICENSE 文件。