go页面静态化

5 篇文章 0 订阅
1 篇文章 0 订阅

什么是页面静态化:

原文链接:http://www.5lmh.com/%E5%85%B6%E4%BB%96/%E9%A1%B5%E9%9D%A2%E9%9D%99%E6%80%81%E5%8C%96.html
简 单的说,我们如果访问一个链接 ,服务器对应的模块会处理这个请求,转到对应的go方法,最后生成我们想要看到的数据。这其中的缺点是显而易见的:因为每次请求服务器都会进行处理,如 果有太多的高并发请求,那么就会加重应用服务器的压力,弄不好就把服务器 搞down 掉了。那么如何去避免呢?如果我们把请求后的结果保存成一个 html 文件,然后每次用户都去访问 ,这样应用服务器的压力不就减少了?

那么静态页面从哪里来呢?总不能让我们每个页面都手动处理吧?这里就牵涉到我们要讲解的内容了,静态页面生成方案… 我们需要的是自动的生成静态页面,当用户访问 ,会自动生成html文件 ,然后显示给用户。

为了路由方便我用的gin框架但是不管用在什么框架上面都是一样的

项目目录:

project

-tem

–index.html

-main.go

main.go文件代码:

package main

import (
	"fmt"
	"net/http"
	"os"
	"path/filepath"
	"text/template"

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

type Product struct {
	Id   int64  `json:"id"` //字段一定要大写不然各种问题
	Name string `json:"name"`
}

//模拟从数据库查询过来的消息
var allproduct []*Product = []*Product{
	{1, "苹果手机"},
	{2, "苹果电脑"},
	{3, "苹果耳机"},
}
var (
	//生成的Html保存目录
	htmlOutPath = "./tem"
	//静态文件模版目录
	templatePath = "./tem"
)

func main() {
	r := gin.Default()
	r.LoadHTMLGlob("tem/*")
	r.GET("/index", func(c *gin.Context) {
		GetGenerateHtml()
		c.HTML(http.StatusOK, "index.html", gin.H{"allproduct": allproduct})
	})
	r.GET("/index2", func(c *gin.Context) {
		c.HTML(http.StatusOK, "htmlindex.html", gin.H{})
	})
	r.Run()
}

//生成静态文件的方法
func GetGenerateHtml() {
	//1.获取模版
	contenstTmp, err := template.ParseFiles(filepath.Join(templatePath, "index.html"))
	if err != nil {
		fmt.Println("获取模版文件失败")
	}
	//2.获取html生成路径
	fileName := filepath.Join(htmlOutPath, "htmlindex.html")
	//4.生成静态文件
	generateStaticHtml(contenstTmp, fileName, gin.H{"allproduct": allproduct})
}

//生成静态文件
func generateStaticHtml(template *template.Template, fileName string, product map[string]interface{}) {
	//1.判断静态文件是否存在
	if exist(fileName) {
		err := os.Remove(fileName)
		if err != nil {
			fmt.Println("移除文件失败")
		}
	}
	//2.生成静态文件
	file, err := os.OpenFile(fileName, os.O_CREATE|os.O_WRONLY, os.ModePerm)
	if err != nil {
		fmt.Println("打开文件失败")
	}
	defer file.Close()
	template.Execute(file, &product)
}

//判断文件是否存在
func exist(fileName string) bool {
	_, err := os.Stat(fileName)
	return err == nil || os.IsExist(err)
}

tem/index.html文件代码:

{{define "index.html"}}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>商品列表页</title>
</head>
<tbody>

<div><a href="#">商品列表页</a></div>
<table border="1">
    <thead>
    <tr>
        <th>ID</th>
        <th>商品名称</th>
    </tr>
    </thead>
    <tbody>
    {{range .allproduct}}
    <tr>
        <td>{{.Id}}</td>
        <td>{{.Name}}</td>
    </tr>
    {{end}}
    </tbody>
</table>
</html>
{{end}}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现这个功能,你需要使用Go语言的Web框架,例如Gin、Beego等,以及Go语言的MySQL数据库驱动程序。以下是一个实现静态Dashboard页面,并能够和MySQL数据库进行增删改查的示例代码: ```go package main import ( "database/sql" "fmt" "html/template" "net/http" "strconv" "time" "github.com/gin-gonic/gin" _ "github.com/go-sql-driver/mysql" ) type Contain struct { ID int IsRunning bool LastUpdated time.Time ImageID string CPU float64 Memory int Port int } func main() { // 连接MySQL数据库 db, err := sql.Open("mysql", "user:password@tcp(localhost:3306)/database") if err != nil { fmt.Println(err) return } defer db.Close() // 初始Gin框架 router := gin.Default() router.Static("/static", "./static") router.LoadHTMLGlob("templates/*") // 显示Dashboard页面 router.GET("/", func(c *gin.Context) { // 查询contain表中的数据 rows, err := db.Query("SELECT id, is_running, last_updated, image_id, cpu, memory, port FROM contain") if err != nil { fmt.Println(err) c.AbortWithError(http.StatusInternalServerError, err) return } defer rows.Close() // 将查询结果存入Contain结构体切片中 var contains []Contain for rows.Next() { var contain Contain err = rows.Scan(&contain.ID, &contain.IsRunning, &contain.LastUpdated, &contain.ImageID, &contain.CPU, &contain.Memory, &contain.Port) if err != nil { fmt.Println(err) c.AbortWithError(http.StatusInternalServerError, err) return } contains = append(contains, contain) } if err = rows.Err(); err != nil { fmt.Println(err) c.AbortWithError(http.StatusInternalServerError, err) return } // 渲染Dashboard页面 c.HTML(http.StatusOK, "dashboard.html", gin.H{ "contains": contains, }) }) // 处理添加新的contain记录的请求 router.POST("/add", func(c *gin.Context) { // 从表单中获取contain的信息 isRunning, _ := strconv.ParseBool(c.PostForm("is_running")) imageID := c.PostForm("image_id") cpu, _ := strconv.ParseFloat(c.PostForm("cpu"), 64) memory, _ := strconv.Atoi(c.PostForm("memory")) port, _ := strconv.Atoi(c.PostForm("port")) // 插入新的记录到contain表中 stmt, err := db.Prepare("INSERT INTO contain(is_running, last_updated, image_id, cpu, memory, port) VALUES(?, NOW(), ?, ?, ?, ?)") if err != nil { fmt.Println(err) c.AbortWithError(http.StatusInternalServerError, err) return } defer stmt.Close() _, err = stmt.Exec(isRunning, imageID, cpu, memory, port) if err != nil { fmt.Println(err) c.AbortWithError(http.StatusInternalServerError, err) return } // 跳转回Dashboard页面 c.Redirect(http.StatusFound, "/") }) // 处理修改contain记录的请求 router.POST("/edit/:id", func(c *gin.Context) { // 从URL中获取contain的ID id, _ := strconv.Atoi(c.Param("id")) // 从表单中获取contain的信息 isRunning, _ := strconv.ParseBool(c.PostForm("is_running")) imageID := c.PostForm("image_id") cpu, _ := strconv.ParseFloat(c.PostForm("cpu"), 64) memory, _ := strconv.Atoi(c.PostForm("memory")) port, _ := strconv.Atoi(c.PostForm("port")) // 更新contain表中对应ID的记录 stmt, err := db.Prepare("UPDATE contain SET is_running=?, last_updated=NOW(), image_id=?, cpu=?, memory=?, port=? WHERE id=?") if err != nil { fmt.Println(err) c.AbortWithError(http.StatusInternalServerError, err) return } defer stmt.Close() _, err = stmt.Exec(isRunning, imageID, cpu, memory, port, id) if err != nil { fmt.Println(err) c.AbortWithError(http.StatusInternalServerError, err) return } // 跳转回Dashboard页面 c.Redirect(http.StatusFound, "/") }) // 处理删除contain记录的请求 router.POST("/delete/:id", func(c *gin.Context) { // 从URL中获取contain的ID id, _ := strconv.Atoi(c.Param("id")) // 删除contain表中对应ID的记录 stmt, err := db.Prepare("DELETE FROM contain WHERE id=?") if err != nil { fmt.Println(err) c.AbortWithError(http.StatusInternalServerError, err) return } defer stmt.Close() _, err = stmt.Exec(id) if err != nil { fmt.Println(err) c.AbortWithError(http.StatusInternalServerError, err) return } // 跳转回Dashboard页面 c.Redirect(http.StatusFound, "/") }) // 启动Web服务器 router.Run(":8080") } ``` 在上述代码中,我们定义了一个名为Contain的结构体,用于存储contain表中的数据。我们使用SQL查询语句从MySQL数据库中查询contain表中的数据,并将查询结果存入Contain结构体切片中。然后,我们使用HTML模板渲染Dashboard页面,并将Contain结构体切片作为参数传递给HTML模板。在Dashboard页面中,我们使用表格展示Contain结构体切片中的数据,并提供添加、修改和删除contain记录的表单。当用户提交表单时,我们会使用SQL插入、更新或删除语句对MySQL数据库进行相应的操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值