GoframePro框架开发一个接口需在api下编写对外接口、在internal\controller编写控制层、在internal\logic编写实现层业务功能。除了这几个手动编写外,还有通过通过命令生成的dao层和service层。下面将给大家介绍开发一个接口流程,我们通过编写代码前后顺序介绍。
开发步骤:
1.创建api文件-对外接口
1.1 api接口目录结构说明
- 首先在api目录下创建一个目录文本夹作为模块目录,在模块目录中创建具体功能目录文件夹,如创建admin模块目录。
- 然后在admin目录下创建datacenter、system和user等管理后台相关功能目录。
- 最后在功能目录下创建具体实现功能接口文件,如system目录下创建rule.go(菜单管理)、role.go(角色管理)和account.go(账号管理)等文件。
1.2 api接口文件编码
创建好接口文件编写代码如下:
Go
// 账号列表
type AccountListReq struct {
g.Meta `path:"/system/account/getList" tags:"getList" method:"get" summary:"账号列表"`
baseapi.PageReq
Name string `p:"name" d:"" dc:"搜索名称"`
Status any `p:"status" d:"" dc:"状态"`
Createtime string `p:"createtime" d:"" dc:"创建时间"`
}
type AccountListRes struct {
*gf.R
}
其中:
- g.Meta 是编写路由地址相关参数,path是请求接口路由地址,访问接口完整地址为:域名+模块名+path,如:https://goframepro.goflys.cn/admin/system/account/getList。tags接口名(用于接口文档生成)。method是请求方法(如get、post、delete)。summary接口名称(用于接口文档生成)。还有GoFramePro框架扩展的noValApi忽略接口访问验证、noAuth忽略RBAC权限验证、noLogin忽略登录token验证(忽略验证更多使用方法参考:接口权限/token验证及跨域)。
- baseapi.PageReq这个列表分页相关公共参数
- 其他参数根据前端传回具体添加。
2.生成controller控制层
在开发时我们都是先通过框架命令工具,先生成控制器文件和控制名称,在把控制器名添加到模块路由 中,然后再根据情况在控制器中编写代码,可在控制器中写实现程序代码,也可以添加实现层logic 把业务写到实现层中。
2.1 通过api文件生成控制器文件
Goframe框架提供gf 工具可以通过配置好的api目录下的文件生成控制器文件和创建控制器结构名称,开发使用生成控制器命令如下:
Go
gf gen ctrl -m
这个命令生成控制文件会把一个api文件所有接口方法生成到一个控制器文件中 。如果想每个接口方法单独一个控制器文件,那么去掉 -m 即可,命令如下:
Go
gf gen ctrl
生成控制器文件同时,会在"模块+_new.go"文件中生成机构购名称,并用于注册路由。我们用admin 模块举例,后台的数据中心 Datacenter通过api配置运行命令后,会在internal\controller\admin\admin_new.go文件中添加如下代码:
Go
type ControllerDatacenter struct{}
func NewDatacenter() admin.IAdminDatacenter {
return &ControllerDatacenter{}
}
其中NewDatacenter()把它添加到路由文件内,重启服务后就可以访问到Datacenter内所有接口了。
生成的控制器文件名名称为:模块名++功能类名称++api文件名,如数据中心字典数据tabledata文件名为admin_datacenter_tabledata.go 代码如下:
Go
package admin
import (
"context"
"goframepro/api/admin/datacenter"
)
func (c *ControllerDatacenter) TabledataList(ctx context.Context, req *datacenter.TabledataListReq) (res *datacenter.TabledataListRes, err error) {
return
}
2.2 把api接口注册到路由中
通过"1.3 通过api文件生成控制器文件"生成的控制名称实例 NewXX() 添加到同目录下"模块+_router.go"路由文件。还是用admin模块举例,把生成的NewDatacenter()把它添加到internal\controller\admin\admin_router.go文件内容,代码如下:
Go
func (router *Router) BindController(ctx context.Context, group *ghttp.RouterGroup) {
group.Group("/admin", func(group *ghttp.RouterGroup) {
//登录验证拦截
group.Middleware(middleware.Token)
//验证后台管理接口的RBAC权限验证
group.Middleware(middleware.Auth)
//后台操作日志记录
// group.Hook("/*", ghttp.HookAfterOutput, service.Adminsystem().OperationLog)
group.Middleware(service.Adminsystem().OperationLog)
//注册路由-新增功能需要把admin_new.go新增的NewXX添加进来
group.Bind(
NewUser(),
//.....
NewDatacenter(),//这就是注册数据中心路由
) //append
})
}
3.创建logic实现层
在实际开发中我们会根据业务复杂度、后端参与开发人数、公司编码要求等情况选择是否把业务代码放到 logic 实现层中编写。
3.1 创建实现成目录
在internal\logic目录下创建指定模块的功能目录,目录名称为:模块名+_+功能类名称,例如管理后端的数据中心 datacenter 创建实现层目录名称为admin_datacenter。注意目录内包名package为模块名+功能类名称,如数据中心 datacenter为:package admindatacenter
3.2 创建接收器名称文件
创建文件名称与目录名称一致,如数据中心 datacenter创建文件为:admin_datacenter.go,编写代码步骤为:
3.3 首页定义接收器名称:
这是统一实现层内部所有方法名类型,如数据中心 datacenter创建文件为:
Go
//1.定义接收器名称
type (
sAdmindatacenter struct{}
)
3.4 生成service文件
这里先运行一次 生成service文件命令,先生成对应 service 名,提供给接收器调用。生成命令如下:
Go
gf gen service
3.5 把实现层结构名注册到service中
生成好service文件后就把当前实现层注册到service 服务中,用数据中心 datacenter为例,完整代码如下:
Go
package admindatacenter
import "goframepro/internal/service"
//1.定义接收器名称
type (
sAdmindatacenter struct{}
)
//2.把sAdmindatacenter注册到service中
func NewAdmindatacenter() service.IAdmindatacenter {
return &sAdmindatacenter{}
}
func init() {
service.RegisterAdmindatacenter(NewAdmindatacenter())
}
3.6 创建实现方法文件
写好统一把实现层注册到service 服务文件后,可以写具体实现层代码了,为了让实现层和控制层对应上,我们直接复制控制器名称过来。文件名称为:模块名++功能类名称++api文件名,如数据中心 datacenter 的字典数据 tabledata文件为:admin_datacenter_tabledata.go 它和控制文件internal\controller\admin目录下的admin_datacenter_tabledata.go一致。然后实现层方法名也要和控制器方法名一致。如数据中心 datacenter 的字典数据 tabledata获取数据TabledataList具体代码如下:
Go
package admindatacenter
import (
"context"
"goframepro/api/admin/datacenter"
"goframepro/internal/dao"
"goframepro/utility/gf"
)
// 获取字典分类数据
func (s *sAdmindatacenter) TabledataList(ctx context.Context, req *datacenter.TabledataListReq) (res *gf.R) {
list, err := dao.DictionaryGroup.Ctx(ctx).Fields("id,title,remark,tablename,status,weigh,db_way").Order("weigh asc").All()
if err != nil {
res = gf.Failed().SetMsg("获取字典分类数据失败").SetData(err)
return
}
res = gf.Success().SetMsg("获取字典分类数据").SetData(list)
return
}
在实现业务代码中我们使用dao层数据对象,通过"5.生成dao数据层"命令生成。
3.7 再次运行service生成命令
把编写好的实现层方法注册到service 服务中提供控制层等调用。运行命令和"3.4 生成service文件"步骤相同,即在终端运行:gf gen service
4.在controller控制层引入service中的logic实现层函数
编写好实现层代码后,再去控制层调用,调用方法为:service.模块名+功能类名称,如数据中心 datacenter的字典数据 tabledata为例即:service.Admindatacenter().方法名,代码如下:
Go
package admin
import (
"context"
"goframepro/api/admin/datacenter"
"goframepro/internal/service"
)
func (c *ControllerDatacenter) TabledataList(ctx context.Context, req *datacenter.TabledataListReq) (res *datacenter.TabledataListRes, err error) {
res = &datacenter.TabledataListRes{R: service.Admindatacenter().TabledataList(ctx, req)}
return
}
到此一个完整编写接口流程就完成了,看似复杂,熟练以后开发起来还是很简单的,以上很多步骤都有通过命令生成代码,减少了手动编写,手写就放在api接口定义和实现层代码中。
5.生成dao数据层
dao数据这一步操作步骤不固定,只要编写业务有数据表,就可以在编写业务之前执行,只要在调用之前生成即可,生成命令如下:
Go
gf gen dao