1 Star 1 Fork 0

MELF晓宇 / gin-start

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README
MIT

gin-start

介绍

一个Gin框架的项目公共基础库,避免进行基础模块的重复开发。

  • 实现高并发可用的分布式雪花ID
  • 封装跨域、限流等常用中间件
  • 封装类型转换等常用函数
  • 封装Casbin的常用方法
  • 封装请求统一返回格式

安装

go get github.com/melf-xyzh/gin-start

例子

package main

import (
	"github.com/gin-gonic/gin"
	"github.com/melf-xyzh/gin-start/config"
	"github.com/melf-xyzh/gin-start/global"
	"github.com/melf-xyzh/gin-start/global/check"
	"github.com/melf-xyzh/gin-start/middleware"
	"github.com/melf-xyzh/gin-start/user/model"
	"github.com/melf-xyzh/gin-start/utils/result"
	"go-guide/guide/api/v1"
	"go-guide/guide/model"
)

//go:generate go env -w GO111MODULE=on
//go:generate go env -w GOPROXY=https://goproxy.cn,direct
//go:generate go mod tidy
//go:generate go mod download

func main() {
	init := conf.Init{}
	// 初始化环境变量
	global.E = init.Env(global.ENV_DEV)
	// 初始化Viper(读取配置文件)
	global.V = init.Viper()
	// 初始化数据库连接池
	global.DB = init.Database()
	// 初始化雪花ID节点
	global.Node = init.Node()
	// 初始化Redis连接池
	global.RDB = init.Redis()
	// 初始化参数校验器
	global.Validate = init.Validate()
	// 初始化Casbin
	global.Enforcer = init.Casbin()

	r := gin.New()
	r.Use(middleware.Cors())

	err := global.DB.AutoMigrate(
		usermod.User{},
		guidemod.Index{},
		guidemod.WebSite{},
		guidemod.WebsiteGroup{},
	)
	if err != nil {
		panic("数据迁移失败")
	}

	r.GET("/", func(c *gin.Context) {

		user := usermod.User{
			Model: global.Model{
				ID:         global.CreateId(),
				CreateTime: global.CreateTime(),
			},
			Name:        "MELF",
			Email:       "123456789@99.com",
			LastLoginIp: "8.8.8.8",
		}
		err = check.Check(user, usermod.CreateUserCheck)
		if err != nil {
			return
		}
		//err = global.DB.Create(&user).Error

		var userFind usermod.User
		global.DB.First(&userFind)
		userFind.LastLoginIp = "192.168.1.11"
		global.DB.Updates(&userFind)
		result.OkDataMsg(c, userFind, "创建成功")
	})

	r.GET("/index", guideapi.IndexAPI.GetIndex)

	r.GET("/aaa/", middleware.Rate0("4-H"), func(c *gin.Context) {
		var userFind usermod.User
		global.DB.First(&userFind)
		result.OkDataMsg(c, userFind, "创建成功")
	})

	// 启动服务
	init.Run(r)
}

类型转换封装

func main(){
    // var x interface{}
    
    // 将任意类型转换为string
	str := data.ToString(x)
	// 将任意类型转换为float32
	f32, err := data.ToFloat32(x)
	if err != nil {
		return
	}
	// 将任意类型转换为float64
	f64, err := data.ToFloat64(x)
	if err != nil {
		return
	}
	// 将任意类型转换为int
	i, err := data.ToInt(x)
	if err != nil {
		return
	}
	// 将任意类型转换为int32
	i32, err := data.ToInt32(x)
	if err != nil {
		return
	}
	// 将任意类型转换为int64
	i64, err := data.ToInt64(x)
	if err != nil {
		return
	}
}

中间件封装

// 允许跨域
r.Use(middleware.Cors())

// 限流中间件
 *  5 reqs/second: "5-S"
 *  10 reqs/minute: "10-M"
 *  1000 reqs/hour: "1000-H"
 *  2000 reqs/day: "2000-D"
// 限流每个ip的访问频率
r.Use(middleware.Rate("4-H"))
// 限制该接口的总访问频率
r.Use(middleware.Rate0("4-H"))

非侵入式校验器

模型定义

