当前位置: 首页 > news >正文

什么网站发布找做效果图的seo 工具

什么网站发布找做效果图的,seo 工具,中国制造网一级类目,烟台网站制作公司在线咨询前言 上一篇文章带你实现了Go-Zero和goctl:解锁微服务开发的神器,快速上手指南,本文将继续深入探讨Go-Zero的强大之处,并介绍如何使用goctl工具实现模板定制化,并根据实际项目业务需求进行模板定制化实现。 通过本文…

前言

上一篇文章带你实现了Go-Zero和goctl:解锁微服务开发的神器,快速上手指南,本文将继续深入探讨Go-Zero的强大之处,并介绍如何使用goctl工具实现模板定制化,并根据实际项目业务需求进行模板定制化实现。

通过本文的教程,你能够亲自实践并完成goctl模板的定制化,进一步提升你的Go-Zero开发技能。

概述

goctl 代码生成是基于 go 的模板去实现数据驱动的,默认情况会选择内存中的模板进行生成,当开发需要修改模板时,就需要定制化模板,goctl为我们实现了这一功能。

实战前准备

首先需要你在本地安装goctl、protoc、go-zero,下载教学和地址点击这里,按照教程操作即可,非常简单。

下面按顺序和我操作吧,对整体开发流程不清楚的同学务必先看我前篇文章:GoZero的开发技巧 & 整体开发流程

本文重在实战,如果对goctl毫不了解的话,建议先看我前一篇文章:Go-Zero和goctl:解锁微服务开发的神器,快速上手指南

以下均以我的商业项目举例,应该对你有启发:

(后面我会把商业项目脱敏开源出来,欢迎关注我)

数据表生成Model方法脚本

首先在deploy下新增script目录,结构如下图所示。

脚本内容如下:

#!/usr/bin/env bash# 使用方法:
# ./genModel.sh lottery lottery
# ./genModel.sh lottery prize
# 再将./genModel下的文件剪切到对应服务的model目录里面,记得改package#生成的表名
tables=$2
#表生成的genmodel目录
modeldir=./genModel# 数据库配置
host=127.0.0.1
port=33069
dbname=$1
username=root
passwd=PXDN93VRKUm8TeE7
template=../../goctl/1.6.1echo "开始创建库:$dbname 的表:$2"
goctl model mysql datasource -url="${username}:${passwd}@tcp(${host}:${port})/${dbname}" -table="${tables}" -dir="${modeldir}" -cache=true --home="${template}" --style=goZero

模板定制化使用方法

相关命令使用详情,参考:官网文档
具体使用方法网上有很多文章介绍,官网也有详细步骤。这里更加注重商业项目对于模板定制化的实战,对相关操作不进行赘述,快速过一遍流程即可。

初始化模板到本地

依据前文所介绍的项目目录结构,我们将自定义模板放在deploy下面即可,并且采用的版本号为1.6.1(目录路径根据自己实际情况修改)

goctl template init --home $HOME/Desktop/lottery-backend/deploy/goctl/1.6.1

注意:如果不指定–home 他会初始化到$HOME/.goctl

这样就生成好自己版本的goctl模板啦,可以根据自己的实际需求进行模板的修改。

接下来分享我们项目中关于自定义goctl的实战。

自定义goctl实战

实战1:Model层方法定制化

很多时候我们需要对数据进行分页查询。这个方法是一个通用的方法,可以在很多地方复用,所以放入模板去生成,这样可以减少重复代码,提高开发效率。

步骤一:在model/update.tpl下面新增一个方法FindPageListByPage

方法具体实现如下

func (m *default{{.upperStartCamelObject}}Model) FindPageListByPage(ctx context.Context,builder squirrel.SelectBuilder,page ,pageSize int64,orderBy string) ([]*{{.upperStartCamelObject}},error) {builder = builder.Columns({{.lowerStartCamelObject}}Rows)if orderBy == ""{builder = builder.OrderBy("id DESC")}else{builder = builder.OrderBy(orderBy)}if page < 1{page = 1}offset := (page - 1) * pageSizequery, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql()if err != nil {return nil, err}var resp []*{{.upperStartCamelObject}}{{if .withCache}}err = m.QueryRowsNoCacheCtx(ctx,&resp, query, values...){{else}}err = m.conn.QueryRowsCtx(ctx,&resp, query, values...){{end}}switch err {case nil:return resp, nildefault:return nil, err}
}

