引言:
接着上一篇,这一篇记录个人实现博客小项目第二天的实战过程。
二:编写代码
输入gf gen dao后,若数据库连接无误,则会根据连接数据库的表生成对应的go文件,例如:
admin.go
// =================================================================================
// This is auto-generated by GoFrame CLI tool only once. Fill this file as you wish.
// =================================================================================
package dao
import (
"demo-blog/internal/dao/internal"
)
// internalAdminDao is internal type for wrapping internal DAO implements.
type internalAdminDao = *internal.AdminDao
// adminDao is the data access object for table admin.
// You can define custom methods on it to extend its functionality as you wish.
type adminDao struct {
internalAdminDao
}
var (
// Admin is globally public accessible object for table admin operations.
Admin = adminDao{
internal.NewAdminDao(),
}
)
// Fill with you ideas below.
接下来实现api层
在官方文档中对api层代码编写的规范如下:
前置约定
重要的规范🔥
该命令的目的之一是规范化api代码的编写,那么我们应该有一些重要的规范需要了解(否则生成不了代码哦):
api层的接口定义文件路径需要满足/api/模块/版本/定义文件.go,例如:/api/user/v1/user.go、/api/user/v1/user_delete.go、etc.
这里的模块指的是API的模块划分,我们可以将API按照不同的业务属性进行拆分方便聚合维护。你也可以将模块认为是具体的业务资源。
这里的版本通常使用v1/v2..这样的形式来定义,用以API兼容性的版本控制。当相同的API出现兼容性更新时,需要通过不同版本号来区分。默认使用v1来管理第一个版本。
这里的定义文件指的是API的输入输出定义文件,通常每个API需要单独定义一个go文件来独立维护。当然也支持将多个API放到一个go文件中统一维护。
api定义的结构体名称需要满足操作+Req及操作+Res的命名方式。例如:GetOneReq/GetOneRes、GetListReq/GetListRes、DeleteReq/DeleteRes、etc.
这里的操作是当前API模块的操作名称,通常对应CURD是:Create、Update、GetList/GetOne、Delete。
接口规范-gen ctrl - GoFrame (ZH)-Latest - GoFrame官网 - 类似PHP-Laravel, Java-SpringBoot的Go企业级开发框架
模仿官方的写法,在api包下分别创建admin,article,tags包,例如: /api/admin/v1/
更具体的代码可以参考官方文档给出的示例项目:GitHub - gogf/gf-demo-user: A simple user API service.
官方示例项目下载:
git clone https://github.com/gogf/gf-demo-user
使用gen命令生成代码
按照官方文档的指示,在编写完api包下所需的代码后,在项目根目录执行
gf gen ctrl
成功后controller包如下
其中hello是用init创建项目时自动生成的示例代码,这里由于需要参考代码如何实现,并未删除
在cmd中注册路由
这一部分由于个人不是很清楚原理,因此只得依样画葫芦,有错误的地方请指出。并留下todo待以后修改
var (
Main = gcmd.Command{
Name: "main",
Usage: "main",
Brief: "start http server",
Func: func(ctx context.Context, parser *gcmd.Parser) (err error) {
s := g.Server()
s.Group("/", func(group *ghttp.RouterGroup) {
group.Middleware(ghttp.MiddlewareHandlerResponse)
group.Bind(
admin.NewV1(),
)
group.Group("/admin", func(group *ghttp.RouterGroup) {
group.Bind(
admin.NewV1(),
)
})
group.Group("/article", func(group *ghttp.RouterGroup) {
group.Bind(
article.NewV1(),
)
})
group.Group("/tags", func(group *ghttp.RouterGroup) {
group.Bind(
tags.NewV1(),
)
})
})
s.Run()
return nil
},
}
)
其中group.Bind中的方法均在controller包中,由上一步的gf gen ctrl命令生成。
编写controller层
controller层用于接收参数,由logic层实现业务逻辑,再由controller层返回。