Gin(三):配合模板 Tmpl

本文介绍了如何在Gin项目中使用模板文件Tmpl渲染页面,包括创建模板文件、设置模板高亮、加载模板、修改路由以及处理单元测试时的问题。通过示例展示了如何在Gin中引入Bootstrap和jQuery,以及设置网站图标。
640?wx_fmt=png

点击蓝字关注我

640?wx_fmt=png

原文首发于 https://youngxhui.top

640?wx_fmt=jpeg


前面的学习已经对 Gin 有了一个初步的认识和了解,对router的简单使用也有了一定的掌握,那么今天就来使用 Gin 来渲染出我们的html页面吧。

640 ?添加模板 640

我们仍旧是在上一章节的项目中进行修改。


首先新建一个templates文件夹,用于存放我们的模板文件,在文件夹中新建立index.tmpl并且编写我们的模板。


 
 <!doctype html>	
 <html lang="en">	
 <head>	
     <meta charset="UTF-8">	
     <meta name="viewport"	
           content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">	
     <meta http-equiv="X-UA-Compatible" content="ie=edge">	
     <title>Gin Hello</title>	
 </head>	
 <body>	
 <main>{{ .title }}</main>	
 </body>	
 </html>


小提示GoLand 现在还未对 tmpl 有高亮显示语法,我们可以将 .tmpl 后缀文件添加到 go Template 模板。方法如下:File-settings-Editor-File Types。(或者我们直接使用 *.gohtml 做为模板也是可以的)如图:


640?wx_fmt=jpeg


我们可以通过LoadHTMLGlobLoadHTMLFiles两个方法来对我们的模板进行加载。其中LoadHTMLGlob方法可以将一个目录下所有的模板进行加载,而LoadHTMLFiles只会加载一个文件,他的参数为可变长参数,需要我们一个一个的手动将模板文件填写。这里我们使用LoadHTMLGlob方法。



 
 router.LoadHTMLGlob("templates/*")


此时我们需要修改我们的/路由了,不再是让它返回一个字符串,而是返回我们的页面模板。


handler中新建立一个indexHandler.go,用来处理我们的/路由。


 
 func Index(context *gin.Context) {	
   context.HTML(http.StatusOK, "index.tmpl", gin.H{	
     "title": "hello gin " + strings.ToLower(context.Request.Method) + " method",	
   })	
 }


此时在访问我们的页面,仍旧是hello gin get method,但是这和我们之前返回的字符串是不同的。


打开浏览器-Network 就可以看到这两个页面的不同,一个是text一个是html


640?wx_fmt=jpeg


写完具体功能,我们需要改造一下我们的单元测试,针对新的接口逻辑原有的单元测试已经行不通了。


重新修改单元测试。



 
 func TestIndexHtml(t *testing.T) {	
   router := initRouter.SetupRouter()	
   w := httptest.NewRecorder()	
   req, _ := http.NewRequest(http.MethodGet, "/", nil)	
   router.ServeHTTP(w, req)	
   assert.Equal(t, http.StatusOK, w.Code)	
 }


进行单元测试的时候,发现报错了,报错原因是竟然是找不到html


 --- FAIL: TestIndexGetRouter (0.00s)
 panic: html/template: pattern matches no files: `templates/*` [recovered]
 panic: html/template: pattern matches no files: `templates/*`


此时就感到很奇怪了,为什么网页上可以很好的访问到,在测试中却无法访问呢?


查了很多资料没有找到原因,很多解决方法是将templates写成全路径,这显然不是很好的解决方法。官方对于单元测试介绍少的可怜。

这里我介绍一种方法:


我们需要修改方法,通过判断不同的模式(debug,release,test)来加载不同路径下的templates


initRouter.go


 
 // 省略部分代码	
 if mode := gin.Mode(); mode == gin.TestMode {	
     router.LoadHTMLGlob("./../templates/*")	
 } else {	
     router.LoadHTMLGlob("templates/*")	
 }


