时长一周的golang萌新学习go-zero --- 进度二

744 阅读3分钟

本文已参与「新人创作礼」活动, 一起开启掘金创作之路。

睡之前;还是先写一写一篇技术文章。昨天我们才刚刚把初模版搭建好。接下来就是配置yaml文件;注册服务等等。直接开始吧!

打开我们的配置文件:在项目下:etc/user-api.yaml

yaml.jpg

这里面的配置文件很重要后面;一些的重要的配置文件都会写在里面,记住上传git的时候把这玩意配置成不提交的文件。 接下来就是开始我们的骚操作,填写好了后开始 根据go-zero提供的模版一键生成的curd的代码,这个是基于sqlx的。前几天我看到一个大佬把这个模版改为基于gorm的;但是要改goctl的模版文件哦;我新兵蛋子不会改,先学学最原始的吧。

开始表演骚操作
  1. 老规矩把终端命令切换到 go-zero-demo目录下;创建一个model目录。
  2. $ goctl model mysql ddl -src="./*.sql" -dir="./sql/model" -c这是官方大大的给的例子。我们来实操吧
  3. goctl model mysql datasource -url="数据库名:密码@tcp(IP地址:端口)/数据库名" -table="数据表" -dir="生成目录下" -cache=true --style=goZero
  4. 这里的生成目录:./model 会生成几个文件;生成好了我们检查一遍没有问题直接拖进去user-api目录下。
  5. 我这脸不想去生成;麻烦我的数据库是线上的不想玩本地,懒的去弄;有问题可以在评论区留言;我们来 battery。
  6. 好了表演结束;开始了我们的无聊的写代码时刻了。
🥱的写代码时刻到了

现在我们的curd的基本操作已经自动生成了;来我们开始调试。。。

  1. 首先先去etc/user-api.yaml配置文件中数据库加载进 internal/config/config.go中去。
  2. User的数据表模型加载项目中;(这里加载svc中;这玩意很重要。很多中间件都会从这儿加载进去)
  3. 最后一步就是开始我们调用 CURD的方法了。然后快乐就这么没了。

来来一步步来。

package config

import "github.com/zeromicro/go-zero/rest"

type Config struct {
   rest.RestConf
   Auth struct {
      AccessSecret string
      AccessExpire int64
   }
   DB struct {
      DataSource string
   }    // 这里就是在 yaml 文件写的数据库配置。我这边只是写了一个很简单的配置。复杂的配置;可以直接去追踪svc创建连接时 看源码,可选参数的。
}

然后就是在 svc的配置。

package svc

import (
   "github.com/zeromicro/go-zero/core/stores/sqlx"
   "user-api/internal/config"
)

type ServiceContext struct {
   Config    config.Config
   UserModel model.UserModel // 我这边还没有生成出来;所以报错的
}

func NewServiceContext(c config.Config) *ServiceContext {
   return &ServiceContext{
      Config:    c,
      UserModel: model(NewUserModel(sqlx.NewMysql(c.DB.DataSource))), // 我这边还没有生成出来;所以报错的
   }
}

// 注意 model的包引用啊;我这边没有生成

最后一步;就是开始在 hanler去调用放curd的方法了。也许萌新找不到 对应的接口的 handler不知道是哪一个;很简单直接在路由文件 去追踪方法快速找到(开发还是用Goland工具;一个后端仔🔧好用程度决定工作效率)。 关于通过路由追踪方法:这里要跳2次;第一次跳到是注册的hanlder的目录下;这里不是写业务地方;这是goctl的自动生成的文件(这里具体是干什么我还没有研究🧐;我估计是检验参数是否必选传递那些;) 真正的业务代码是在logic目录;goctl很贴心在我们要写业务地方用TDO 标识了

package user

import (
   "context"

   "user-api/internal/svc"
   "user-api/internal/types"

   "github.com/zeromicro/go-zero/core/logx"
)

type DetailLogic struct {
   logx.Logger
   ctx    context.Context
   svcCtx *svc.ServiceContext
}

func NewDetailLogic(ctx context.Context, svcCtx *svc.ServiceContext) *DetailLogic {
   return &DetailLogic{
      Logger: logx.WithContext(ctx),
      ctx:    ctx,
      svcCtx: svcCtx,
   }
}

func (l *DetailLogic) Detail(req *types.DetailReq) (resp *types.DetailRep, err error) {
   // todo: add your logic here and delete this line
   user, err := l.svcCtx.UserModel.FindOne(req.Id)

   if err != nil {
      return nil, err
   }
   if user == nil {
      return nil, err
   }
   // 返回数据;
   return
}

没了,下期间;我要睡了-----早睡早起。溜了溜了