博客项目环境搭建和Model设计

版权声明:本文为博主尹成联系QQ77025077,微信18510341407原创文章,欢迎转载侵权不究。 https://blog.csdn.net/yincheng01/article/details/84068828 #准备工作: a.下载goland,...

版权声明:本文为博主尹成联系QQ77025077,微信18510341407原创文章,欢迎转载侵权不究。 https://blog.csdn.net/yincheng01/article/details/84068828

#准备工作:

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

  • 发表于 2018-11-14 16:53
  • 阅读 ( 651 )
  • 分类:默认分类

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
不写代码的码农
Kemin

架构工程师

45 篇文章

作家榜 »

  1. Kemin 45 文章
  2. golanglover 5 文章
  3. D.Chen 4 文章
  4. salamander 1 文章
  5. 深圳-伟 1 文章
  6. 广训 1 文章
  7. PHP小菜 1 文章
  8. Undefined 0 文章