代码还是在db分支,相关业务代码全部在app/other目录下
上一篇分析完了数据库的连接。这篇就是实现代码来印证一下。
首先呢,这里的数据来源是go-admin官方提供的初始化导入的。我的数据库取名叫做“go_admin”。说实话,我看看它自带的那些业务代码,一个简简单单的get查询,都实现得很复杂似的。其中好几个方法,都是知道到底在干吗,查资料后,我删掉了大部分代码。留下一些好理解的。
我取其中的一个接口 “getPage”做实践。
首先看page的接口层:
它首先是为了提供对外的接口,然后再做一些基本的检查,然后将db,logger等对象传递给业务实现层。
// go-admin框架下 接口层必备结构体
type SysApi struct {
api.Api
}
func (e SysApi) GetPage(c *gin.Context) {
// 业务实现层对象
s := service.SysApi{}
// 这里的链式操作是为了检查各所需的对象是否正确初始化,基本上每个接口都带有这一串玩意。实际上是将所需的对象传递到需要的位置
err := e.MakeContext(c). // 这里是为了将gin.Context这个http连接实例赋值给SysApi这个对象,并且为它获取了日志的对象以过程中的日志操作
MakeOrm(). // 为了获取db对象,并将指针拷贝给SysApi的对象
MakeService(&s.Service). // 这一步是将上面获取日志对象和db对象赋值给业务实现层对象s,然后由它去完成操作。
Errors // 过程中如果有哪一步有错,就会提取到错误,否则err为 nil
// 判断是否有错
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
list := make([]models.SysApi, 0) // 储存从数据库获取的数据的列表
err = s.GetPage(&list) //获取数据的实现
if err != nil {
e.Error(500, err, "查询失败")
return
}
e.OK(list, "查询成功")
}
业务实现在service文件夹的page.go:
// go-admin 封装的业务实现层必备结构体
type SysApi struct {
service.Service
}
// GetPage 获取SysApi列表
func (e *SysApi) GetPage(list *[]models.SysApi) error {
var err error
var data models.SysApi // page对应表的映射结构体
err = e.Orm.Debug().Model(&data).Limit(1).Find(list).Error // 这里就是查询满足条件的第一条数据
if err != nil {
e.Log.Errorf("Service GetSysApiPage error:%s", err)
return err
}
return nil
}
有没有发现这个查询过程没有提到表名,也没提到字段名,那它怎么查呢?其实都是通过Model(&data)获取到这些信息的。我们就讲models.SysApi这个结构体吧。
// page 对应表的映射,后面这些标签,为了查询数据和转换大小写
type SysApi struct {
Id int `json:"id" gorm:"primaryKey;autoIncrement;comment:主键编码"`
Handle string `json:"handle" gorm:"size:128;comment:handle"`
Title string `json:"title" gorm:"size:128;comment:标题"`
Path string `json:"path" gorm:"size:128;comment:地址"`
Action string `json:"action" gorm:"size:16;comment:请求类型"`
Type string `json:"type" gorm:"size:16;comment:接口类型"`
CreatedAt time.Time `json:"createdAt" gorm:"comment:创建时间"`
UpdatedAt time.Time `json:"updatedAt" gorm:"comment:最后更新时间"`
DeletedAt gorm.DeletedAt `json:"-" gorm:"index;comment:删除时间"`
CreateBy int `json:"createBy" gorm:"index;comment:创建者"`
UpdateBy int `json:"updateBy" gorm:"index;comment:更新者"`
}
首先在go的规范里,字段要想对外暴露,首字母必须大写。否则无法正确解析。但是业界的命名规范通常都是小写字母开头,于是就需要json标签,可以看到就是把首字母换小写,个别比较特别的可以去查下什么含义。
但是我们还知道,数据库里字段命名规范通常又采用下划线的方式,所以这里还要做一次转换,但是这个转换gorm帮我们完成了。所以就能对应上数据库上的字段了。
这个过程中还缺了很重要的一个因素,表名都没有呀,其实gorm也有默认规则,表名也默认是结构体的名字,它也会默认转化成下划线的格式。所以,整个查询就这样完成的。当然,字段要加入gorm标签才行。
PS:我这里省略了路由没有描述,接口要对外暴露,自然是需要添加到路由中。
1592

被折叠的 条评论
为什么被折叠?



