Golangのテンプレートエンジン(html/template)

動的なページ作成のためにはテンプレートエンジンが必須で、Node.jsの場合にはexpress-generatorに同様の機能が存在しますが、golangでもライブラリhtml/templateを使うと実現できます。

https://isehara-3lv.sakura.ne.jp/blog/2023/03/29/golangとnode-jsでmifareカード使ってチェックイン表示/

ではビューはNode.jsを使っていますが、ラズパイで動かすと実行速度あるいは実行ファイルの扱いやすさなどを考えるとGolangに統一した方が良いだろうからhtml/templateを使います。myfareカードから読み取りデータを受信するGoのスクリプトはほぼそのままです。

https://www.twihike.dev/docs/golang-web/templates

上記を参考に作成してみました。

<web server起動のスクリプト>

myfareカードを読み取ってDBをアップデートする関数はgoオプションで並行処理として起動(go uidSerial.SerialMain())。

package main

import (
	"fmt"

	"html/template"
	"myfare/uidSerial"
	"net/http"

	"gorm.io/driver/sqlite"
	"gorm.io/gorm"
	"strconv"
	"time"
)

type Ninjya struct {
	Uid  string `gorm:"primaryKey"`
	Name string
	Time int
	Stat int
}

var products []Ninjya
var ninjyaSlice []string

// implements TableName of the Tabler interface
func (Ninjya) TableName() string {
	t := time.Now()
	tableName := "tbl" + strconv.Itoa(t.Year()) + strconv.Itoa(t.YearDay())
	return tableName
}

// to get active ninjya slice
func ninjya() {
	db, err := gorm.Open(sqlite.Open("./myfare.db"), &gorm.Config{})
	if err != nil {
		panic("failed to connect database")
	}

	// Migrate the schema
	db.AutoMigrate(&Ninjya{}) // if you use Automigrate and change struct, it won't be reflected automatically

	db.Debug().Order("Time desc").Where("Stat = ?", 1).Find(&products) // SELECT * FROM where Stat = tbl*****;
	ninjyaSlice = nil
	for i, p := range products {
		ninjyaSlice = append(ninjyaSlice, p.Name)
		fmt.Println(i, p)
	}
}

func handler(w http.ResponseWriter, r *http.Request) {
	t := template.Must(template.ParseFiles("layout.html", "pageData.html"))
	// to update ninjya status
	ninjya()
	tm := time.Now().Format(time.RFC1123)
	err := t.Execute(w, map[string]interface{}{
		"Time": tm,
		"Slice": ninjyaSlice,
	})
	if err != nil {
		fmt.Fprintln(w, err)
	}
}

func wevServer() {
	mux := http.NewServeMux()
	// to include static resoureces
	mux.Handle("/resources/", http.StripPrefix("/resources/", http.FileServer(http.Dir("resources/"))))
	mux.HandleFunc("/", handler)
	server := http.Server{
		Addr:    ":8080",
		Handler: mux,
	}
	err := server.ListenAndServe()
	if err != nil {
		if err != http.ErrServerClosed {
			panic(err)
		}
	}
}

func main() {
	// to call card reader function()
	go uidSerial.SerialMain()

	// http server start
	wevServer()

}

t := template.Must(template.ParseFiles("layout.html", "pageData.html"))

ここで、以下の二個のtemplete処理対象ファイルを読み込みます。

<layout.html>

<pageData.html>

mux.Handle("/resources/", http.StripPrefix("/resources/", http.FileServer(http.Dir("resources/"))))

スタイルシートを読み込むために検索パスを追加します。

 

実行すると、例えばこんな具合にブラウザ上に表示されます。

これでNode.jsと同等レベルになったので、Golang上で機能を追加していきます。

 

admin