和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}})

在模板中{{方法别名 参数}},就能够了!

 

好了,今天就写到这里吧,下篇主要介绍:

一、单图上传

二、多图上传

相关文章
相关标签/搜索