Published on

goframe的使用

Authors

环境要求

  • go 语言环境
  • git版本管理

新建项目

1. 安装gf cli工具

git clone https://github.com/gogf/gf && cd gf/cmd/gf && go install

执行gf -v有下列打印信息,表示安装成功。

v2.6.1
  Welcome to GoFrame!
  Env Detail:
    Go Version: go1.21.5 windows/amd64
    GF Version(go.mod):
      github.com/gogf/gf/contrib/drivers/mysql/v2@v2.6.1
      github.com/gogf/gf/v2@v2.6.1
  CLI Detail:
    Installed At: C:\Users\tianjiang\go\bin\gf.exe
    Built Go Version: go1.21.5
    Built GF Version: v2.6.1
  Others Detail:
    Docs: https://goframe.org
    Now : 2023-12-29T10:26:34+08:00

2. 创建项目

创建一个名为 demo 的项目

gf init demo -u

启动项目

gf run main.go

接入数据库

manifest/config/config.yaml 写入数据库配置

database:
  logger:
    level: "all"
    stdout: true

  default:
    link: "mysql:root:12345678@tcp(127.0.0.1:3306)/test"
    debug: true

在 main.go 导入mysql驱动

import	_ "github.com/gogf/gf/contrib/drivers/mysql/v2"

hack/config.yaml下加入如下配置:

gfcli:
  gen:
    dao:
      - link: "mysql:root:12345678@tcp(127.0.0.1:3306)/test

运行 gf gen dao,生成 entity dao do文件

编写API

例如写一个 user 的api:

api\user\v1 下 新建user.go

package v1

import (
	"github.com/gogf/gf/v2/frame/g"
)

type HelloReq struct {
	g.Meta `path:"/hello" tags:"Hello" method:"get" summary:"You first hello api"`
}
type HelloRes struct {
	g.Meta `mime:"text/html" example:"string"`
}

运行 gf gen ctrl, 在目录 api\user\user.go 会生成api的接口代码,在 internal\controller\user\user_new.go 被包装成函数,并在 internal\cmd\cmd.go 中被注册到路由。

  • 例子:

    func (c *ControllerV1) Hello(ctx context.Context, req *v1.HelloReq) (res *v1.HelloRes, err error) {
    
      g.RequestFromCtx(ctx).Response.WriteStatus(400) // 写入http status
      g.RequestFromCtx(ctx).Response.WriteJson(g.Array{ // 写入返回结果
        1, 23, 4, 5,
      })
    
      return
    }
    

    如果不用 res *v1.HelloRes 这个返回值,那么需要用 g.RequestFromCtx(ctx).Response.Write() 显性的写返回值,返回结构也是自定义的。

    如果使用填充res返回结构,则会被默认中间件接管,返回统一的结构。

    {
      "message": xxx
      "code": xxx
      "data": xxx
    }
    

业务编写

按文档的设计,需要将逻辑写到 internal\logic 里,实现 internal\service 里的接口, 我的业务简单,就将所有业务直接写到service包里。

  • internal\model

    在这个包里创建user.go提供controllerservice交互的数据结构

    package model
    
    type UserInfoOutput struct {
      Nickname string
      // ... another more..
    }
    
    type UserSignInInput struct {
      Passport string
      Password string
    }
    

用户密码加密

使用 "golang.org/x/crypto/bcrypt" 保障密码的安全性,md5,sha1,sha256等都不安全