From 990e6abbd81932567d7ad6e5c2c712ecf8fb011c Mon Sep 17 00:00:00 2001 From: deepzz0 Date: Tue, 27 Apr 2021 11:08:55 +0800 Subject: [PATCH] chore: run blog --- .gitignore | 2 +- conf/app.yml | 3 +- go.mod | 2 +- go.sum | 6 +- pkg/cache/cache.go | 119 +++++++++++++++++++++----------- pkg/cache/store/mongodb.go | 76 ++++++++++---------- pkg/cache/store/mongodb_test.go | 1 - pkg/cache/store/store.go | 10 +-- pkg/core/blog/file/timer.go | 84 +++++++++++----------- pkg/internal/qiniu.go | 4 +- 10 files changed, 173 insertions(+), 134 deletions(-) diff --git a/.gitignore b/.gitignore index cc736d8..7a02538 100644 --- a/.gitignore +++ b/.gitignore @@ -15,4 +15,4 @@ # Dependency directories (remove the comment below to include it) # vendor/ bin - +assets/*.* diff --git a/conf/app.yml b/conf/app.yml index 3d8f361..5621927 100644 --- a/conf/app.yml +++ b/conf/app.yml @@ -1,7 +1,7 @@ appname: eiblog database: driver: mongodb - source: localhost:27017 + source: mongodb://localhost:27017 eshost: http://localhost:9200 blogapp: mode: @@ -28,6 +28,7 @@ blogapp: shortname: xxxxxx publickey: wdSgxRm9rdGAlLKFcFdToBe3GT4SibmV7Y8EjJQ0r4GWXeKtxpopMAeIeoI2dTEg accesstoken: 50023908f39f4607957e909b495326af + interval: 5 # 获取评论数量间隔h google: url: https://www.google-analytics.com/collect tid: UA-xxxxxx-1 diff --git a/go.mod b/go.mod index 3e0785c..46e44a9 100644 --- a/go.mod +++ b/go.mod @@ -10,7 +10,7 @@ require ( github.com/gin-gonic/gin v1.6.3 github.com/gofrs/uuid v3.3.0+incompatible github.com/golang/protobuf v1.4.2 - github.com/qiniu/api.v7/v7 v7.8.2 + github.com/qiniu/go-sdk/v7 v7.9.5 github.com/sirupsen/logrus v1.4.2 github.com/swaggo/gin-swagger v1.3.0 github.com/swaggo/swag v1.6.9 diff --git a/go.sum b/go.sum index e1a5b3c..69e1812 100644 --- a/go.sum +++ b/go.sum @@ -126,8 +126,6 @@ github.com/google/go-cmp v0.5.2 h1:X2ev0eStA3AbceY54o37/0PQ/UWqKEiiO2dKL5OPaFM= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gookit/color v1.3.6 h1:Rgbazd4JO5AgSTVGS3o0nvaSdwdrS8bzvIXwtK6OiMk= -github.com/gookit/color v1.3.6/go.mod h1:R3ogXq2B9rTbXoSHJ1HyUVAZ3poOJHpd9nQmyGZsfvQ= github.com/gorilla/context v1.1.1 h1:AWwleXJkX/nhcU9bZSnZoi3h/qGYqQAGhq6zZe/aQW8= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/securecookie v1.1.1 h1:miw7JPhV+b/lAHSXz4qd/nN9jRiAFV5FwjeKyCS8BvQ= @@ -191,8 +189,8 @@ github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/qiniu/api.v7/v7 v7.8.2 h1:f08kI0MmsJNzK4sUS8bG3HDH67ktwd/ji23Gkiy2ra4= -github.com/qiniu/api.v7/v7 v7.8.2/go.mod h1:FPsIqxh1Ym3X01sANE5ZwXfLZSWoCUp5+jNI8cLo3l0= +github.com/qiniu/go-sdk/v7 v7.9.5 h1:hxsdSmRAfN8hp77OUjjDgKHyxjHpFlW5fC2rHC6hMRQ= +github.com/qiniu/go-sdk/v7 v7.9.5/go.mod h1:Eeqk1/Km3f1MuLUUkg2JCSg/dVkydKbBvEdJJqFgn9g= github.com/quasoft/memstore v0.0.0-20180925164028-84a050167438/go.mod h1:wTPjTepVu7uJBYgZ0SdWHQlIas582j6cn2jgk4DDdlg= github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= diff --git a/pkg/cache/cache.go b/pkg/cache/cache.go index ee5b377..3312b5c 100644 --- a/pkg/cache/cache.go +++ b/pkg/cache/cache.go @@ -3,6 +3,7 @@ package cache import ( "bytes" + "context" "fmt" "sort" "strings" @@ -23,7 +24,7 @@ var ( Ei *Cache // regenerate pages chan - pagesCh = make(chan string, 1) + pagesCh = make(chan string, 2) pageSeries = "series-md" pageArchive = "archive-md" ) @@ -77,6 +78,79 @@ type Cache struct { ArticlesMap map[string]*model.Article // slug:article } +// // LoadInsertAccount 读取或创建账户 +// LoadInsertAccount(ctx context.Context, acct *model.Account) (*model.Account, error) +// // UpdateAccount 更新账户 +// UpdateAccount(ctx context.Context, name string, fields map[string]interface{}) error +// +// // LoadInsertBlogger 读取或创建博客 +// LoadInsertBlogger(ctx context.Context, blogger *model.Blogger) (*model.Blogger, error) +// // UpdateBlogger 更新博客 +// UpdateBlogger(ctx context.Context, fields map[string]interface{}) error +// +// // InsertSeries 创建专题 +// InsertSeries(ctx context.Context, series *model.Series) error +// // RemoveSeries 删除专题 +// RemoveSeries(ctx context.Context, id int) error +// // UpdateSeries 更新专题 +// UpdateSeries(ctx context.Context, id int, fields map[string]interface{}) error +// // LoadAllSeries 读取所有专题 +// LoadAllSeries(ctx context.Context) (model.SortedSeries, error) +// +// // InsertArticle 创建文章 +// InsertArticle(ctx context.Context, article *model.Article) error +// // RemoveArticle 硬删除文章 +// RemoveArticle(ctx context.Context, id int) error +// // DeleteArticle 软删除文章,放入回收箱 +// DeleteArticle(ctx context.Context, id int) error +// // CleanArticles 清理回收站文章 +// CleanArticles(ctx context.Context) error +// // UpdateArticle 更新文章 +// UpdateArticle(ctx context.Context, id int, fields map[string]interface{}) error +// // RecoverArticle 恢复文章到草稿 +// RecoverArticle(ctx context.Context, id int) error +// // LoadAllArticle 读取所有文章 +// LoadAllArticle(ctx context.Context) (model.SortedArticles, error) +// // LoadTrashArticles 读取回收箱 +// LoadTrashArticles(ctx context.Context) (model.SortedArticles, error) +// // LoadDraftArticles 读取草稿箱 +// LoadDraftArticles(ctx context.Context) (model.SortedArticles, error) + +// PageArticles 文章翻页 +func (c *Cache) PageArticles(page int, pageSize int) (prev, + next int, articles []*model.Article) { + + var l int + for l = len(c.Articles); l > 0; l-- { + if c.Articles[l-1].ID >= config.Conf.BlogApp.General.StartID { + break + } + } + if l == 0 { + return 0, 0, nil + } + m := l / pageSize + if d := l % pageSize; d > 0 { + m++ + } + if page > m { + page = m + } + if page > 1 { + prev = page - 1 + } + if page < m { + next = page + 1 + } + s := (page - 1) * pageSize + e := page * pageSize + if e > l { + e = l + } + articles = c.Articles[s:e] + return +} + // loadBlogger 博客信息 func (c *Cache) loadBlogger() error { blogapp := config.Conf.BlogApp @@ -87,7 +161,7 @@ func (c *Cache) loadBlogger() error { BTitle: blogapp.Blogger.BTitle, Copyright: blogapp.Blogger.Copyright, } - blogger, err := c.LoadOrCreateBlogger(blogger) + blogger, err := c.LoadInsertBlogger(context.Background(), blogger) if err != nil { return err } @@ -108,7 +182,7 @@ func (c *Cache) loadAccount() error { PhoneN: blogapp.Account.PhoneNumber, Address: blogapp.Account.Address, } - account, err := c.LoadOrCreateAccount(account) + account, err := c.LoadInsertAccount(context.Background(), account) if err != nil { return err } @@ -118,7 +192,7 @@ func (c *Cache) loadAccount() error { // loadArticles 文章信息 func (c *Cache) loadArticles() error { - articles, err := c.LoadAllArticles() + articles, err := c.LoadAllArticle(context.Background()) if err != nil { return err } @@ -254,7 +328,7 @@ func (c *Cache) timerClean() { ticker := time.NewTicker(dur * time.Hour) for range ticker.C { - err := c.CleanArticles() + err := c.CleanArticles(context.Background()) if err != nil { logrus.Error("cache.timerClean.CleanArticles: ", err) } @@ -273,38 +347,3 @@ func (c *Cache) timerDisqus() { } } } - -// PageArticles 文章翻页 -func (c *Cache) PageArticles(page int, pageSize int) (prev, - next int, articles []*model.Article) { - - var l int - for l = len(c.Articles); l > 0; l-- { - if c.Articles[l-1].ID >= config.Conf.BlogApp.General.StartID { - break - } - } - if l == 0 { - return 0, 0, nil - } - m := l / pageSize - if d := l % pageSize; d > 0 { - m++ - } - if page > m { - page = m - } - if page > 1 { - prev = page - 1 - } - if page < m { - next = page + 1 - } - s := (page - 1) * pageSize - e := page * pageSize - if e > l { - e = l - } - articles = c.Articles[s:e] - return -} diff --git a/pkg/cache/store/mongodb.go b/pkg/cache/store/mongodb.go index 1d05601..10f303e 100644 --- a/pkg/cache/store/mongodb.go +++ b/pkg/cache/store/mongodb.go @@ -16,6 +16,9 @@ import ( "go.mongodb.org/mongo-driver/mongo/readpref" ) +// driver: mongodb +// source: mongodb://localhost:27017 + const ( mongoDBName = "eiblog" collectionAccount = "account" @@ -50,42 +53,6 @@ func (db *mongodb) Init(source string) (Store, error) { return db, nil } -// LoadInsertAccount 读取或创建账户 -func (db *mongodb) LoadInsertAccount(ctx context.Context, - acct *model.Account) (*model.Account, error) { - - collection := db.Database(mongoDBName).Collection(collectionAccount) - - filter := bson.M{"username": config.Conf.BlogApp.Account.Username} - result := collection.FindOne(ctx, filter) - err := result.Err() - if err != nil { - if err != mongo.ErrNoDocuments { - return nil, err - } - _, err = collection.InsertOne(ctx, acct) - } else { - err = result.Decode(acct) - } - return acct, err -} - -// UpdateAccount 更新账户 -func (db *mongodb) UpdateAccount(ctx context.Context, name string, - fields map[string]interface{}) error { - - collection := db.Database(mongoDBName).Collection(collectionAccount) - - filter := bson.M{"username": name} - params := bson.M{} - for k, v := range fields { - params[k] = v - } - update := bson.M{"$set": params} - _, err := collection.UpdateOne(ctx, filter, update) - return err -} - // LoadInsertBlogger 读取或创建博客 func (db *mongodb) LoadInsertBlogger(ctx context.Context, blogger *model.Blogger) (*model.Blogger, error) { @@ -122,6 +89,42 @@ func (db *mongodb) UpdateBlogger(ctx context.Context, return err } +// LoadInsertAccount 读取或创建账户 +func (db *mongodb) LoadInsertAccount(ctx context.Context, + acct *model.Account) (*model.Account, error) { + + collection := db.Database(mongoDBName).Collection(collectionAccount) + + filter := bson.M{"username": config.Conf.BlogApp.Account.Username} + result := collection.FindOne(ctx, filter) + err := result.Err() + if err != nil { + if err != mongo.ErrNoDocuments { + return nil, err + } + _, err = collection.InsertOne(ctx, acct) + } else { + err = result.Decode(acct) + } + return acct, err +} + +// UpdateAccount 更新账户 +func (db *mongodb) UpdateAccount(ctx context.Context, name string, + fields map[string]interface{}) error { + + collection := db.Database(mongoDBName).Collection(collectionAccount) + + filter := bson.M{"username": name} + params := bson.M{} + for k, v := range fields { + params[k] = v + } + update := bson.M{"$set": params} + _, err := collection.UpdateOne(ctx, filter, update) + return err +} + // InsertSeries 创建专题 func (db *mongodb) InsertSeries(ctx context.Context, series *model.Series) error { collection := db.Database(mongoDBName).Collection(collectionSeries) @@ -222,7 +225,6 @@ func (db *mongodb) CleanArticles(ctx context.Context) error { collection := db.Database(mongoDBName).Collection(collectionArticle) exp := time.Now().Add(time.Duration(config.Conf.BlogApp.General.Trash) * time.Hour) - fmt.Println(exp) filter := bson.M{"deletetime": bson.M{"$gt": time.Time{}, "$lt": exp}} _, err := collection.DeleteMany(ctx, filter) return err diff --git a/pkg/cache/store/mongodb_test.go b/pkg/cache/store/mongodb_test.go index 33fc1ca..a2e524e 100644 --- a/pkg/cache/store/mongodb_test.go +++ b/pkg/cache/store/mongodb_test.go @@ -155,7 +155,6 @@ func TestDeleteArticle(t *testing.T) { } } -// TODO func TestCleanArticles(t *testing.T) { err := store.CleanArticles(context.Background()) if err != nil { diff --git a/pkg/cache/store/store.go b/pkg/cache/store/store.go index 1c5a098..4ca9538 100644 --- a/pkg/cache/store/store.go +++ b/pkg/cache/store/store.go @@ -17,16 +17,16 @@ var ( // Store 存储后端 type Store interface { - // LoadInsertAccount 读取或创建账户 - LoadInsertAccount(ctx context.Context, acct *model.Account) (*model.Account, error) - // UpdateAccount 更新账户 - UpdateAccount(ctx context.Context, name string, fields map[string]interface{}) error - // LoadInsertBlogger 读取或创建博客 LoadInsertBlogger(ctx context.Context, blogger *model.Blogger) (*model.Blogger, error) // UpdateBlogger 更新博客 UpdateBlogger(ctx context.Context, fields map[string]interface{}) error + // LoadInsertAccount 读取或创建账户 + LoadInsertAccount(ctx context.Context, acct *model.Account) (*model.Account, error) + // UpdateAccount 更新账户 + UpdateAccount(ctx context.Context, name string, fields map[string]interface{}) error + // InsertSeries 创建专题 InsertSeries(ctx context.Context, series *model.Series) error // RemoveSeries 删除专题 diff --git a/pkg/core/blog/file/timer.go b/pkg/core/blog/file/timer.go index 9dfbaf5..0dc0721 100644 --- a/pkg/core/blog/file/timer.go +++ b/pkg/core/blog/file/timer.go @@ -26,6 +26,9 @@ func init() { if err != nil { panic(err) } + generateOpensearch() + generateRobots() + generateCrossdomain() go timerFeed() go timerSitemap() } @@ -38,29 +41,28 @@ func timerFeed() { return } - t := time.NewTicker(time.Hour * 4) - for now := range t.C { - _, _, articles := cache.Ei.PageArticles(1, 20) - params := map[string]interface{}{ - "Titile": cache.Ei.Blogger.BTitle, - "SubTitle": cache.Ei.Blogger.SubTitle, - "Host": config.Conf.BlogApp.Host, - "FeedrURL": config.Conf.BlogApp.FeedRPC.FeedrURL, - "BuildDate": now.Format(time.RFC1123Z), - "Articles": articles, - } - f, err := os.OpenFile("assets/feed.xml", os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0666) - if err != nil { - logrus.Error("file: timerFeed.OpenFile: ", err) - continue - } - defer f.Close() - err = tpl.Execute(f, params) - if err != nil { - logrus.Error("file: timerFeed.Execute: ", err) - continue - } + now := time.Now() + _, _, articles := cache.Ei.PageArticles(1, 20) + params := map[string]interface{}{ + "Titile": cache.Ei.Blogger.BTitle, + "SubTitle": cache.Ei.Blogger.SubTitle, + "Host": config.Conf.BlogApp.Host, + "FeedrURL": config.Conf.BlogApp.FeedRPC.FeedrURL, + "BuildDate": now.Format(time.RFC1123Z), + "Articles": articles, } + f, err := os.OpenFile("assets/feed.xml", os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0666) + if err != nil { + logrus.Error("file: timerFeed.OpenFile: ", err) + return + } + defer f.Close() + err = tpl.Execute(f, params) + if err != nil { + logrus.Error("file: timerFeed.Execute: ", err) + return + } + time.AfterFunc(time.Hour*4, timerFeed) } // timerSitemap 定时刷新sitemap @@ -71,24 +73,22 @@ func timerSitemap() { return } - t := time.NewTicker(time.Hour * 4) - for range t.C { - params := map[string]interface{}{ - "Articles": cache.Ei.Articles, - "Host": config.Conf.BlogApp.Host, - } - f, err := os.OpenFile("assets/sitemap.xml", os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0666) - if err != nil { - logrus.Error("file: timerSitemap.OpenFile: ", err) - continue - } - defer f.Close() - err = tpl.Execute(f, params) - if err != nil { - logrus.Error("file: timerSitemap.Execute: ", err) - continue - } + params := map[string]interface{}{ + "Articles": cache.Ei.Articles, + "Host": config.Conf.BlogApp.Host, } + f, err := os.OpenFile("assets/sitemap.xml", os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0666) + if err != nil { + logrus.Error("file: timerSitemap.OpenFile: ", err) + return + } + defer f.Close() + err = tpl.Execute(f, params) + if err != nil { + logrus.Error("file: timerSitemap.Execute: ", err) + return + } + time.AfterFunc(time.Hour*24, timerSitemap) } // generateOpensearch 生成opensearch.xml @@ -103,7 +103,7 @@ func generateOpensearch() { "SubTitle": cache.Ei.Blogger.SubTitle, "Host": config.Conf.BlogApp.Host, } - f, err := os.OpenFile("static/opensearch.xml", os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0666) + f, err := os.OpenFile("assets/opensearch.xml", os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0666) if err != nil { logrus.Error("file: generateOpensearch.OpenFile: ", err) return @@ -126,7 +126,7 @@ func generateRobots() { params := map[string]string{ "Host": config.Conf.BlogApp.Host, } - f, err := os.OpenFile("static/robots.txt", os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0666) + f, err := os.OpenFile("assets/robots.txt", os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0666) if err != nil { logrus.Error("file: generateRobots.OpenFile: ", err) return @@ -149,7 +149,7 @@ func generateCrossdomain() { params := map[string]string{ "Host": config.Conf.BlogApp.Host, } - f, err := os.OpenFile("static/crossdomain.xml", os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0666) + f, err := os.OpenFile("assets/crossdomain.xml", os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0666) if err != nil { logrus.Error("file: generateCrossdomain.OpenFile: ", err) return diff --git a/pkg/internal/qiniu.go b/pkg/internal/qiniu.go index 1f00175..544de60 100644 --- a/pkg/internal/qiniu.go +++ b/pkg/internal/qiniu.go @@ -9,8 +9,8 @@ import ( "github.com/eiblog/eiblog/pkg/config" - "github.com/qiniu/api.v7/v7/auth/qbox" - "github.com/qiniu/api.v7/v7/storage" + "github.com/qiniu/go-sdk/v7/auth/qbox" + "github.com/qiniu/go-sdk/v7/storage" ) // QiniuUpload 上传文件