gin web项目(6): 给模板传递常用全局数据

5 阅读1分钟

创建render.go。func H函数中的 "App": viper.Get("app") 用来读取config.toml中的app字段。

  • 返回:interface{} (通常是 map[string]interface{})
  • 用途:直接获取值,适合传给模板
  • 特点:返回的是普通数据结构
package render

import (
	"strings"

	"github.com/gin-contrib/sessions"
	"github.com/gin-gonic/gin"
	"github.com/hahaxo/boilerplatelite/config"
	"github.com/spf13/viper"
)

func getUserInfo(c *gin.Context) gin.H {
	session := sessions.Default(c)
	userEmail := session.Get("user_email")

	if userEmail == nil {
		return gin.H{
			"IsLoggedIn": false,
		}
	}

	email, _, _ := strings.Cut(userEmail.(string), "@")
	return gin.H{
		"IsLoggedIn": true,
		"Email":      userEmail,
		"Name":       email,
		"Avatar":     config.Cfg.User.Avatar,
	}
}

func H(c *gin.Context, data gin.H) gin.H {
	result := gin.H{
		"App":  viper.Get("app"),
		"User": getUserInfo(c),
	}

	for k, v := range data {
		result[k] = v
	}
	return result
}

核心是创建的func H(c *gin.Context, data gin.H) gin.H,来代替在handler中使用的c.HTML中的第三个参数。在handler中,用H替换第三个参数

package handler

import (
	"net/http"

	"github.com/gin-gonic/gin"
	"github.com/hahaxo/boilerplatelite/render"
)

func Index(c *gin.Context) {
	c.HTML(http.StatusOK, "index.html", render.H(c, gin.H{
		"title": "Home",
	}))
}

模板页面中直接使用

{{ template "header.html" .}}
<main>
    <div>{{ .}}</div>

    <h1>From handler:</h1>
    <div>{{ .title }}</div>
    
    <h1>From App config file:</h1>
    <div>{{ .App.title }}</div>
    <div>{{ .App.description }}</div>
    <div>{{ .App.keywords }}</div>

    <h1>From session:</h1>
    <div>{{ .User.Avatar }}</div>
    <div>{{ .User.Name }}</div>
    <div>{{ .User.IsLoggedIn }}</div>
</main>
{{ template "footer.html" .}}