Ejemplo n.º 1
0
func deleteAndOthers(qs *models.Question, uid int64, role int64) error {

	if err := qs.Read(); err == orm.ErrNoRows {
		return errors.New("无法删除不存在的Question ID:" + strconv.Itoa(int(qs.Id)))
	}

	allow := role < 0
	if !(qs.Uid == uid || role < 0) {
		return errors.New("你无权删除此问题:" + strconv.Itoa(int(qs.Id)))
	}

	//检查附件字段并尝试删除文件
	if qs.Attachment != "" {
		if p := utils.Url2local(qs.Attachment); utils.Exist(p) {
			//验证是否管理员权限
			if allow {
				if err := os.Remove(p); err != nil {
					//可以输出错误,但不要反回错误,以免陷入死循环无法删掉
					fmt.Println("ROOT DEL Question Attachment, Question ID:", qs.Id, ",ERR:", err)
				}
			} else { //检查用户对文件的所有权
				if utils.VerifyUserfile(p, strconv.Itoa(int(uid))) {
					if err := os.Remove(p); err != nil {
						fmt.Println("DEL Question Attachment, Question ID:", qs.Id, ",ERR:", err)
					}
				}
			}
		}
	}

	//检查内容字段并尝试删除文件
	if qs.Content != "" {
		//若内容中存在图片则开始尝试删除图片
		delfiles_local := []string{}

		if m, n := utils.GetImages(qs.Content); n > 0 {
			for _, v := range m {
				if utils.IsLocal(v) {
					delfiles_local = append(delfiles_local, v)
					//如果本地同时也存在banner缓存文件,则加入旧图集合中,等待后面一次性删除
					if p := utils.Url2local(utils.SetSuffix(v, "_banner.jpg")); utils.Exist(p) {
						delfiles_local = append(delfiles_local, p)
					}
					if p := utils.Url2local(utils.SetSuffix(v, "_large.jpg")); utils.Exist(p) {
						delfiles_local = append(delfiles_local, p)
					}
					if p := utils.Url2local(utils.SetSuffix(v, "_medium.jpg")); utils.Exist(p) {
						delfiles_local = append(delfiles_local, p)
					}
					if p := utils.Url2local(utils.SetSuffix(v, "_small.jpg")); utils.Exist(p) {
						delfiles_local = append(delfiles_local, p)
					}
				}
			}
			for k, v := range delfiles_local {
				if p := utils.Url2local(v); utils.Exist(p) { //如若文件存在,则处理,否则忽略
					//先行判断是否缩略图  如果不是则执行删除image表记录的操作 因为缩略图是没有存到image表记录里面的
					isThumbnails := bool(true) //false代表不是缩略图 true代表是缩略图
					if (!strings.HasSuffix(v, "_large.jpg")) &&
						(!strings.HasSuffix(v, "_medium.jpg")) &&
						(!strings.HasSuffix(v, "_small.jpg")) {
						isThumbnails = false

					}
					//验证是否管理员权限
					if allow {
						if err := os.Remove(p); err != nil {
							fmt.Println("#", k, ",ROOT DEL FILE ERROR:", err)
						}

						//删除image表中已经被删除文件的记录
						if !isThumbnails {
							if e := models.DelImageByLocation(v); e != nil {
								fmt.Println("DelImageByLocation删除未使用文件", v, "的数据记录时候出现错误:", e)
							}
						}
					} else { //检查用户对文件的所有权
						if utils.VerifyUserfile(p, strconv.Itoa(int(uid))) {
							if err := os.Remove(p); err != nil {
								fmt.Println("#", k, ",DEL FILE ERROR:", err)
							}

							//删除image表中已经被删除文件的记录
							if !isThumbnails {
								if e := models.DelImageByLocation(v); e != nil {
									fmt.Println("v:", v)
									fmt.Println("DelImageByLocation删除未使用文件", v, "的数据记录时候出现错误:", e)
								}
							}
						}
					}
				}
			}
		}
	}

	// 不管实际路径中是否存在文件均删除该数据库记录,以免数据库记录陷入死循环无法删掉
	if err := qs.Delete(); err != nil {
		fmt.Println("删除话题错误:", err) //此时居然为空!
	}

	// 删除该问题下所有答案
	if err := models.DelReplysByPid(qs.Id); err != nil {
		fmt.Println("执行DelReplysByPid出错:", err)
		return err
	}
	return nil

}
Ejemplo n.º 2
0
func (self *NewQuestionController) Post() {
	self.TplNames = "q/new.html"
	self.LayoutSections["Heads"] = "q/head.html"
	self.LayoutSections["Scripts"] = "q/scripts.html"

	flash := beego.NewFlash()
	tags := template.HTMLEscapeString(strings.TrimSpace(strings.ToLower(self.GetString("tags"))))

	if tags == "" {
		flash.Error("尚未设置标签,请设定正确的标签!")
		flash.Store(&self.Controller)
		return
	}

	uid, _ := self.GetSession("userid").(int64)
	sess_username, _ := self.GetSession("username").(string)
	qid_title := template.HTMLEscapeString(strings.TrimSpace(self.GetString("title")))
	qid_content := template.HTMLEscapeString(strings.TrimSpace(self.GetString("content")))

	if qid_title == "" {
		flash.Error("问题标题为空!")
		flash.Store(&self.Controller)
		return
	}

	if qid_content == "" {
		flash.Error("问题内容为空!")
		flash.Store(&self.Controller)
		return
	}

	qs := new(models.Question)
	qs.Title = qid_title
	qs.Tags = tags
	qs.Content = qid_content
	qs.Uid = uid
	qs.Author = sess_username
	qs.Created = time.Now()
	qs.Updated = qs.Created
	qs.ReplyTime = qs.Created

	if s, e := utils.GetBannerThumbnail(qid_content); e == nil {
		qs.Attachment = s
	}

	if thumbnails, thumbnailslarge, thumbnailsmedium, thumbnailssmall, e := utils.GetThumbnails(qid_content); e == nil {
		qs.Thumbnails = thumbnails
		qs.ThumbnailsLarge = thumbnailslarge
		qs.ThumbnailsMedium = thumbnailsmedium
		qs.ThumbnailsSmall = thumbnailssmall
	}

	if err := qs.Insert(); err == nil {
		// TODO
		//models.SetRecordforImageOnPost(qts.Id, uid)
		self.Redirect("/q/"+strconv.Itoa(int(qs.Id))+"/", 302)
	} else {
		flash.Error(fmt.Sprint(err))
		flash.Store(&self.Controller)
		return
	}

}