接着上篇来写《和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}})
在模板中{{方法别名 参数}},就能够了!
好了,今天就写到这里吧,下篇主要介绍:
一、单图上传
二、多图上传