整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          golang html/template模塊


          tml/template常用的對象和方法

          type Template struct {
          Tree *parse.Tree
          }
          # 初始化一個template對象
          ## Must函數會在Parse返回err不為nil時,調用panic,不需要初始化后再調用Parse方法去檢測
          func Must(t *Template,err error) *Template
          ## New函數用來創建一個指定的HTML模板
          func New(name string) *Template
          ## ParseFiles函數用來從一個指定的文件中創建并解析模板
          func ParseFiles(filenames ...string) (*Template, error)
          ## ParseGlob函數從指定的匹配文件中創建并解析模板,必須得至少匹配一個文件
          func ParseGlob(pattern string) (*Template, error)
          # Template結構體對象常用的幾個方法
          ## 使用New()函數創建的模板需要指定模板內容
          func (t *Template) Parse(text string) (*Template, error)
          ## Delims()方法用來指定分隔符來分割字符串,隨后會使用Parse, ParseFiles, or ParseGlob方法進行模板內容解析
          func (t *Template) Delims(left, right string) *Template
          ## Execute()方法用來把一個模板解析到指定的數據對象data中,并且寫入到輸出wr中。如果有任何錯誤,就like停止,但如果是并行操作的話,有一些數據已經被寫入了。因此,使用該方法一定要注意并發安全性
          func (t *Template) Execute(wr io.Writer, data interface{}) error
          ## 同上
          func (t *Template) ExecuteTemplate(wr io.Writer, name string, data interface{}) error
          # 模板文件
          $ $ cat app.tpl
          <!DOCTYPE html>
          <html>
          <head>
          <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
          <title>layout</title>
          </head>
          <body>
          <h3>userslist:</h3>
          <p>userlist:</p>{{ .}}
          <p>users:</p>
          {{range $i,$e := .}}
          {{$i}}:{{$e}}
          {{end}}
          {{range .}}
          {{ .}}
          {{end}}
          </body>
          </html>
          # 示例程序
          $ cat golanghtml.go
          package main
          import (
          "html/template"
          "os"
          )
          func main() {
          /*
          1.聲明一個Template對象并解析模板文本
          func New(name string) *Template
          func (t *Template) Parse(text string) (*Template, error)
          2.從html文件解析模板
          func ParseFiles(filenames ...string) (*Template, error)
          3.模板生成器的包裝
          template.Must(*template.Template, error )會在Parse返回err不為nil時,調用panic。
          func Must(t *Template, err error) *Template
          t := template.Must(template.New("name").Parse("html"))
          */
          t, _ :=template.ParseFiles("app.tpl")
          //t,_ := template.ParseGlob("*.tpl")
          t.Execute(os.Stdout, []string{"bgbiao","biaoge"})
          }
          $ go run golanghtml.go

          olang 簡介

          Go(又稱Golang)是Google開發的一種靜態強類型、編譯型、并發型,并具有垃圾回收功能的編程語言。

          golang前景

          適合云計算、微服務、基礎后端軟件的功能實現。

          go語言優點

          go是非常年輕的一門語言,“兼具Python 等動態語言的開發速度和C/C++等編譯型語言的性能與安全性”,具備強大的標準庫,內置垃圾回收機制,屬于靜態類型語言,因此具備編譯檢查和編碼規范,特別是并發功能實現簡單,但功能強大,可使用goroutine和channel輕松實現高并發。

          golang web 優勢

          語法簡單:語法簡潔,新手入門簡單,開發應用性能高。

          便于維護:強類型靜態語言,便于項目的重構和維護。

          部署方便:編譯的可執行二進制文件,在執行時,不需要部署環境,把編譯文件上傳,就完成了項目的部署。

          設置響應內容為HTML

          1、文件列表結構

          2、html/base/admin.html

          3、html/admin/admin.html

          4、html/base/foot.html


          5、設置請求處理對象

          6、設置請求處理函數

          著之前的內容,前面已經講過很多Golang的基礎語法,mysql的使用,redis的使用,也講了orm框架,如何創建一個webapi 服務等等,感興趣的可以看看以前的文章。今天要來說一說,如何用beego開發web應用。


          介紹

          beego 是一個快速開發 Go 應用的 HTTP 框架,他可以用來快速開發 API、Web 及后端服務等各種應用,是一個 RESTful 的框架,同時也是一個關注度和使用量都比價高的開源項目。我認為它是go初學者比較容易上手的一門MVC Web框架。

          它是由國內團隊開發的開源框架,文檔基本都是中文,簡單易懂。


          安裝

            需要安裝 Beego 和 Bee 的開發工具:

          $ go get github.com/astaxie/beego
          $ go get github.com/beego/bee

            注意:

          1. beege和bee是兩個概念。beego是框架,bee是工具,是命令。
          2. 在安裝Beego前,先確認是否將$GOPATH/bin寫入GO環境中。


          創建應用

            創建一個名為webDemo的應用

          $ bee new webDemo     //創建一個web應用
          $ bee api webDemo     //創建一個api應用

           

          編譯運行

            進入webDemo目錄中,執行bee run,就會完成編譯、運行:

          $ bee run

           

            成功后,打開瀏覽器訪問:http://localhost:8080,可以看到如圖:


          項目結構

            以上就beego 的安裝和運行簡單的介紹完了,下面我們就通過訂單查詢和新增的例子來學習學習如何用beego開發web應用。一般的 beego 項目的目錄如下所示:

          ├── conf           //配置文件
          │   └── app.conf
          ├── controllers    //控制器
          │   └── default.go
          ├── main.go   
          ├── models         //模型   
          │   └── models.go
          ├── routers       //路由
          │   └──router.go
          ├── static         //靜態文件
          │   ├── css
          │   ├── ico
          │   ├── img
          │   └── js
          └── views          //界面
              └── index.tpl


          1、conf

          beego 默認會創建配置文件目錄,里面放置系統的配置文件,這里我們先創建app.conf ,增加數據庫連接配置。

          appname = webDemo
          httpport = 8080
          runmode = dev
          
          DBConn="root:root@tcp(localhost:3306)/zwz_test?charset=utf8"

          2、controller

          controllers目錄主要是控制器相關的,我們在controllers中增加pay.go

          package controllers
          
          import (
                  "webDemo/models"
          )
          
          func (c *MainController) PayQuery() {
              AccountID, _ := c.GetInt64("AccountID1")
              payment, _ := models.GetPaymenRec(AccountID)
              c.Data["AccountID"] = payment.AccountID
              c.Data["PartnerID"] = payment.PartnerID
              c.Data["UserID"] = payment.UserID
              c.Data["CreateTime"] = payment.CreateTime
              c.Data["Amount"] = payment.Amount
              c.Data["OuterTradeNo"] = payment.OuterTradeNo
              c.Data["Remark"] = payment.Remark
              c.Data["Status"] = payment.Status
              c.Data["Msg"] = payment.Msg
              c.TplName = "query.html"
          }
          func (c *MainController) PayAdd() {
              var payment models.PaymentRecordStr
              c.ParseForm(&payment)
              pay, _ := models.AddPaymenRec(payment)
              c.Data["AccountID"] = pay.AccountID
              c.Data["PartnerID"] = pay.PartnerID
              c.Data["UserID"] = pay.UserID
              c.Data["CreateTime"] = pay.CreateTime
              c.Data["Amount"] = pay.Amount
              c.Data["OuterTradeNo"] = pay.OuterTradeNo
              c.Data["Remark"] = pay.Remark
              c.TplName = "query.html"
          }

          3、models

          models是存放實體類文件,屬于模型層,負責定義實體類和數據增刪改查的操作。在models目錄下增加pay.go 。

          package models
          
          import (
              "database/sql"
              "errors"
          
              "strconv"
              "time"
          
              "github.com/astaxie/beego"
              _ "github.com/go-sql-driver/mysql"
          )
          
          var Db *sql.DB
          
          type PaymentRecord struct {
              Id           int64
              AccountID    int64
              PartnerID    string
              UserID       string
              CreateTime   string
              Amount       float64
              OuterTradeNo string
              Remark       string
              Status       int
              Msg          string
          }
          type PaymentRecordStr struct {
              AccountID    string
              PartnerID    string
              UserID       string
              CreateTime   string
              Amount       string
              OuterTradeNo string
              Remark       string
          }
          
          func init() {
              dbconn := beego.AppConfig.String("DBConn")
              db, err := sql.Open("mysql", dbconn)
              if err != nil {
                  return
              }
              db.SetMaxOpenConns(2000)
              db.SetMaxIdleConns(0)
              db.Ping()
              Db = db
          }
          
          func Close() {
              if Db != nil {
                  Db.Close()
          
              }
          
          }
          
          func AddPaymenRec(rec PaymentRecordStr) (PaymentRecord, error) {
              var isql = "INSERT pay_demo SET account_id=?,partner_id=?,user_id=?,amount=?,outer_tradeno=?,remark=?"
              AccountID, _ := strconv.ParseInt(rec.AccountID, 10, 64)
              Amount, _ := strconv.ParseFloat(rec.Amount, 64)
              response := PaymentRecord{0, AccountID, rec.PartnerID, rec.UserID, rec.CreateTime, Amount, rec.OuterTradeNo, rec.Remark, 0, ""}
              if Db == nil {
                  return response, errors.New("AddPaymenRec connect mysql failed")
              }
              stmt, _ := Db.Prepare(isql)
              defer stmt.Close()
              beego.Informational("AddPaymenRec rec=%#v", rec)
              res, err := stmt.Exec(AccountID, rec.PartnerID, rec.UserID, Amount, rec.OuterTradeNo, rec.Remark)
              if err == nil {
                  response.Id, _ = res.LastInsertId()
                  response.Status = 1
                  response.Msg = "已生效"
                  return response, nil
              }
          
              return response, nil
          }
          func GetPaymenRec(AccountID int64) (PaymentRecord, error) {
              var qsql = "SELECT * FROM pay_demo WHERE  account_id=?"
              var response PaymentRecord
              response.Msg = "失敗"
              if AccountID != 0 {
                  if Db == nil {
                      return response, errors.New("GetPaymenRec connect mysql failed")
                  }
                  stmt, _ := Db.Prepare(qsql)
                  rows, err := stmt.Query(AccountID)
                  defer rows.Close()
                  if err != nil {
                      return response, err
                  }
                  var timedate string
                  for rows.Next() {
                      err = rows.Scan(&response.Id, &response.AccountID, &response.PartnerID, &response.UserID, &timedate, &response.Amount, &response.OuterTradeNo, &response.Remark)
                      if err != nil {
                          return response, err
                      }
                      DefaultTimeLoc := time.Local
                      loginTime, err := time.ParseInLocation("2006-01-02 15:04:05", timedate, DefaultTimeLoc)
                      if err == nil {
                          unix_time := loginTime.Unix() //time to int64
                          response.CreateTime = time.Unix(unix_time, 0).Format("2006-01-02 15:04:05")
                          response.Status = 2
                          response.Msg = "成功"
                          return response, err
                      } else {
                          return response, err
                      }
                  }
                  return response, nil
              }
              return response, errors.New("GetPaymenRec Requset is non porinter")
          }


          和實體對應的還有數據庫中的表結構,這里我們手動在數據庫中增加pay_demo表,實際上beego封裝了orm,可自動創建對應的表。

          CREATE TABLE `pay_demo` (
            `id` int(64) NOT NULL AUTO_INCREMENT,
            `account_id` int(64) NOT NULL,
            `partner_id` varchar(50) CHARACTER SET utf8 DEFAULT NULL,
            `user_id` varchar(50) CHARACTER SET utf8 DEFAULT NULL,
            `create_time` datetime DEFAULT CURRENT_TIMESTAMP,
            `amount` double DEFAULT '0',
            `outer_tradeno` varchar(50) CHARACTER SET utf8 DEFAULT NULL,
            `remark` varchar(255) CHARACTER SET utf8 DEFAULT NULL,
            PRIMARY KEY (`id`)
          ) ENGINE=InnoDB AUTO_INCREMENT=5024 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

          4、views

          views目錄負責存放前端模板文件。beego支持t4模板,功能非常強大。我們將原有的index.tpl 刪除,增加新的index.html 和query.html

          index.html頁面:

          <!DOCTYPE html>
          
          <html>
          <head>
              <title>webDemo</title>
              <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
          </head>
          
          <body>
          <div>
              <form action="/query" method="Post">
                  <div>
                      GetPaymentBy AccountID:<input  type="text" name="AccountID1" />
                  </div>
          
                  <div>
                      <input type= "submit" name="n" />
                  </div>
              </form>
              <br/>
              <br/>
              <form action="/add" method="Post">
                  <div>
                      AccountID:<input  type="text" name="AccountID" />
                  </div>
                  <div>
                      PartnerID:<input  type="text" name="PartnerID" />
                  </div>
                  <div>
                      UserID   :<input  type="text" name="UserID" />
                  </div>
                  <div>
                      CreateTime:<input  type="text" name="CreateTime" />
                  </div>
                  <div>
                      Amount:<input  type="text" name="Amount" />
                  </div>
                  <div>
                      OuterTradeNo:<input  type="text" name="OuterTradeNo" />
                  </div>
                  <div>
                      Remark:<input  type="text" name="Remark" />
                  </div>
          
                  <div>
                      <input type= "submit" name="add" value="添加"/>
                  </div>
              </form>
          
          </div>
          </body>
          </html>

          query.html頁面:

          <!DOCTYPE html>
          
          <html>
          <head>
            <title>BeegoDemo</title>
            <meta http-equiv="Content-Type" content="text/html; charset=utf-8">  
          </head>
          
          <body>
            <div>        
                  <div>
                      Payment:
                  </div>
                  <div>
                  AccountID:{{.AccountID}}
                  </div>
                  <div>
                  PartnerID:{{.PartnerID}}
                  </div>
                  <div>
                  UserID:{{.UserID}}
                  </div>
                  <div>
                  CreateTime:{{.CreateTime}}
                  </div>
                  <div>
                  Amount:{{.Amount}}
                  </div>
                  <div>        
                  OuterTradeNo:{{.OuterTradeNo}}
                  </div>
                      <div>
                  Remark:{{.Remark}}
                  </div>
                      
          
            </div>
          </body>
          </html>

          5、routers

          routers定義路由,負責整個web系統的頁面請求轉發。同樣,我們創建一個router.go文件,在router.go 中增加以上新增的2個路由

          package routers
          
          import (
              "webDemo/controllers"
              "github.com/astaxie/beego"
          )
          
          func init() {
              beego.Router("/query", &controllers.MainController{}, "Post:PayQuery")        // 新增PayQuery路由
              beego.Router("/add", &controllers.MainController{}, "Post:PayAdd")       // 新增PayAdd路由
              beego.Router("/", &controllers.MainController{})
          }


          運行

          增加完以上代碼之后,重新運行webDemo應用,就可以看到我們新增加的訂單查詢和新增訂單的功能。


          最后

            1. 以上就把beego 的安裝給介紹完了。同時也通過簡單的訂單支付的例子,介紹如何使用beego 開發web應用。

          ·  2. 這里只是對beego 做一個最基本的介紹,想要詳細了解beego 的各種功能,可以去它的官網:https://beego.me

             3. 分享關注(章為忠學架構)完整代碼。


          推薦閱讀:

          Golang 入門系列(十一)從零開始實現一個完整的webapi項目!

          Golang 入門系列(八)如何實現定時任務,極簡版!

          Golang 入門系列(六)理解Go協程Goroutine,這篇就夠了!

          Golang 入門系列(四)Golang中的interface,一看就明白

          Golang 入門系列(三)打好基本功: Golang 語法基礎!

          SpringBoot入門系列(一)如何快速創建SpringBoot項目

          Nginx總結(六)nginx實現負載均衡


          主站蜘蛛池模板: 久久久国产精品无码一区二区三区| 无码人妻精品一区二区| 午夜视频一区二区| 小泽玛丽无码视频一区| 国产乱码精品一区三上| 久久久久国产一区二区三区| 亚洲一区二区三区乱码A| 一区二区三区在线播放| 自拍日韩亚洲一区在线| 亚洲日本va一区二区三区 | 国产激情无码一区二区三区| 日韩AV无码一区二区三区不卡 | 无码精品国产一区二区三区免费 | 国产在线观看一区二区三区| 国产SUV精品一区二区88| 人妻夜夜爽天天爽爽一区| 人妻少妇精品视频一区二区三区| 久久无码一区二区三区少妇| 多人伦精品一区二区三区视频| 国产美女一区二区三区| 在线观看视频一区二区| 福利片免费一区二区三区| 三上悠亚一区二区观看| 久久国产免费一区二区三区| 亚洲va乱码一区二区三区| 78成人精品电影在线播放日韩精品电影一区亚洲 | 国产av熟女一区二区三区| 久久无码人妻一区二区三区| 亚洲精品无码一区二区| 在线视频一区二区日韩国产| 精品成人av一区二区三区| 久久国产精品最新一区| 日韩精品一区二区三区中文版| 国产激情精品一区二区三区 | 国产日韩视频一区| 国产亚洲自拍一区| 久久一区二区精品| 亚洲日本一区二区三区在线不卡| 久久福利一区二区| 国产日韩高清一区二区三区| 国产综合精品一区二区|