本文已参与「新人创作礼」活动, 一起开启掘金创作之路。
睡之前;还是先写一写一篇技术文章。昨天我们才刚刚把初模版搭建好。接下来就是配置yaml文件;注册服务等等。直接开始吧!
打开我们的配置文件:在项目下:etc/user-api.yaml
这里面的配置文件很重要后面;一些的重要的配置文件都会写在里面,记住上传git的时候把这玩意配置成不提交的文件。
接下来就是开始我们的骚操作,填写好了后开始 根据go-zero提供的模版一键生成的curd的代码,这个是基于sqlx的。前几天我看到一个大佬把这个模版改为基于gorm的;但是要改goctl的模版文件哦;我新兵蛋子不会改,先学学最原始的吧。
开始表演骚操作
- 老规矩把终端命令切换到 go-zero-demo目录下;创建一个
model目录。 $ goctl model mysql ddl -src="./*.sql" -dir="./sql/model" -c这是官方大大的给的例子。我们来实操吧goctl model mysql datasource -url="数据库名:密码@tcp(IP地址:端口)/数据库名" -table="数据表" -dir="生成目录下" -cache=true --style=goZero- 这里的生成目录:
./model会生成几个文件;生成好了我们检查一遍没有问题直接拖进去user-api目录下。 - 我这脸不想去生成;麻烦我的数据库是线上的不想玩本地,懒的去弄;有问题可以在评论区留言;我们来 battery。
- 好了表演结束;开始了我们的无聊的写代码时刻了。
🥱的写代码时刻到了
现在我们的curd的基本操作已经自动生成了;来我们开始调试。。。
- 首先先去
etc/user-api.yaml配置文件中数据库加载进internal/config/config.go中去。 - 把
User的数据表模型加载项目中;(这里加载svc中;这玩意很重要。很多中间件都会从这儿加载进去) - 最后一步就是开始我们调用
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
}
没了,下期间;我要睡了-----早睡早起。溜了溜了