基于 Go 和 Vue 3 构建的简易图书管理系统,使用 gin-vue-admin 框架风格实现。
- ✅ 图书的增删改查(CRUD)
- ✅ 前端展示、搜索和分页
- ✅ RESTful API 接口
- ✅ MySQL 数据库支持
- ✅ 前后端分离架构
- Go 1.23+
- Gin Web 框架
- GORM ORM
- MySQL 数据库
- Zap 日志库
- Vue 3
- Element Plus UI 组件库
- Axios HTTP 客户端
- Vue Router
bookadmin/
├── api/ # API 接口层
│ └── v1/
│ └── book.go # 图书相关接口
├── model/ # 数据模型
│ ├── book.go # 图书模型
│ └── common/ # 通用模型
├── router/ # 路由配置
│ ├── book.go # 图书路由
│ └── router.go # 路由初始化
├── initialize/ # 初始化模块
│ ├── gorm.go # 数据库初始化
│ └── logger.go # 日志初始化
├── global/ # 全局变量
│ └── global.go
├── config.yaml # 配置文件
├── main.go # 入口文件
├── go.mod # Go 模块文件
└── web/ # 前端项目
├── src/
│ ├── views/ # 页面组件
│ ├── router/ # 路由配置
│ └── main.js # 入口文件
└── package.json # 前端依赖
- Go 1.23 或更高版本
- Docker 和 Docker Compose(推荐使用 Docker 启动 MySQL)
- 或 MySQL 5.7+ 或 MySQL 8.0+(本地安装)
- Node.js 16+ 和 npm/yarn
使用项目提供的 docker-compose.yml 文件启动 MySQL:
docker-compose up -d这将启动一个 MySQL 8.0 容器,配置如下:
- 容器名称:
bookadmin-mysql - 端口:
3306 - 数据库名:
bookadmin - 用户名:
root - 密码:
root - 字符集:
utf8mb4
查看容器状态:
docker-compose ps查看日志:
docker-compose logs -f mysql停止容器:
docker-compose down停止并删除数据卷(会删除所有数据):
docker-compose down -v创建 MySQL 数据库:
CREATE DATABASE bookadmin CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;数据库连接配置在 initialize/gorm.go 文件中。如果使用 Docker 启动的 MySQL,默认配置已经匹配,无需修改。
如果需要修改,编辑 initialize/gorm.go 文件:
dsn := fmt.Sprintf("%s:%s@tcp(%s)/%s?%s",
"root", // 数据库用户名
"root", // 数据库密码
"127.0.0.1:3306", // 数据库地址
"bookadmin", // 数据库名称
"charset=utf8mb4&parseTime=True&loc=Local",
)go mod tidygo run main.go后端服务将在 http://localhost:8888 启动。
cd web
npm installnpm run serve前端服务将在 http://localhost:8080 启动。
GET /api/book/getBookList
查询参数:
page: 页码(默认:1)pageSize: 每页数量(默认:10)keyword: 搜索关键字(可选,支持书名、作者、出版社、ISBN)
响应示例:
{
"code": 200,
"data": {
"list": [...],
"total": 100,
"page": 1,
"pageSize": 10
},
"msg": "获取成功"
}POST /api/book/createBook
请求体:
{
"title": "书名",
"author": "作者",
"publisher": "出版社",
"publish_date": "2024-01-01",
"isbn": "978-7-123456-78-9",
"price": 59.99,
"description": "图书描述"
}PUT /api/book/updateBook
请求体:
{
"id": 1,
"title": "书名",
"author": "作者",
...
}DELETE /api/book/deleteBook/:id
或
DELETE /api/book/deleteBook
请求体:
{
"id": 1
}GET /api/book/getBook?id=1
| 字段 | 类型 | 说明 |
|---|---|---|
| id | uint | 主键ID |
| created_at | datetime | 创建时间 |
| updated_at | datetime | 更新时间 |
| deleted_at | datetime | 删除时间(软删除) |
| title | varchar | 书名(必填) |
| author | varchar | 作者(必填) |
| publisher | varchar | 出版社 |
| publish_date | varchar | 出版日期 |
| isbn | varchar | ISBN(唯一索引) |
| price | decimal | 价格 |
| description | text | 描述 |
- 添加新的模型:在
model/目录下创建新的模型文件 - 添加新的接口:在
api/v1/目录下创建新的接口文件 - 注册路由:在
router/目录下注册新的路由
- 添加新页面:在
web/src/views/目录下创建新的 Vue 组件 - 配置路由:在
web/src/router/index.js中添加路由配置 - API 调用:使用
axios调用后端接口
- 确保 MySQL 服务已启动
- 确保数据库已创建
- 首次运行会自动创建数据表
- 前端需要配置正确的后端 API 地址
- 跨域问题已在后端配置,无需额外设置
检查:
- MySQL 服务是否启动
- 数据库连接信息是否正确
- 数据库是否已创建
检查:
- 后端服务是否启动(端口 8888)
- 前端代理配置是否正确
- 浏览器控制台是否有错误信息
尝试:
# Go 依赖
go clean -modcache
go mod tidy
# 前端依赖
cd web
rm -rf node_modules package-lock.json
npm installMIT License