步骤二:使用之前做好的脚本生成代码

使用GitBash打开deploy/script/mysql目录,执行脚本

此时genModel目录下面就会生成相关代码

步骤三:将生成的代码剪切到项目目录的对应位置

效果

默认模板生成的Model层方法

自定义模板生成的Model层方法

生成的FindPageListByPage方法

func (m *defaultLotteryModel) FindPageListByPage(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*Lottery, error) {builder = builder.Columns(lotteryRows)if orderBy == "" {builder = builder.OrderBy("id DESC")} else {builder = builder.OrderBy(orderBy)}if page < 1 {page = 1}offset := (page - 1) * pageSizequery, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql()if err != nil {return nil, err}var resp []*Lotteryerr = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...)switch err {case nil:return resp, nildefault:return nil, err}
}

实战2:api自定义响应返回以及集成validator库校验参数

当我们希望自定义统一返回响应体以及希望每个api接口都进行参数校验时,我们可以在模板中修改handler层的代码,从而实现这些效果。

步骤一:实现自定义统一返回响应

在common目录下新建result目录和httpResult.go文件,如下图所示

具体实现代码不是本文重点,下面是提供的代码

package resultimport ("fmt""net/http""looklook/common/xerr""github.com/pkg/errors""github.com/zeromicro/go-zero/core/logx""github.com/zeromicro/go-zero/rest/httpx""google.golang.org/grpc/status"
)// http返回
func HttpResult(r *http.Request, w http.ResponseWriter, resp interface{}, err error) {if err == nil {//成功返回r := Success(resp)httpx.WriteJson(w, http.StatusOK, r)} else {//错误返回errcode := xerr.SERVER_COMMON_ERRORerrmsg := "服务器开小差啦,稍后再来试一试"causeErr := errors.Cause(err)                // err类型if e, ok := causeErr.(*xerr.CodeError); ok { //自定义错误类型//自定义CodeErrorerrcode = e.GetErrCode()errmsg = e.GetErrMsg()} else {if gstatus, ok := status.FromError(causeErr); ok { // grpc err错误grpcCode := uint32(gstatus.Code())if xerr.IsCodeErr(grpcCode) { //区分自定义错误跟系统底层、db等错误,底层、db错误不能返回给前端errcode = grpcCodeerrmsg = gstatus.Message()}}}logx.WithContext(r.Context()).Errorf("【API-ERR】 : %+v ", err)httpx.WriteJson(w, http.StatusBadRequest, Error(errcode, errmsg))}
}// http 参数错误返回
func ParamErrorResult(r *http.Request, w http.ResponseWriter, err error) {errMsg := fmt.Sprintf("%s ,%s", xerr.MapErrMsg(xerr.REUQEST_PARAM_ERROR), err.Error())httpx.WriteJson(w, http.StatusBadRequest, Error(xerr.REUQEST_PARAM_ERROR, errMsg))
}

步骤二:在handler下面引入定制的validator包

关于定制validator也不是本文重点,感兴趣的同学可以关注我,留言。

package translatorimport ("errors""github.com/go-playground/locales/zh"ut "github.com/go-playground/universal-translator""github.com/go-playground/validator/v10"zh_translations "github.com/go-playground/validator/v10/translations/zh""looklook/app/lottery/cmd/api/internal/logic/lottery""looklook/app/lottery/cmd/api/internal/types""reflect""strings"
)func Validate(dataStruct interface{}) error {zh_ch := zh.New()validate := validator.New()// 注册一个函数,获取struct tag里自定义的label作为字段名validate.RegisterTagNameFunc(func(fld reflect.StructField) string {name := strings.SplitN(fld.Tag.Get("json"), ",", 2)[0]if name == "-" {return ""}return name})// 在这里注册自定义结构体/字段校验方法// 注册自定义结构体校验方法validate.RegisterStructValidation(lottery.SignUpParamStructLevelValidation, types.TestReq{})// 注册自定义结构体字段校验方法if err := validate.RegisterValidation("checkDate", lottery.CheckDate); err != nil {return err}uni := ut.New(zh_ch)trans, _ := uni.GetTranslator("zh")// 在这里注册自定义tag翻译// 注意!因为这里会使用到trans实例// 所以这一步注册要放到trans初始化的后面if err := validate.RegisterTranslation("checkDate",trans,registerTranslator("checkDate", "{0}必须要晚于当前日期"),translate,); err != nil {return err}// 验证器注册翻译器zh_translations.RegisterDefaultTranslations(validate, trans)err := validate.Struct(dataStruct)if err != nil {for _, err := range err.(validator.ValidationErrors) {return errors.New(err.Translate(trans))}}return nil
}// registerTranslator 为自定义字段添加翻译功能
func registerTranslator(tag string, msg string) validator.RegisterTranslationsFunc {return func(trans ut.Translator) error {if err := trans.Add(tag, msg, false); err != nil {return err}return nil}
}// translate 自定义字段的翻译方法
func translate(trans ut.Translator, fe validator.FieldError) string {msg, err := trans.T(fe.Tag(), fe.Field())if err != nil {panic(fe.(error).Error())}return msg
}

步骤三:修改handler.tpl模板代码

将模板替换为以下内容

package {{.PkgName}}import ("net/http""looklook/common/result""github.com/zeromicro/go-zero/rest/httpx"{{.ImportPackages}}
)func {{.HandlerName}}(svcCtx *svc.ServiceContext) http.HandlerFunc {return func(w http.ResponseWriter, r *http.Request) {{{if .HasRequest}}var req types.{{.RequestType}}if err := httpx.Parse(r, &req); err != nil {httpx.ErrorCtx(r.Context(), w, err)return}validateErr := translator.Validate(&req)if validateErr != nil {result.ParamErrorResult(r, w, validateErr)return}{{end}}l := {{.LogicName}}.New{{.LogicType}}(r.Context(), svcCtx){{if .HasResp}}resp, {{end}}err := l.{{.Call}}({{if .HasRequest}}&req{{end}})result.HttpResult(r, w, {{if .HasResp}}resp{{else}}nil{{end}}, err)}
}

步骤四:生成对应的代码

注意生成handler后需要手动点开生成的handler文件,导入translator包,否则服务会报错!!!

# 使用自定义的goctl 生成api
goctl api go -api main.api -dir ../  --style=goZero --home=../../../../../deploy/goctl/1.6.1

修改后的响应体

{"code": 200,"msg": "OK","data": {"message": ""}
}

模板自定义规则

  1. 在 goctl 提供的有效数据范围内修改,即不支持外部变量
  2. 不支持新增模板文件
  3. 不支持变量修改

总结

本文介绍了如何使用Go-Zero的goctl工具进行自定义模板的实战,并提供了一个具体的案例来演示定制化模板的过程。

如果你需要详细的命令使用详情,可以参考官方文档中的相关内容。模板定制化 | go-zero Documentation

我将继续更新Go-Zero系列文章,如果你对Go语言或者微服务感兴趣,欢迎关注我,也欢迎直接私信我。

gozero&微服务交流群

我将继续更新Go-Zero系列文章,如果你对Go语言或者微服务感兴趣,欢迎关注我,也欢迎直接私信我。

微信:wangzhongyang1993


文章转载自:
http://regrettably.jqLx.cn
http://instrumentalism.jqLx.cn
http://ruggedness.jqLx.cn
http://tavern.jqLx.cn
http://erastus.jqLx.cn
http://doorframe.jqLx.cn
http://warily.jqLx.cn
http://cab.jqLx.cn
http://keynes.jqLx.cn
http://talaria.jqLx.cn
http://hadramaut.jqLx.cn
http://varisized.jqLx.cn
http://promorphology.jqLx.cn
http://saanen.jqLx.cn
http://pancreozymin.jqLx.cn
http://diageotropism.jqLx.cn
http://piptonychia.jqLx.cn
http://editorially.jqLx.cn
http://wtp.jqLx.cn
http://volubile.jqLx.cn
http://eggbeater.jqLx.cn
http://solicitor.jqLx.cn
http://sazan.jqLx.cn
http://nonobservance.jqLx.cn
http://enwind.jqLx.cn
http://dissentious.jqLx.cn
http://ganoin.jqLx.cn
http://carom.jqLx.cn
http://splicer.jqLx.cn
http://wilsonian.jqLx.cn
http://perchlorinate.jqLx.cn
http://simply.jqLx.cn
http://shinny.jqLx.cn
http://rama.jqLx.cn
http://serialize.jqLx.cn
http://cordis.jqLx.cn
http://holytide.jqLx.cn
http://lighthouseman.jqLx.cn
http://hemline.jqLx.cn
http://catbrier.jqLx.cn
http://mil.jqLx.cn
http://smirnoff.jqLx.cn
http://vanadium.jqLx.cn
http://mandir.jqLx.cn
http://mineralogy.jqLx.cn
http://pomposo.jqLx.cn
http://lunabase.jqLx.cn
http://contrasty.jqLx.cn
http://infield.jqLx.cn
http://tympanoplasty.jqLx.cn
http://inchoative.jqLx.cn
http://reverse.jqLx.cn
http://cymbeline.jqLx.cn
http://kinetosome.jqLx.cn
http://marlpit.jqLx.cn
http://bridget.jqLx.cn
http://helium.jqLx.cn
http://apollinian.jqLx.cn
http://uplifted.jqLx.cn
http://caress.jqLx.cn
http://spiritualism.jqLx.cn
http://queasily.jqLx.cn
http://tung.jqLx.cn
http://inofficial.jqLx.cn
http://statesman.jqLx.cn
http://politicize.jqLx.cn
http://exode.jqLx.cn
http://biocompatible.jqLx.cn
http://jap.jqLx.cn
http://affirmance.jqLx.cn
http://substitutional.jqLx.cn
http://bathrobe.jqLx.cn
http://pecky.jqLx.cn
http://archaic.jqLx.cn
http://fadeless.jqLx.cn
http://ministration.jqLx.cn
http://nongovernment.jqLx.cn
http://mountainous.jqLx.cn
http://numb.jqLx.cn
http://salability.jqLx.cn
http://somatosensory.jqLx.cn
http://kickback.jqLx.cn
http://fidicinales.jqLx.cn
http://ergate.jqLx.cn
http://fulling.jqLx.cn
http://vic.jqLx.cn
http://misapprehensive.jqLx.cn
http://numerical.jqLx.cn
http://airwaves.jqLx.cn
http://haberdash.jqLx.cn
http://prattler.jqLx.cn
http://reductase.jqLx.cn
http://inconvertibility.jqLx.cn
http://atrament.jqLx.cn
http://chiton.jqLx.cn
http://osteria.jqLx.cn
http://gate.jqLx.cn
http://subpena.jqLx.cn
http://ragworm.jqLx.cn
http://deify.jqLx.cn
http://www.hrbkazy.com/news/80872.html

相关文章:

  • 主做熟人推荐的招聘网站爱链
  • 微信人生里面微网站怎么做免费的网站软件
  • 番禺做网站哪家好培训seo去哪家机构最好
  • 中英文双版网站怎么做近期的新闻热点
  • 佛山建站公司模板国际形势最新消息
  • 浙江省电子商务网站建设双11各大电商平台销售数据
  • 08影院 WordPress模板重庆seo网络优化师
  • 深圳做网站开发费用内容营销平台有哪些
  • 网站建设期末作业互联网营销
  • 广州制作网站报价郑州seo外包平台
  • cvm可以做网站服务器吗陕西seo排名
  • 做网站费用 会计分录浙江百度查关键词排名
  • 网站怎么做组织图seo什么意思
  • 海阳网站建设今日国际新闻最新消息
  • 免费微信分销系统新十条优化措施
  • 购物网站的功能怎么样建网站
  • 长沙水业网站是哪家公司做的成人技能培训班有哪些
  • 做url网站麒麟seo
  • 利用劫持的网站做seo代发关键词包收录
  • 专业网站开发建设360网站收录
  • 网站开发合同适用印花税网站网络推广
  • 关于手机的网站有哪些内容免费个人博客网站
  • wordpress 文章背景透明山东搜索引擎优化
  • 网站搭建修改收费依据杭州网站排名seo
  • 实现网站开发百度收录官网
  • abc公司电子商务网站建设策划书怎么查询搜索关键词
  • 下载一个网站企业网络规划设计方案
  • 凯里市企业建站公司郑州网络推广公司排名
  • 常州哪里做网站拼多多关键词排名在哪里看
  • wordpress 歌词 插件seo网站优化多少钱