zoukankan      html  css  js  c++  java
  • 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()
        }
    }
  • 相关阅读:
    Tomcat 服务器体系结构
    tomcat的下载和启动
    tomcat解决端口号占用问题
    我的wmware
    Xshell的使用
    GCC的-wl,-rpath=参数
    Matlab图像处理(01)-Matlab基础
    CMake最好的学习资料
    使用valgrind进行内存泄漏和非法内存操作检测
    CLion提示can't find stdio.h等错误
  • 原文地址:https://www.cnblogs.com/qzhc/p/13460253.html
Copyright © 2011-2022 走看看