最近想做一个微信小程序,会涉及到后端接口,那么选什么好呢?用Gin、Beego吗?最后思来想去,还是选择了go-zero
,主要是因为它开发起来相对简单一些。
安装goctl 我的开发环境是Windows 10,那么先进入到powershell
,先设置代理:
1 2 $env:GO111MODULE="on" $env:GOPROXY = "https://goproxy.cn"
然后执行安装命令go install github.com/zeromicro/go-zero/tools/goctl@latest
,安装完后,执行goctl
便可看到如下命令提示
新建项目 我们跟着官网,创建所需项目,
1 mkdir wedding && cd wedding && go mod init wedding && goctl api new wedding && go mod tidy
至此,项目便初始化完成。
从数据生成模型 goctl命令直接可以连接数据库生成相应的表model,并生成简单的CRUD代码,官方的用法
1 goctl model mysql datasource -url="user:password@tcp(127.0.0.1:3306)/database" -table="*" -dir="./model"
直接带上实际的环境参数即可生成
编写api文件,生成api代码 在项目初始化时,命令工具会为我们生成一个*.api
的文件,同时,也会生成一个接口模版
我们安装这个模版进行编码
api
文件编写好后,便可通过goctl
生成代码了,
1 goctl api go -api wedding.api -dir .
关于api描述文件的语法格式,可以去go-zero
官网了解一下,这里暂不赘述
编写业务逻辑 go-zero
为我们生成好了基础代码,现在,我们只需要把这些代码稍作调整,将其组装起来便可使用了。
配置数据库连接 首先,我们去wedding-api.yaml
配置数据库信息
然后到Config.go
去配置连接属性
1 2 3 Mysql struct{ DataSource string }
继续到servicecontext.go
进行依赖关联
这里的model是*model.go里面的接口 接下来,就是去loginlogic.go
完成具体的逻辑了,因为我这里只是一条简单的数据查询,不需要有过多的逻辑,但是,goctl
默认生成的代码中,也无法满足我的要求,那么,便只有修改一下原有逻辑,或者重新写个查询方法,这里,我是另外写了一个查询方法
1 2 3 4 5 6 7 8 9 10 11 12 13 func (m *defaultWeddingInfoModel) FindFirst(ctx context.Context) (*WeddingInfo, error) { query := fmt.Sprintf("select %s from %s limit 1", weddingInfoRows, m.table) var resp WeddingInfo err := m.conn.QueryRowCtx(ctx, &resp, query) switch err { case nil: return &resp, nil case sqlc.ErrNotFound: return nil, ErrNotFound default: return nil, err } }
进入到logic
文件夹里找到对应的实现业务逻辑的
go文件,添加业务逻辑
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 func (l *WeddingInfoLogic) WeddingInfo() (resp *types.WeddingInfoResponse, err error) { // todo: add your logic here and delete this line weddingInfo, e := l.svcCtx.WeddingInfo.FindFirst(l.ctx) if e != nil { return nil, e } return &types.WeddingInfoResponse{ Lat: weddingInfo.Lat, Lng: weddingInfo.Lng, Address: weddingInfo.Address, Hotel: weddingInfo.Hotel, Man: weddingInfo.Man, Woman: weddingInfo.Woman, BgUrl: weddingInfo.BgUrl, MusicUrl: weddingInfo.MusicUrl, Date: weddingInfo.Date, DateDesc: weddingInfo.DateDesc, }, nil }
取数逻辑简单的调整了一下,接下来便启动起来看看效果
访问一下接口,这里的接口路径可以到routes.go
进行查看
上面是返回单条数据,我们再来模拟多条数据返回
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 photosmodel_gen.go func (m *defaultPhotosModel) FindList(ctx context.Context) ([]Photos, error) { query := fmt.Sprintf("select %s from %s ", photosRows, m.table) var resp []Photos err := m.conn.QueryRowsCtx(ctx, &resp, query) switch err { case nil: return resp, nil case sqlc.ErrNotFound: return nil, ErrNotFound default: return nil, err } } photologic.go func (l *PhotoLogic) Photo() (resp []types.PhotoResponse, err error) { // todo: add your logic here and delete this line photos, e := l.svcCtx.Photo.FindList(l.ctx) if e != nil { return nil, e } response := make([]types.PhotoResponse, len(photos)) for index := 0; index < len(photos); index++ { item := photos[index] response[index] = types.PhotoResponse{ ImgUrl: item.ImgUrl, } } return response, nil }