liteblog/controllers/note.go

117 lines
2.5 KiB
Go

package controllers
import (
"bytes"
"fmt"
"github.com/PuerkitoBio/goquery"
"github.com/jinzhu/gorm"
"liteblog/models"
"liteblog/syserrors"
"log"
"time"
)
type NoteController struct {
BaseController
}
// 写文章
// @router /new [get]
func (c *NoteController) NewPage() {
log.Print("开始写文章了...")
c.Data["key"] = c.UUID()
c.TplName = "note_new.html"
}
// 保存文章
// @router /save/:key [post]
func (c *NoteController) Save() {
// 得到页面传过来的key
key := c.Ctx.Input.Param(":key")
// 判空
title := c.GetMustString("title", "标题不能为空")
content := c.GetMustString("content", "内容不能为空")
// 获取内容摘要
summary, _ := getSummary(content)
// 根据key查询文章
note, err := models.QueryNoteByKeyAndUserId(key, int(c.User.ID))
var n models.Note
if err != nil {
if err != gorm.ErrRecordNotFound {
c.Abort500(syserrors.NewError("保存失败!", err))
}
n = models.Note{
Key: key,
Summary: summary,
Title: title,
Content: content,
UserId: int(c.User.ID),
}
} else {
log.Print("进入了修改过程")
//查询不报错,这存在文章,那就做更新文章操作
n = note
n.Title = title
n.Content = content
n.Summary = summary
n.UpdatedAt = time.Now()
}
if err := models.SaveNote(&n); err != nil {
c.Abort500(syserrors.NewError("保存失败!", err))
}
c.JSONOk("成功", fmt.Sprintf("/details/%s", key))
}
// 编辑文章
// @router /edit/:key [get]
func (c *NoteController) EditPage() {
key := c.Ctx.Input.Param(":key")
note, err := models.QueryNoteByKeyAndUserId(key, int(c.User.ID))
if err != nil {
c.Abort500(syserrors.NewError("文章不存在!", err))
}
c.Data["note"] = note
c.Data["key"] = key
c.TplName = "note_new.html"
}
// 删除文章
// @router /del/:key [post]
func (c *NoteController) Del() {
key := c.Ctx.Input.Param(":key")
if err := models.DeleteNoteByUserIdAndKey(key, int(c.User.ID)); err != nil {
c.Abort500(syserrors.NewError("删除失败", err))
}
c.JSONOk("删除成功", "/")
}
func (c *NoteController) NestPrepare() {
c.MustLogin()
if c.User.Role != 0 {
c.Abort500(syserrors.NewError("您没有权限", nil))
}
}
func getSummary(content string) (string, error) {
var buf bytes.Buffer
buf.Write([]byte(content))
//用goquery来解析content
doc, err := goquery.NewDocumentFromReader(&buf)
if err != nil {
return "", err
}
// Text()得到body元素下的文本内容去掉html元素
str := doc.Find("body").Text()
// 截取字符
if len(str) > 600 {
str = str[0:600] + "..."
}
return str, nil
}