新学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() } }