mirror of
https://github.com/eiblog/eiblog.git
synced 2026-02-15 02:42:27 +08:00
fix: delete trash article
This commit is contained in:
74
pkg/cache/cache.go
vendored
74
pkg/cache/cache.go
vendored
@@ -4,6 +4,7 @@ package cache
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"context"
|
"context"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"sort"
|
"sort"
|
||||||
"strings"
|
"strings"
|
||||||
@@ -106,23 +107,60 @@ func (c *Cache) RepArticle(oldArticle, newArticle *model.Article) {
|
|||||||
c.refreshCache(newArticle, false)
|
c.refreshCache(newArticle, false)
|
||||||
}
|
}
|
||||||
|
|
||||||
// DelArticles 删除文章
|
// DelArticle 删除文章
|
||||||
func (c *Cache) DelArticles(ids []int) error {
|
func (c *Cache) DelArticle(id int) error {
|
||||||
c.lock.Lock()
|
c.lock.Lock()
|
||||||
defer c.lock.Unlock()
|
defer c.lock.Unlock()
|
||||||
|
|
||||||
for _, id := range ids {
|
article, _ := c.FindArticleByID(id)
|
||||||
article, _ := c.FindArticleByID(id)
|
if article == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
// set delete
|
||||||
|
err := c.UpdateArticle(context.Background(), id, map[string]interface{}{
|
||||||
|
"deleted_at": time.Now(),
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
// drop from tags,series,archives
|
||||||
|
c.refreshCache(article, true)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// set delete
|
// AddSerie 添加专题
|
||||||
err := c.UpdateArticle(context.Background(), id, map[string]interface{}{
|
func (c *Cache) AddSerie(serie *model.Serie) error {
|
||||||
"deleted_at": time.Now(),
|
c.lock.Lock()
|
||||||
})
|
defer c.lock.Unlock()
|
||||||
if err != nil {
|
|
||||||
return err
|
err := c.InsertSerie(context.Background(), serie)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
c.Series = append(c.Series, serie)
|
||||||
|
PagesCh <- PageSeries
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// DelSerie 删除专题
|
||||||
|
func (c *Cache) DelSerie(id int) error {
|
||||||
|
c.lock.Lock()
|
||||||
|
defer c.lock.Unlock()
|
||||||
|
|
||||||
|
for i, serie := range c.Series {
|
||||||
|
if serie.ID == id {
|
||||||
|
if len(serie.Articles) > 0 {
|
||||||
|
return errors.New("请删除该专题下的所有文章")
|
||||||
|
}
|
||||||
|
err := c.RemoveSerie(context.Background(), id)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
c.Series[i] = nil
|
||||||
|
c.Series = append(c.Series[:i], c.Series[i+1:]...)
|
||||||
|
PagesCh <- PageSeries
|
||||||
|
break
|
||||||
}
|
}
|
||||||
// drop from tags,series,archives
|
|
||||||
c.refreshCache(article, true)
|
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -403,6 +441,12 @@ func (c *Cache) loadOrInit() error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
c.Account = account
|
c.Account = account
|
||||||
|
// series
|
||||||
|
series, err := c.LoadAllSerie(context.Background())
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
c.Series = series
|
||||||
// all articles
|
// all articles
|
||||||
search := store.SearchArticles{
|
search := store.SearchArticles{
|
||||||
Page: 1,
|
Page: 1,
|
||||||
@@ -423,10 +467,10 @@ func (c *Cache) loadOrInit() error {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if i > 0 {
|
if i > 0 {
|
||||||
v.Prev = Ei.Articles[i-1]
|
v.Prev = articles[i-1]
|
||||||
}
|
}
|
||||||
if Ei.Articles[i+1].ID >= blogapp.General.StartID {
|
if articles[i+1].ID >= blogapp.General.StartID {
|
||||||
v.Next = Ei.Articles[i+1]
|
v.Next = articles[i+1]
|
||||||
}
|
}
|
||||||
c.readdArticle(v, false)
|
c.readdArticle(v, false)
|
||||||
}
|
}
|
||||||
|
|||||||
2
pkg/cache/store/mongodb.go
vendored
2
pkg/cache/store/mongodb.go
vendored
@@ -298,7 +298,7 @@ func (db *mongodb) LoadArticleList(ctx context.Context, search SearchArticles) (
|
|||||||
case SearchArticleSerieID:
|
case SearchArticleSerieID:
|
||||||
filter["serie_id"] = v.(int)
|
filter["serie_id"] = v.(int)
|
||||||
case SearchArticleTrash:
|
case SearchArticleTrash:
|
||||||
filter["deleted_at"] = bson.M{"$nq": time.Time{}}
|
filter["deleted_at"] = bson.M{"$ne": time.Time{}}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// search count
|
// search count
|
||||||
|
|||||||
@@ -35,8 +35,6 @@ func RegisterRoutes(e *gin.Engine) {
|
|||||||
|
|
||||||
// RegisterRoutesAuthz register routes
|
// RegisterRoutesAuthz register routes
|
||||||
func RegisterRoutesAuthz(group gin.IRoutes) {
|
func RegisterRoutesAuthz(group gin.IRoutes) {
|
||||||
group.GET("/draft-delete", handleDraftDelete)
|
|
||||||
|
|
||||||
group.POST("/api/account", handleAPIAccount)
|
group.POST("/api/account", handleAPIAccount)
|
||||||
group.POST("/api/blog", handleAPIBlogger)
|
group.POST("/api/blog", handleAPIBlogger)
|
||||||
group.POST("/api/password", handleAPIPassword)
|
group.POST("/api/password", handleAPIPassword)
|
||||||
@@ -80,49 +78,6 @@ func handleAcctLogin(c *gin.Context) {
|
|||||||
c.Redirect(http.StatusFound, "/admin/profile")
|
c.Redirect(http.StatusFound, "/admin/profile")
|
||||||
}
|
}
|
||||||
|
|
||||||
// handleDraftDelete 删除草稿, 物理删除
|
|
||||||
func handleDraftDelete(c *gin.Context) {
|
|
||||||
id, err := strconv.Atoi(c.Query("cid"))
|
|
||||||
if err != nil || id < 1 {
|
|
||||||
c.JSON(http.StatusBadRequest, gin.H{"error": "参数错误"})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
err = cache.Ei.RemoveArticle(context.Background(), id)
|
|
||||||
if err != nil {
|
|
||||||
c.JSON(http.StatusBadRequest, gin.H{"error": "删除错误"})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
c.Redirect(http.StatusFound, "/admin/write-post")
|
|
||||||
}
|
|
||||||
|
|
||||||
// handleAPIAccount 更新账户信息
|
|
||||||
func handleAPIAccount(c *gin.Context) {
|
|
||||||
e := c.PostForm("email")
|
|
||||||
pn := c.PostForm("phoneNumber")
|
|
||||||
ad := c.PostForm("address")
|
|
||||||
if (e != "" && !tools.ValidateEmail(e)) || (pn != "" &&
|
|
||||||
!tools.ValidatePhoneNo(pn)) {
|
|
||||||
responseNotice(c, NoticeNotice, "参数错误", "")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
err := cache.Ei.UpdateAccount(context.Background(), cache.Ei.Account.Username,
|
|
||||||
map[string]interface{}{
|
|
||||||
"email": e,
|
|
||||||
"phone_n": pn,
|
|
||||||
"address": ad,
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
logrus.Error("handleAPIAccount.UpdateAccount: ", err)
|
|
||||||
responseNotice(c, NoticeNotice, err.Error(), "")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
cache.Ei.Account.Email = e
|
|
||||||
cache.Ei.Account.PhoneN = pn
|
|
||||||
cache.Ei.Account.Address = ad
|
|
||||||
responseNotice(c, NoticeSuccess, "更新成功", "")
|
|
||||||
}
|
|
||||||
|
|
||||||
// handleAPIBlogger 更新博客信息
|
// handleAPIBlogger 更新博客信息
|
||||||
func handleAPIBlogger(c *gin.Context) {
|
func handleAPIBlogger(c *gin.Context) {
|
||||||
bn := c.PostForm("blogName")
|
bn := c.PostForm("blogName")
|
||||||
@@ -159,6 +114,34 @@ func handleAPIBlogger(c *gin.Context) {
|
|||||||
responseNotice(c, NoticeSuccess, "更新成功", "")
|
responseNotice(c, NoticeSuccess, "更新成功", "")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// handleAPIAccount 更新账户信息
|
||||||
|
func handleAPIAccount(c *gin.Context) {
|
||||||
|
e := c.PostForm("email")
|
||||||
|
pn := c.PostForm("phoneNumber")
|
||||||
|
ad := c.PostForm("address")
|
||||||
|
if (e != "" && !tools.ValidateEmail(e)) || (pn != "" &&
|
||||||
|
!tools.ValidatePhoneNo(pn)) {
|
||||||
|
responseNotice(c, NoticeNotice, "参数错误", "")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
err := cache.Ei.UpdateAccount(context.Background(), cache.Ei.Account.Username,
|
||||||
|
map[string]interface{}{
|
||||||
|
"email": e,
|
||||||
|
"phone_n": pn,
|
||||||
|
"address": ad,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
logrus.Error("handleAPIAccount.UpdateAccount: ", err)
|
||||||
|
responseNotice(c, NoticeNotice, err.Error(), "")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
cache.Ei.Account.Email = e
|
||||||
|
cache.Ei.Account.PhoneN = pn
|
||||||
|
cache.Ei.Account.Address = ad
|
||||||
|
responseNotice(c, NoticeSuccess, "更新成功", "")
|
||||||
|
}
|
||||||
|
|
||||||
// handleAPIPassword 更新密码
|
// handleAPIPassword 更新密码
|
||||||
func handleAPIPassword(c *gin.Context) {
|
func handleAPIPassword(c *gin.Context) {
|
||||||
od := c.PostForm("old")
|
od := c.PostForm("old")
|
||||||
@@ -191,6 +174,24 @@ func handleAPIPassword(c *gin.Context) {
|
|||||||
responseNotice(c, NoticeSuccess, "更新成功", "")
|
responseNotice(c, NoticeSuccess, "更新成功", "")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// handleDraftDelete 删除草稿, 物理删除
|
||||||
|
func handleDraftDelete(c *gin.Context) {
|
||||||
|
for _, v := range c.PostFormArray("mid[]") {
|
||||||
|
id, err := strconv.Atoi(v)
|
||||||
|
if err != nil || id < 1 {
|
||||||
|
responseNotice(c, NoticeNotice, "参数错误", "")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
err = cache.Ei.RemoveArticle(context.Background(), id)
|
||||||
|
if err != nil {
|
||||||
|
logrus.Error("handleDraftDelete.RemoveArticle: ", err)
|
||||||
|
responseNotice(c, NoticeNotice, "删除失败", "")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
responseNotice(c, NoticeSuccess, "删除成功", "")
|
||||||
|
}
|
||||||
|
|
||||||
// handleAPIPostDelete 删除文章,移入回收箱
|
// handleAPIPostDelete 删除文章,移入回收箱
|
||||||
func handleAPIPostDelete(c *gin.Context) {
|
func handleAPIPostDelete(c *gin.Context) {
|
||||||
var ids []int
|
var ids []int
|
||||||
@@ -200,17 +201,17 @@ func handleAPIPostDelete(c *gin.Context) {
|
|||||||
responseNotice(c, NoticeNotice, "参数错误", "")
|
responseNotice(c, NoticeNotice, "参数错误", "")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
err = cache.Ei.DelArticle(id)
|
||||||
|
if err != nil {
|
||||||
|
logrus.Error("handleAPIPostDelete.DeleteArticles: ", err)
|
||||||
|
|
||||||
|
responseNotice(c, NoticeNotice, err.Error(), "")
|
||||||
|
return
|
||||||
|
}
|
||||||
ids = append(ids, id)
|
ids = append(ids, id)
|
||||||
}
|
}
|
||||||
err := cache.Ei.DelArticles(ids)
|
|
||||||
if err != nil {
|
|
||||||
logrus.Error("handleAPIPostDelete.DeleteArticles: ", err)
|
|
||||||
|
|
||||||
responseNotice(c, NoticeNotice, err.Error(), "")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
// elasticsearch
|
// elasticsearch
|
||||||
err = internal.ElasticDelIndex(ids)
|
err := internal.ElasticDelIndex(ids)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logrus.Error("handleAPIPostDelete.ElasticDelIndex: ", err)
|
logrus.Error("handleAPIPostDelete.ElasticDelIndex: ", err)
|
||||||
}
|
}
|
||||||
@@ -343,24 +344,10 @@ func handleAPISerieDelete(c *gin.Context) {
|
|||||||
responseNotice(c, NoticeNotice, err.Error(), "")
|
responseNotice(c, NoticeNotice, err.Error(), "")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
for i, serie := range cache.Ei.Series {
|
err = cache.Ei.DelSerie(id)
|
||||||
if serie.ID == id {
|
if err != nil {
|
||||||
if len(serie.Articles) > 0 {
|
responseNotice(c, NoticeNotice, err.Error(), "")
|
||||||
logrus.Error("handleAPISerieDelete.failed: ")
|
return
|
||||||
responseNotice(c, NoticeNotice, "请删除该专题下的所有文章", "")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
err = cache.Ei.RemoveSerie(context.Background(), id)
|
|
||||||
if err != nil {
|
|
||||||
logrus.Error("handleAPISerieDelete.RemoveSerie: ")
|
|
||||||
responseNotice(c, NoticeNotice, err.Error(), "")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
cache.Ei.Series[i] = nil
|
|
||||||
cache.Ei.Series = append(cache.Ei.Series[:i], cache.Ei.Series[i+1:]...)
|
|
||||||
cache.PagesCh <- cache.PageSeries
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
responseNotice(c, NoticeSuccess, "删除成功", "")
|
responseNotice(c, NoticeSuccess, "删除成功", "")
|
||||||
@@ -404,11 +391,15 @@ func handleAPISerieCreate(c *gin.Context) {
|
|||||||
responseNotice(c, NoticeNotice, err.Error(), "")
|
responseNotice(c, NoticeNotice, err.Error(), "")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
serie.Slug = slug
|
||||||
|
serie.Name = name
|
||||||
|
serie.Desc = desc
|
||||||
} else {
|
} else {
|
||||||
err = cache.Ei.InsertSerie(context.Background(), &model.Serie{
|
err = cache.Ei.AddSerie(&model.Serie{
|
||||||
Slug: slug,
|
Slug: slug,
|
||||||
Name: name,
|
Name: name,
|
||||||
Desc: desc,
|
Desc: desc,
|
||||||
|
CreatedAt: time.Now(),
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logrus.Error("handleAPISerieCreate.InsertSerie: ", err)
|
logrus.Error("handleAPISerieCreate.InsertSerie: ", err)
|
||||||
|
|||||||
@@ -14,10 +14,9 @@ import (
|
|||||||
"github.com/eiblog/eiblog/pkg/cache/store"
|
"github.com/eiblog/eiblog/pkg/cache/store"
|
||||||
"github.com/eiblog/eiblog/pkg/config"
|
"github.com/eiblog/eiblog/pkg/config"
|
||||||
"github.com/eiblog/eiblog/pkg/core/blog"
|
"github.com/eiblog/eiblog/pkg/core/blog"
|
||||||
"github.com/eiblog/eiblog/pkg/model"
|
|
||||||
"github.com/sirupsen/logrus"
|
|
||||||
|
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
|
"github.com/sirupsen/logrus"
|
||||||
)
|
)
|
||||||
|
|
||||||
// baseBEParams 基础参数
|
// baseBEParams 基础参数
|
||||||
@@ -140,11 +139,10 @@ func handleAdminSerie(c *gin.Context) {
|
|||||||
id, err := strconv.Atoi(c.Query("mid"))
|
id, err := strconv.Atoi(c.Query("mid"))
|
||||||
params["Title"] = "新增专题 | " + cache.Ei.Blogger.BTitle
|
params["Title"] = "新增专题 | " + cache.Ei.Blogger.BTitle
|
||||||
if err == nil && id > 0 {
|
if err == nil && id > 0 {
|
||||||
var serie *model.Serie
|
|
||||||
for _, v := range cache.Ei.Series {
|
for _, v := range cache.Ei.Series {
|
||||||
if v.ID == id {
|
if v.ID == id {
|
||||||
params["Title"] = "编辑专题 | " + cache.Ei.Blogger.BTitle
|
params["Title"] = "编辑专题 | " + cache.Ei.Blogger.BTitle
|
||||||
params["Edit"] = serie
|
params["Edit"] = v
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -164,6 +162,21 @@ func handleAdminTags(c *gin.Context) {
|
|||||||
renderHTMLAdminLayout(c, "admin-tags", params)
|
renderHTMLAdminLayout(c, "admin-tags", params)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// handleDraftDelete 编辑页删除草稿
|
||||||
|
func handleDraftDelete(c *gin.Context) {
|
||||||
|
id, err := strconv.Atoi(c.Query("cid"))
|
||||||
|
if err != nil || id < 1 {
|
||||||
|
c.JSON(http.StatusBadRequest, gin.H{"error": "参数错误"})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
err = cache.Ei.RemoveArticle(context.Background(), id)
|
||||||
|
if err != nil {
|
||||||
|
c.JSON(http.StatusBadRequest, gin.H{"error": "删除错误"})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
c.Redirect(http.StatusFound, "/admin/write-post")
|
||||||
|
}
|
||||||
|
|
||||||
// handleAdminDraft 草稿箱页
|
// handleAdminDraft 草稿箱页
|
||||||
func handleAdminDraft(c *gin.Context) {
|
func handleAdminDraft(c *gin.Context) {
|
||||||
params := baseBEParams(c)
|
params := baseBEParams(c)
|
||||||
@@ -202,8 +215,6 @@ func handleAdminTrash(c *gin.Context) {
|
|||||||
params["List"], _, err = cache.Ei.LoadArticleList(context.Background(), search)
|
params["List"], _, err = cache.Ei.LoadArticleList(context.Background(), search)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logrus.Error("handleTrash.LoadArticleList: ", err)
|
logrus.Error("handleTrash.LoadArticleList: ", err)
|
||||||
c.HTML(http.StatusBadRequest, "backLayout.html", params)
|
|
||||||
return
|
|
||||||
}
|
}
|
||||||
renderHTMLAdminLayout(c, "admin-trash", params)
|
renderHTMLAdminLayout(c, "admin-trash", params)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -54,6 +54,7 @@ func RegisterRoutesAuthz(group gin.IRoutes) {
|
|||||||
group.GET("/profile", handleAdminProfile)
|
group.GET("/profile", handleAdminProfile)
|
||||||
// write
|
// write
|
||||||
group.GET("/write-post", handleAdminPost)
|
group.GET("/write-post", handleAdminPost)
|
||||||
|
group.GET("/draft-delete", handleDraftDelete)
|
||||||
// manage
|
// manage
|
||||||
group.GET("/manage-posts", handleAdminPosts)
|
group.GET("/manage-posts", handleAdminPosts)
|
||||||
group.GET("/manage-series", handleAdminSeries)
|
group.GET("/manage-series", handleAdminSeries)
|
||||||
|
|||||||
Reference in New Issue
Block a user