部落格專案環境搭建和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
相關文章
- Mac環境下搭建Octopress部落格Mac
- Vue部落格專案Vue
- 基於.NetCore開發部落格專案 StarBlog - (2) 環境準備和建立專案NetCore
- 黑馬部落格——詳細步驟(十)專案功能的實現之開發環境與生產環境開發環境
- Maven環境搭建和介紹Maven
- Flutter 即學即用系列部落格——01 環境搭建Flutter
- 【SSH專案實戰】國稅協同平臺-2.環境搭建和整合
- 部落格專案前臺實現
- androidNDK環境的搭建和使用Android
- 從0到1搭建和部署個人部落格
- 基於.NetCore開發部落格專案 StarBlog - (3) 模型設計NetCore模型
- pycharm新建專案環境設定詳解PyCharm
- 部落格連結—程式設計程式設計
- Vue搭建專案環境Vue
- django專案開發實戰——部落格Django
- Django手擼一個部落格專案Django
- 個人部落格專案筆記_01筆記
- 個人部落格專案筆記_05筆記
- 個人部落格專案筆記_06筆記
- 個人部落格專案筆記_07筆記
- Flutter開發環境搭建和除錯Flutter開發環境除錯
- Android systrace環境的搭建和使用Android
- FastAPI專案實戰: 個人部落格專案的APIASTAPI
- 【單頁面部落格從前端到後端】環境搭建前端後端
- 都說搭部落格簡單,鬼知道後端程式設計師要經歷什麼!後端程式設計師
- 原型設計工具個人部落格原型
- 一個專為程式設計師設計的精緻 Java 部落格系統程式設計師Java
- 分享一個我的 Django 部落格專案Django
- Python——個人部落格專案開發Python
- Windows Phone 專案實戰之部落格園Windows
- 從零搭建和配置OSX開發環境開發環境
- Mac下git的環境搭建和基本使用MacGit
- Jbpm4環境搭建和整合SpringSpring
- WebSphere MQ傳輸環境搭建和測試WebMQ
- Django搭建個人部落格:在Windows中搭建開發環境DjangoWindows開發環境
- Streamsets專案git環境搭建Git
- 軟體工程課程設計個人部落格與團隊部落格軟體工程
- Django搭建個人部落格:編寫部落格文章的Model模型Django模型