GoFrame登錄實戰之模板引擎

GoFrame登錄實戰之模板引擎

這節課開始除了會介紹一部分GoFrame基礎知識,也有一些關鍵的知識點和實戰經驗進行分享。示例還是主要以GoFrame爲基礎;

實踐是檢驗真理的唯一標準。希望大家可以多跟練習,多去思考,多去體會,而不是簡單的聽;

一、模板引擎

模板引擎(這裏特指用於Web開發的模板引擎)是爲了使用戶界面與業務數據(內容)分離而產生的,它可以生成特定格式的文檔,用於網站的模板引擎就會生成一個標準的HTML文檔。

但模板引擎不屬於特定技術領域,它是跨領域跨平臺的概念。

模板配置config.toml

# 模板引擎配置
[viewer]
    Path        = "template"
    DefaultFile = "index.html"
    Delimiters  =  ["${", "}"]


模板使用

// 調用文件
s := g.Server()
s.BindHandler("/template", func(r *ghttp.Request) {
    r.Response.WriteTpl("index.tpl", g.Map{
        "id":   123,
        "name": "john",
    })
})
// 直接傳入字符串
s := g.Server()
s.BindHandler("/template", func(r *ghttp.Request){
    tplContent := `id:{{.id}}, name:{{.name}}`
    r.Response.WriteTplContent(tplContent, g.Map{
        "id"   : 123,
        "name" : "john",
    })
})


模板常用標籤

<!-- 取值 -->
{{ .value }}
<!-- 判斷 -->
{{if .condition}}
    ...
{{else if .condition2}}
    ...
{{else}}
    ...
{{end}}
<!-- 遍歷 -->
{{range $index, $elem := .SliceContent}}
    {{range $key, $value := $elem}}
        {{$key}}:{{$value}}
    {{end}}
{{end}}
<!-- 引用文件 -->
{{include "模板文件名(需要帶完整文件名後綴)" .}}
<!-- 註釋 -->
{{/*
comment content
support new line
*/}}


模板也支持函數,大家也可以自定義函數

${"我是中國人" | substr 2 -1}


其實模板可以當做一種語言來講,這裏不做過多介紹,一般使用模板只用一些基本功能,但是要想深入瞭解建議去看go模板和GoFram官網模板章節;

二、示例

目錄

:.
│  go.mod
│  go.sum
│  main.go
│
├─config
│      config.toml
│
└─template
        index.html
        include.html


config.toml

# 模板引擎配置
[viewer]
    Path        = "template"
    DefaultFile = "index.html"
    Delimiters  =  ["${", "}"]


go.mod

module gf-template

go 1.14

require github.com/gogf/gf v1.12.1


main.go

package main

import (
	"github.com/gogf/gf/frame/g"
	"github.com/gogf/gf/net/ghttp"
)

func main() {
	s := g.Server()
	// 常規註冊
	group := s.Group("/")

	// 模板文件
	group.GET("/", func(r *ghttp.Request) {
		r.Response.WriteTpl("index.html", g.Map{
			"title": "列表頁面",
			"show": true,
			"listData": g.List{
				g.Map{
					"date":    "2020-04-01",
					"name":    "朱元璋",
					"address": "江蘇110號",
				},
				g.Map{
					"date":    "2020-04-02",
					"name":    "徐達",
					"address": "江蘇111號",
				},
				g.Map{
					"date":    "2020-04-03",
					"name":    "李善長",
					"address": "江蘇112號",
				},
			}})
	})

	// 字符串傳入
	group.GET("/template", func(r *ghttp.Request) {
		tplContent := `id:${.id}, name:${.name}`
		r.Response.WriteTplContent(tplContent, g.Map{
			"id"   : 123,
			"name" : "john",
		})
	})

	s.Run()
}



index.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <!-- import CSS -->
    <link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
    <style>
        .el-row {
            margin-bottom: 20px;
        }
    </style>
</head>
<body>
<div id="app">
    <el-row>
        <el-col :span="6" :offset="6" style="text-align: center">
            <span>${ .title }</span>
            <span>${if .show}【展示】${end}</span>
        </el-col>
    </el-row>
    <el-row>
        <el-col :span="24">
            <template>
                <el-table
                        :data="tableData"
                        style="width: 100%">
                    <el-table-column
                            prop="date"
                            label="日期"
                            width="180">
                    </el-table-column>
                    <el-table-column
                            prop="name"
                            label="姓名"
                            width="180">
                    </el-table-column>
                    <el-table-column
                            prop="address"
                            label="地址">
                    </el-table-column>
                </el-table>
            </template>
        </el-col>
    </el-row>
    
    ${include "include.html" .}

</div>
</body>
<!-- import Vue before Element -->
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<!-- import JavaScript -->
<script src="https://unpkg.com/element-ui/lib/index.js"></script>

<script src="https://cdn.bootcss.com/axios/0.19.2/axios.min.js"></script>

<script>
    /**
     tableData: [{
        date: '2016-05-02',
        name: '王小虎',
        address: '上海市普陀區金沙江路 1518 弄'
    }]
     */

    var listData = new Array();
    var data;
    ${range $index, $elem := .listData}
        data = {};
        ${range $key, $value := $elem}
        data['${$key}']='${$value}'
        ${end}
        listData.push(data)
    ${end}
    var vm = new Vue({
        el: '#app',
        data: {
            visible: false,
            tableData: listData
        }
    })
</script>
</html>


include.html

    <el-row>
        <el-col :span="6" :offset="6" style="text-align: center">
            <span style="font-weight: bold">這裏是通過include引用的文件內容</span>
        </el-col>
    </el-row>


視頻地址

代碼地址

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章