同时,也需要修改test,我们要写个init方法,这里的  init 方法就好比javaJunit中的@Before



 
package test	
 	
 import (	
   "GinHello/initRouter"	
   "github.com/gin-gonic/gin"	
   "github.com/stretchr/testify/assert"	
   "net/http"	
   "net/http/httptest"	
   "testing"	
 )	
 	
 var router *gin.Engine	
 	
 func init() {	
   gin.SetMode(gin.TestMode)	
   router = initRouter.SetupRouter()	
 }	
 	
 func TestIndexHtml(t *testing.T) {	
   w := httptest.NewRecorder()	
   req, _ := http.NewRequest(http.MethodGet, "/", nil)	
   router.ServeHTTP(w, req)	
   assert.Equal(t, http.StatusOK, w.Code)	
   assert.Contains(t,w.Body.String(),"hello gin get method","返回的HTML页面中应该包含 hello gin get method")	
 }


这样完善了单元测试,方便日后的功能更改。

640 ✨添加静态资源
640

当网页可以正常显示的时候,我们可以添加一些静态资源来使我们的页面更加美观。我在这里选择了Bootstrap 4做为一个 UI 界面框架。Bootstrap 4 下载


同时还要引入JqueryPopper


我们新建一个statics文件夹,将我们Bootstrap解压,将jscss复制到statics目录下。


在我们的initRouter 中,对静态资源进行添加。



 
 router.Static("/statics","./statics")


新建header.tmpl


 
 {{ define "header" }}	
     <nav class="navbar navbar-expand-lg navbar-light bg-light">	
         <a class="navbar-brand" href="#">Gin Hello</a>	
         <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent"	
                 aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">	
             <span class="navbar-toggler-icon"></span>	
         </button>	
 	
         <div class="collapse navbar-collapse" id="navbarSupportedContent">	
             <ul class="navbar-nav mr-auto">	
                 <li class="nav-item active">	
                     <a class="nav-link" href="#">主页 <span class="sr-only">(current)</span></a>	
                 </li>	
                 <li class="nav-item">	
                     <a class="nav-link" href="#">文章列表</a>	
                 </li>	
                 <li class="nav-item">	
                     <a class="nav-link " href="#" tabindex="-1" aria-disabled="true">关于</a>	
                 </li>	
             </ul>	
             <form class="form-inline my-2 my-lg-0">	
                 <input class="form-control mr-sm-2" type="search" placeholder="Search" aria-label="Search">	
                 <button class="btn btn-outline-success my-2 my-sm-0" type="submit">搜索</button>	
             </form>	
             <ul class="navbar-nav ">	
                 <li class="nav-item">	
                     <a class="nav-link" href="#">登录</a>	
                 </li>	
                 <li class="nav-item">	
                     <a class="nav-link" href="#">注册</a>	
                 </li>	
             </ul>	
         </div>	
     </nav>	
 {{end}}


并在我们的index.tmpl上进行添加


 
 <body>	
 <header>	
     {{template "header"}}	
 </header>	
 <main>	
     {{ .title }}	
 </main>	
 </body>


此时运行我们的网站,出现下图样式。

640 ?添加网站图标 640

万事俱备,只欠一个icon


网站此时还缺少网站的图标,网站图标也是通过 Gin 给定的函数设置。我们将.ico图片放到项目根目录下,然后在initRouter中设置。



 
  router.StaticFile("/favicon.ico","./favicon.ico")


再次运行我们的网站,此时就会发现网站的左上角标签页中出现了设置好的图标。

640 ✍总结 640

通过本章节的介绍和学习,可以很快的使用 Gin 中的静态资源,定义网站图标等。

640 ?‍?本章节代码 640

获取本章节代码,点击阅读原文

往期推荐

Gin(一):Hello Gin

Gin(二):路由


640?wx_fmt=jpeg好看的人才能点 640


