Golang框架Gin入门实战--(4)HTML模板渲染以及模板语法 自定义模板函数 静态文件服务(下)

2022-11-21 21:41:39 浏览数 (1)

Golang框架Gin入门实战–(4)HTML模板渲染以及模板语法 自定义模板函数 静态文件服务(下)

此篇文章内容基于上篇文章继续修改Golang框架Gin入门实战–(3)HTML模板渲染及模板语法(上)

main.go

代码语言:javascript复制
package main

import (
	"fmt"
	"html/template"
	"time"

	"github.com/gin-gonic/gin"
)

type Article struct {
	Title   string
	Content string
}

//时间戳转换成日期
func UnixToTime(timestamp int) string {
	fmt.Println(timestamp)
	t := time.Unix(int64(timestamp), 0)

	return t.Format("2006-01-02 15:04:05")
}
func Println(str1 string, str2 string) string {
	fmt.Println(str1, str2)
	return str1   "-----"   str2

}
func main() {
	r := gin.Default()
	//自定义模板函数  注意要把这个函数放在加载模板前
	r.SetFuncMap(template.FuncMap{
		"UnixToTime": UnixToTime,
		"Println":    Println,
	})
	//加载模板
	r.LoadHTMLGlob("templates/**/*")
	//  配置静态web目录 第一个参数表示路由 第二个参数表示映射的目录
	r.Static("/static", "./static")

	//前台
	r.GET("/", func(c *gin.Context) {
		c.HTML(200, "default/index.html", gin.H{
			"title": "aaa",
			"msg":   "我是msg",
			"score": 89,
			"hobby": []string{"吃饭", "睡觉", "写代码"},
			"newsList": []interface{}{
				&Article{
					Title:   "新闻标题111",
					Content: "新闻详情111",
				},
				&Article{
					Title:   "新闻标题222",
					Content: "新闻详情222",
				},
			},
			"testSlice": []string{},
			"news": &Article{
				Title:   "新闻标题",
				Content: "新闻内容",
			},
			"date": 1654565445,
		})

	})

	r.GET("/news", func(c *gin.Context) {
		news := &Article{
			Title:   "新闻标题",
			Content: "新闻详情",
		}
		c.HTML(200, "default/news.html", gin.H{
			"title": "新闻页面",
			"news":  news,
		})

	})
	//后台
	r.GET("/admin", func(c *gin.Context) {
		c.HTML(200, "admin/index.html", gin.H{
			"title": "后台首页",
		})

	})

	r.GET("/admin/news", func(c *gin.Context) {
		c.HTML(200, "admin/news.html", gin.H{
			"title": "新闻页面",
		})

	})
	r.Run()
}

GINDEMOtemplatesadminindex.html

代码语言:javascript复制
{{define "admin/index.html"}}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h2>这是后台首页</h2>
</body>
</html>
{{end}}

GINDEMOtemplatesadminnews.html

代码语言:javascript复制
{{define "admin/news.html"}}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h2>后台新闻页面</h2>
</body>
</html>
{{end}}

GINDEMOtemplatesdefaultindex.html

代码语言:javascript复制
<!--相当于给模板定义一个名称 define-end成对出现-->
{{define "default/index.html"}}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="stylesheet" href="/static/css/base.css">
</head>
<body>

    {{template "public/page_header.html" .}}

    <img src="/static/images/test.jpg" alt="">
    <h2>{{.title}}</h2>

    {{$t := .title}}

<!-- 定义变量 -->
    <br>
    <h4>
        {{$t}}
    </h4>
    <!-- 条件判断 -->
    {{if ge .score 60}}
        <p>及格</p>
    {{else}}
        <p>不及格</p>
    {{end}}

    {{if gt .score 90}}
    <p>优秀</p>
    {{else if gt .score 80}}
    <p>良好</p>
    {{else if gt .score 60}}
    <p>及格</p>
    {{else}}
    <p>不及格</p>
    {{end}}

    <!-- 循环遍历数据 -->
<ul>
    {{range $key,$value:=.hobby}}
    <li>{{$key}}----{{$value}}</li>
    {{end}}
</ul>

<br>

<ul>
    {{range $key,$value:=.newsList}}
         <li>{{$key}}----{{$value.Title}}----{{$value.Content}}</li>
    {{end}}
</ul>

<br>
<ul>
    {{range $key,$value:=.testSlice}}
    <li>{{$key}}----{{$value}}</li>

    {{else}}
        <li>数组中没有数据</li>
    {{end}}
</ul>

<!-- with 解构结构体 -->
<p>{{.news.Title}}</p>
<p>{{.news.Content}}</p>

<br>

{{with .news}}
<p>{{.Title}}</p>
<p>{{.Content}}</p>
{{end}}
<br>
<!-- 预定义函数(了解) -->
{{len .title}}

<!-- 自定义模板函数 -->
<br>
<br>

{{.date}}


<br>
<br>

{{UnixToTime .date}}

<br>
<br>
{{Println .title .msg}}

<br><br>
{{template "public/page_footer.html" .}}

</body>
</html>
{{end}}

GINDEMOtemplatesdefaultnews.html

代码语言:javascript复制
{{define "default/news.html"}}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="stylesheet" href="static/css/base.css">
</head>
<body>
    {{template "public/page_header.html" .}}

    <h2>{{.title}}</h2>
    <p>
        {{.news.Title}}
    </p>
    <p>
        {{.news.Content}}
    </p>

    <br><br>
    {{template "public/page_footer.html" .}}

</body>
</html>
{{end}}

GINDEMOtemplatespublicpage_footer.html

代码语言:javascript复制
<!--相当于给模板定义一个名称 define-end成对出现-->
{{define "public/page_footer.html"}}


<h1>
    我是一个公共的底部
</h1>
{{end}}

GINDEMOtemplatespublicpage_header.html

代码语言:javascript复制
<!--相当于给模板定义一个名称 define-end成对出现-->
{{define "public/page_header.html"}}


<h1>
    我是一个公共的标题---{{.title}}
</h1>
{{end}}

在demo目录下创建一个static目录用于存放静态文件 再在static目录下分别创建css、images、js目录

GINDEMOstaticcss

代码语言:javascript复制
h1 {
    
   background: #000;
    color: #fff;
    text-align: center;
    

}

h2 {
    color: red;
}

GINDEMOstaticimages 存放一张名为test.jpg图片

访问localhost:8080

访问localhost:8080/news

0 人点赞