sitemap2.js 7.0 KB

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