code logical adjust

This commit is contained in:
henry.chen
2018-01-14 02:02:12 +08:00
parent 06a12bc6f9
commit 2ed9db5c7b
2 changed files with 169 additions and 202 deletions

164
api.go
View File

@@ -4,7 +4,6 @@ import (
"errors" "errors"
"fmt" "fmt"
"net/http" "net/http"
"sort"
"strconv" "strconv"
"strings" "strings"
"time" "time"
@@ -56,6 +55,7 @@ func init() {
APIs["file-delete"] = apiFileDelete APIs["file-delete"] = apiFileDelete
} }
// 更新账号信息Email、PhoneNumber、Address
func apiAccount(c *gin.Context) { func apiAccount(c *gin.Context) {
e := c.PostForm("email") e := c.PostForm("email")
pn := c.PostForm("phoneNumber") 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}}) err := UpdateAccountField(mgo.M{"$set": mgo.M{"email": e, "phonen": pn, "address": ad}})
if err != nil { if err != nil {
logd.Error(err)
responseNotice(c, NOTICE_NOTICE, err.Error(), "") responseNotice(c, NOTICE_NOTICE, err.Error(), "")
return return
} }
@@ -77,6 +78,7 @@ func apiAccount(c *gin.Context) {
responseNotice(c, NOTICE_SUCCESS, "更新成功", "") responseNotice(c, NOTICE_SUCCESS, "更新成功", "")
} }
// 更新博客信息
func apiBlog(c *gin.Context) { func apiBlog(c *gin.Context) {
bn := c.PostForm("blogName") bn := c.PostForm("blogName")
bt := c.PostForm("bTitle") bt := c.PostForm("bTitle")
@@ -93,6 +95,7 @@ func apiBlog(c *gin.Context) {
"blogger.btitle": bt, "blogger.beian": ba, "blogger.subtitle": st, "blogger.btitle": bt, "blogger.beian": ba, "blogger.subtitle": st,
"blogger.seriessay": ss, "blogger.archivessay": as}}) "blogger.seriessay": ss, "blogger.archivessay": as}})
if err != nil { if err != nil {
logd.Error(err)
responseNotice(c, NOTICE_NOTICE, err.Error(), "") responseNotice(c, NOTICE_NOTICE, err.Error(), "")
return return
} }
@@ -107,6 +110,7 @@ func apiBlog(c *gin.Context) {
responseNotice(c, NOTICE_SUCCESS, "更新成功", "") responseNotice(c, NOTICE_SUCCESS, "更新成功", "")
} }
// 更新密码
func apiPassword(c *gin.Context) { func apiPassword(c *gin.Context) {
logd.Debug(c.Request.PostForm.Encode()) logd.Debug(c.Request.PostForm.Encode())
od := c.PostForm("old") od := c.PostForm("old")
@@ -128,6 +132,7 @@ func apiPassword(c *gin.Context) {
err := UpdateAccountField(mgo.M{"$set": mgo.M{"password": newPwd}}) err := UpdateAccountField(mgo.M{"$set": mgo.M{"password": newPwd}})
if err != nil { if err != nil {
logd.Error(err)
responseNotice(c, NOTICE_NOTICE, err.Error(), "") responseNotice(c, NOTICE_NOTICE, err.Error(), "")
return return
} }
@@ -135,46 +140,39 @@ func apiPassword(c *gin.Context) {
responseNotice(c, NOTICE_SUCCESS, "更新成功", "") responseNotice(c, NOTICE_SUCCESS, "更新成功", "")
} }
// 删除文章,软删除:移入到回收箱
func apiPostDelete(c *gin.Context) { 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 ids []int32
var i int for _, v := range c.PostFormArray("cid[]") {
for _, v := range c.Request.PostForm["cid[]"] { i, err := strconv.Atoi(v)
i, err = strconv.Atoi(v)
if err != nil || int32(i) < setting.Conf.General.StartID { if err != nil || int32(i) < setting.Conf.General.StartID {
err = errors.New("参数错误") responseNotice(c, NOTICE_NOTICE, "参数错误", "")
return return
} }
ids = append(ids, int32(i)) ids = append(ids, int32(i))
} }
err = DelArticles(ids...) err := DelArticles(ids...)
if err != nil { if err != nil {
logd.Error(err)
responseNotice(c, NOTICE_NOTICE, err.Error(), "")
return return
} }
// elasticsearch 删除索引
// elasticsearch
err = ElasticDelIndex(ids) err = ElasticDelIndex(ids)
if err != nil { if err != nil {
return logd.Error(err)
} }
// TODO disqus delete
responseNotice(c, NOTICE_SUCCESS, "删除成功", "")
} }
func apiPostAdd(c *gin.Context) { func apiPostAdd(c *gin.Context) {
var err error var (
var do string err error
var cid int do string
cid int
)
defer func() { defer func() {
switch do { switch do {
case "auto": // 自动保存 case "auto": // 自动保存
@@ -183,18 +181,16 @@ func apiPostAdd(c *gin.Context) {
return return
} }
c.JSON(http.StatusOK, gin.H{"success": SUCCESS, "time": time.Now().Format("15:04:05 PM"), "cid": cid}) 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 { if err != nil {
responseNotice(c, NOTICE_NOTICE, err.Error(), "") responseNotice(c, NOTICE_NOTICE, err.Error(), "")
return return
} }
c.Redirect(http.StatusFound, "/admin/manage-draft") uri := "/admin/manage-draft"
case "publish": // 发布 if do == "publish" {
if err != nil { uri = "/admin/manage-posts"
responseNotice(c, NOTICE_NOTICE, err.Error(), "")
return
} }
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") slug := c.PostForm("slug")
title := c.PostForm("title") title := c.PostForm("title")
text := c.PostForm("text") text := c.PostForm("text")
date := c.PostForm("date") date := CheckDate(c.PostForm("date"))
serie := c.PostForm("serie") serie := c.PostForm("serie")
tag := c.PostForm("tags") tag := c.PostForm("tags")
update := c.PostForm("update") update := c.PostForm("update")
if title == "" || text == "" || slug == "" { if slug == "" || title == "" || text == "" {
err = errors.New("参数错误") err = errors.New("参数错误")
return return
} }
@@ -219,13 +215,14 @@ func apiPostAdd(c *gin.Context) {
Title: title, Title: title,
Content: text, Content: text,
Slug: slug, Slug: slug,
CreateTime: CheckDate(date), CreateTime: date,
IsDraft: do != "publish", IsDraft: do != "publish",
Author: Ei.Username, Author: Ei.Username,
SerieID: serieid, SerieID: serieid,
Tags: tags, Tags: tags,
} }
cid, err = strconv.Atoi(c.PostForm("cid")) cid, err = strconv.Atoi(c.PostForm("cid"))
// 新文章
if err != nil || cid < 1 { if err != nil || cid < 1 {
err = AddArticle(artc) err = AddArticle(artc)
if err != nil { if err != nil {
@@ -234,58 +231,49 @@ func apiPostAdd(c *gin.Context) {
} }
cid = int(artc.ID) cid = int(artc.ID)
if !artc.IsDraft { if !artc.IsDraft {
// elastic
ElasticIndex(artc) ElasticIndex(artc)
// rss
DoPings(slug) DoPings(slug)
// disqus
ThreadCreate(artc)
} }
return return
} }
// 旧文章
artc.ID = int32(cid) artc.ID = int32(cid)
i, a := GetArticle(artc.ID) _, a := GetArticle(artc.ID)
if a != nil { if a != nil {
artc.IsDraft = false artc.IsDraft = false
artc.Count = a.Count artc.Count = a.Count
artc.UpdateTime = a.UpdateTime 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) { if CheckBool(update) {
artc.UpdateTime = time.Now() artc.UpdateTime = time.Now()
} }
// 数据库更新
err = UpdateArticle(mgo.M{"id": artc.ID}, artc) err = UpdateArticle(mgo.M{"id": artc.ID}, artc)
if err != nil { if err != nil {
logd.Error(err) logd.Error(err)
return return
} }
if !artc.IsDraft { if !artc.IsDraft {
Ei.MapArticles[artc.Slug] = artc ReplaceArticle(a, artc)
Ei.Articles = append(Ei.Articles, artc) // elastic
sort.Sort(Ei.Articles)
GenerateExcerptAndRender(artc)
// elasticsearch 索引
ElasticIndex(artc) ElasticIndex(artc)
// rss
DoPings(slug) DoPings(slug)
if artc.ID >= setting.Conf.General.StartID { // disqus
ManageTagsArticle(artc, true, ADD) if a == nil {
ManageSeriesArticle(artc, true, ADD) ThreadCreate(artc)
ManageArchivesArticle(artc, true, ADD)
AddToLinkedList(artc.ID)
} }
} }
} }
// 只能逐一删除,专题下不能有文章
func apiSerieDelete(c *gin.Context) { func apiSerieDelete(c *gin.Context) {
err := c.Request.ParseForm() for _, v := range c.PostFormArray("mid[]") {
if err != nil {
responseNotice(c, NOTICE_NOTICE, err.Error(), "")
return
}
// 只能逐一删除
for _, v := range c.Request.PostForm["mid[]"] {
id, err := strconv.Atoi(v) id, err := strconv.Atoi(v)
if err != nil || id < 1 { if err != nil || id < 1 {
responseNotice(c, NOTICE_NOTICE, err.Error(), "") responseNotice(c, NOTICE_NOTICE, err.Error(), "")
@@ -301,6 +289,7 @@ func apiSerieDelete(c *gin.Context) {
responseNotice(c, NOTICE_SUCCESS, "删除成功", "") responseNotice(c, NOTICE_SUCCESS, "删除成功", "")
} }
// 添加专题,如果专题有提交 mid 即更新专题
func apiSerieAdd(c *gin.Context) { func apiSerieAdd(c *gin.Context) {
name := c.PostForm("name") name := c.PostForm("name")
slug := c.PostForm("slug") slug := c.PostForm("slug")
@@ -337,24 +326,15 @@ func apiSerieAdd(c *gin.Context) {
responseNotice(c, NOTICE_SUCCESS, "操作成功", "") responseNotice(c, NOTICE_SUCCESS, "操作成功", "")
} }
// NOTE 暂未启用 // NOTE 排序专题,暂未实现
func apiSerieSort(c *gin.Context) { func apiSerieSort(c *gin.Context) {
err := c.Request.ParseForm() v := c.PostFormArray("mid[]")
if err != nil {
responseNotice(c, NOTICE_NOTICE, err.Error(), "")
return
}
v := c.Request.PostForm["mid[]"]
logd.Debug(v) logd.Debug(v)
} }
// 删除草稿箱,物理删除
func apiDraftDelete(c *gin.Context) { func apiDraftDelete(c *gin.Context) {
err := c.Request.ParseForm() for _, v := range c.PostFormArray("mid[]") {
if err != nil {
responseNotice(c, NOTICE_NOTICE, err.Error(), "")
return
}
for _, v := range c.Request.PostForm["mid[]"] {
i, err := strconv.Atoi(v) i, err := strconv.Atoi(v)
if err != nil || i < 1 { if err != nil || i < 1 {
responseNotice(c, NOTICE_NOTICE, "参数错误", "") responseNotice(c, NOTICE_NOTICE, "参数错误", "")
@@ -369,15 +349,9 @@ func apiDraftDelete(c *gin.Context) {
responseNotice(c, NOTICE_SUCCESS, "删除成功", "") responseNotice(c, NOTICE_SUCCESS, "删除成功", "")
} }
// 删除垃圾箱,物理删除
func apiTrashDelete(c *gin.Context) { func apiTrashDelete(c *gin.Context) {
logd.Debug(c.PostForm("key")) for _, v := range c.PostFormArray("mid[]") {
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[]"] {
i, err := strconv.Atoi(v) i, err := strconv.Atoi(v)
if err != nil || i < 1 { if err != nil || i < 1 {
responseNotice(c, NOTICE_NOTICE, "参数错误", "") responseNotice(c, NOTICE_NOTICE, "参数错误", "")
@@ -392,15 +366,9 @@ func apiTrashDelete(c *gin.Context) {
responseNotice(c, NOTICE_SUCCESS, "删除成功", "") responseNotice(c, NOTICE_SUCCESS, "删除成功", "")
} }
// 从垃圾箱恢复到草稿箱
func apiTrashRecover(c *gin.Context) { func apiTrashRecover(c *gin.Context) {
logd.Debug(c.PostForm("key")) for _, v := range c.PostFormArray("mid[]") {
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[]"] {
i, err := strconv.Atoi(v) i, err := strconv.Atoi(v)
if err != nil || i < 1 { if err != nil || i < 1 {
responseNotice(c, NOTICE_NOTICE, "参数错误", "") responseNotice(c, NOTICE_NOTICE, "参数错误", "")
@@ -416,6 +384,7 @@ func apiTrashRecover(c *gin.Context) {
responseNotice(c, NOTICE_SUCCESS, "恢复成功", "") responseNotice(c, NOTICE_SUCCESS, "恢复成功", "")
} }
// 上传文件到 qiniu 云
func apiFileUpload(c *gin.Context) { func apiFileUpload(c *gin.Context) {
type Size interface { type Size interface {
Size() int64 Size() int64
@@ -448,20 +417,19 @@ func apiFileUpload(c *gin.Context) {
}) })
} }
// 删除七牛 CDN 文件
func apiFileDelete(c *gin.Context) { func apiFileDelete(c *gin.Context) {
var err error defer c.String(http.StatusOK, "删掉了吗?鬼知道。。。")
defer func() {
if err != nil {
logd.Error(err)
}
c.String(http.StatusOK, "删掉了吗?鬼知道。。。")
}()
name := c.PostForm("title") name := c.PostForm("title")
if name == "" { if name == "" {
err = errors.New("参数错误") logd.Error("参数错误")
return return
} }
err = FileDelete(name) err := FileDelete(name)
if err != nil {
logd.Error(err)
}
} }
func responseNotice(c *gin.Context, typ, content, hl string) { func responseNotice(c *gin.Context, typ, content, hl string) {

207
db.go
View File

@@ -136,9 +136,7 @@ func loadArticles() (artcs SortArticles) {
if artcs[i+1].ID >= setting.Conf.General.StartID { if artcs[i+1].ID >= setting.Conf.General.StartID {
v.Next = artcs[i+1] v.Next = artcs[i+1]
} }
ManageTagsArticle(v, false, ADD) upArticle(v, false)
ManageSeriesArticle(v, false, ADD)
ManageArchivesArticle(v, false, ADD)
} }
Ei.CH <- SERIES_MD Ei.CH <- SERIES_MD
Ei.CH <- ARCHIVE_MD Ei.CH <- ARCHIVE_MD
@@ -251,96 +249,6 @@ func PageList(p, n int) (prev int, next int, artcs []*Article) {
return 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操作和截取摘要操作 // 渲染markdown操作和截取摘要操作
var reg = regexp.MustCompile(setting.Conf.General.Identifier) var reg = regexp.MustCompile(setting.Conf.General.Identifier)
@@ -390,6 +298,104 @@ func LoadTrash() (artcs SortArticles, err error) {
return 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 { func AddArticle(artc *Article) error {
// 分配ID, 占位至起始id // 分配ID, 占位至起始id
@@ -414,13 +420,8 @@ func AddArticle(artc *Article) error {
Ei.Articles = append([]*Article{artc}, Ei.Articles...) Ei.Articles = append([]*Article{artc}, Ei.Articles...)
sort.Sort(Ei.Articles) sort.Sort(Ei.Articles)
AddToLinkedList(artc.ID) AddToLinkedList(artc.ID)
ManageTagsArticle(artc, true, ADD)
ManageSeriesArticle(artc, true, ADD) upArticle(artc, true)
ManageArchivesArticle(artc, true, ADD)
Ei.CH <- ARCHIVE_MD
if artc.SerieID > 0 {
Ei.CH <- SERIES_MD
}
} }
return nil return nil
} }
@@ -434,14 +435,12 @@ func DelArticles(ids ...int32) error {
DelFromLinkedList(artc) DelFromLinkedList(artc)
Ei.Articles = append(Ei.Articles[:i], Ei.Articles[i+1:]...) Ei.Articles = append(Ei.Articles[:i], Ei.Articles[i+1:]...)
delete(Ei.MapArticles, artc.Slug) 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()}}) err := UpdateArticle(mgo.M{"id": id}, mgo.M{"$set": mgo.M{"deletetime": time.Now()}})
if err != nil { if err != nil {
return err return err
} }
artc = nil dropArticle(artc)
} }
Ei.CH <- ARCHIVE_MD Ei.CH <- ARCHIVE_MD
Ei.CH <- SERIES_MD Ei.CH <- SERIES_MD