Beego框架:部落格專案環境搭建和Model設計
#準備工作:
a.下載goland,安裝go環境,在mysql建立資料庫beego_blog,然後匯入beego_blog.sql
b.然後安裝beego和開發工具
go get -u github.com/astaxie/beego
go get -u github.com/beego/bee
c.或許還需要安裝go-mysql的驅動
go get github.com/go-sql-driver/mysql
c.然後在你的gopath的src目錄下執行:
bee new beego_blog
然後看見自動建立的beego_blog資料夾,進入beego_blog資料夾,將預設的static資料夾和views資料夾替換成自己的static資料夾和views資料夾,並執行:
bee run
訪問http://localhost:8080/
出現welcome to beego畫面表示準備工作完成,然後就可以開始我們的開發了。
#Mode設計
##表結構分析
根據sql指令碼分析可得出表之間的關係如下:
tb_link:友情連結表 id:主鍵,自增長 sitename:網站名稱 url:網址 rank:排序值 tb_mood:說說表 id:主鍵,自增長 content:說說內容 cover:說說封面 posttime:發表時間 tb_post:文章表 id:主鍵,自增長 userid:建立者id author:作者 title:標題 color:標題的顏色 content:文章的內容 tags:標籤名稱(所屬分類) views:瀏覽量 status:狀態 posttime:釋出時間 updated:更新時間 istop:是否置頂 cover:封面 tb_tag:標籤表 id:主鍵,自增長 name:名稱 count:文章數量 tb_tag_post:標籤文章表 id:主鍵,自增長 tagid:標籤id postid:文章id poststatus:狀態 posttime:發表時間 tb_user:管理員表 id:主鍵,自增長 username:使用者名稱 password:密碼 email:郵箱 logincount:登陸次數 authkey: active:是否啟用
tb_post表和tb_tag表之間的關係:
文章表和標籤表之間是多對多的關係,因為某一篇文章(go語言陣列)可以屬於多個標籤(go,陣列),然而某個標籤中可以存在多篇文章。
1.根據文章id查詢其對應的一個分類,首先在標籤文章表中找到該文章id所對應的標籤id,然後去標籤表中根據標籤id查詢對應的記錄。
2.根據標籤id查詢該標籤下的所有文章,首先在標籤文章表中找到對應文章id(11,12,16,22,23),在文章表中根據這些文章id查詢對應的記錄(select * from tb_post where id in (11, 12,16,22,23))
##設定配置檔案
當我們在建立專案的時候,bee哦已經在app.conf檔案中為我們配置了一些預設資訊,但是這些資訊對於我們這個部落格專案來說遠遠不夠,需要我們自己去配置相關的資訊,例如:連線資料庫的資訊,網站頭部資訊等等。
appname = beego_blog
httpport = 8080
runmode = dev
dbprefix = tb_
dbhost = 127.0.0.1
dbport = 3306
dbuser = root
dbpassword = 111111
dbname = beego_blog
title = 兄弟連
keywords = 區塊鏈學院
description = 兄弟連區塊鏈學院成立於2018年7月1日
version = 1.0
##建立model
根據上面的表結構,在我們的專案中的models檔案下建立專案的model,這些model和資料庫中的表一一對應,在我們以後和資料的互動過程中扮演著重要角色,因為它們是我們專案和資料庫互動的資料的載體,主要檔案見下圖:
其中base.go主要是獲取配置檔案中和資料庫連線相關的資訊,例如:登入密碼,使用者名稱等等,在獲得這些資訊之後註冊模型,註冊資料庫,和資料連線。
package models
import (
"github.com/astaxie/beego"
"github.com/astaxie/beego/orm"
_ "github.com/go-sql-driver/mysql"
"crypto/md5"
"fmt"
)
func init() {
dbhost := beego.AppConfig.String("dbhost")
dbport := beego.AppConfig.String("dbport")
dbuser := beego.AppConfig.String("dbuser")
dbpassword := beego.AppConfig.String("dbpassword")
dbname := beego.AppConfig.String("dbname")
dburl := dbuser + ":" + dbpassword + "@tcp(" + dbhost + ":" + dbport + ")/" + dbname + "?charset=utf8"
// set default database
orm.RegisterDataBase("default", "mysql", dburl, 30)
// register model
orm.RegisterModel(new(Link), new(Mood), new(Post), new(Tag), new(TagPost), new(User))
}
Pager.go主要封裝的是和分頁相關的資訊,例如:當前頁碼,每頁顯示的文章的數量等資訊,其中ToString方法是核心,首先通過計算得出所要顯示的頁碼,然後通過迴圈將頁碼和對應的rootpath寫入a標籤中,最後轉換為字串返回。
package models
import (
"bytes"
"fmt"
)
type Pager struct {
Page int //第幾頁
Pagesize int //每頁大小
Totalnum int//總頁數
urlpath string //每頁所對應的url
}
//建立Pager物件
func NewPager(page, pagesize, totalnum int, urlpath string) *Pager {
pager := new(Pager)
pager.Page = page
pager.Pagesize = pagesize
pager.Totalnum = totalnum
pager.urlpath = urlpath
return pager
}
//修改page
func (this *Pager) SetPage(page int) {
this.Page = page
}
//修改pagesize
func (this *Pager) SetPagesize(pagesize int) {
this.Pagesize = pagesize
}
//設定總數量
func (this *Pager) SetTotalnum(totalnum int) {
this.Totalnum = totalnum
}
//設定rootpath
func (this *Pager) SetUrlpath(urlpath string) {
this.urlpath = urlpath
}
func (this *Pager) url(page int) string {
return fmt.Sprintf(this.urlpath, page)
}
func (this *Pager) ToString() string{//str2html
//文章的總數量小於等於每頁顯示的文章的數量
if this.Totalnum <= this.Pagesize {
return ""
}
//偏移量
offset := 5
//顯示10個頁碼
linknum := 10
var totalpage int
var from int//從哪一頁開始顯示
var to int //顯示到哪一頁
if this.Totalnum % this.Pagesize != 0 {
totalpage = this.Totalnum / this.Pagesize + 1
}else {
totalpage = this.Totalnum / this.Pagesize
}
//總的頁碼小於10,直接從第一頁顯示到最後一頁
if totalpage < linknum {
from = 1
to = totalpage
}else {
//計算開始顯示的頁碼
from = this.Page - offset
//計算結束頁碼
to = from + linknum
//判斷開始頁碼是否小於1
if from < 1 {
from = 1
//結束頁根據開始頁來計算,1+10-1
to = from + linknum - 1
}else if to > totalpage {//結束頁大於總頁數
to = totalpage
from = to - linknum + 1//20 - 10 + 1 = 11(11-20)
}
}
//開闢空間
var buf bytes.Buffer
buf.WriteString("<div class='page'>")
//上一頁
if this.Page > 1 {
buf.WriteString(fmt.Sprintf("<a href='%s'>«</a>", this.url(this.Page-1)))//<<
}
for i := from; i <= to; i++ {
if i == this.Page {
//<b> 標籤規定粗體文字。
buf.WriteString(fmt.Sprintf("<b>%d</b>", i))
}else {
buf.WriteString(fmt.Sprintf("<a href='%s'>%d</a>", this.url(i), i))
}
}
//設定下一頁標籤
if this.Page < totalpage {
buf.WriteString(fmt.Sprintf("<a href='%s'>»</a>", this.url(this.Page+1)))//>>
}
buf.WriteString("</div>")
str := buf.String()
return str
}
其他的model中內容是和資料庫意義對應的,完整程式碼可在github上獲取。
學院Go語言視訊主頁
https://edu.csdn.net/lecturer/1928
清華團隊帶你實戰區塊鏈開發
掃碼獲取海量視訊及原始碼 QQ群:721929980