信用徐州网站建设情况谁做的四虎网站是多少

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

信用徐州网站建设情况,谁做的四虎网站是多少,wordpress自动加链接,wordpress免费图床插件前言 上一篇文章带你实现了Go-Zero和goctl#xff1a;解锁微服务开发的神器#xff0c;快速上手指南#xff0c;本文将继续深入探讨Go-Zero的强大之处#xff0c;并介绍如何使用goctl工具实现模板定制化#xff0c;并根据实际项目业务需求进行模板定制化实现。 通过本文…前言 上一篇文章带你实现了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# 数据库配置 host127.0.0.1 port33069 dbname\)1 usernameroot passwdPXDN93VRKUm8TeE7 template../../goctl/1.6.1echo 开始创建库\(dbname 的表\)2 goctl model mysql datasource -url\({username}:\){passwd}tcp(\({host}:\){port})/\({dbname} -table\){tables} -dir\({modeldir} -cachetrue --home\){template} –stylegoZero模板定制化使用方法 相关命令使用详情参考官网文档 具体使用方法网上有很多文章介绍官网也有详细步骤。这里更加注重商业项目对于模板定制化的实战对相关操作不进行赘述快速过一遍流程即可。 初始化模板到本地 依据前文所介绍的项目目录结构我们将自定义模板放在deploy下面即可并且采用的版本号为1.6.1目录路径根据自己实际情况修改 goctl template init –home \(HOME/Desktop/lottery-backend/deploy/goctl/1.6.1注意如果不指定–home 他会初始化到\)HOME/.goctl 这样就生成好自己版本的goctl模板啦可以根据自己的实际需求进行模板的修改。 接下来分享我们项目中关于自定义goctl的实战。 自定义goctl实战 实战1Model层方法定制化 很多时候我们需要对数据进行分页查询。这个方法是一个通用的方法可以在很多地方复用所以放入模板去生成这样可以减少重复代码提高开发效率。 步骤一在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} }实战2api自定义响应返回以及集成validator库校验参数 当我们希望自定义统一返回响应体以及希望每个api接口都进行参数校验时我们可以在模板中修改handler层的代码从而实现这些效果。 步骤一实现自定义统一返回响应 在common目录下新建result目录和httpResult.go文件如下图所示 具体实现代码不是本文重点下面是提供的代码 package resultimport (fmtnet/httplooklook/common/xerrgithub.com/pkg/errorsgithub.com/zeromicro/go-zero/core/logxgithub.com/zeromicro/go-zero/rest/httpxgoogle.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 (errorsgithub.com/go-playground/locales/zhut github.com/go-playground/universal-translatorgithub.com/go-playground/validator/v10zh_translations github.com/go-playground/validator/v10/translations/zhlooklook/app/lottery/cmd/api/internal/logic/lotterylooklook/app/lottery/cmd/api/internal/typesreflectstrings )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/httplooklook/common/resultgithub.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 ../ –stylegoZero –home../../../../../deploy/goctl/1.6.1修改后的响应体 {code: 200,msg: OK,data: {message: } }模板自定义规则 在 goctl 提供的有效数据范围内修改即不支持外部变量不支持新增模板文件不支持变量修改 总结 本文介绍了如何使用Go-Zero的goctl工具进行自定义模板的实战并提供了一个具体的案例来演示定制化模板的过程。 如果你需要详细的命令使用详情可以参考官方文档中的相关内容。模板定制化 | go-zero Documentation 我将继续更新Go-Zero系列文章如果你对Go语言或者微服务感兴趣欢迎关注我也欢迎直接私信我。 gozero微服务交流群 我将继续更新Go-Zero系列文章如果你对Go语言或者微服务感兴趣欢迎关注我也欢迎直接私信我。 微信wangzhongyang1993