/** * 每天运行一次,生成站点地图 */ const fs = require("fs"); const datefns = require("date-fns"); const models = require("../../models"); const sitemapPath = __dirname + "/../../dist/sitemap.xml"; const sitemapTempPath = __dirname + "/../../dist/sitemap.xml.temp"; // 生成站点地图 async function generateSitemap() { let commonXml = [ '', // '', "", " ", " https://art.pcoloring.com", ` 2026-05-13`, " ", " ", " https://art.pcoloring.com/coloring-page-gallery", ` 2026-05-13`, " ", " ", " https://art.pcoloring.com/coloring-pages", ` 2026-05-13`, " ", " ", " https://art.pcoloring.com/coloring-page-albums", ` 2025-07-22`, " ", " ", " https://art.pcoloring.com/video-coloring-pages", ` 2026-05-13`, " ", " ", " https://art.pcoloring.com/mandala-coloring-pages", ` 2026-05-13`, " ", " ", " https://art.pcoloring.com/zentangle-coloring-pages", ` 2026-05-13`, " ", " ", " https://art.pcoloring.com/zen-coloring-pages", ` 2026-05-13`, " ", " ", " https://art.pcoloring.com/flower-coloring-pages", ` 2026-05-13`, " ", " ", " https://art.pcoloring.com/cat-coloring-pages", ` 2026-05-13`, " ", " ", " https://art.pcoloring.com/butterfly-coloring-pages", ` 2026-05-13`, " ", " ", " https://art.pcoloring.com/architecture-coloring-pages", ` 2026-05-13`, " ", " ", " https://art.pcoloring.com/simple-coloring-pages", ` 2026-05-13`, " ", " ", " https://art.pcoloring.com/girl-coloring-pages", ` 2026-05-13`, " ", " ", " https://art.pcoloring.com/fantasy-coloring-pages", ` 2026-05-13`, " ", " ", " https://art.pcoloring.com/christmas-coloring-pages", ` 2026-05-13`, " ", " ", " https://art.pcoloring.com/patterns-coloring-pages", ` 2026-05-13`, " ", " ", " https://art.pcoloring.com/peacock-coloring-pages", ` 2026-05-13`, " ", " ", " https://art.pcoloring.com/dragon-coloring-pages", ` 2026-05-13`, " ", " ", " https://art.pcoloring.com/unicorn-coloring-pages", ` 2026-05-13`, " ", " ", " https://art.pcoloring.com/food-coloring-pages", ` 2026-05-13`, " ", " ", " https://art.pcoloring.com/tips-tricks", ` 2026-05-13`, " ", " ", " https://art.pcoloring.com/tips-tricks/how-to-color-online", ` 2026-05-13`, " ", " ", " https://art.pcoloring.com/tips-tricks/how-to-color-mandala-coloring-page", ` 2026-05-13`, " ", " ", " https://art.pcoloring.com/tips-tricks/benefit-of-coloring-pages", ` 2026-05-13`, " ", " ", " https://art.pcoloring.com/tips-tricks/choose-the-right-coloring-tools", ` 2026-05-13`, " ", " ", " https://art.pcoloring.com/tips-tricks/color-combinations-guide", ` 2026-05-13`, " ", " ", " https://art.pcoloring.com/tips-tricks/coloring-techniques-for-beginners", ` 2026-05-13`, " ", " ", " https://art.pcoloring.com/app", ` 2026-05-13`, " ", " ", " https://art.pcoloring.com/contact", ` 2026-05-13`, " ", " ", " https://art.pcoloring.com/about", ` 2026-05-13`, " ", " ", " https://art.pcoloring.com/faq", ` 2026-05-13`, " ", " ", " https://art.pcoloring.com/privacy-policy", ` 2026-05-13`, " ", " ", " https://art.pcoloring.com/terms-of-service", ` 2026-05-13`, " ", ]; // albums let albumsXml = []; let albums = await models.ArtAlbum.find({ pid: "art", enabled: true }) .sort({ order: "asc" }) .select("_id timeLastModify") .lean() .exec(); albums.forEach((e) => { albumsXml = albumsXml.concat([ " ", ` https://art.pcoloring.com/coloring-page-album/${e._id}`, ` ${datefns.format(e.timeLastModify, "yyyy-MM-dd")}`, " ", ]); }); // details let detailsXml = []; const cursor = await models.Art.find({ status: 9000 }) .select("name title publishTime") .sort({ publishTime: -1 }) .cursor(); // 使用cursor,避免一次查询太多记录内存受不了 // 遍历游标中的每个文档 for await (const doc of cursor) { detailsXml = detailsXml.concat([ " ", ` https://art.pcoloring.com/coloring-page/${doc._id}`, ` ${datefns.format(doc.publishTime, "yyyy-MM-dd")}`, " ", ]); } let endXml = [""]; let sitemapXml = [...commonXml, ...albumsXml, ...detailsXml, ...endXml]; let sitemapXmlStr = sitemapXml.join("\n"); fs.writeFileSync(sitemapTempPath, sitemapXmlStr); // 先写入临时文件 fs.renameSync(sitemapTempPath, sitemapPath); // 再重命名 console.log("生成sitemap成功"); } function run() { generateSitemap(); } module.exports = { run }; if (require.main == module) { run(); }