内容简介:版权声明:本文为博主尹成联系QQ77025077,微信18510341407原创文章,欢迎转载侵权不究。 https://blog.csdn.net/yincheng01/article/details/84068810
版权声明:本文为博主尹成联系QQ77025077,微信18510341407原创文章,欢迎转载侵权不究。 https://blog.csdn.net/yincheng01/article/details/84068810
#项目前台整体页面
在layout.html页面通过 LayoutContent 组合了 index.html
,通过 LayoutSections 组合了 head.html
, banner.html
, middle.html
, right.html
, foot.html
。具体实现了首页,关于我,成长录,碎言碎语,最新文章,点击排行,友情连接的展示。
#首页
由于首页是由多个页面而组成的,所以展示首页,需要分析各个页面是如何组合的以及各个页面需要展示哪些数据,这些数据我们需要从数据库或配置文件中获取,获取到数据之后需要将这些数据添加到模板数据中,然后前台页面在获取这些数据之后就可以从模板数据中获取相应的数据经过渲染将数据展示出来。
由于之后的关于我,成长录,碎言碎语等页面都是通过layout.html组合的,所以需要将layout.html中的数据放在Prepare函数中,在处理各个请求的时候需要先执行Prepaer函数,就可以将这些公共数据存入模板数据中了。所以在Prepare函数中从配置文件中获得了title,keywords,description并存入了模板数据中。然后设置过滤条件,主要是过滤出正常状态的博文并按id降序排列从数据库中查询出博文信息,根据前台页面的要求将数据依次存入到了模板数据中,此处需要注意的坑点是:在前台页面某些数据我是从后台函数中获取的,并不是从结构体的字段中获取的,大部分人可能存在思维定势,认为页面的数据都是通过结构体的字段展示出来的,其实这是不正确的,完全可以从函数中获取,因为在beego中,前台页面是可以调用后台的函数的。
func (this *MainController) Index() { this.display("index") //设置头部公共信息 this.setHeadMeater() //设置网站右侧部分 this.setRight() //创建文章切片,用于存储查询结果 var list []*models.Post //创建文章结构体 post := models.Post{} //获得tb_post表的句柄 query := orm.NewOrm().QueryTable(&post).Filter("status", 0) //获得符合条件的记录数 //SELECT COUNT(*) FROM tb_post WHERE STATUS = 0 count, _ := query.Count() //设置总的记录数 this.Pager.SetTotalnum(int(count)) //设置rootpath //fmt.Sprintf("<a href='%s'>%d</a>", this.url(i), i) this.Pager.SetUrlpath("/index%d.html") //判断记录数是否大于0 if count > 0 { //将分页查询的结果按文章是否置顶,浏览量降序排列 //SELECT * FROM tb_post ORDER BY istop DESC, views DESC LIMIT num1,num2; num1为偏移量,num2为记录数 _, err := query.OrderBy("-istop", "-views").Limit(this.Pager.Pagesize, (this.Pager.Page - 1)*this.Pager.Pagesize).All(&list) //处理错误 if err != nil { fmt.Println("err = ", err) } } //为模板数据赋值 this.Data["list"] = list this.Data["pagebar"] = this.Pager.ToString() }
#关于我
关于我这个页面的效果图如下:
该页面主要展示了我的个人信息,这个页面也是通过组合在layout.html中展示出来的,其中我的个人信息是写在配置文件中的,然后在后台获取配置文件中的信息并存入到模板数据中在前台页面展示。如果大家有什么问题不懂欢迎大家点击“ 给我写信 ”来给我发邮件,或者通过首页的二维码添加我的微信也是可以的,我会在第一时间为大家解答的。
func (this *MainController) About() { this.display("about") this.setHeadMeater() }
#成长录
成长录这个页面的效果图如下:
func (this *MainController) BlogList() { this.display("life") //设置头部公共信息 this.setHeadMeater() //设置网站右侧部分 this.setRight() //创建文章指针结构体,用于存储查询结果 var list []*models.Post //获得tb_post表的句柄并指定过滤条件(状态正常) query := orm.NewOrm().QueryTable(new(models.Post)).Filter("status", 0) //获得符合条件的记录数 //SELECT COUNT(*) FROM tb_post WHERE STATUS = 0 count, _ := query.Count() //判断记录数是否大于0 if count > 0 { //将分页查询的结果按照是否置顶,发布时间降序排列 //SELECT * FROM tb_post ORDER BY istop DESC, posttime DESC LIMIT num1,num2; num1为偏移量,num2为记录数 query.OrderBy("-istop", "-posttime").Limit(this.Pager.Pagesize, (this.Pager.Page-1)*this.Pager.Pagesize).All(&list) } this.Data["list"] = list //设置rootpath this.Pager.SetUrlpath("/life%d.html") //设置总数量 this.Pager.SetTotalnum(int(count)) this.Data["pagebar"] = this.Pager.ToString() }
这个页面主要展示了博文,最新文章,点击排行,友情链接等信息,其中博文的展示和首页大致类似,其中的最新文章在查询数据库的时候根据文章的发布时间进行倒序 排序 就可以了,点击排行根据文章的点击量倒序排序,整体上没有比较复杂的逻辑。
#碎言碎语
碎言碎语这个页面的效果图如下:
func (this *MainController) Mood() { this.display("mood") //设置头部公共信息 this.setHeadMeater() //创建切片,用于存储查询结果 var list []*models.Mood //获得tb_post表的句柄 query := orm.NewOrm().QueryTable(new(models.Mood)) //获得符合条件记录的数量 //SELECT COUNT(*) FROM tb_mood; count, _ := query.Count() //判断数量是否大于0 if count > 0 { //将分页查询的结果按照文章发布时间降序排列 //SELECT * FROM tb_mood ORDER BY posttime DESC LIMIT num1,num2; num1为偏移量,num2为记录数 query.OrderBy("-posttime").Limit(this.Pager.Pagesize, (this.Pager.Page - 1)*this.Pager.Pagesize).All(&list) } this.Data["list"] = list //设置总数量 this.Pager.SetTotalnum(int(count)) //设置rootpath this.Pager.SetUrlpath("/mood%d.html") //分页导航栏 this.Data["pagebar"] = this.Pager.ToString() }
该页面主要将碎言碎语(类似于QQ的说说,微信的朋友圈)从数据库中查询出来展示在前台页面,这里为了显示出分页的效果我故意设置每页显示两条碎言碎语,分页的请求数据主要是在Prepare函数中获取的,因为在首页展示博文的时候也是需要分页展示的,所以统一在Prepare函数中处理。
#博文详情展示
博文详情页面效果图如下:
该页面主要展示博文的详情,在用户点击某篇文章的时候会将文章的id提交到后台,在后台获取id在数据库中根据id进行查询,将对应的数据存入模板数据就可以了。
func (this *MainController) Show() { this.display("article") //设置头部公共信息 this.setHeadMeater() //设置网站右侧部分 this.setRight() //获取文章id并转换为整数 id, err := strconv.Atoi(this.Ctx.Input.Param(":id")) //处理错误 if err != nil { this.Redirect("/404", 302) } //创建文章结构体 post := new(models.Post) //将获取到的文章id赋值给文章结构体 post.Id = id //按照文章id查询 err = post.Read() //处理错误 if err != nil { this.Redirect("/404", 302) } //浏览加一 post.Views++ //更新浏览量 post.Update("Views") //为模板数据赋值 this.Data["post"] = post //获取上一篇文章(文章id小于当前文章的id)和下一篇文章(文章id大于当前文章的id) pre, next := post.GetPreAndNext() this.Data["pre"] = pre this.Data["next"] = next this.Data["smalltitle"] = "文章详情" }
学院 Go 语言视频主页
https://edu.csdn.net/lecturer/1928扫码获取海量视频及源码 QQ群:721929980
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
深度探索C++对象模型
斯坦利•B.李普曼 (Stanley B. Lippman) / 侯捷 / 电子工业出版社 / 2012-1 / 69.00元
作者Lippman参与设计了全世界第一套C++编译程序cfront,这本书就是一位伟大的C++编译程序设计者向你阐述他如何处理各种explicit(明确出现于C++程序代码中)和implicit(隐藏于程序代码背后)的C++语意。 本书专注于C++面向对象程序设计的底层机制,包括结构式语意、临时性对象的生成、封装、继承,以及虚拟——虚拟函数和虚拟继承。这本书让你知道:一旦你能够了解底层实现模......一起来看看 《深度探索C++对象模型》 这本书的介绍吧!