gin+gorm+logrus实现增删改查项目源码

新学golang,呕心沥血小几天,转载请务必附上本文连接。

可能有些地方写的不是很好,请在评论区指教一二~

package main

import (
    "fmt"
    "github.com/gin-gonic/gin"
    _ "github.com/go-sql-driver/mysql"
    "github.com/jinzhu/gorm"
    "github.com/sirupsen/logrus"
    "net/http"
    "os"
    "strconv"
    "time"
)

//对应的实体类
type AppConf struct {
    Id      int    `gorm:"type:bigint(20);column:id;primary_key;AUTO_INCREMENT"`
    App_Id   int    `gorm:"type:bigint(20);column:app_id;not null"`
    Key     string `gorm:"type:varchar(255);column:key;not null"`
    Content string `gorm:"type:varchar(1500);column:content;not null"`
    Ctime   int    `gorm:"type:bigint(20);column:ctime;not null"`
    Utime   int    `gorm:"type:bigint(20);column:utime;not null"`
}

//声明全局数据库连接变量
var db *gorm.DB
var log = logrus.New()
func main() {
    defer db.Close()
    engine := gin.Default()
    engine.Use(LoggerToFile())
    routerGroup := engine.Group("/test")

    //查询所有数据
    routerGroup.GET("/appConfs", ListAll)

    //增加数据
    routerGroup.POST("/appConfs", Add)

    //删除数据
    routerGroup.DELETE("/appConfs/:id", Delete)

    //更新数据
    routerGroup.PATCH("/appConfs/:id", Update)
    engine.Run(":9999")

}

//初始化,创建连接
func init() {
    //连接mysql
    db, _ = gorm.Open("mysql", "root:123456(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=True&loc=Local")
    LoggerToFile()
    //单对单
    db.SingularTable(true)
    //设置数据库连接池
    db.DB().SetMaxIdleConns(5)
    db.DB().SetMaxOpenConns(10)
}

//查询所有用户信息
func ListAll(context *gin.Context) {
    var (
        //定义数据表条数
        count int
        //为count传参
        appConfCount[] AppConf
    )

    //获取指定表的数据总条数
    err := db.Model(&appConfCount).Count(&count)
    if err != nil {
        context.JSON(http.StatusOK,gin.H{
            "code":401,
            "status":"error",
            "message":"空表 !",
            "data":"null",
        })
    }
    //创建一个长度为0,容量为count的切片,使其避免扩容。    当时没用gorm,需要存到集合里,才会有扩容。下述不会
    var appConfs = make([]AppConf, 0, count)

    //查询数据表 app_conf
    rowsAffected:= db.Model(&AppConf{}).Find(&appConfs).RowsAffected
    if rowsAffected > 0 {

        context.JSON(http.StatusOK,gin.H{
            "code":200,
            "status":"success",
            "data":appConfs,
        })
    }else {
        context.JSON(http.StatusOK,gin.H{
            "code":401,
            "status":"error",
            "message":"空表 !",
            "data":"null",
        })
    }
}

//新增数据
func Add(context *gin.Context) {
    var appConf AppConf

    //绑定结构体
    context.Bind(&appConf)

    fmt.Println(appConf)
    //若id一样,则添加失败
    rowsAffected := db.Model(&AppConf{}).Create(&appConf).RowsAffected
    if rowsAffected > 0 {
        context.JSON(http.StatusOK,gin.H{
            "code":200,
            "status":"success",
            "message":"添加成功 !",
        })
    }else {
        context.JSON(http.StatusOK, gin.H{
            "code":401,
            "status":"error",
            "message": "添加失败",
        })
    }
}

//根据id删除数据
func Delete(context *gin.Context) {
    id := context.Param("id")
    //sting装int
    s,_ := strconv.Atoi(id)
    rowsAffected := db.Model(&AppConf{}).Where(&AppConf{Id: s}).Delete(&AppConf{}).RowsAffected

    //fmt.Println(rowsAffected)
    if rowsAffected > 0 {
        context.JSON(http.StatusOK,gin.H{
            "code":200,
            "status":"success",
            "message":"删除成功",
        })
    } else {
        context.JSON(http.StatusOK,gin.H{
            "code":401,
            "status":"error",
            "message":"删除失败",
        })
    }
}

//根据id修改信息
func Update(context *gin.Context) {
    var appConf AppConf
    id := context.Param("id")
    s,_ := strconv.Atoi(id)
    //绑定结构体
    context.Bind(&appConf)
    rowsAffected := db.Model(&AppConf{}).Where(&AppConf{Id: s}).Update(&appConf).RowsAffected
    if rowsAffected > 0 {
        context.JSON(http.StatusOK,gin.H{
            "code":200,
            "status":"success",
            "message":"更新成功",
        })
    } else {
        context.JSON(http.StatusOK,gin.H{
            "code":401,
            "status":"error",
            "message":"更新失败",
        })
    }
}


func LoggerToFile() gin.HandlerFunc {

    fileName := "./logger.log"
    //写入文件
    src, err := os.OpenFile(fileName, os.O_APPEND|os.O_WRONLY, os.ModeAppend)
    if err != nil {
        fmt.Println("err", err)
    }

    //实例化
    logger := logrus.New()

    //设置输出
    logger.Out = src

    //设置日志级别
    logger.SetLevel(logrus.DebugLevel)

    //处理日期格式

    logger.SetFormatter(&logrus.TextFormatter{
        TimestampFormat:"2006-01-01 15:04:05",
    })

    //设置日志格式
logger.SetFormatter(&logrus.JSONFormatter{})

    return func(c *gin.Context) {
        // 开始时间
        startTime := time.Now()
        // 处理请求
        c.Next()
        // 结束时间
        endTime := time.Now()
        // 执行时间
        latencyTime := endTime.Sub(startTime)
        latencyTime2 := float32(latencyTime) / float32(1000000)
        // 请求方式
        reqMethod := c.Request.Method
        // 请求路由
        reqUri := c.Request.RequestURI
        // 状态码
        statusCode := c.Writer.Status()
        // 请求IP
        clientIP := c.Request.Host
        // 日志格式
        logger.WithFields(logrus.Fields{
            "status_code"  : statusCode,
            "latency_time" : latencyTime2,
            "client_ip"    : clientIP,
            "req_method"   : reqMethod,
            "req_uri"      : reqUri,
        }).Info()
    }
}
原文地址:https://www.cnblogs.com/qzhc/p/13460253.html