和lock一塊兒學beego 博客系統開發爲例(六)

接着上篇來寫《和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}})

在模板中{{方法別名 參數}},就能夠了!

 

好了,今天就寫到這裏吧,下篇主要介紹:

一、單圖上傳

二、多圖上傳

相關文章
相關標籤/搜索