mirror of
https://github.com/eiblog/eiblog.git
synced 2026-02-04 13:52:26 +08:00
fixed #6,发布文章异步提交,随机 session key等
This commit is contained in:
34
api.go
34
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)
|
||||
}
|
||||
}()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
50
db.go
50
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,
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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))
|
||||
|
||||
8
front.go
8
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 {
|
||||
|
||||
10
router.go
10
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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user