196-beego代码分析

版权声明:本文为博主原创文章,未经博主允许不得转载。 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
}




猜你喜欢

转载自blog.csdn.net/qq_33781658/article/details/85719042