goframe开发学习(一)基础流程开发一个API
- Published on
- Authors
- Name
- Wxm
我是一名普普通通的前端程序员,并没有进过大厂工作,也不太了解各种设计模式,之前只用过flask,或者一些serverless的项目做一些简单的后端程序。第一次使用goframe的我其实也是有点一头雾水,看什么设计模式云里雾里,不过摸索了一阵子后,发现里面确实有很多设计方面的思想,不一定能用上,但是了解了也是很有帮助的(比如面试哈哈😂),总是学习是让人快乐的!
下面直接进入主题,我会用最精炼的步骤来开发,如果我的学习分享能给你帮助或者有任何问题,都欢迎留言或邮件联系我。
开发准备
安装goframe
初始化项目设置
开发流程!重要 gf-v2.5
- 设计数据库
- 设置(dao,数据库等)
- 在main.go中加入一行 _ "github.com/gogf/gf/contrib/drivers/mysql/v2" (如果你使用的是mysql;只需写一次)
- gf gen dao 生成对应的 dao/do/model
- 编写api层:定义业务侧数据结构,提供对外接口的输入/输出数据结构
- gf gen ctrl 生成对应的 controller
- 编写model层:定义数据侧数据结构,提供对内的数据处理的输入/输出数据结构
- 编写logic层,自动生成service层代码
- 在main.go中 加入一行 _ "project-name/internal/logic" (只需写一次)
- gf gen service 生成对应的 service
- 编写controller层,接收/解析用户输入的参数,调用service层的服务
- 在cmd.go中注册路由
详细
然后是分别详解对应步骤,我只会把和goframe相关的写出来,像数据库设计这种,请自己找资料学习。
1.设计数据库
注意:
- 给需要的表添加
`created_at` datetime DEFAULT NULL COMMENT '创建时间', `updated_at` datetime DEFAULT NULL COMMENT '修改时间', `deleted_at` datetime DEFAULT NULL COMMENT '删除时间',
- 官方参考
4.编写api
注意:
- 使用指针类型的属性参数,用于实现:当传递该参数时执行修改,不传递时不修改。(具体可以看官方参考)
主要参考文档:
// MARK:你好 顺便获取全部管理员
// 收到的请求request的格式
type Admin_HelloReq struct {
g.Meta `path:"/jkmap/admin/_hello" tags:"Admin" method:"get" summary:"🌟 Hello 拿来吧你全部admin"`
}
// 返回的response格式
type Admin_HelloRes struct {
Hello string `json:"hello" dc:"你好世界"`
AdminList *[]model.AdminAll `json:"admin_list" dc:"拿来吧你"`
}
6.编写model
其实就是各种数据类型都可以放在这里,一般是input output的数据类型。
//有没有发现 其实API中也是这么写的,所以model其实也可以用于API编写中
//
type AdminAll struct {
Admin_id int `json:"admin_id"`
Role_id int `json:"role_id"`
Name string `json:"name"`
Password string `json:"password"`
Salt string `json:"salt"`
Status string `json:"status"`
Nick_name string `json:"nick_name"`
Email string `json:"email"`
Phonenumber string `json:"phonenumber"`
Sex string `json:"sex"`
Avatar string `json:"avatar"`
Login_ip string `json:"login_ip"`
Login_date *gtime.Time `json:"login_date"`
Remark string `json:"remark"`
Created_at *gtime.Time `json:"created_at"`
Updated_at *gtime.Time `json:"updated_at"`
Deleted_at *gtime.Time `json:"deleted_at"`
}
type AdminGetAllOutput struct {
AdminAllList []AdminAll `json:"list"`
}
7.编写logic
这个我在一开始使用的时候其实很困惑,为啥要弄这个,直接在controller里把这些逻辑都写在一起不就好了,不过文档中说明是在面对复杂项目上,用于封装业务。可能是我的项目太简单了吧🦉(汗...
在看过官方示例后可以可以模仿来写。
// /logic/jkmap_admin/admin.go
//记得加上init 和new方法,每个logic都需要
type sAdmin struct{}
func init() {
service.RegisterAdmin(New())
}
func New() *sAdmin {
return &sAdmin{}
}
// Hello 获得所有方法
func (s *sAdmin) GetAll(ctx context.Context) (out *model.AdminGetAllOutput, err error) {
l := dao.JkAdmin.Ctx(ctx)
//实例化响应结构体
out = &model.AdminGetAllOutput{AdminAllList: nil}
err = l.Where(1 > 0).Scan(&out.AdminAllList)
return
}
9.编写controller
在这里调用你在logic中写的业务方法,来实现接口。
10.在cmd中绑定接口
//像这样在 cmd.go 文件中绑定你生成的controller
group.Bind(
//hello.NewV1(),
jkmap_admin.NewV1(),
//jkmap_mp.NewV1(),
)
然后执行gf run main.go
是不是看到自己的接口啦~
小结
现在只是写了基本的用法,以后也会慢慢用也会写一些更具体的用法,一些细节之类的。