golang微服务框架中如何扩展go-zero使之支持html模板解析自动化
新建view/www/index.html
文件,内容如下
这是Index的内容
此时编译后即可得到如下内容
这是Head 这是Index的内容 这是footer
如何在模板中使用变量
在模板中直接使用 首先需要将变量暴露到模板中,这里我们使用到了
ExecuteTemplate
函数,该函数第三个参数即可以在模板里面访问的参数,比如如下代码,则在模板中可以访问Query了
data:=r.URI.Queryerr:=t.ExecuteTemplate(w,tplname,data)
新建view/www/arg.html
文件
{{define"www/arg.html"}}
arga={{.arga}}
argb={{.argb}}
{{end}}请求访问方式http://127.0.0.1:8888/www/arg.html?arga=123&argb=456
系统返回结果
arga=[123]argb=[456]
在嵌套模板中使用
在嵌套模板中使用需要将对象传入,方式是在模板名后加一个.
,如下 新建view/www/embd.html
文件
{{define"www/embd.html"}}没加点:{{template"www/arg.html"}}=======加点:{{template"www/arg.html".}}{{end}}
结果如下
没加点:
arga=
argb=
=======加点:arga=[123]
argb=[456]
如何实现模板热更新
假设我们的应用支持开发模式和生产模式,在生产模式下,由于有性能考虑,系统不需要每次访问都解析模板。而在开发模式下,每个模板有所任何小的修改,我们都希望模板能自动更新,怎么实现这个功能呢? 方案很多,有文件监听方案,如github.com/fsnotify/fsnotify
监听模板目录,也有标记位方案,无论模板有没有变动,只要是开发模式,每次请求都重新加载模板并解析,gin
就是这种方案,本文也采用这种方案,核心代码如下
//模板名字就是r.URL.Patht:=gloabtemplate//如果是debug模式ifserverCtx.Config.Debug{//每次都重新解析t,_=template.New("").Funcs(FuncMap()).ParseGlob(serverCtx.Config.TemplatePattern)}err:=t.ExecuteTemplate(w,tplname,r.URL.Query())
如何设置首页
本质上是指定/
请求对应的模板,以及系统错误对应的模板
for_,tpl:=rangegloabtemplate.Templates(){patern:=tpl.Name()if!strings.HasPrefix(patern,"/"){patern="/"+patern}//处理首页逻辑tplname:=tpl.Name()if0==len(tplname){//模板名称为""那么就默认首页吧//恰好/对应的模板名称为"",tplname=serverCtx.Config.TemplateIndex}pageRouters=append(pageRouters,rest.Route{Method:http.MethodGet,Path:patern,Handler:htmlhandler(gloabtemplate,tplname,serverCtx),})logx.Infof("registerpage%s%s",patern,tplname)}
404等页面
目前可以实现业务逻辑层面的404定制,如httpx.Error方法可用404.html替代。 对于部分场景如访问一个不存在的url,则需要go-zero
官方提供支持,并开发接口。
集成
以上操作完成后,我们得到如下项目目录,
tree/F/A|go.mod|go.sum|html.api|html.go|readme.md|+---etc|html-api.yaml|\---internal+---config|config.go|+---handler||funcs.go||html.go||routes.go|||\---open|authorizationhandler.go|+---logic|\---open|authorizationlogic.go|+---svc|servicecontext.go|+---types|types.go|\---view+---public|404.html|footer.html|header.html|\---wwwarg.htmlembd.htmlfunc.htmlindex.htmltest.html
在routes.go
中添加如下代码段即可
funcRegisterHandlers(engine*rest.Server,serverCtx*svc.ServiceContext){engine.AddRoutes([]rest.Route{{Method:http.MethodPost,Path:"/open/authorization",Handler:open.AuthorizationHandler(serverCtx),},})//添加这个代码段RegisterHtmlHandlers(engine,serverCtx)}
本文代码获取
关注公众号betaidea
输入html
即可获得html解析相关代码 关注公众号betaidea
输入jwt
即可获得gozero集成jwt-token相关代码 关注公众号betaidea
输入gozero
即可gozero入门代码
下一篇预告
目前貌似还没找到go-zero对static file支持的例子,类似gin
哪样做静态资源服务貌的例子,那么明天就写一个吧。 在go-zero的路由框架下寻找解决方案。 《用go-zero 支持文件服务》
广而告之
送福利了uniapp用户福音来啦! 历经数十万用户考验,我们的客服系统终于对外提供服务了。 你还在为商城接入客服烦恼吗?只需一行代码,即可接入啦!! 只需一行代码!!!!
/*kefu.vue*/