生成sitemap.xml示范demo


go
package services

import (
	"encoding/xml"
	"fmt"
	"log"
	"os"
	"github.com/gin-gonic/gin"
	"time"
	model "btcinfo/models"
	"context"
	"math" //向上取整需要
	"go.mongodb.org/mongo-driver/bson"

)

// URL 结构体定义了 sitemap.xml 文件中的每个 URL 条目
type URL struct {
	XMLName   xml.Name `xml:"url"`
	Loc       string   `xml:"loc"`
	LastMod   string   `xml:"lastmod,omitempty"`
	ChangeFreq string   `xml:"changefreq,omitempty"`
	Priority  float64  `xml:"priority,omitempty"`
}

// Sitemap 结构体定义了 sitemap.xml 文件的根元素
type Sitemap struct {
	XMLName xml.Name `xml:"urlset"`
	Xmlns   string   `xml:"xmlns,attr"`
	URLs    []URL    `xml:"url"`
}





//创建函数
func UpSitemap(c *gin.Context) {
	var Urls []URL
	log.Print("sitemap运行")

	//遍历语言代码并追加
	for _, lang := range Langs {
		//首页
		index := URL{
			Loc:       "https://info.com/"+lang,
			LastMod:   "2024-03-28",
			ChangeFreq: "yearly",
			Priority: 0.6,
		}
		Urls = append(Urls, index) //追加

		//列表faq
		//查询条件
		filter := bson.D{{Key: "dalei", Value: "faq"},{Key: "lang", Value: lang}}
		//取当前条件的总条数
		zongtiaoshu, _ := model.FaqModel.CountDocuments(context.TODO(), filter)
		//根据总条数计算总页数
		zongyeshu := int64(math.Ceil(float64(zongtiaoshu) / 12))
		log.Print("faq总页数",zongyeshu)
		//循环
		for i := int64(0); i < zongyeshu; i++ {
			log.Print("循环",i+1)
			lists1 := URL{
				Loc:       "https://info.com/"+lang+"/lists/faq/" +fmt.Sprint((i+1)),
				LastMod:   "2024-03-28",
				ChangeFreq: "weekly",
				Priority: 0.3,
			}
			Urls = append(Urls, lists1) //追加
		}

		//文章列表
		//查询条件
		filter = bson.D{{Key: "dalei", Value: "article"},{Key: "lang", Value: lang}}
		//取当前条件的总条数
		zongtiaoshu, _ = model.ArticleModel.CountDocuments(context.TODO(), filter)
		//根据总条数计算总页数
		zongyeshu = int64(math.Ceil(float64(zongtiaoshu) / 12))
		log.Print("文章总页数",zongyeshu)
		//循环
		for i := int64(0); i < zongyeshu; i++ {
			log.Print("循环",i+1)
			lists1 := URL{
				Loc:       "https://info.com/"+lang+"/lists/article/" +fmt.Sprint((i+1)),
				LastMod:   "2024-03-28",
				ChangeFreq: "weekly",
				Priority: 0.3,
			}
			Urls = append(Urls, lists1) //追加
		}

		//文章faq
		//定义一个空的切片来存储查询结果
		var results []model.Article_modelcha
		//查询条件
		filter = bson.D{{Key: "lang", Value: lang}}
		// 执行查询操作
		cursor, err := model.FaqModel.Find(context.TODO(), filter)
		if err != nil {
			c.JSON(400, gin.H{"db_error": "FAQ表查询错误"})
			log.Print("faq表查询错误:", err)
			return
		}
		//将上面的查询结果转码赋值给变量&results
		if err = cursor.All(context.TODO(), &results); err != nil {
			// 处理解码错误
			c.JSON(500, gin.H{"db_error": err})
			log.Print("路由查询解码错误:", err)
			return
		}

		//遍历文章
		for _, r := range results {
			var date time.Time //判断是否存在更新时间
			if r.Update != (time.Time{}) {
				date = r.Update
			} else {
				date = r.CreatedAt
			}
			
			list := URL{
				Loc:       "https://info.com/" + lang + "/article/faq/" + r.ID.Hex(),
				LastMod:   date.Format("2006-01-02"),
				ChangeFreq: "monthly",
				Priority: 0.7,
			}
			Urls = append(Urls, list) //追加
			
		}


		//文章

		// 执行查询操作
		cursor, err = model.ArticleModel.Find(context.TODO(), filter)
		if err != nil {
			c.JSON(400, gin.H{"db_error": "FAQ表查询错误"})
			log.Print("faq表查询错误:", err)
			return
		}
		//将上面的查询结果转码赋值给变量&results
		if err = cursor.All(context.TODO(), &results); err != nil {
			// 处理解码错误
			c.JSON(500, gin.H{"db_error": err})
			log.Print("路由查询解码错误:", err)
			return
		}

		//遍历文章
		for _, r := range results {
			var date time.Time //判断是否存在更新时间
			if r.Update != (time.Time{}) {
				date = r.Update
			} else {
				date = r.CreatedAt
			}
			
			list := URL{
				Loc:       "https://info.com/" + lang + "/article/article/" + r.ID.Hex(),
				LastMod:   date.Format("2006-01-02"),
				ChangeFreq: "monthly",
				Priority: 0.8,
			}
			Urls = append(Urls, list) //追加
			
		}

	}

	// 创建一个新的 sitemap 结构体
	sitemap := Sitemap{
		Xmlns: "http://www.sitemaps.org/schemas/sitemap/0.9",
		URLs: Urls,
	}

	// 创建一个新的文件并打开以供写入
	file, err := os.Create("jingtai/sitemap.xml")
	if err != nil {
		log.Println("Error creating file:", err)
		return
	}
	defer file.Close()

	// 使用 xml 包将 sitemap 结构体编码为 XML 格式,并写入到文件中
	encoder := xml.NewEncoder(file)
	encoder.Indent("", "  ")
	if err := encoder.Encode(sitemap); err != nil {
		log.Println("写入Sitemap.xml失败:", err)
		return
	}

	log.Println("Sitemap.xml更新完成!")
}

在一个不断试图把你变成另一个人的世界里做你自己就是最大的成就 -- 拉尔夫·瓦尔多·爱默生