「这是我参与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
}
复制代码
新增分类:
尝试了一下返回插入数据的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("修改成功")
}
复制代码
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的后台管理框架了吧。