sitemap2.js 6.3 KB

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