9

Gin学习笔记 - MVC & CRUD

 3 years ago
source link: https://tomoya92.github.io/2021/02/22/gin-tutorial-mvc&crud/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

作者:朋也

日期:2021-02-22

版权声明:自由转载-非商用-非衍生-保持署名( 创意共享3.0许可证

上古的分包模型,M模型,V视图,C控制器

对应到项目中的包结构如下

gin-tutorial
├─controller
├─model
├─service
└─main.go

创建model.User

type User struct {
    Name     string `json:"name"`
    Password string `json:"password"`
    Age      int    `json:"age"`
}

创建UserService,作为user的服务层,后面这个类都是要跟数据库打交道的,现在还没有连接数据库,临时造点假数据

package service

import (
    "gin-tutorial/model"
    uuid "github.com/satori/go.uuid"
    "strconv"
)

type UserService struct {
    users []model.User
}

func (service *UserService) Init() {
    for i := 0; i < 10; i++ {
        service.users = append(service.users, model.User{
            Name:     "name" + strconv.Itoa(i),
            Password: uuid.NewV4().String(),
            Age:      i + 10,
        })
    }
}

然后在UserService里添加上CRUD的方法

func (service *UserService) GetUsers() []model.User {
    return service.users
}

func (service *UserService) GetByName(name string) model.User {
    for i := range service.users {
        user := &service.users[i]
        if user.Name == name {
            return *user
        }
    }
    return model.User{}
}

func (service *UserService) SaveUser(name string, password string, age int) model.User {
    newUser := model.User{
        Name:     name,
        Password: password,
        Age:      age,
    }
    service.users = append(service.users, newUser)
    return newUser
}

func (service *UserService) UpdateUserByName(name string, password string, age int) model.User {
    for i := range service.users {
        user := &service.users[i]
        if user.Name == name {
            user.Password = password
            user.Age = age
            return *user
        }
    }
    return model.User{}
}

func (service *UserService) DeleteUserByName(name string) {
    for i, user := range service.users {
        if user.Name == name {
            service.users = append(service.users[:i], service.users[i+1:]...)
        }
    }
}

service弄好后,下面创建controller

UserController里要用到UserService里的方法,所以在UserController里定义一个UserService的对象

package controller

import (
    "gin-tutorial/service"
    "github.com/gin-gonic/gin"
    "net/http"
    "strconv"
    "unsafe"
)

type UserController struct {
    Service *service.UserService
}

添加上CRUD的入口,每个方法就一个参数 c *gin.Context 这样就能作为路由方法了

func (controller UserController) GetUsers(c *gin.Context) {
    c.JSON(http.StatusOK, controller.Service.GetUsers())
}

func (controller UserController) GetUser(c *gin.Context) {
    name := c.Param("name")
    c.JSON(http.StatusOK, controller.Service.GetByName(name))
}

func (controller UserController) SaveUser(c *gin.Context) {
    // 获取post请求的参数,请求类型必须要是 application/x-www-form-urlencoded
    name := c.PostForm("name")
    password := c.PostForm("password")
    age, _ := strconv.ParseInt(c.PostForm("age"), 10, 32)
    c.JSON(http.StatusOK, controller.Service.SaveUser(name, password, *(*int)(unsafe.Pointer(&age))))
}

func (controller UserController) UpdateUser(c *gin.Context) {
    name := c.PostForm("name")
    password := c.PostForm("password")
    age, _ := strconv.ParseInt(c.PostForm("age"), 10, 64)
    c.JSON(http.StatusOK, controller.Service.UpdateUserByName(name, password, *(*int)(unsafe.Pointer(&age))))
}

func (controller UserController) DeleteUser(c *gin.Context) {
    name := c.Param("name")
    controller.Service.DeleteUserByName(name)
    c.JSON(http.StatusOK, controller.Service.GetUsers())
}

几种取值的方式

  • ?name=123&pwd=abc 这种是Query参数,使用 c.Query(“name”) 来取
  • /users/:name 这是Param参数,使用 c.Param(“name”) 来取
  • POST请求且Content-Type为application/x-www-form-urlencoded 时,使用 c.PostForm(“name”) 来取

最后修改main.go里的路由配置

package main

import (
    "gin-tutorial/controller"
    "gin-tutorial/service"
    "github.com/gin-gonic/gin"
)

// 初始化service和controller
var userService = service.UserService{}
var userController = controller.UserController{Service: &userService}

func main() {
    router := gin.Default()
    // router.LoadHTMLGlob("templates/*")

    // 初始化造的假数据
    userService.Init()

    router.GET("/users", userController.GetUsers)
    router.GET("/users/:name", userController.GetUser)
    router.POST("/users", userController.SaveUser)
    router.PUT("/users", userController.UpdateUser)
    router.DELETE("/users/:name", userController.DeleteUser)

    router.Run(":8080")
}

string 转 int/int32/int64 或者 int 转 string 的方法

YNRBNzZ.png!mobile


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK