创建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" .}}