diff --git a/api.go b/api.go index 6d59841..ac8b774 100644 --- a/api.go +++ b/api.go @@ -231,12 +231,15 @@ func apiPostAdd(c *gin.Context) { } cid = int(artc.ID) if !artc.IsDraft { - // elastic - ElasticIndex(artc) - // rss - DoPings(slug) - // disqus - ThreadCreate(artc) + // 异步执行,快 + go func() { + // elastic + ElasticIndex(artc) + // rss + DoPings(slug) + // disqus + ThreadCreate(artc) + }() } return } @@ -260,14 +263,17 @@ func apiPostAdd(c *gin.Context) { } if !artc.IsDraft { ReplaceArticle(a, artc) - // elastic - ElasticIndex(artc) - // rss - DoPings(slug) - // disqus - if a == nil { - ThreadCreate(artc) - } + // 异步执行,快 + go func() { + // elastic + ElasticIndex(artc) + // rss + DoPings(slug) + // disqus + if a == nil { + ThreadCreate(artc) + } + }() } } diff --git a/db.go b/db.go index 3050f83..d1ad1fa 100644 --- a/db.go +++ b/db.go @@ -75,9 +75,9 @@ func init() { logd.Fatal(err) } // 读取帐号信息 - Ei = loadAccount() + loadAccount() // 获取文章数据 - Ei.Articles = loadArticles() + loadArticles() // 生成markdown文档 go generateMarkdown() // 启动定时器 @@ -87,12 +87,13 @@ func init() { } // 读取或初始化帐号信息 -func loadAccount() (a *Account) { - a = &Account{} - err := mgo.FindOne(DB, COLLECTION_ACCOUNT, mgo.M{"username": setting.Conf.Account.Username}, a) +func loadAccount() { + Ei = &Account{} + err := mgo.FindOne(DB, COLLECTION_ACCOUNT, mgo.M{"username": setting.Conf.Account.Username}, Ei) // 初始化用户数据 if err == mgo.ErrNotFound { - a = &Account{ + logd.Printf("Initializing account: %s\n", setting.Conf.Account.Username) + Ei = &Account{ Username: setting.Conf.Account.Username, Password: EncryptPasswd(setting.Conf.Account.Username, setting.Conf.Account.Password), Email: setting.Conf.Account.Email, @@ -100,29 +101,28 @@ func loadAccount() (a *Account) { Address: setting.Conf.Account.Address, CreateTime: time.Now(), } - a.BlogName = setting.Conf.Blogger.BlogName - a.SubTitle = setting.Conf.Blogger.SubTitle - a.BeiAn = setting.Conf.Blogger.BeiAn - a.BTitle = setting.Conf.Blogger.BTitle - a.Copyright = setting.Conf.Blogger.Copyright - err = mgo.Insert(DB, COLLECTION_ACCOUNT, a) + Ei.BlogName = setting.Conf.Blogger.BlogName + Ei.SubTitle = setting.Conf.Blogger.SubTitle + Ei.BeiAn = setting.Conf.Blogger.BeiAn + Ei.BTitle = setting.Conf.Blogger.BTitle + Ei.Copyright = setting.Conf.Blogger.Copyright + err = mgo.Insert(DB, COLLECTION_ACCOUNT, Ei) generateTopic() } else if err != nil { logd.Fatal(err) } - a.CH = make(chan string, 2) - a.MapArticles = make(map[string]*Article) - a.Tags = make(map[string]SortArticles) - return + Ei.CH = make(chan string, 2) + Ei.MapArticles = make(map[string]*Article) + Ei.Tags = make(map[string]SortArticles) } -func loadArticles() (artcs SortArticles) { - err := mgo.FindAll(DB, COLLECTION_ARTICLE, mgo.M{"isdraft": false, "deletetime": mgo.M{"$eq": time.Time{}}}, &artcs) +func loadArticles() { + err := mgo.FindAll(DB, COLLECTION_ARTICLE, mgo.M{"isdraft": false, "deletetime": mgo.M{"$eq": time.Time{}}}, &Ei.Articles) if err != nil { logd.Fatal(err) } - sort.Sort(artcs) - for i, v := range artcs { + sort.Sort(Ei.Articles) + for i, v := range Ei.Articles { // 渲染文章 GenerateExcerptAndRender(v) Ei.MapArticles[v.Slug] = v @@ -131,16 +131,15 @@ func loadArticles() (artcs SortArticles) { continue } if i > 0 { - v.Prev = artcs[i-1] + v.Prev = Ei.Articles[i-1] } - if artcs[i+1].ID >= setting.Conf.General.StartID { - v.Next = artcs[i+1] + if Ei.Articles[i+1].ID >= setting.Conf.General.StartID { + v.Next = Ei.Articles[i+1] } upArticle(v, false) } Ei.CH <- SERIES_MD Ei.CH <- ARCHIVE_MD - return } // generate series,archive markdown @@ -209,6 +208,9 @@ func generateTopic() { CreateTime: time.Time{}, UpdateTime: time.Time{}, } + // 推送到 disqus + go func() { ThreadCreate(about) }() + blogroll := &Article{ ID: mgo.NextVal(DB, COUNTER_ARTICLE), Author: setting.Conf.Account.Username, diff --git a/docker-compose.yml b/docker-compose.yml index a1db3d3..9f9bffa 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -6,8 +6,6 @@ services: volumes: - /data/eiblog/mgodb:/data/db restart: always - ports: - - 27017:27017 elasticsearch: image: elasticsearch:2.4.1 container_name: eisearch diff --git a/elasticsearch.go b/elasticsearch.go index b4cb1c3..163e6db 100644 --- a/elasticsearch.go +++ b/elasticsearch.go @@ -6,6 +6,7 @@ import ( "errors" "fmt" "io/ioutil" + "net" "net/http" "regexp" "strings" @@ -23,10 +24,20 @@ const ( ES_DATE = `{"range":{"date":{"gte":"%s","lte": "%s","format": "yyyy-MM-dd||yyyy-MM||yyyy"}}}` // 2016-10||/M ) -var es *ElasticService +var ( + ErrUninitializedES = errors.New("uninitialized elasticsearch") + + es *ElasticService +) // 初始化 Elasticsearch 服务器 func init() { + _, err := net.LookupIP("elasticsearch") + if err != nil { + logd.Info(err) + return + } + es = &ElasticService{url: "http://elasticsearch:9200", c: new(http.Client)} initIndex() } @@ -41,7 +52,11 @@ func initIndex() { } // 查询 -func Elasticsearch(qStr string, size, from int) *ESSearchResult { +func Elasticsearch(qStr string, size, from int) (*ESSearchResult, error) { + if es == nil { + return nil, ErrUninitializedES + } + // 分析查询字符串 reg := regexp.MustCompile(`(tag|slug|date):`) indexs := reg.FindAllStringIndex(qStr, -1) @@ -92,14 +107,17 @@ func Elasticsearch(qStr string, size, from int) *ESSearchResult { } docs, err := IndexQueryDSL(INDEX, TYPE, size, from, []byte(dsl)) if err != nil { - logd.Error(err) - return nil + return nil, err } - return docs + return docs, nil } // 添加或更新索引 func ElasticIndex(artc *Article) error { + if es == nil { + return ErrUninitializedES + } + img := PickFirstImage(artc.Content) mapping := map[string]interface{}{ "title": artc.Title, @@ -115,6 +133,10 @@ func ElasticIndex(artc *Article) error { // 删除索引 func ElasticDelIndex(ids []int32) error { + if es == nil { + return ErrUninitializedES + } + var target []string for _, id := range ids { target = append(target, fmt.Sprint(id)) diff --git a/front.go b/front.go index 5a2e940..6a8efa0 100644 --- a/front.go +++ b/front.go @@ -199,10 +199,12 @@ func HandleSearchPage(c *gin.Context) { start = 1 } h["Word"] = q - var result *ESSearchResult + vals := c.Request.URL.Query() - result = Elasticsearch(q, setting.Conf.General.PageNum, start-1) - if result != nil { + result, err := Elasticsearch(q, setting.Conf.General.PageNum, start-1) + if err != nil { + logd.Error(err) + } else { result.Took /= 1000 for i, v := range result.Hits.Hits { if artc := Ei.MapArticles[result.Hits.Hits[i].Source.Slug]; len(v.Highlight.Content) == 0 && artc != nil { diff --git a/router.go b/router.go index c19ed3f..6721789 100644 --- a/router.go +++ b/router.go @@ -2,6 +2,7 @@ package main import ( + "crypto/rand" "fmt" "text/template" "time" @@ -27,7 +28,12 @@ func init() { } router = gin.Default() - store := sessions.NewCookieStore([]byte("eiblog321")) + b := make([]byte, 16) + _, err := rand.Read(b) + if err != nil { + logd.Fatal(err) + } + store := sessions.NewCookieStore(b) store.Options(sessions.Options{ MaxAge: 86400 * 7, Path: "/", @@ -43,7 +49,7 @@ func init() { } return false }) - _, err := Tmpl.ParseFiles(files...) + _, err = Tmpl.ParseFiles(files...) if err != nil { logd.Fatal(err) }