• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

从零开始摸索VUE,配合Golang搭建导航网站十九.GORM数据增删改查和Gin验证器

武飞扬头像
土圭垚墝
帮助1

前言

现在基本框架都弄完了,准备添加数据的时候发现只有从数据库导出表格,在表格中添加数据然后再导入数据库,解析来准备做一个后台系统,做一些简单的增删改查,登录注销,然后再使用一个流行的管理后台的框架,那么今天就做一个域名分类的增删改查吧,学习一下GORM的增删改查,还有Gin的验证器。

GORM增删改查

主要是新增返回新增的id稍微想了一下办法,其他的都不是很困难,先把模型方法分别代码亮出来,然后再把其中service和controller还有route的代码一起展示。

分类列表:

//获取所有的type
func GetAllTypeLIst() (data interface{}, err error) {
	var list []UrlType
	db.Debug().Find(&list)
	fmt.Println(list)
	return list, nil
}

学新通网

新增分类:

尝试了一下返回插入数据的ID:

//增加一个分类
func AddType(name string) (id int, err error) {
	TypeData := UrlType{
		Name: name,
	}
	err = db.Debug().Create(&TypeData).Error
	return int(TypeData.ID), err
}

学新通网

修改分类

这里是查找了相关的资料,感觉有点不对劲,有优化的地方,希望大佬指出~,可以做一个简单返回修改影响的条数,这里埋个坑,下次修改详细的域名的时候优化。

//修改一个分类
func EditType(id int, name string) error {
	return db.Debug().Model(&UrlType{}).Where("id = ?", id).Updates(map[string]interface{}{
		"Name": name,
	}).Error
}

学新通网

删除

删除是简单的,根据id删除:

//删除一个分类
func DelType(id int) error {
	return db.Delete(&UrlType{}, id).Error
}

验证器

在项目根目录新建request目录。在request目录下新建request.go文件,写入一下内容:

package request

// 定义接收数据的结构体
type DelTypeRequest struct {
	Id int `form:"id" json:"id" binding:"required"`
}

type AddTypeRequest struct {
	Name string `form:"name" json:"name" binding:"required"`
}

type EditTypeRequest struct {
	Id   int    `form:"id" json:"id" binding:"required"`
	Name string `form:"name" json:"name" binding:"required"`
}

获取列表接口不用传参,删除传数据的id,增加传name,修改传id和name,上面从postman的截图可以看出来传入的是json数据。

验证器使用:

实在controller中使用的,先把controller的主要代码亮出来:

import (
	"main/global"
	"main/request"
	"main/service"
	"net/http"

	"github.com/gin-gonic/gin"
)

....
func GetTypeList(c *gin.Context) {
	result := global.NewResult(c)
	data, err := service.GetTypeList()
	if err != nil {
		result.Error(5201, err.Error(), data)
		return
	}
	result.Success(data)
}

func DelType(c *gin.Context) {
	var json request.DelTypeRequest
	if err := c.ShouldBindJSON(&json); err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}

	result := global.NewResult(c)
	err := service.DelType(json)
	if err != nil {
		result.Error(5201, err.Error(), "删除失败")
		return
	}
	result.Success("删除成功")
}

func AddType(c *gin.Context) {
	var json request.AddTypeRequest
	if err := c.ShouldBindJSON(&json); err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}
	result := global.NewResult(c)
	id, err := service.AddType(json)
	if err != nil {
		result.Error(5201, err.Error(), "添加成功")
		return
	}
	result.Success(id)
}

func EditType(c *gin.Context) {
	var json request.EditTypeRequest
	if err := c.ShouldBindJSON(&json); err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}
	result := global.NewResult(c)
	err := service.EditType(json)
	if err != nil {
		result.Error(5201, err.Error(), "修改失败")
		return
	}
	result.Success("修改成功")
}

核心代码是引入requet包,把前面定义的数据接口实例化,然后使用Gin框架的c.ShouldBindJSON()去验证controller接受的参数是否合法,不合法报错:

	var json request.DelTypeRequest
	if err := c.ShouldBindJSON(&json); err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}

路由

然后看看路由,顶一个一个理由分组,这些增删改查是属于后台管理的,就定义了一个admin分组:

//Router 路由方法
func Router() *gin.Engine {
	router := gin.Default()
	//处理异常
	router.NoRoute(HandleNotFound)
	router.NoMethod(HandleNotFound)
	router.Use(Recover)
	router.Use(middleware.Cors())
	router.GET("/", func(c *gin.Context) {
		c.JSON(http.StatusOK, 1)
		return
	})

	router.GET("/api", controller.Api)
	admin := router.Group("/admin")
	{
		// 路径映射
		// api:=controller.NewDyController()
		admin.GET("/getTypeList", controller.GetTypeList)
		admin.POST("/DelType", controller.DelType)
		admin.POST("/AddType", controller.AddType)
		admin.POST("/EditType", controller.EditType)

	}

	return router
}

在最开始的postman截图上可以看到接口路径中有了这个admin.

service

最后讲service,因为它没有什么好说的,用户请求从router到controller,controller验证参数再到service,代码逻辑应该在service,但是增删改查没有逻辑,就是直接调用model的方法:

import (
	"main/model"
	"main/request"
)
...
func GetTypeList() (data interface{}, err error) {
	list, nil := model.GetAllTypeLIst()
	return list, nil
}

func DelType(json request.DelTypeRequest) (err error) {
	nil := model.DelType(json.Id)
	return nil
}

func AddType(json request.AddTypeRequest) (id int, err error) {
	id, nil := model.AddType(json.Name)
	return id, nil
}

func EditType(json request.EditTypeRequest) (err error) {
	nil := model.EditType(json.Id, json.Name)
	return nil
}

serivce里还要引入request验证器,需要直接把具体的参数类型传给model,model那边就直接使用具体类型的参数了。

总结

GORM对于熟悉PHP框架的人来说还是挺难学习的,PHP框架的ORM方法做了好多封装,很好使用并且很好理解,在GORM这里就暴露了语言的很多底层的东西。例如 实例化结构体,为结构体分配内存并初始化,然后返回给用户,在PHP的laravel框架直接引入直接用的,下篇预计来看看element的后台管理框架了吧。

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhbebjcj
系列文章
更多 icon
同类精品
更多 icon
继续加载