type User struct {
	global.Model
	Account       string     `json:"account"           gorm:"column:account;comment:账号;type:varchar(30)"`
	Password      string     `json:"-"                 gorm:"column:password;comment:密码;type:varchar(255)"`
	Name          string     `json:"name"              gorm:"column:name;comment:姓名;type:varchar(10)"`
	Avatar        string     `json:"avatar"            gorm:"column:avatar;comment:头像;type:varchar(255)"`
	Nickname      string     `json:"nickname"          gorm:"column:nickname;comment:昵称;type:varchar(20)"`
	Status        string     `json:"status"            gorm:"column:status;comment:状态;default:enable;type:varchar(10)"`
	UserType      string     `json:"userType"          gorm:"column:user_type;comment:用户类型;default:common;type:varchar(20)"`
	Phone         string     `json:"phone"             gorm:"column:phone;comment:手机号;type:varchar(255)"`
	Email         string     `json:"email"             gorm:"column:email;comment:邮箱;type:varchar(255)"`
	LoginCount    uint64     `json:"loginCount"        gorm:"column:login_count;comment:登录次数;default:0"`
	LastLoginTime *time.Time `json:"lastLoginTime"     gorm:"column:last_login_time;comment:上传登录时间;"`
	LastLoginIp   string     `json:"lastLoginIp"       gorm:"column:last_login_ip;comment:上次登录IP;type:varchar(100)"`
}

校验规则定义

var (
	// CreateUserCheck 创建用户校验
	CreateUserCheck = check.Rules{
        // 键名为结构体字段名,规则请参考
        // https://github.com/go-playground/validator/blob/master/README.md
        "Name": "required",
	}
)

在这里向https://github.com/go-playground/validator致敬!

校验

// 创建一个实例
user := usermod.User{
    Model: global.Model{
        ID:         global.CreateId(),
        CreateTime: global.CreateTime(),
    },
    Name:        "MELF",
    Email:       "123456789@99.com",
    LastLoginIp: "8.8.8.8",
}
// 校验该实例是否符合规则
err = check.Check(user, usermod.CreateUserCheck)
if err != nil {
    return
}

第三方接口请求(GET / POST方式)

func main(){
	data, err := httpapi.Get.Get("https://api.uomg.com/api/comments.163")
	if err != nil {
		log.Println(err.Error())
	}
	log.Println(data)


	data, err = httpapi.Get.GetWithParams("https://api.uomg.com/api/comments.163", map[string]interface{}{"format":"text"})
	if err != nil {
		log.Println(err.Error())
	}
	log.Println(data)

	data,err = httpapi.Post.PostJson("需要请求的url",map[string]interface{}{"format":"text"})
	if err != nil {
		log.Println(err.Error())
	}
	log.Println(data)

	data,err = httpapi.Post.PostFormData("需要请求的url",map[string]interface{}{"format":"text"})
	if err != nil {
		log.Println(err.Error())
	}
	log.Println(data)

	data,err = httpapi.Post.PostUrlencoded("需要请求的url",map[string]interface{}{"format":"text"})
	if err != nil {
		log.Println(err.Error())
	}
	log.Println(data)
}

项目目录

├─config            #配置相关
├─global            #全局变量(或单例连接池)、全局常量
├─resource          #资源文件夹
├─router            #路由文件夹
├─user              #用户模块
└─utils             #工具类
    ├─data          #数据格式相关
    ├─distributed #分布式相关
    └─result#返回消息封装

功能目标

  • Viper配置文件解析
  • 集成ORM(Gorm)
  • 跨域
  • 身份认证(登录)
    • 基于Session
    • 基于Jwt
  • 权限控制
    • 集成csabin
  • SSE(服务端消息推送)
  • gRPC
  • 分布式ID
    • snowflow
  • Websocket
  • 接口限流

备注

codechina:https://codechina.csdn.net/qq_29537269/gin-start

gitee:https://gitee.com/melf-xyzh/gin-start

github:https://github.com/melf-xyzh/gin-start

MIT License Copyright (c) 2021 MELF晓宇 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.

简介

一个Gin框架的项目模板 展开 收起
Go
MIT
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
Go
1
https://gitee.com/melf-xyzh/gin-start.git
git@gitee.com:melf-xyzh/gin-start.git
melf-xyzh
gin-start
gin-start
master

搜索帮助