Golang 入門系列(十三)介紹一個非常強大的web框架-Beego

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


介紹

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

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


安裝

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

<code>$ go get github.com/astaxie/beego
$ go get github.com/beego/bee/<code>

  注意:

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


創建應用

  創建一個名為webDemo的應用

<code>$ bee new webDemo     //創建一個web應用
$ bee api webDemo //創建一個api應用/<code>
Golang 入門系列(十三)介紹一個非常強大的web框架-Beego

 

編譯運行

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

<code>$ bee run/<code>

 

Golang 入門系列(十三)介紹一個非常強大的web框架-Beego

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

Golang 入門系列(十三)介紹一個非常強大的web框架-Beego


項目結構

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

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


1、conf

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

<code>appname = webDemo
httpport = 8080
runmode = dev

DBConn="root:root@tcp(localhost:3306)/zwz_test?charset=utf8"/<code>

2、controller

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

<code>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"
}/<code>

3、models

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

<code>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")
}/<code>


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

<code>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;/<code>

4、views

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

index.html頁面:

<code>



<title>webDemo/<title>














/<code>

query.html頁面:

<code>



<title>BeegoDemo/<title>






Payment:


AccountID:{{.AccountID}}


PartnerID:{{.PartnerID}}


UserID:{{.UserID}}


CreateTime:{{.CreateTime}}


Amount:{{.Amount}}


OuterTradeNo:{{.OuterTradeNo}}


Remark:{{.Remark}}





/<code>

5、routers

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

<code>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{})
}/<code>


運行

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

Golang 入門系列(十三)介紹一個非常強大的web框架-Beego


最後

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

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

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



分享到:


相關文章: