Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 05b7c1c

Browse files
committed
sitemap文件
1 parent 7ae4d76 commit 05b7c1c

File tree

11 files changed

+466
-2
lines changed

11 files changed

+466
-2
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ bin
1212
log
1313
pid
1414
data
15+
sitemap
16+
assets
1517

1618
# Architecture specific extensions/prefixes
1719
*.[568vq]

websites/code/studygolang/src/controller/account.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ func sendWelcomeMail(email []string) {
6262
content := `Welcome to Study Golang.<br><br>
6363
欢迎您,成功注册成为 Golang中文社区 | Go语言学习园地 会员<br><br>
6464
Golang中文社区是一个Go语言技术社区,完全用Go语言开发。我们为gopher们提供一个好的学习交流场所。加入到社区中来,参与分享,学习,不断提高吧。前往 <a href="http://studygolang.com">Golang中文社区 | Go语言学习园地</a><br>
65-
<div style="text-align:right;">&copy;2013 studygolang.com Golang中文社区 | Go语言学习园地</div>`
65+
<div style="text-align:right;">&copy;2012-2014 studygolang.com Golang中文社区 | Go语言学习园地</div>`
6666
service.SendMail("Golang中文社区 | Go语言学习园地 注册成功通知", content, email)
6767
}
6868

@@ -84,6 +84,7 @@ func LoginHandler(rw http.ResponseWriter, req *http.Request) {
8484
userLogin, err := service.Login(username, passwd)
8585
if err != nil {
8686
if suffix != "" {
87+
logger.Errorln("login error:", err)
8788
fmt.Fprint(rw, `{"ok":0,"error":"`+err.Error()+`"}`)
8889
return
8990
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
// Copyright 2014 The StudyGolang Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style
3+
// license that can be found in the LICENSE file.
4+
// http://studygolang.com
5+
// Author:polaris [email protected]
6+
7+
package controller
8+
9+
import (
10+
"net/http"
11+
)
12+
13+
// 构建 rss 订阅
14+
// uri: /feed
15+
func FeedHandler(rw http.ResponseWriter, req *http.Request) {
16+
17+
}

websites/code/studygolang/src/server/studygolang/background.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@ func ServeBackGround() {
3333
// 两分钟刷一次浏览数(TODO:重启丢失问题?信号控制重启?)
3434
c.AddFunc("@every 2m", service.Views.Flush)
3535

36+
// 每天生成 sitemap 文件
37+
c.AddFunc("@daily", service.GenSitemap)
38+
3639
c.Start()
3740
}
3841

websites/code/studygolang/src/server/studygolang/main.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ func main() {
3232
// 服务静态文件
3333
http.Handle("/static/", http.FileServer(http.Dir(ROOT)))
3434

35+
// 服务 sitemap 文件
36+
http.Handle("/sitemap/", http.FileServer(http.Dir(ROOT)))
37+
3538
// 验证码
3639
http.Handle("/captcha/", captcha.Server(100, 40))
3740

Lines changed: 225 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,225 @@
1+
// Copyright 2014 The StudyGolang Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style
3+
// license that can be found in the LICENSE file.
4+
// http://studygolang.com
5+
// Author:polaris [email protected]
6+
7+
package service
8+
9+
import (
10+
"fmt"
11+
"os"
12+
"strconv"
13+
"text/template"
14+
"time"
15+
16+
"config"
17+
"logger"
18+
"model"
19+
"util"
20+
)
21+
22+
var sitemapTpl = template.Must(template.ParseFiles(config.ROOT + "/template/sitemap.xml"))
23+
var sitemapIndexTpl = template.Must(template.ParseFiles(config.ROOT + "/template/sitemapindex.xml"))
24+
25+
var sitemapPath = config.ROOT + "/sitemap/"
26+
27+
func init() {
28+
if !util.Exist(sitemapPath) {
29+
err := os.MkdirAll(sitemapPath, 0777)
30+
if err != nil {
31+
panic(err)
32+
}
33+
}
34+
}
35+
36+
func GenSitemap() {
37+
sitemapFiles := []string{}
38+
39+
// 首页
40+
home := map[string]string{
41+
"loc": "http://" + config.Config["domain"],
42+
"lastmode": time.Now().Format(time.RFC3339),
43+
}
44+
45+
var (
46+
little = 1
47+
step = 4999
48+
large = little + step
49+
)
50+
51+
// 文章
52+
article := model.NewArticle()
53+
for {
54+
sitemapFile := "sitemap_article_" + strconv.Itoa(large) + ".xml"
55+
56+
articles, err := article.Where("id BETWEEN ? AND ? AND status!=?", little, large, model.StatusOffline).FindAll("id", "mtime")
57+
little = large + 1
58+
large = little + step
59+
60+
if err != nil {
61+
continue
62+
}
63+
64+
if len(articles) == 0 {
65+
break
66+
}
67+
68+
data := map[string]interface{}{
69+
"home": home,
70+
"articles": articles,
71+
}
72+
73+
if err = output(sitemapFile, data); err == nil {
74+
sitemapFiles = append(sitemapFiles, sitemapFile)
75+
}
76+
}
77+
78+
little = 1
79+
large = little + step
80+
81+
// 主题(帖子)
82+
topic := model.NewTopic()
83+
for {
84+
sitemapFile := "sitemap_topic_" + strconv.Itoa(large) + ".xml"
85+
86+
topics, err := topic.Where("tid BETWEEN ? AND ? AND flag IN(?,?)", little, large, 0, 1).FindAll("tid", "mtime")
87+
little, large = large+1, little+step
88+
89+
if err != nil {
90+
continue
91+
}
92+
93+
if len(topics) == 0 {
94+
break
95+
}
96+
97+
data := map[string]interface{}{
98+
"home": home,
99+
"topics": topics,
100+
}
101+
102+
if err = output(sitemapFile, data); err == nil {
103+
sitemapFiles = append(sitemapFiles, sitemapFile)
104+
}
105+
}
106+
107+
little = 1
108+
large = little + step
109+
110+
// 资源
111+
resource := model.NewResource()
112+
for {
113+
sitemapFile := "sitemap_resource_" + strconv.Itoa(large) + ".xml"
114+
115+
resources, err := resource.Where("id BETWEEN ? AND ?", little, large).FindAll("id", "mtime")
116+
little, large = large+1, little+step
117+
118+
if err != nil {
119+
continue
120+
}
121+
122+
if len(resources) == 0 {
123+
break
124+
}
125+
126+
data := map[string]interface{}{
127+
"home": home,
128+
"resources": resources,
129+
}
130+
131+
if err = output(sitemapFile, data); err == nil {
132+
sitemapFiles = append(sitemapFiles, sitemapFile)
133+
}
134+
}
135+
136+
little = 1
137+
large = little + step
138+
139+
// 项目
140+
project := model.NewOpenProject()
141+
for {
142+
sitemapFile := "sitemap_project_" + strconv.Itoa(large) + ".xml"
143+
144+
projects, err := project.Where("id BETWEEN ? AND ? AND status=?", little, large, model.StatusOnline).FindAll("id", "uri", "mtime")
145+
little, large = large+1, little+step
146+
147+
if err != nil {
148+
continue
149+
}
150+
151+
if len(projects) == 0 {
152+
break
153+
}
154+
155+
data := map[string]interface{}{
156+
"home": home,
157+
"projects": projects,
158+
}
159+
160+
if err = output(sitemapFile, data); err == nil {
161+
sitemapFiles = append(sitemapFiles, sitemapFile)
162+
}
163+
}
164+
165+
little = 1
166+
large = little + step
167+
168+
// wiki
169+
wiki := model.NewWiki()
170+
for {
171+
sitemapFile := "sitemap_wiki_" + strconv.Itoa(large) + ".xml"
172+
173+
wikis, err := wiki.Where("id BETWEEN ? AND ?", little, large).FindAll("id", "uri", "mtime")
174+
little, large = large+1, little+step
175+
176+
if err != nil {
177+
continue
178+
}
179+
180+
if len(wikis) == 0 {
181+
break
182+
}
183+
184+
data := map[string]interface{}{
185+
"home": home,
186+
"wikis": wikis,
187+
}
188+
189+
if err = output(sitemapFile, data); err == nil {
190+
sitemapFiles = append(sitemapFiles, sitemapFile)
191+
}
192+
}
193+
194+
file, err := os.Create(sitemapPath + "sitemapindex.xml")
195+
if err != nil {
196+
logger.Errorln("gen sitemap index file error:", err)
197+
return
198+
}
199+
defer file.Close()
200+
201+
err = sitemapIndexTpl.Execute(file, map[string]interface{}{
202+
"home": home,
203+
"sitemapFiles": sitemapFiles,
204+
})
205+
if err != nil {
206+
logger.Errorln("execute sitemap index template error:", err)
207+
}
208+
209+
fmt.Println("finish")
210+
}
211+
212+
func output(filename string, data map[string]interface{}) (err error) {
213+
var file *os.File
214+
file, err = os.Create(sitemapPath + filename)
215+
if err != nil {
216+
logger.Errorln("open file error:", err)
217+
return
218+
}
219+
defer file.Close()
220+
if err = sitemapTpl.Execute(file, data); err != nil {
221+
logger.Errorln("execute template error:", err)
222+
}
223+
224+
return
225+
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
// Copyright 2014 The StudyGolang Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style
3+
// license that can be found in the LICENSE file.
4+
// http://studygolang.com
5+
// Author:polaris [email protected]
6+
7+
package util
8+
9+
import (
10+
"os"
11+
)
12+
13+
// 检查文件或目录是否存在
14+
// 如果由 filename 指定的文件或目录存在则返回 true,否则返回 false
15+
func Exist(filename string) bool {
16+
_, err := os.Stat(filename)
17+
return err == nil || os.IsExist(err)
18+
}
19+
20+
// 列出指定路径中的文件和目录
21+
// 如果目录不存在,则返回空slice
22+
func ScanDir(directory string) []string {
23+
file, err := os.Open(directory)
24+
if err != nil {
25+
return []string{}
26+
}
27+
names, err := file.Readdirnames(-1)
28+
if err != nil {
29+
return []string{}
30+
}
31+
return names
32+
}
33+
34+
// 判断给定文件名是否是一个目录
35+
// 如果文件名存在并且为目录则返回 true。如果 filename 是一个相对路径,则按照当前工作目录检查其相对路径。
36+
func IsDir(filename string) bool {
37+
return isFileOrDir(filename, true)
38+
}
39+
40+
// 判断给定文件名是否为一个正常的文件
41+
// 如果文件存在且为正常的文件则返回 true
42+
func IsFile(filename string) bool {
43+
return isFileOrDir(filename, false)
44+
}
45+
46+
// 判断是文件还是目录,根据decideDir为true表示判断是否为目录;否则判断是否为文件
47+
func isFileOrDir(filename string, decideDir bool) bool {
48+
fileInfo, err := os.Stat(filename)
49+
if err != nil {
50+
return false
51+
}
52+
isDir := fileInfo.IsDir()
53+
if decideDir {
54+
return isDir
55+
}
56+
return !isDir
57+
}

0 commit comments

Comments
 (0)