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 優勢
語法簡單:語法簡潔,新手入門簡單,開發應用性能高。
便于維護:強類型靜態語言,便于項目的重構和維護。
部署方便:編譯的可執行二進制文件,在執行時,不需要部署環境,把編譯文件上傳,就完成了項目的部署。
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
注意:
創建一個名為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實現負載均衡
*請認真填寫需求信息,我們會在24小時內與您取得聯系。