gin模板

缺点

  • 模板引擎不具备运算功能
  • 模板不能继承方法,只能使用导入
  • 没有比较符,只有比较函数,参考下面的比较函数

多个页面的方法:

顶部header.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>测试标题</title>
    <link href="./static/index.css" rel="stylesheet">
</head>
<body>

底部bottom.html:

</body>
</html>

页脚内容footer.html:

<br>这是页尾文字

index.html:

{{template "header.html"}}
这里是index
<!--如果要把变量传递给子模板 就要使用{{template "header.html" . }}-->
<!--如果不需要页脚内容就不要插入footer.html-->
{{template "footer.html"}}
{{template "bottom.html"}}

注意,模板传递的变量格式:{{ .var }}

模板数组变量不遍历直接访问 {{index .var 0}}

只能有一个页面的方法,不推荐这个用法:

主模板位置添加:

<!--这是是主模板顶部内容-->
{{block "main" .}}{{end}}
<!--{{block "main" .}}{{end}}是子模板占用-->
<!--这主模板底部内容-->

子模板:

{{template "layout.html"}}
{{define "main"}}
这里是替换内容
{{end}}

格式化时间

{{.CreatedAt.Format "2006-01-02 15:04:05"}} //假设CreatedAt是一个时间变量

遍历变量

注意,在range 遍历内部任何变量都会认为是.results的子变量,此时若要引用外部变量示范{{$.var}}

{{range .results}}
<a href="#">{{.Subject}}</a>
<p>{{.Jieduan}}</p>

<div>{{.CreatedAt.Format "2006-01-02 15:04:05"}}</div>
            {{end}}

比较函数

eq:等于
ne:不等于
lt:小于
le:小于等于
gt:大于
ge:大于等于
用法:{{if gt .page 1}} 只有page大于1时中间的内容才会显示

自定义模板函数

//自定义模板函数,utc转utc+8
func Utczhuan(utcTime time.Time) string {
    loc, err := time.LoadLocation("Asia/Shanghai")
    if err != nil {
        log.Print("Utczhuan时区转换函数出错:",err)
        return ""
    }
    return utcTime.In(loc).Format("2006-01-02 15:04:05")
}


//下面的写在gin初始化函数中

r := gin.Default()
// 注册模板函数,要在加载模板之前使用,注意顺序,否则会报错
r.SetFuncMap(template.FuncMap{
    "Utczhuan": Utczhuan,
})
r.LoadHTMLGlob("templates/*")//加载html模板全局,指定templates目录下的所有文件

分页查询示范

// 文章列表
func Lists(c *gin.Context) {
    page1, err := strconv.Atoi(c.Param("page")) //页码需要先转整数
    if err != nil {
        // 处理转换错误
        c.JSON(400, gin.H{"page_error": err})
        return
    }
    page := int64(page1) //转为int64
    pageSize := int64(6) // 每页显示的文档数量
    // 计算要跳过的文档数量
    skip := (page - 1) * pageSize
    // 设置查询选项,包括分页参数
    findOptions := options.Find()
    findOptions.SetSkip(int64(skip))
    findOptions.SetLimit(int64(pageSize))
    var zongyeshu int64 //定义一个总页数变量
    
    var results []model.Article_model

    // 执行查询操作
    cursor, err := model.FaqModel.Find(context.TODO(),{},findOptions)
    if err != nil {
    //处理错误
        return
    }

    if err := cursor.All(context.TODO(), &results); err != nil {
        // 处理解码错误
        return
    }
    //取当前总页数
    zongtiaoshu, _ := model.FaqModel.CountDocuments(context.TODO(), {})
    zongyeshu = int64(math.Ceil(float64(zongtiaoshu) / float64(pageSize)))
    
    shangye := page - 1
    xiaye := page + 1

    //渲染模板
    c.HTML(200, "lists.html", gin.H{"results":results,"page":page,"shangye":shangye,"xiaye":xiaye,"zongyeshu":zongyeshu})
}

前端:

{{if gt .page 1}}
<a href="/lists/{{.shangye}}">上一页</a>
{{end}}
{{if lt .page .zongyeshu}}
<a href="/lists/{{.xiaye}}">下一页</a>
{{end}}