# easy-gin
**Repository Path**: load_star/easy-gin
## Basic Information
- **Project Name**: easy-gin
- **Description**: 一套基于 Gin 的 MVC 框架,提供了基础的控制器、模型,视图,路由结构,提供了数据库/数据库连接池配置,内含一套 ok 的 Restful Api 演示实例
- **Primary Language**: Go
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 2
- **Created**: 2023-09-23
- **Last Updated**: 2025-01-04
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# easy-gin
一套基于 Gin 框架的 MVC 脚手架
- 封装了 Gin Web 服务配置、路由配置、数据库/连接池配置、视图配置,方便快速体验及构建 Go Web 工程
- 自带一套用于体验及演示的 Restful Api 代码示例
## 安装步骤
### 安装govendor包管理工具
```
# go get -u -v github.com/kardianos/govendor
```
### 拉取源码
```sh
# cd $GOPATH/src && git clone git@github.com:sqrtcat/easy-gin.git && cd easy-gin
```
### 使用 govendor 安装依赖包
```sh
# govendor sync
```
### 服务配置
```go
package configs
// 服务配置 防止变量污染故用函数组织
func GetServerConfig() (serverConfig map[string]string) {
serverConfig = make(map[string]string)
serverConfig["HOST"] = "0.0.0.0" //监听地址
serverConfig["PORT"] = "8080" //监听端口
serverConfig["VIEWS_PATTERN"] = "easy-gin/views/*/*" //视图模板路径pattern
serverConfig["ENV"] = "debug" //环境模式 release/debug/test
return
}
```
### 数据库及连接池配置
因框架启动时会创建连接池服务,故需配置好数据库后运行
```go
package configs
// 数据库配置
func GetDbConfig() map[string]string {
// 初始化数据库配置map
dbConfig := make(map[string]string)
dbConfig["DB_HOST"] = "127.0.0.1" //主机
dbConfig["DB_PORT"] = "3306" //端口
dbConfig["DB_NAME"] = "golang" //数据库
dbConfig["DB_USER"] = "root" //用户名
dbConfig["DB_PWD"] = "" //密码
dbConfig["DB_CHARSET"] = "utf8"
dbConfig["DB_MAX_OPEN_CONNS"] = "20" // 连接池最大连接数
dbConfig["DB_MAX_IDLE_CONNS"] = "10" // 连接池最大空闲数
dbConfig["DB_MAX_LIFETIME_CONNS"] = "7200" // 连接池链接最长生命周期
return dbConfig
}
```
### 启动服务
```sh
# go run main.go
[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.
[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
- using env: export GIN_MODE=release
- using code: gin.SetMode(gin.ReleaseMode)
[GIN-debug] Loaded HTML Templates (3):
-
- index.html
- index/index.html
[GIN-debug] GET / --> easy-gin/controllers.IndexHome (3 handlers)
[GIN-debug] GET /index --> easy-gin/controllers.IndexHome (3 handlers)
[GIN-debug] GET /users/:id --> easy-gin/controllers.UserGet (3 handlers)
[GIN-debug] GET /users --> easy-gin/controllers.UserGetList (3 handlers)
[GIN-debug] POST /users --> easy-gin/controllers.UserPost (3 handlers)
[GIN-debug] PUT /users/:id --> easy-gin/controllers.UserPut (3 handlers)
[GIN-debug] PATCH /users/:id --> easy-gin/controllers.UserPut (3 handlers)
[GIN-debug] DELETE /users/:id --> easy-gin/controllers.UserDelete (3 handlers)
[GIN-debug] Listening and serving HTTP on 0.0.0.0:8080
```
### 访问服务
http://yourhost:8080/
## 快速体验
### 导入框架示例 Sql
```sql
CREATE DATABASE `golang` DEFAULT CHARSET uft8mb4 DEFAULT utf8mb4_general_ci;
USE `golang`;
CREATE TABLE `users` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(25) NOT NULL,
`age` tinyint unsigned NOT NULL DEFAULT 0,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
```
### 定义控制器
controllers
controllers/IndexController.go
```go
package controllers
import (
"net/http"
"github.com/gin-gonic/gin"
)
func IndexHome(ctx *gin.Context) {
//// query string
//queryVal1 := ctx.Query("val1")
//queryVal2 := ctx.DefaultQuery("val2", "val2_default")
//
//// post form data
//formVal3 := ctx.PostForm("val3")
//formVal4 := ctx.DefaultPostForm("val4", "val4_default")
//
//// path info
//pathVal5 := ctx.Param("val5")
//ctx.String(http.StatusOK, "hello %s %s %s %s %s", queryVal1, queryVal2, formVal3, formVal4, pathVal5)
ctx.HTML(http.StatusOK, "index/index.html", gin.H{
"msg": "easy gin",
})
}
```
### 定义模型
models
models/User.go
```go
package models
import (
"log"
)
type User struct {
Model
Id int `json:"id" form:"id" primaryKey:"true"`
Name string `json:"name" form:"name" binding:"required"`
Age int `json:"age" form:"age" binding:"required"`
}
// get one
func (model *User) UserGet(id int) (user User, err error) {
....
}
// get list
func (model *User) UserGetList(page int, pageSize int) (users []User, err error) {
....
}
// create
func (model *User) UserAdd() (id int64, err error) {
....
}
// update
func (model *User) UserUpdate(id int) (afr int64, err error) {
....
}
// delete
func (model *User) UserDelete(id int) (afr int64, err error) {
....
}
```
### 定义视图
views
views/index
views/index/index.html
### 定义路由 Restful
routes
routes/router.go
```go
package routes
import (
"easy-gin/controllers"
"github.com/gin-gonic/gin"
)
func RegisterRoutes(router *gin.Engine) {
router.GET("/", controllers.IndexHome)
router.GET("/index", controllers.IndexHome)
router.GET("/users/:id", controllers.UserGet)
router.GET("/users", controllers.UserGetList)
router.POST("/users", controllers.UserPost)
router.PUT("/users/:id", controllers.UserPut)
router.PATCH("/users/:id", controllers.UserPut)
router.DELETE("/users/:id", controllers.UserDelete)
}
```
### 热更新开发模式借用 rizla 插件
```sh
# go get -u github.com/kataras/rizla
# rizla main.go
```
### 注意
因 golang 的包载入机制问题,项目名如需改为其他,需修改框架内的部分包的载入路径 `easy-gin` to `your-projectName`
```
main.go
server/server.go
routes/router.go
server/server.go
models/*
```
go 1.11 后大家可以改用 gomod 模式