go+beego框架开发博客首页功能流程步骤

2023-06-01 00:00:00 框架 步骤 首页

上一篇自定义函数也是铺垫开发首页的知识点,像首尾分离,分页等,后续首页功能开发的必须知识点会在这文中写出来


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的持久化


相关文章