This commit is contained in:
awei
2025-03-03 17:43:50 +08:00
commit 113756eaae
1497 changed files with 127997 additions and 0 deletions

View File

@@ -0,0 +1,173 @@
package sitemap
import (
"bbs-go/internal/models/constants"
"bbs-go/internal/pkg/bbsurls"
"bbs-go/internal/pkg/uploader"
"bytes"
"compress/gzip"
"log/slog"
"strings"
"time"
"github.com/ikeikeikeike/go-sitemap-generator/v2/stm"
"github.com/mlogclub/simple/common/dates"
"bbs-go/internal/models"
"bbs-go/internal/pkg/config"
"bbs-go/internal/services"
)
const (
changefreqAlways = "always"
changefreqHourly = "hourly"
changefreqDaily = "daily"
changefreqWeekly = "weekly"
changefreqMonthly = "monthly"
changefreqYearly = "yearly"
changefreqNever = "never"
)
var building = false
// Generate
func Generate() {
if !config.Instance.IsProd() {
return
}
if building {
slog.Info("Sitemap in building...")
return
}
building = true
defer func() {
building = false
}()
sm := stm.NewSitemap(0)
sm.SetDefaultHost(config.Instance.BaseUrl) // 网站host
if uploader.IsEnabledOss() {
sm.SetSitemapsHost(config.Instance.Uploader.AliyunOss.Host) // 上传到阿里云所以host设置为阿里云
} else {
sm.SetPublicPath(config.Instance.Uploader.Local.Host)
}
sm.SetSitemapsPath("sitemap") // sitemap存放目录
sm.SetVerbose(false)
sm.SetPretty(false)
sm.SetCompress(true)
sm.SetAdapter(&myAdapter{})
sm.Create()
sm.Add(stm.URL{
{"loc", bbsurls.AbsUrl("/")},
{"lastmod", time.Now()},
{"changefreq", changefreqHourly},
})
sm.Add(stm.URL{
{"loc", bbsurls.AbsUrl("/topics")},
{"lastmod", time.Now()},
{"changefreq", changefreqHourly},
})
sm.Add(stm.URL{
{"loc", bbsurls.AbsUrl("/articles")},
{"lastmod", time.Now()},
{"changefreq", changefreqAlways},
})
// var (
// dateFrom = dates.Timestamp(time.Now().AddDate(0, -1, 0))
// dateTo = dates.NowTimestamp()
// )
services.ArticleService.ScanDesc(func(articles []models.Article) {
for _, article := range articles {
if article.Status == constants.StatusOk {
articleUrl := bbsurls.ArticleUrl(article.Id)
sm.Add(stm.URL{
{"loc", articleUrl},
{"lastmod", dates.FromTimestamp(article.UpdateTime)},
{"changefreq", changefreqMonthly},
{"priority", 0.6},
})
}
}
})
services.TopicService.ScanDesc(func(topics []models.Topic) {
for _, topic := range topics {
if topic.Status == constants.StatusOk {
topicUrl := bbsurls.TopicUrl(topic.Id)
sm.Add(stm.URL{
{"loc", topicUrl},
{"lastmod", dates.FromTimestamp(topic.LastCommentTime)},
{"changefreq", changefreqDaily},
{"priority", 0.6},
})
}
}
})
services.TagService.Scan(func(tags []models.Tag) {
for _, tag := range tags {
tagUrl := bbsurls.TagArticlesUrl(tag.Id)
sm.Add(stm.URL{
{"loc", tagUrl},
{"lastmod", time.Now()},
{"changefreq", changefreqMonthly},
})
}
})
services.UserService.Scan(func(users []models.User) {
for _, user := range users {
sm.Add(stm.URL{
{"loc", bbsurls.UserUrl(user.Id)},
{"lastmod", time.Now()},
{"changefreq", changefreqWeekly},
})
}
})
sm.Finalize().PingSearchEngines()
// sm.Finalize().PingSearchEngines("http://www.google.cn/webmasters/tools/ping?sitemap=%s")
}
// My Adapter
type myAdapter struct {
}
// Bytes gets written content.
func (adp *myAdapter) Bytes() [][]byte {
return nil
}
// Write will create sitemap xml file into the file systems.
func (adp *myAdapter) Write(loc *stm.Location, data []byte) {
if stm.GzipPtn.MatchString(loc.Filename()) { // gzip
var out []byte
var in bytes.Buffer
w := gzip.NewWriter(&in)
_, _ = w.Write(data)
_ = w.Close()
out = in.Bytes()
// 写入gzip格式数据
adp.ossWrite(loc.PathInPublic(), out)
// 写入原始数据
adp.ossWrite(strings.ReplaceAll(loc.PathInPublic(), ".gz", ""), data)
} else { // 非gzip
adp.ossWrite(loc.PathInPublic(), data)
}
}
// oss写入
func (adp *myAdapter) ossWrite(fileKey string, out []byte) {
if _url, err := uploader.PutObject(fileKey, out, ""); err != nil {
slog.Error("Upload sitemap error:", slog.Any("err", err))
} else {
slog.Info("Upload sitemap:", slog.String("url", _url))
}
}