Go语言的GoFramePro开发框架开发接口完整流程教程

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
相关推荐
小二·3 小时前
Go 语言系统编程与云原生开发实战(第36篇)
开发语言·云原生·golang
不会写DN3 小时前
Go中的Tcp编程为什么总是能看到handle?
开发语言·网络·后端·tcp/ip·golang
参.商.3 小时前
【Day32】704. 二分查找 34. 在排序数组中查找元素的第一个和最后一个位置
leetcode·golang
骑驴看星星a3 小时前
Golang学习之time包与net/http 包
学习·http·golang
lars_lhuan3 小时前
Go 方法
开发语言·后端·golang
小二·4 小时前
Go 语言系统编程与云原生开发实战(第37篇)
java·云原生·golang
小二·4 小时前
Go 语言系统编程与云原生开发实战(第40篇 · 终章)
开发语言·云原生·golang
ezreal_pan10 小时前
弹窗缓存重构技术方案
缓存·重构·golang
小二·12 小时前
Go 语言系统编程与云原生开发实战(第38篇)
网络·云原生·golang