golang 语言使用 gin 开发 web 服务

44 阅读1分钟
go.mod
│   go.sum
│   main.go
│
├───controller
│       common.go
│       user.go
│
├───dao
│       dao.go
│
├───module
│       user.go
│
└───router
        router.go

main.go

package main

import (
    "demoProject/router"
    "fmt"
    log "github.com/sirupsen/logrus"
)

func main() {
    fmt.Println("Hello World")

    err := router.Router().Run(":8088")
    if err != nil {
       log.Error(err.Error())
       return
    }
}

controller/common.go

package controller

import (
    "github.com/gin-gonic/gin"
    "net/http"
)

type JsonResponseDTO struct {
    Code    int         `json:"code"`
    Message interface{} `json:"message"`
    Data    interface{} `json:"data"`
    Count   int64       `json:"count"`
}

type JsonErrorDTO struct {
    Code    int         `json:"code"`
    Message interface{} `json:"message"`
}

func Success(c *gin.Context, data interface{}, count int64) {
    json := &JsonResponseDTO{Code: 0, Message: "success", Data: data, Count: count}
    c.JSON(http.StatusOK, json)
}

func Fail(c *gin.Context, msg interface{}) {
    json := &JsonErrorDTO{Code: -1, Message: msg}
    c.JSON(http.StatusOK, json)
}

func ErrorRecover(c *gin.Context) {
    if r := recover(); r != nil {
       Fail(c, r.(error).Error())
    }
}

controller/user.go

package controller

import (
    "demoProject/module"
    "github.com/gin-gonic/gin"
    "strconv"
)

type UserController struct {
}

type UserSearch struct {
    Id       int    `json:"id"`
    UserName string `json:"name"`
}

func (u UserController) GetUser(c *gin.Context) {
    defer ErrorRecover(c)
    id := c.Param("id")
    //name := c.PostForm("name")
    //name := c.PostFormMap("name")
    idInt, err := strconv.Atoi(id)
    if err != nil {
       panic(err)
    }
    userInfo := module.GetUserById(idInt)
    Success(c, userInfo, 1)
}

func (u UserController) PutUser(c *gin.Context) {
    defer ErrorRecover(c)
    param := make(map[string]interface{})
    err := c.ShouldBindJSON(&param)
    if err != nil {
       Fail(c, err.Error())
       return
    }
    Success(c, "add success", 1)
}

func (u UserController) SearchUser(c *gin.Context) {
    defer ErrorRecover(c)
    param := &UserSearch{}
    err := c.ShouldBindJSON(&param)
    if err != nil {
       Fail(c, err.Error())
       return
    }
    Success(c, "search success", 1)
}

func (u UserController) GetUserFail(c *gin.Context) {
    Fail(c, "未找到用户")
}

dao/dao.go

package dao

import (
    "gorm.io/driver/sqlite"
    "gorm.io/gorm"
)

var (
    Db  *gorm.DB
    err error
)

func init() {
    //dsn := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
    //db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
    Db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
    if err != nil {
       panic("failed to connect database")
    }
    if Db.Error != nil {
       panic("database error ")
    }
    //Db.DB().setMaxIdleCounts(10)
}

module/user.go

package module

import "gorm.io/gorm"
import "demoProject/dao"

type UserModule struct {
    gorm.Model
    Name string `gorm:"type:varchar(255)"`
    Age  int    `gorm:"type:int"`
}

func (u UserModule) TableName() string {
    return "sys_user"
}

func GetUserById(id int) (u UserModule) {
    err := dao.Db.Where("id=?", id).First(&u).Error
    if err != nil {
       panic("未找到id")
    }
    return
}

router/router.go

package router

import (
    "demoProject/controller"
    "github.com/gin-gonic/gin"
    "net/http"
)

func Router() *gin.Engine {

    r := gin.Default()
    r.GET("/hi", func(c *gin.Context) {
       c.String(http.StatusOK, "Hello World")
    })

    user := r.Group("/user")
    {
       user.GET("/info/:id", controller.UserController{}.GetUser)
       user.GET("/err", controller.UserController{}.GetUserFail)
    }
    return r
}