内容概要:本文研究了基于DPWMA调制与正负序分离的ANPC电平并网逆变器前馈控制策略,旨在解决传统电平逆变器存在的谐波含量高、电网不平衡工况适应性差及动态响应速度不足等问题。通过采用有源中点箝位(ANPC)电平逆变器拓扑,结合双极性倍频脉宽调制(DPWMA)、正负序分离锁相技术和电网电压前馈控制,构建了一套一体化的高性能并网控制体系。该体系不仅优化了逆变器的开关动作机制,改善了输出电压电流的谐波特性,而且通过精确的相位同步和扰动补偿,显著提高了系统的动态响应能力和抗扰性能。仿真结果显示,所提出的控制策略能有效降低并网谐波含量,提升锁相精度与系统动态稳定性,确保在复杂电网工况下的高质量稳定并网。 适合人群:具备一定电力电子基础知识和仿真技能的研发人员,尤其是从事新能源发电、储能系统、柔性输电等领域研究的专业人士。 使用场景及目标:①研究和开发高性能并网逆变器,特别是针对大功率、高电能质量要求的应用场景;②探索如何通过先进的调制和控制策略来提高并网逆变器对电网扰动的适应性和响应速度;③为相关领域的学术研究和技术开发提供理论依据和实践指导。 阅读建议:建议读者结合实际的仿真软件(如MATLAB/Simulink)进行实践操作,以便更好地理解和掌握文中提到的各种控制策略的具体实现方法。同时,鼓励读者关注最新的研究成果和发展趋势,不断深化对该领域的认识。
摘要 在全球生态环境问题日益严峻、公众环保参与意愿持续提升的背景下,传统环保志愿者招募与管理模式存在信息传播零散、供需对接不畅、管理效率低下等痛点,制约了环保公益事业的规模化发展。为解决上述问题,响应生态保护数字化发展需求,本课题设计实现“守望自然”环保志愿者招募与管理网站,通过数字化手段打通环保组织与志愿者的服务链路,对推动环保公益规范化、高效化发展具有重要的现实意义与实践价值。 该网站采用B/S架构与前后端分离模式开发,前端基于Vue架构建组件化响应式界面;后端以Java为开发语言,采用Spring Boot框架搭建应用,搭配MyBatis作为持久层框架,数据库选用MySQL并遵循第范式设计7个以上核心数据表。系统涵盖用户与管理员两大核心角色,实现了闭环式环保志愿服务功能:用户端支持注册登录、个人信息管理、活动查询报名、环保知识学习、社区互动、问题反馈及客服咨询等功能,满足用户全流程参与需求;管理员端具备用户管理、用户审核、招募与活动信息发布管理、环保知识内容管理、问题反馈处理、证书模板管理、多维度数据可视化分析及社区内容监管等功能,全面支撑环保组织运营管理。开发过程中集成了Token身份认证、MD5密码加密、ECharts数据可视化等关键技术,融入活动智能推荐、数据驱动决策等创新设计,确保系统功能完备性与实用性。 经功能测试、性能测试及安全测试验证,系统运行稳定可靠,具有良好的易用性、安全性和可扩展性,能够高效满足环保组织的用户招募管理需求与用户的多元化参与需求,有效降低环保组织运营成本,提升用户参与体验,为环保理念传播与公益事业发展提供有力的数字化支撑。 关键词:环保志愿者;招募管理系统;Spring Boot;Vue;数据可视化
特等奖标准成品论文(Word无水印纯净版) 硬核结构:全文包含完整的摘要、问题重述与分析、模型假设、符号说明、模型建立与求解、灵敏度分析及结论。 即插即用:排版严格遵循官方规范,逻辑严密。拿到手即可作为绝佳的高分参考模板,稍作替换与个性化润色即可极速完稿,彻底解决写论文难的痛点。 双源硬核解题代码(Python与MATLAB双版本) 拒绝假代码:提供底层逻辑清晰、模块化设计的全套可运行源码。 全流程覆盖:涵盖从前期数据清洗预处理,到中期核心数学模型训练,再到后期启发式算法寻优。 傻瓜式运行:代码自带详尽的逐行中文注释,并支持一键生成高质量结果可视化图表,编程小白也能轻松复现与二次开发。 全量数据与结果展示表 所有中间处理数据、模型输出参数以及最终结论,均已精细整理成高质量表格。直观呈现性能评估指标与多模型对比分析,可直接作为论文正文或附件使用,极大提升学术说服力。 独家硬核思路解析 深入浅出剖析出题人意图,详细拆解每一小问的数学本质与底层逻辑,让你不仅知其然更知其所以然。 【四大核心产品优势】 高效实用:所有代码与论文均经过严格测试,确保结果精准无误、完全可复现,省去熬夜试错的时间。 全栈覆盖:从思路分析到跑出结果,再到写出高质量论文,提供一站式全流程资料矩阵。 排版辅助:资料内提供专业的论文排版一键转换工具与官方标准模板,告别格式调整的繁琐。 持续迭代:网盘直发,开赛后资料库将持续滚动更新,所有用户均可免费同步获取最新包。 【适用人群】 想要打破建模瓶颈的参赛队长与主攻手;急需高质量底层代码的编程小白;目标直指特等奖需要高分模板对标的精英团队。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值