go+beego框架开发博客首页功能流程步骤
管理员 发布于 3年前   877
上一篇自定义函数也是铺垫开发首页的知识点,像首尾分离,分页等,后续首页功能开发的必须知识点会在这文中写出来
1.首先 路由 首页不用说默认是/ 根目录
在routers目录router.go文件中添加
//首页
beego.Router("/", &controllers.IndexController{})
2.添加首页控制器
在controllers目录下创建index.go文件
都是orm操作,首页我就没写model了,主要是方便,还有一个分页
2.1 分页 (这个单独写一下,其他的我就粘贴全部首页控制器代码了)
在models目录下创建pages.go文件 专门处理分页页数值
package models
import (
"math"
_ "github.com/go-sql-driver/mysql"
)
//分页方法,根据传递过来的页数,每页数,总数,返回分页的内容 7个页数 前 1,2,3,4,5 后 的格式返回,小于5页返回具体页数
func Paginator(page, prepage int, nums int) map[string]interface{} {
var firstpage int //前一页地址
var lastpage int //后一页地址
//根据nums总数,和prepage每页数量 生成分页总数
totalpages := int(math.Ceil(float64(nums) / float64(prepage))) //page总数
if page > totalpages {
page = totalpages
}
if page = totalpages-5 && totalpages > 5: //最后5页
start := totalpages - 5 + 1
firstpage = page - 1
lastpage = int(math.Min(float64(totalpages), float64(page+1)))
pages = make([]int, 5)
for i, _ := range pages {
pages[i] = start + i
}
case page >= 3 && totalpages > 5:
start := page - 3 + 1
pages = make([]int, 5)
firstpage = page - 3
for i, _ := range pages {
pages[i] = start + i
}
firstpage = page - 1
lastpage = page + 1
default:
pages = make([]int, int(math.Min(5, float64(totalpages))))
for i, _ := range pages {
pages[i] = i + 1
}
firstpage = int(math.Max(float64(1), float64(page-1)))
lastpage = page + 1
}
paginatorMap := make(map[string]interface{})
paginatorMap["pages"] = pages
paginatorMap["totalpages"] = totalpages
paginatorMap["firstpage"] = firstpage
paginatorMap["lastpage"] = lastpage
paginatorMap["currpage"] = page
return paginatorMap
}
2.2 首页控制器全部代码
package controllers
import (
"fmt"
"gblog/models"
"strconv"
"github.com/astaxie/beego"
"github.com/astaxie/beego/orm"
_ "github.com/go-sql-driver/mysql"
)
type IndexController struct {
beego.Controller
}
func (c *IndexController) Get() {
c.Data["title"] = "Go编程_beego_常用PHP框架_前端后端分享交流-侯体宗的博客"
c.Data["keywords"] = "Go编程_beego_常用PHP框架_前端后端分享交流"
c.Data["description"] = "个人博客,侯体宗的博客,Go编程,beego框架,侯体宗的博客常用框架及前端后端分享交流"
o := orm.NewOrm()
//分类列表
var cats []orm.Params
catssql := `select cat.cat_id,cat.catname,count(art.cat_id) as num from cat inner join art on art.cat_id = cat.cat_id group by art.cat_id`
o.Raw(catssql).Values(&cats)
c.Data["cats"] = cats
//当前页码
page, err := c.GetInt("page")
if err != nil {
page = 1
println(err)
}
//文章总条数
var count []orm.Params
numssql := `select count(*) as count from art where is_state=0 and is_del=1 order by art_id desc`
o.Raw(numssql).Values(&count)
nums := count[0]["count"]
// 这里先显示转换,.(string) 把interface转换成string类型,再利用strconv.Atoi把string 转换成int
cnt, _ := strconv.Atoi(nums.(string))
//当前页 每页条数 总条数
var pageSize int
pageSize = 30
pages := models.Paginator(page, pageSize, cnt)
c.Data["pages"] = pages
//文章列表 分页数据
var arts []orm.Params
artssql := `select art_id,title,content,pubtime,view,cat_id from art where is_state=0 and is_del=1 order by art_id desc limit ?,?`
o.Raw(artssql, (page-1)*pageSize, pageSize).Values(&arts)
c.Data["arts"] = arts
//文章归档 格式:2017年01月
var artdates []orm.Params
artdatessql := `select pubtime,FROM_UNIXTIME( pubtime,'%Y-%m') as time ,count(*) as num FROM art where is_state=0 and is_del=1 group by time`
o.Raw(artdatessql).Values(&artdates)
c.Data["artdates"] = artdates
//标签云
var tags []orm.Params
tagssql := `select tag_id,tagname FROM tag group by tagname order by tag_id desc limit 50`
o.Raw(tagssql).Values(&tags)
c.Data["tags"] = tags
fmt.Printf("%v", pages)
//c.Data["json"] = tags
//c.ServeJSON()
c.TplName = "index.html"
}
3.view 这包括首尾分离模板页面 官网介绍两种方式 一种是layout 还有就是下面这种
3.1 首尾分离模板页面 在views目录下创建pubcli目录 并在底下创建header/footer.html文件
{{template "public/header.html" .}}
中间内容 不要问为什么用这种 一个字熟 两个字习惯
{{template "public/footer.html" .}}
3.2 中间html 就是控制器渲染的 c.TplName = "index.html"
在views目录下创建index.html文件 全部代码我就不贴了,只贴分页列表段代码
{{template "public/header.html" .}}
<div class="row clearfix">
<div class="col-md-8 column">
<ul class="nav nav-tabs">
<li class="active"><a href="/">最新</a></li>
<li class=""><a href="?q=hot">最热</a></li>
<li class="disabled"><a href="#">问答</a></li>
<li class="dropdown pull-right">
<a href="#" data-toggle="dropdown" class="dropdown-toggle">下拉<strong class="caret"></strong></a>
<ul class="dropdown-menu">
<li><a href="#">操作</a></li>
<li><a href="#">设置栏目</a></li>
<li><a href="#">更多设置</a></li>
<li class="divider"></li>
<li><a href="#">分割线</a></li>
</ul>
</li>
</ul>
<div class="list-group">
{{range $ind, $elem := .arts}}
<a href="/art/390" class="list-group-item"><span style="float:right;color:#999;"><i class="icon ion-eye"></i> {{$elem.view}} | <small>{{FormatDate $elem.pubtime}}</small></span>{{$elem.title}}</a>
{{end}}
</div>
<ul class="pagination">
<li><a href="?page={{.pages.firstpage}}" class="btn btn-large"> 上一页 </a></li>
<li><a href="">{{.pages.currpage}}</a></li>
<li><a href="?page={{.pages.lastpage}}"> 下一页 </a></li>
<li><a href="?page={{.pages.totalpages}}"> 尾页 </a></li>
</ul>
</div>
<div class="col-md-4 column">
<p class="h-block">
<strong>该博客于2020-9-28日,后端基于laravel8框架开发<br>前端页面使用Bootstrap可视化布局系统自动生成</strong><br>
<small>是我仿的原来我的TP5框架写的博客,比较粗糙,底下是入口</small><br>
<a href="https://www.zongscan.com/">侯体宗的博客</a>
</p>
{{template "public/footer.html" .}}
首页基本展示完,效果就不贴图了,就是本网站的首页布局基本一样
后续就写登录功能的session/cookie的持久化
请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!
该博客于2020-12-7日,后端基于go语言的beego框架开发
前端页面使用Bootstrap可视化布局系统自动生成
是我仿的原来我的TP5框架写的博客,比较粗糙,底下是入口
侯体宗的博客
文章标签
友情链接