接着上篇來寫《和lock一塊兒學beego 博客系統開發爲例(五)》html
這篇主要完成如下事項:mysql
下篇咱們要完成下面三個任務:git
一、第三方工具方法的定義github
二、mysql全局的定義及全局初始化方法定義與使用sql
三、在模板中如何使用本身方法數據庫
1、第三方工具方法的定義curl
咱們在作一個項目的時候,每每會寫一些共用的方法或工具,在beego裏如何去實現呢?首先看一下博客的目錄結構:tcp
紅色框,就是咱們定義的方法文件。你也能夠根據本身的須要進行方法命名,如curl.go, smtp.go etc.這裏咱們相關方法都放到一個叫function的方法中,詳情請看:函數
package utils import ( "crypto/md5" "crypto/rand" "encoding/base64" "encoding/hex" "io" "math/big" "net/smtp" //"strconv" "fmt" "regexp" "strings" "time" "github.com/astaxie/beego" ) //md5方法 func GetMd5String(s string) string { h := md5.New() h.Write([]byte(s)) return hex.EncodeToString(h.Sum(nil)) } //Guid方法 func GetGuid() string { b := make([]byte, 48) if _, err := io.ReadFull(rand.Reader, b); err != nil { return "" } return GetMd5String(base64.URLEncoding.EncodeToString(b)) } //字串截取 func SubString(s string, pos, length int) string { runes := []rune(s) l := pos + length if l > len(runes) { l = len(runes) } return string(runes[pos:l]) } func GetFileSuffix(s string) string { re, _ := regexp.Compile(".(jpg|jpeg|png|gif|exe|doc|docx|ppt|pptx|xls|xlsx)") suffix := re.ReplaceAllString(s, "") return suffix } /* * to: example@example.com;example1@163.com;example2@sina.com.cn;... * subject:The subject of mail * body: The content of mail */ func SendMail(to string, subject string, body string) error { user := beego.AppConfig.String("adminemail") password := beego.AppConfig.String("adminemailpass") host := beego.AppConfig.String("adminemailhost") hp := strings.Split(host, ":") auth := smtp.PlainAuth("", user, password, hp[0]) var content_type string content_type = "Content-type:text/html;charset=utf-8" msg := []byte("To: " + to + "\r\nFrom: " + user + "<" + user + ">\r\nSubject: " + subject + "\r\n" + content_type + "\r\n\r\n" + body) send_to := strings.Split(to, ";") err := smtp.SendMail(host, auth, user, send_to, msg) return err } func RandInt64(min, max int64) int64 { maxBigInt := big.NewInt(max) i, _ := rand.Int(rand.Reader, maxBigInt) if i.Int64() < min { RandInt64(min, max) } return i.Int64() } func GetDate(timestamp int64) string { tm := time.Unix(timestamp, 0) return tm.Format("2006-01-02 15:04") } func GetDateMH(timestamp int64) string { tm := time.Unix(timestamp, 0) return tm.Format("01-02 03:04") } func GetGravatar() string { i := RandInt64(1, 5) return "/static/img/avatar/" + fmt.Sprintf("%d", i) + ".jpg" }
咱們在這裏定義好了這些方法後,咱們如何使用呢?工具
其實很簡單,咱們在控制器裏只要引用它就能夠:
package controllers import ( //"fmt" "blog/utils" "io" //"net/http" "os" "strconv" "strings" "time" "github.com/astaxie/beego" )
引用後,在方法體中直接utils.方法,就能夠。如:
ext := utils.SubString(filename, strings.LastIndex(filename, "."), 5)
是否是很簡單?
2、mysql全局的定義及全局初始化方法定義與使用
首先看一張圖:
咱們初始化的一些方法,直接寫在一個文件夾中,initial中,數據庫的初始化是必需要進行的。
代碼在前面的章節中也有介紹:
package initial import ( "fmt" "github.com/astaxie/beego" "github.com/astaxie/beego/orm" _ "github.com/go-sql-driver/mysql" ) func InitSql() { user := beego.AppConfig.String("mysqluser") passwd := beego.AppConfig.String("mysqlpass") host := beego.AppConfig.String("mysqlurls") port, err := beego.AppConfig.Int("mysqlport") dbname := beego.AppConfig.String("mysqldb") if nil != err { port = 3306 } orm.Debug = true orm.RegisterDriver("mysql", orm.DRMySQL) //orm.RegisterDataBase("default", "mysql", "root:@/blog?charset=utf8", 30) orm.RegisterDataBase("default", "mysql", fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8", user, passwd, host, port, dbname)) }
引用了配置文件定義的變量,註冊數據庫。那麼問題來了,註冊好後,咱們如何使用呢?
在上面的圖片中,我看到init.go這個文件,初始化中間又加了一層過分。init.go代碼以下:
package initial func init() { InitSql() InitTplFunc() }
爲何要放在init這個方法體了,由於go加載方法有順序了的。main(),init()....具體能夠看一下go文檔
這樣,咱們就能夠在主入口文件中加載了main.go,以下:
package main import ( _ "blog/routers" _ "blog/initial" "fmt" "html/template" "net/http" "github.com/astaxie/beego" ) func main() { beego.ErrorHandler("404", page_not_found) beego.Run() }
能夠看到咱們在引用的時候,前面加了一個下劃線,下劃線的意思就是隻引用init裏的方法。
3、在模板中如何使用本身方法
咱們常常會定義一些方法,在模板視圖中引用,由於自帶的模板方法不能知足咱們的使用,咱們要定義一些與項目自己有聯繫的模板函數。在上面的的代碼中你們看到了tplfunc了。初始化引用上面已經介紹,咱們看一下代碼:
package initial import ( "blog/utils" "github.com/astaxie/beego" ) func InitTplFunc() { beego.AddFuncMap("date_mh", utils.GetDateMH) beego.AddFuncMap("date", utils.GetDate) beego.AddFuncMap("avatar", utils.GetGravatar) }
有沒有發現,咱們是引用untils下的方法,重寫取了一個名子,用AddFuncMap來映射。那麼如何在模板中使用呢?
{{$v.Title}}({{date $v.Created}})
在模板中{{方法別名 參數}},就能夠了!
好了,今天就寫到這裏吧,下篇主要介紹:
一、單圖上傳
二、多圖上傳