sitemap2.js 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. /**
  2. * 每天运行一次,生成站点地图
  3. */
  4. const fs = require("fs");
  5. const datefns = require("date-fns");
  6. const models = require("../../models");
  7. const sitemapPath = __dirname + "/../../dist/sitemap.xml";
  8. const sitemapTempPath = __dirname + "/../../dist/sitemap.xml.temp";
  9. // 生成站点地图
  10. async function generateSitemap() {
  11. let commonXml = [
  12. '<?xml version="1.0" encoding="UTF-8"?>',
  13. // '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">',
  14. "<urlset",
  15. ' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"',
  16. ' xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd http://www.w3.org/1999/xhtml http://www.w3.org/2002/08/xhtml/xhtml1-strict.xsd"',
  17. ' xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"',
  18. ' xmlns:xhtml="http://www.w3.org/1999/xhtml"',
  19. ">",
  20. " <url>",
  21. " <loc>https://art.pcoloring.com</loc>",
  22. ` <lastmod>2026-05-13</lastmod>`,
  23. " </url>",
  24. " <url>",
  25. " <loc>https://art.pcoloring.com/coloring-page-gallery</loc>",
  26. ` <lastmod>2026-05-13</lastmod>`,
  27. " </url>",
  28. " <url>",
  29. " <loc>https://art.pcoloring.com/coloring-pages</loc>",
  30. ` <lastmod>2026-05-13</lastmod>`,
  31. " </url>",
  32. " <url>",
  33. " <loc>https://art.pcoloring.com/coloring-page-albums</loc>",
  34. ` <lastmod>2025-07-22</lastmod>`,
  35. " </url>",
  36. " <url>",
  37. " <loc>https://art.pcoloring.com/video-coloring-pages</loc>",
  38. ` <lastmod>2026-05-13</lastmod>`,
  39. " </url>",
  40. " <url>",
  41. " <loc>https://art.pcoloring.com/mandala-coloring-pages</loc>",
  42. ` <lastmod>2026-05-13</lastmod>`,
  43. " </url>",
  44. " <url>",
  45. " <loc>https://art.pcoloring.com/zentangle-coloring-pages</loc>",
  46. ` <lastmod>2026-05-13</lastmod>`,
  47. " </url>",
  48. " <url>",
  49. " <loc>https://art.pcoloring.com/zen-coloring-pages</loc>",
  50. ` <lastmod>2026-05-13</lastmod>`,
  51. " </url>",
  52. " <url>",
  53. " <loc>https://art.pcoloring.com/flower-coloring-pages</loc>",
  54. ` <lastmod>2026-05-13</lastmod>`,
  55. " </url>",
  56. " <url>",
  57. " <loc>https://art.pcoloring.com/cat-coloring-pages</loc>",
  58. ` <lastmod>2026-05-13</lastmod>`,
  59. " </url>",
  60. " <url>",
  61. " <loc>https://art.pcoloring.com/butterfly-coloring-pages</loc>",
  62. ` <lastmod>2026-05-13</lastmod>`,
  63. " </url>",
  64. " <url>",
  65. " <loc>https://art.pcoloring.com/architecture-coloring-pages</loc>",
  66. ` <lastmod>2026-05-13</lastmod>`,
  67. " </url>",
  68. " <url>",
  69. " <loc>https://art.pcoloring.com/simple-coloring-pages</loc>",
  70. ` <lastmod>2026-05-13</lastmod>`,
  71. " </url>",
  72. " <url>",
  73. " <loc>https://art.pcoloring.com/girl-coloring-pages</loc>",
  74. ` <lastmod>2026-05-13</lastmod>`,
  75. " </url>",
  76. " <url>",
  77. " <loc>https://art.pcoloring.com/fantasy-coloring-pages</loc>",
  78. ` <lastmod>2026-05-13</lastmod>`,
  79. " </url>",
  80. " <url>",
  81. " <loc>https://art.pcoloring.com/christmas-coloring-pages</loc>",
  82. ` <lastmod>2026-05-13</lastmod>`,
  83. " </url>",
  84. " <url>",
  85. " <loc>https://art.pcoloring.com/patterns-coloring-pages</loc>",
  86. ` <lastmod>2026-05-13</lastmod>`,
  87. " </url>",
  88. " <url>",
  89. " <loc>https://art.pcoloring.com/peacock-coloring-pages</loc>",
  90. ` <lastmod>2026-05-13</lastmod>`,
  91. " </url>",
  92. " <url>",
  93. " <loc>https://art.pcoloring.com/dragon-coloring-pages</loc>",
  94. ` <lastmod>2026-05-13</lastmod>`,
  95. " </url>",
  96. " <url>",
  97. " <loc>https://art.pcoloring.com/unicorn-coloring-pages</loc>",
  98. ` <lastmod>2026-05-13</lastmod>`,
  99. " </url>",
  100. " <url>",
  101. " <loc>https://art.pcoloring.com/food-coloring-pages</loc>",
  102. ` <lastmod>2026-05-13</lastmod>`,
  103. " </url>",
  104. " <url>",
  105. " <loc>https://art.pcoloring.com/tips-tricks</loc>",
  106. ` <lastmod>2026-05-13</lastmod>`,
  107. " </url>",
  108. " <url>",
  109. " <loc>https://art.pcoloring.com/tips-tricks/how-to-color-online</loc>",
  110. ` <lastmod>2026-05-13</lastmod>`,
  111. " </url>",
  112. " <url>",
  113. " <loc>https://art.pcoloring.com/tips-tricks/how-to-color-mandala-coloring-page</loc>",
  114. ` <lastmod>2026-05-13</lastmod>`,
  115. " </url>",
  116. " <url>",
  117. " <loc>https://art.pcoloring.com/tips-tricks/benefit-of-coloring-pages</loc>",
  118. ` <lastmod>2026-05-13</lastmod>`,
  119. " </url>",
  120. " <url>",
  121. " <loc>https://art.pcoloring.com/tips-tricks/choose-the-right-coloring-tools</loc>",
  122. ` <lastmod>2026-05-13</lastmod>`,
  123. " </url>",
  124. " <url>",
  125. " <loc>https://art.pcoloring.com/tips-tricks/color-combinations-guide</loc>",
  126. ` <lastmod>2026-05-13</lastmod>`,
  127. " </url>",
  128. " <url>",
  129. " <loc>https://art.pcoloring.com/tips-tricks/coloring-techniques-for-beginners</loc>",
  130. ` <lastmod>2026-05-13</lastmod>`,
  131. " </url>",
  132. " <url>",
  133. " <loc>https://art.pcoloring.com/app</loc>",
  134. ` <lastmod>2026-05-13</lastmod>`,
  135. " </url>",
  136. " <url>",
  137. " <loc>https://art.pcoloring.com/contact</loc>",
  138. ` <lastmod>2026-05-13</lastmod>`,
  139. " </url>",
  140. " <url>",
  141. " <loc>https://art.pcoloring.com/about</loc>",
  142. ` <lastmod>2026-05-13</lastmod>`,
  143. " </url>",
  144. " <url>",
  145. " <loc>https://art.pcoloring.com/faq</loc>",
  146. ` <lastmod>2026-05-13</lastmod>`,
  147. " </url>",
  148. " <url>",
  149. " <loc>https://art.pcoloring.com/privacy-policy</loc>",
  150. ` <lastmod>2026-05-13</lastmod>`,
  151. " </url>",
  152. " <url>",
  153. " <loc>https://art.pcoloring.com/terms-of-service</loc>",
  154. ` <lastmod>2026-05-13</lastmod>`,
  155. " </url>",
  156. ];
  157. // albums
  158. let albumsXml = [];
  159. let albums = await models.ArtAlbum.find({ pid: "art", enabled: true })
  160. .sort({ order: "asc" })
  161. .select("_id timeLastModify")
  162. .lean()
  163. .exec();
  164. albums.forEach((e) => {
  165. albumsXml = albumsXml.concat([
  166. " <url>",
  167. ` <loc>https://art.pcoloring.com/coloring-page-album/${e._id}</loc>`,
  168. ` <lastmod>${datefns.format(e.timeLastModify, "yyyy-MM-dd")}</lastmod>`,
  169. " </url>",
  170. ]);
  171. });
  172. // details
  173. let detailsXml = [];
  174. const cursor = await models.Art.find({ status: 9000 })
  175. .select("name title publishTime")
  176. .sort({ publishTime: -1 })
  177. .cursor(); // 使用cursor,避免一次查询太多记录内存受不了
  178. // 遍历游标中的每个文档
  179. for await (const doc of cursor) {
  180. detailsXml = detailsXml.concat([
  181. " <url>",
  182. ` <loc>https://art.pcoloring.com/coloring-page/${doc._id}</loc>`,
  183. ` <lastmod>${datefns.format(doc.publishTime, "yyyy-MM-dd")}</lastmod>`,
  184. " </url>",
  185. ]);
  186. }
  187. let endXml = ["</urlset>"];
  188. let sitemapXml = [...commonXml, ...albumsXml, ...detailsXml, ...endXml];
  189. let sitemapXmlStr = sitemapXml.join("\n");
  190. fs.writeFileSync(sitemapTempPath, sitemapXmlStr); // 先写入临时文件
  191. fs.renameSync(sitemapTempPath, sitemapPath); // 再重命名
  192. console.log("生成sitemap成功");
  193. }
  194. function run() {
  195. generateSitemap();
  196. }
  197. module.exports = { run };
  198. if (require.main == module) {
  199. run();
  200. }