部落格專案環境搭建和Model設計

尹成發表於2018-11-14

#準備工作:
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'>&laquo;</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'>&raquo;</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
在這裡插入圖片描述

相關文章