From 2ed9db5c7bea8454427c55c5590774f8d2e00189 Mon Sep 17 00:00:00 2001 From: "henry.chen" Date: Sun, 14 Jan 2018 02:02:12 +0800 Subject: [PATCH] code logical adjust --- api.go | 164 ++++++++++++++++++--------------------------- db.go | 207 ++++++++++++++++++++++++++++----------------------------- 2 files changed, 169 insertions(+), 202 deletions(-) diff --git a/api.go b/api.go index 9768414..6d59841 100644 --- a/api.go +++ b/api.go @@ -4,7 +4,6 @@ import ( "errors" "fmt" "net/http" - "sort" "strconv" "strings" "time" @@ -56,6 +55,7 @@ func init() { APIs["file-delete"] = apiFileDelete } +// 更新账号信息,Email、PhoneNumber、Address func apiAccount(c *gin.Context) { e := c.PostForm("email") pn := c.PostForm("phoneNumber") @@ -68,6 +68,7 @@ func apiAccount(c *gin.Context) { err := UpdateAccountField(mgo.M{"$set": mgo.M{"email": e, "phonen": pn, "address": ad}}) if err != nil { + logd.Error(err) responseNotice(c, NOTICE_NOTICE, err.Error(), "") return } @@ -77,6 +78,7 @@ func apiAccount(c *gin.Context) { responseNotice(c, NOTICE_SUCCESS, "更新成功", "") } +// 更新博客信息 func apiBlog(c *gin.Context) { bn := c.PostForm("blogName") bt := c.PostForm("bTitle") @@ -93,6 +95,7 @@ func apiBlog(c *gin.Context) { "blogger.btitle": bt, "blogger.beian": ba, "blogger.subtitle": st, "blogger.seriessay": ss, "blogger.archivessay": as}}) if err != nil { + logd.Error(err) responseNotice(c, NOTICE_NOTICE, err.Error(), "") return } @@ -107,6 +110,7 @@ func apiBlog(c *gin.Context) { responseNotice(c, NOTICE_SUCCESS, "更新成功", "") } +// 更新密码 func apiPassword(c *gin.Context) { logd.Debug(c.Request.PostForm.Encode()) od := c.PostForm("old") @@ -128,6 +132,7 @@ func apiPassword(c *gin.Context) { err := UpdateAccountField(mgo.M{"$set": mgo.M{"password": newPwd}}) if err != nil { + logd.Error(err) responseNotice(c, NOTICE_NOTICE, err.Error(), "") return } @@ -135,46 +140,39 @@ func apiPassword(c *gin.Context) { responseNotice(c, NOTICE_SUCCESS, "更新成功", "") } +// 删除文章,软删除:移入到回收箱 func apiPostDelete(c *gin.Context) { - var err error - defer func() { - if err != nil { - logd.Error(err) - responseNotice(c, NOTICE_NOTICE, err.Error(), "") - return - } - responseNotice(c, NOTICE_SUCCESS, "删除成功", "") - }() - - err = c.Request.ParseForm() - if err != nil { - return - } var ids []int32 - var i int - for _, v := range c.Request.PostForm["cid[]"] { - i, err = strconv.Atoi(v) + for _, v := range c.PostFormArray("cid[]") { + i, err := strconv.Atoi(v) if err != nil || int32(i) < setting.Conf.General.StartID { - err = errors.New("参数错误") + responseNotice(c, NOTICE_NOTICE, "参数错误", "") return } ids = append(ids, int32(i)) } - err = DelArticles(ids...) + err := DelArticles(ids...) if err != nil { + logd.Error(err) + responseNotice(c, NOTICE_NOTICE, err.Error(), "") return } - // elasticsearch 删除索引 + + // elasticsearch err = ElasticDelIndex(ids) if err != nil { - return + logd.Error(err) } + // TODO disqus delete + responseNotice(c, NOTICE_SUCCESS, "删除成功", "") } func apiPostAdd(c *gin.Context) { - var err error - var do string - var cid int + var ( + err error + do string + cid int + ) defer func() { switch do { case "auto": // 自动保存 @@ -183,18 +181,16 @@ func apiPostAdd(c *gin.Context) { return } c.JSON(http.StatusOK, gin.H{"success": SUCCESS, "time": time.Now().Format("15:04:05 PM"), "cid": cid}) - case "save": // 保存草稿 + case "save", "publish": // 草稿,发布 if err != nil { responseNotice(c, NOTICE_NOTICE, err.Error(), "") return } - c.Redirect(http.StatusFound, "/admin/manage-draft") - case "publish": // 发布 - if err != nil { - responseNotice(c, NOTICE_NOTICE, err.Error(), "") - return + uri := "/admin/manage-draft" + if do == "publish" { + uri = "/admin/manage-posts" } - c.Redirect(http.StatusFound, "/admin/manage-posts") + c.Redirect(http.StatusFound, uri) } }() @@ -202,11 +198,11 @@ func apiPostAdd(c *gin.Context) { slug := c.PostForm("slug") title := c.PostForm("title") text := c.PostForm("text") - date := c.PostForm("date") + date := CheckDate(c.PostForm("date")) serie := c.PostForm("serie") tag := c.PostForm("tags") update := c.PostForm("update") - if title == "" || text == "" || slug == "" { + if slug == "" || title == "" || text == "" { err = errors.New("参数错误") return } @@ -219,13 +215,14 @@ func apiPostAdd(c *gin.Context) { Title: title, Content: text, Slug: slug, - CreateTime: CheckDate(date), + CreateTime: date, IsDraft: do != "publish", Author: Ei.Username, SerieID: serieid, Tags: tags, } cid, err = strconv.Atoi(c.PostForm("cid")) + // 新文章 if err != nil || cid < 1 { err = AddArticle(artc) if err != nil { @@ -234,58 +231,49 @@ func apiPostAdd(c *gin.Context) { } cid = int(artc.ID) if !artc.IsDraft { + // elastic ElasticIndex(artc) + // rss DoPings(slug) + // disqus + ThreadCreate(artc) } return } + + // 旧文章 artc.ID = int32(cid) - i, a := GetArticle(artc.ID) + _, a := GetArticle(artc.ID) if a != nil { artc.IsDraft = false artc.Count = a.Count artc.UpdateTime = a.UpdateTime - Ei.Articles = append(Ei.Articles[0:i], Ei.Articles[i+1:]...) - DelFromLinkedList(a) - ManageTagsArticle(a, false, DELETE) - ManageSeriesArticle(a, false, DELETE) - ManageArchivesArticle(a, false, DELETE) - delete(Ei.MapArticles, a.Slug) - a = nil } if CheckBool(update) { artc.UpdateTime = time.Now() } + // 数据库更新 err = UpdateArticle(mgo.M{"id": artc.ID}, artc) if err != nil { logd.Error(err) return } if !artc.IsDraft { - Ei.MapArticles[artc.Slug] = artc - Ei.Articles = append(Ei.Articles, artc) - sort.Sort(Ei.Articles) - GenerateExcerptAndRender(artc) - // elasticsearch 索引 + ReplaceArticle(a, artc) + // elastic ElasticIndex(artc) + // rss DoPings(slug) - if artc.ID >= setting.Conf.General.StartID { - ManageTagsArticle(artc, true, ADD) - ManageSeriesArticle(artc, true, ADD) - ManageArchivesArticle(artc, true, ADD) - AddToLinkedList(artc.ID) + // disqus + if a == nil { + ThreadCreate(artc) } } } +// 只能逐一删除,专题下不能有文章 func apiSerieDelete(c *gin.Context) { - err := c.Request.ParseForm() - if err != nil { - responseNotice(c, NOTICE_NOTICE, err.Error(), "") - return - } - // 只能逐一删除 - for _, v := range c.Request.PostForm["mid[]"] { + for _, v := range c.PostFormArray("mid[]") { id, err := strconv.Atoi(v) if err != nil || id < 1 { responseNotice(c, NOTICE_NOTICE, err.Error(), "") @@ -301,6 +289,7 @@ func apiSerieDelete(c *gin.Context) { responseNotice(c, NOTICE_SUCCESS, "删除成功", "") } +// 添加专题,如果专题有提交 mid 即更新专题 func apiSerieAdd(c *gin.Context) { name := c.PostForm("name") slug := c.PostForm("slug") @@ -337,24 +326,15 @@ func apiSerieAdd(c *gin.Context) { responseNotice(c, NOTICE_SUCCESS, "操作成功", "") } -// NOTE 暂未启用 +// NOTE 排序专题,暂未实现 func apiSerieSort(c *gin.Context) { - err := c.Request.ParseForm() - if err != nil { - responseNotice(c, NOTICE_NOTICE, err.Error(), "") - return - } - v := c.Request.PostForm["mid[]"] + v := c.PostFormArray("mid[]") logd.Debug(v) } +// 删除草稿箱,物理删除 func apiDraftDelete(c *gin.Context) { - err := c.Request.ParseForm() - if err != nil { - responseNotice(c, NOTICE_NOTICE, err.Error(), "") - return - } - for _, v := range c.Request.PostForm["mid[]"] { + for _, v := range c.PostFormArray("mid[]") { i, err := strconv.Atoi(v) if err != nil || i < 1 { responseNotice(c, NOTICE_NOTICE, "参数错误", "") @@ -369,15 +349,9 @@ func apiDraftDelete(c *gin.Context) { responseNotice(c, NOTICE_SUCCESS, "删除成功", "") } +// 删除垃圾箱,物理删除 func apiTrashDelete(c *gin.Context) { - logd.Debug(c.PostForm("key")) - logd.Debug(c.Request.PostForm) - err := c.Request.ParseForm() - if err != nil { - responseNotice(c, NOTICE_NOTICE, err.Error(), "") - return - } - for _, v := range c.Request.PostForm["mid[]"] { + for _, v := range c.PostFormArray("mid[]") { i, err := strconv.Atoi(v) if err != nil || i < 1 { responseNotice(c, NOTICE_NOTICE, "参数错误", "") @@ -392,15 +366,9 @@ func apiTrashDelete(c *gin.Context) { responseNotice(c, NOTICE_SUCCESS, "删除成功", "") } +// 从垃圾箱恢复到草稿箱 func apiTrashRecover(c *gin.Context) { - logd.Debug(c.PostForm("key")) - logd.Debug(c.Request.PostForm) - err := c.Request.ParseForm() - if err != nil { - responseNotice(c, NOTICE_NOTICE, err.Error(), "") - return - } - for _, v := range c.Request.PostForm["mid[]"] { + for _, v := range c.PostFormArray("mid[]") { i, err := strconv.Atoi(v) if err != nil || i < 1 { responseNotice(c, NOTICE_NOTICE, "参数错误", "") @@ -416,6 +384,7 @@ func apiTrashRecover(c *gin.Context) { responseNotice(c, NOTICE_SUCCESS, "恢复成功", "") } +// 上传文件到 qiniu 云 func apiFileUpload(c *gin.Context) { type Size interface { Size() int64 @@ -448,20 +417,19 @@ func apiFileUpload(c *gin.Context) { }) } +// 删除七牛 CDN 文件 func apiFileDelete(c *gin.Context) { - var err error - defer func() { - if err != nil { - logd.Error(err) - } - c.String(http.StatusOK, "删掉了吗?鬼知道。。。") - }() + defer c.String(http.StatusOK, "删掉了吗?鬼知道。。。") + name := c.PostForm("title") if name == "" { - err = errors.New("参数错误") + logd.Error("参数错误") return } - err = FileDelete(name) + err := FileDelete(name) + if err != nil { + logd.Error(err) + } } func responseNotice(c *gin.Context, typ, content, hl string) { diff --git a/db.go b/db.go index 5ebffad..0e2cc2b 100644 --- a/db.go +++ b/db.go @@ -136,9 +136,7 @@ func loadArticles() (artcs SortArticles) { if artcs[i+1].ID >= setting.Conf.General.StartID { v.Next = artcs[i+1] } - ManageTagsArticle(v, false, ADD) - ManageSeriesArticle(v, false, ADD) - ManageArchivesArticle(v, false, ADD) + upArticle(v, false) } Ei.CH <- SERIES_MD Ei.CH <- ARCHIVE_MD @@ -251,96 +249,6 @@ func PageList(p, n int) (prev int, next int, artcs []*Article) { return } -// 管理 tag -func ManageTagsArticle(artc *Article, s bool, do string) { - switch do { - case ADD: - for _, tag := range artc.Tags { - Ei.Tags[tag] = append(Ei.Tags[tag], artc) - if s { - sort.Sort(Ei.Tags[tag]) - } - } - case DELETE: - for _, tag := range artc.Tags { - for i, v := range Ei.Tags[tag] { - if v == artc { - Ei.Tags[tag] = append(Ei.Tags[tag][0:i], Ei.Tags[tag][i+1:]...) - if len(Ei.Tags[tag]) == 0 { - delete(Ei.Tags, tag) - } - return - } - } - } - } -} - -// 管理专题 -func ManageSeriesArticle(artc *Article, s bool, do string) { - switch do { - case ADD: - for i, serie := range Ei.Series { - if serie.ID == artc.SerieID { - Ei.Series[i].Articles = append(Ei.Series[i].Articles, artc) - if s { - sort.Sort(Ei.Series[i].Articles) - return - } - } - } - case DELETE: - for i, serie := range Ei.Series { - if serie.ID == artc.SerieID { - for j, v := range serie.Articles { - if v == artc { - Ei.Series[i].Articles = append(Ei.Series[i].Articles[0:j], Ei.Series[i].Articles[j+1:]...) - return - } - } - } - } - } -} - -// 管理归档 -func ManageArchivesArticle(artc *Article, s bool, do string) { - switch do { - case ADD: - add := false - y, m, _ := artc.CreateTime.Date() - for i, archive := range Ei.Archives { - ay, am, _ := archive.Time.Date() - if y == ay && m == am { - add = true - Ei.Archives[i].Articles = append(Ei.Archives[i].Articles, artc) - if s { - sort.Sort(Ei.Archives[i].Articles) - break - } - } - } - if !add { - Ei.Archives = append(Ei.Archives, &Archive{Time: artc.CreateTime, Articles: SortArticles{artc}}) - } - case DELETE: - for i, archive := range Ei.Archives { - ay, am, _ := archive.Time.Date() - if y, m, _ := artc.CreateTime.Date(); ay == y && am == m { - for j, v := range archive.Articles { - if v == artc { - Ei.Archives[i].Articles = append(Ei.Archives[i].Articles[0:j], Ei.Archives[i].Articles[j+1:]...) - if len(Ei.Archives[i].Articles) == 0 { - Ei.Archives = append(Ei.Archives[:i], Ei.Archives[i+1:]...) - } - return - } - } - } - } - } -} - // 渲染markdown操作和截取摘要操作 var reg = regexp.MustCompile(setting.Conf.General.Identifier) @@ -390,6 +298,104 @@ func LoadTrash() (artcs SortArticles, err error) { return } +// 添加文章到tag、serie、archive +func upArticle(artc *Article, needSort bool) { + // tag + for _, tag := range artc.Tags { + Ei.Tags[tag] = append(Ei.Tags[tag], artc) + if needSort { + sort.Sort(Ei.Tags[tag]) + } + } + // serie + if artc.SerieID > 0 { + for i, serie := range Ei.Series { + if serie.ID == artc.SerieID { + Ei.Series[i].Articles = append(Ei.Series[i].Articles, artc) + if needSort { + sort.Sort(Ei.Series[i].Articles) + Ei.CH <- SERIES_MD + } + break + } + } + } + // archive + y, m, _ := artc.CreateTime.Date() + for i, archive := range Ei.Archives { + if ay, am, _ := archive.Time.Date(); y == ay && m == am { + Ei.Archives[i].Articles = append(Ei.Archives[i].Articles, artc) + if needSort { + sort.Sort(Ei.Archives[i].Articles) + Ei.CH <- ARCHIVE_MD + } + break + } + } +} + +// 删除文章从tag、serie、archive +func dropArticle(artc *Article) { + // tag + for _, tag := range artc.Tags { + for i, v := range Ei.Tags[tag] { + if v == artc { + Ei.Tags[tag] = append(Ei.Tags[tag][0:i], Ei.Tags[tag][i+1:]...) + if len(Ei.Tags[tag]) == 0 { + delete(Ei.Tags, tag) + } + } + } + } + // serie + for i, serie := range Ei.Series { + if serie.ID == artc.SerieID { + for j, v := range serie.Articles { + if v == artc { + Ei.Series[i].Articles = append(Ei.Series[i].Articles[0:j], Ei.Series[i].Articles[j+1:]...) + break + } + } + } + } + // archive + for i, archive := range Ei.Archives { + ay, am, _ := archive.Time.Date() + if y, m, _ := artc.CreateTime.Date(); ay == y && am == m { + for j, v := range archive.Articles { + if v == artc { + Ei.Archives[i].Articles = append(Ei.Archives[i].Articles[0:j], Ei.Archives[i].Articles[j+1:]...) + if len(Ei.Archives[i].Articles) == 0 { + Ei.Archives = append(Ei.Archives[:i], Ei.Archives[i+1:]...) + } + break + } + } + } + } +} + +// 替换文章 +func ReplaceArticle(oldArtc *Article, newArtc *Article) { + if oldArtc != nil { + i, artc := GetArticle(oldArtc.ID) + DelFromLinkedList(artc) + Ei.Articles = append(Ei.Articles[:i], Ei.Articles[i+1:]...) + delete(Ei.MapArticles, artc.Slug) + + dropArticle(oldArtc) + } + + Ei.MapArticles[newArtc.Slug] = newArtc + Ei.Articles = append(Ei.Articles, newArtc) + sort.Sort(Ei.Articles) + + GenerateExcerptAndRender(newArtc) + AddToLinkedList(newArtc.ID) + + upArticle(newArtc, true) +} + // 添加文章 func AddArticle(artc *Article) error { // 分配ID, 占位至起始id @@ -414,13 +420,8 @@ func AddArticle(artc *Article) error { Ei.Articles = append([]*Article{artc}, Ei.Articles...) sort.Sort(Ei.Articles) AddToLinkedList(artc.ID) - ManageTagsArticle(artc, true, ADD) - ManageSeriesArticle(artc, true, ADD) - ManageArchivesArticle(artc, true, ADD) - Ei.CH <- ARCHIVE_MD - if artc.SerieID > 0 { - Ei.CH <- SERIES_MD - } + + upArticle(artc, true) } return nil } @@ -434,14 +435,12 @@ func DelArticles(ids ...int32) error { DelFromLinkedList(artc) Ei.Articles = append(Ei.Articles[:i], Ei.Articles[i+1:]...) delete(Ei.MapArticles, artc.Slug) - ManageTagsArticle(artc, false, DELETE) - ManageSeriesArticle(artc, false, DELETE) - ManageArchivesArticle(artc, false, DELETE) + err := UpdateArticle(mgo.M{"id": id}, mgo.M{"$set": mgo.M{"deletetime": time.Now()}}) if err != nil { return err } - artc = nil + dropArticle(artc) } Ei.CH <- ARCHIVE_MD Ei.CH <- SERIES_MD