版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_33781658/article/details/85719042
beego代码分析
//展示首页
func (this *ArticleController) ShowIndex() {
//从session中取出userName
userName := this.GetSession("userName")
//如果userName为nil,就说明没有登录
//那么就redirect重定向到login页面
if userName == nil {
this.Redirect("/login", 302)
return
}
//对userName进行类型断言
//如果userName是string类型,就会返回userName的值
//那么就放入this的Data中
this.Data["userName"] = userName.(string)
//获取orm对象
o := orm.NewOrm()
//指定Article表
qs := o.QueryTable("Article")
//定义一个容器
var articles []models.Article
//定义一个每页显示条目数
page := 3
//从前端获取pageIndex值
//如果没有pageIndex值,就赋一个1,也就是当前是第一页
pageIndex, err := this.GetInt("pageIndex")
if err != nil {
pageIndex = 1
}
//然后往Data中存入pageIndex
this.Data["pageIndex"] = pageIndex
//如果是第一页,start为0
//如果是第二页,start为page
//如果是第三页,start为page*2
//如果是第 n页,start为page*(n-1)
//所以 start := page * (pageIndex -1)
start := page * (pageIndex - 1)
//获取选中的类型select
typeName := this.GetString("select")
var count int64
var err1 error
//如果typeName为"",也就是现在还没有指定typeName
//也就是当前还没有选择类型
if typeName == "" {
//用qs对象执行Limit方法,从start开始选出page条记录
//比如,从0开始,取出3条,0,1,2 或者从3开始,取出3条 3,4,5
//再调用RelatedSel方法,这里的qs对象是前面调用QueryTable("Article")得到的
//那么这里调用RelatedSel将Article表与ArticleType表进行关联,
//然后再调用All进行查询
qs.Limit(page, start).RelatedSel("ArticleType").All(&articles)
//将Article表与ArticleType表进行关联,然后调用Count方法获取记录条数
count, err1 = qs.RelatedSel("ArticleType").Count()
} else {
//select * from article where articleType.typeName = "娱乐新闻"
//orm中一对多的查询是惰性查询
//调用RelatedSel将Article表与ArticleType表进行关联,
//然后调用Filter根据TypeName来查询出这个类型的Article
//我们可以这样理解,这里qs对象,是用来操作Article的,Article中存放的是ArticleType,
//而我们要根据ArticleType里面的TypeName来进行筛选
//我们在Article表是取不到TypeName的,所以我们要将Article和ArticleType做一个关联
count, err1 = qs.RelatedSel("ArticleType").Filter("ArticleType__TypeName", typeName).Count()
qs.Limit(page, start).RelatedSel("ArticleType").Filter("ArticleType__TypeName", typeName).All(&articles)
}
//如果出错了,就跳转到index页面
if err1 != nil {
beego.Error("查询数据条目数错误")
this.TplName = "index.html"
return
}
//根据count和page来计算出页面的数量
//比如5条记录,5/3=2页 比如10条记录,10/3=4页
pageCount := math.Ceil(float64(count) / float64(page))
//将count,pageCount,typeName传入到前端
this.Data["count"] = count
this.Data["pageCount"] = int(pageCount)
this.Data["typeName"] = typeName
//将articles传入到前端
this.Data["articles"] = articles
//定义一个ArticleType切片
var articleTypes []models.ArticleType
//将ArticleType表中的数据都查询出来
//放到articleTypes这个切片里面
o.QueryTable("ArticleType").All(&articleTypes)
//把articleTypes切片传到前端
this.Data["articleTypes"] = articleTypes
//设置TplName为index页面
this.TplName = "index.html"
}
//展示添加文章页面
func (this *ArticleController) ShowAdd() {
//获取orm对象
o := orm.NewOrm()
//定义ArticleType的切片articleTypes
var articleTypes []models.ArticleType
//查询所有ArticleType
o.QueryTable("ArticleType").All(&articleTypes)
//将articleTypes传到前端
this.Data["articleTypes"] = articleTypes
//设置页面add.html
this.TplName = "add.html"
}
//处理添加文章业务
func (this *ArticleController) HandleAdd() {
//获取数据
typeName := this.GetString("select")
title := this.GetString("articleName")
content := this.GetString("content")
file, head, err := this.GetFile("uploadname")
defer file.Close()
//校验数据
if title == "" || content == "" || err != nil {
this.Data["errmsg"] = "添加文章失败,请重新添加!"
this.TplName = "add.html"
return
}
//当前时间
fileName := time.Now().Format("2006-01-02-15-04-05")
ext := path.Ext(head.Filename)
beego.Info(head.Filename, ext)
//文件类型校验
if ext != ".jpg" && ext != ".png" && ext != ".jpeg" {
this.Data["errmsg"] = "上传图片格式不正确,请重新上传"
this.TplName = "add.html"
return
}
//文件大小校验
if head.Size > 5000000 {
this.Data["errmsg"] = "上传图片过大,请重新上传"
this.TplName = "add.html"
return
}
//把图片存起来
this.SaveToFile("uploadname", "./static/img/"+fileName+ext)
//获取orm对象
o := orm.NewOrm()
//获取一个插入对象
var article models.Article
//给插入对象赋值
article.Title = title
article.Content = content
article.Img = "/static/img/" + fileName + ext
//插入文章类型
var articleType models.ArticleType
//给查询条件赋值
articleType.TypeName = typeName
//查询所对应
o.Read(&articleType, "TypeName")
//把类型对象赋值给文章
article.ArticleType = &articleType
//插入到数据库
o.Insert(&article)
//返回数据
this.Redirect("/article/index", 302)
}
//展示文章详情
func (this *ArticleController) ShowContent() {
//获取数据
articleId, err := this.GetInt("articleId")
//数据校验
if err != nil {
beego.Error("请求链接错误")
this.TplName = "index.html"
return
}
//数据处理
//获取orm对象
o := orm.NewOrm()
//获取查询对象
var article models.Article
//给查询条件赋值
article.Id = articleId
//查询
err = o.Read(&article)
if err != nil {
beego.Error("查询文章不存在")
this.Redirect("/article/index", 302)
return
}
//阅读数增加
article.Count += 1
//更新数据
o.Update(&article)
//需要添加用户浏览记录
//多对多的数据添加
m2m := o.QueryM2M(&article, "Users")
//插入的是用户的对象
var user models.User
userName := this.GetSession("userName")
user.UserName = userName.(string)
o.Read(&user, "UserName")
//插入
m2m.Add(user)
//第二种多对多查询方法
qs := o.QueryTable("User")
var users []models.User
qs.Filter("Articles__Article__Id", article.Id).Distinct().All(&users)
//把数据传递给前端
this.Data["users"] = users
//返回数据
this.Data["article"] = article
this.TplName = "content.html"
}
//展示编辑页面
func (this *ArticleController) ShowUpdate() {
//获取数据
articleId, err := this.GetInt("articleId")
//校验数据
if err != nil {
beego.Error("请求链接错误")
this.Redirect("/article/index", 302)
return
}
//获取orm
o := orm.NewOrm()
//获取更新对象
var article models.Article
//给更新条件赋值
article.Id = articleId
//读一下
err = o.Read(&article)
if err != nil {
beego.Error("要更新的文章不存在")
this.Redirect("/article/index", 302)
return
}
//返回数据
this.Data["article"] = article
this.TplName = "update.html"
}
//封装函数
func UploadFunc(this *ArticleController, filePath string) string {
//获取文件file
file, head, err := this.GetFile(filePath)
defer file.Close()
if err != nil {
return ""
}
//当前时间
fileName := time.Now().Format("2006-01-02-15-04-05")
ext := path.Ext(head.Filename)
beego.Info(head.Filename, ext)
//文件类型也需要校验
if ext != ".jpg" && ext != ".png" && ext != ".jpeg" {
this.Data["errmsg"] = "上传图片格式不正确,请重新上传"
this.TplName = "add.html"
return ""
}
//文件大小校验
if head.Size > 5000000 {
this.Data["errmsg"] = "上传图片过大,请重新上传"
this.TplName = "add.html"
return ""
}
//把图片存起来
this.SaveToFile(filePath, "./static/img/"+fileName+ext)
return "/static/img/" + fileName + ext
}