「这是我参与11月更文挑战的第19天,活动详情查看:2021最后一次更文挑战」

前言

现在基本框架都弄完了,准备添加数据的时候发现只有从数据库导出表格,在表格中添加数据然后再导入数据库,解析来准备做一个后台系统,做一些简单的增删改查,登录注销,然后再使用一个流行的管理后台的框架,那么今天就做一个域名分类的增删改查吧,学习一下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
}
复制代码

image.png

新增分类:

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

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

image.png

修改分类

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

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

image.png

删除

删除是简单的,根据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("修改成功")
}

复制代码
c.ShouldBindJSON()
	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
}
复制代码
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的后台管理框架了吧。