描述图片

goframe开发学习(一)基础流程开发一个API

Published on
Authors
  • Name
    Wxm
    Twitter

我是一名普普通通的前端程序员,并没有进过大厂工作,也不太了解各种设计模式,之前只用过flask,或者一些serverless的项目做一些简单的后端程序。第一次使用goframe的我其实也是有点一头雾水,看什么设计模式云里雾里,不过摸索了一阵子后,发现里面确实有很多设计方面的思想,不一定能用上,但是了解了也是很有帮助的(比如面试哈哈😂),总是学习是让人快乐的!

下面直接进入主题,我会用最精炼的步骤来开发,如果我的学习分享能给你帮助或者有任何问题,都欢迎留言或邮件联系我。

开发准备

安装goframe

初始化项目设置

开发流程!重要 gf-v2.5

  1. 设计数据库
  2. 设置(dao,数据库等)
    • 在main.go中加入一行 _ "github.com/gogf/gf/contrib/drivers/mysql/v2" (如果你使用的是mysql;只需写一次)
  3. gf gen dao 生成对应的 dao/do/model
  4. 编写api层:定义业务侧数据结构,提供对外接口的输入/输出数据结构
  5. gf gen ctrl 生成对应的 controller
  6. 编写model层:定义数据侧数据结构,提供对内的数据处理的输入/输出数据结构
  7. 编写logic层,自动生成service层代码
    • 在main.go中 加入一行 _ "project-name/internal/logic" (只需写一次)
  8. gf gen service 生成对应的 service
  9. 编写controller层,接收/解析用户输入的参数,调用service层的服务
  10. 在cmd.go中注册路由

详细

然后是分别详解对应步骤,我只会把和goframe相关的写出来,像数据库设计这种,请自己找资料学习。

1.设计数据库

注意:

  1. 给需要的表添加
    `created_at` datetime DEFAULT NULL COMMENT '创建时间',
    `updated_at` datetime DEFAULT NULL COMMENT '修改时间',
    `deleted_at` datetime DEFAULT NULL COMMENT '删除时间',
    
  2. 官方参考

4.编写api

注意:

  1. 使用指针类型的属性参数,用于实现:当传递该参数时执行修改,不传递时不修改。(具体可以看官方参考)

主要参考文档:

  1. g.Meta使用
  2. 官方文档编写规范
// 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 是不是看到自己的接口啦~

小结

现在只是写了基本的用法,以后也会慢慢用也会写一些更具体的用法,一些细节之类的。

0:00/0:00

植松伸夫 - フィナーレ

植松伸夫 - プレリュード

笹井隆司 - 異郷の町

伊藤賢治 - Rising Sun

植松伸夫 - 街のテーマ

植松伸夫 - 怒闘

植松伸夫 - コーネリア城

植松伸夫 - チョコボのテーマ