pageDetail.js 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. /**
  2. * @class Page 页面模型
  3. */
  4. const BaseMod = require('./base')
  5. const {
  6. parseUrl
  7. } = require('../../shared')
  8. const {
  9. DateTime
  10. } = require('../lib')
  11. module.exports = class PageDetail extends BaseMod {
  12. constructor() {
  13. super()
  14. this.tableName = 'page-details'
  15. }
  16. /**
  17. * 获取页面详情信息
  18. * @param {String} appid Dcloud-appid
  19. * @param {String} pageId 页面id
  20. * @param {String} url 页面地址
  21. * @return {Object} pageDetailInfo 页面详情信息
  22. */
  23. async getPageDetail({
  24. appid,
  25. pageId,
  26. url
  27. } = {}) {
  28. const cacheKey = this.getCacheKeyByParams({
  29. module: 'pageDetail',
  30. appid,
  31. pageId,
  32. url
  33. })
  34. let pageDetailData = await this.getCache(cacheKey)
  35. if (!pageDetailData) {
  36. const pageDetailInfo = await this.getCollection(this.tableName).where({
  37. appid,
  38. page_id: pageId,
  39. page_link: url
  40. }).limit(1).get()
  41. pageDetailData = []
  42. if (pageDetailInfo.data.length > 0) {
  43. pageDetailData = pageDetailInfo.data[0]
  44. await this.setCache(cacheKey, pageDetailInfo)
  45. }
  46. }
  47. return pageDetailData
  48. }
  49. /**
  50. * 获取页面详情信息不存在则创建
  51. * @param {String} appid Dcloud-appid
  52. * @param {String} pageId 页面id
  53. * @param {String} url 页面详情匹配地址
  54. * @param {String} title 页面标题
  55. * @return {Object} pageDetailInfo 页面详情信息
  56. */
  57. async getPageDetailAndCreate({
  58. appid,
  59. pageId,
  60. url,
  61. title
  62. } = {}) {
  63. const pageDetailInfo = await this.getPageDetail({
  64. appid,
  65. pageId,
  66. url
  67. })
  68. //页面不存在则创建
  69. if (pageDetailInfo.length === 0) {
  70. const thisTime = new DateTime().getTime()
  71. const insertParam = {
  72. appid: appid,
  73. page_id: pageId,
  74. page_link: url,
  75. page_title: title,
  76. create_time: thisTime,
  77. update_time: thisTime
  78. }
  79. const res = await this.insert(this.tableName, insertParam)
  80. if (res && res.id) {
  81. return Object.assign(insertParam, {
  82. _id: res.id
  83. })
  84. }
  85. } else if (!pageDetailInfo.page_title && title) {
  86. const cacheKey = this.getCacheKeyByParams({
  87. module: 'pageDetail',
  88. appid,
  89. pageId,
  90. url
  91. })
  92. await this.clearCache(cacheKey)
  93. await this.update(this.tableName, {
  94. page_title: title
  95. }, {
  96. _id: pageDetailInfo._id
  97. })
  98. }
  99. return pageDetailInfo
  100. }
  101. /**
  102. * 通过页面规则获取页面详情信息
  103. * @param {String} appid DCloud appid
  104. * @param {String} pageUrl 页面链接
  105. * @param {String} pageTitle 页面标题
  106. * @param {String} pageId 页面编号
  107. * @param {Array} pageRules 页面规则
  108. * @return {Object} pageDetailInfo 页面详情信息
  109. */
  110. async getPageDetailByPageRules({
  111. appid,
  112. pageUrl,
  113. pageTitle,
  114. pageId,
  115. pageRules
  116. } = {}) {
  117. const pageDetailUrl = this.getPageDetailUrlByRules(pageUrl, pageRules)
  118. if(this.debug) {
  119. console.log('pageDetailUrl', pageDetailUrl, pageUrl)
  120. }
  121. if (!pageDetailUrl) {
  122. return false
  123. }
  124. return await this.getPageDetailAndCreate({
  125. appid,
  126. pageId,
  127. url: pageDetailUrl,
  128. title: pageTitle
  129. })
  130. }
  131. /**
  132. * 通过页面规则获取页面详情链接
  133. * @param {Object} url 原始页面地址
  134. * @param {Object} pageRules 页面规则
  135. * @return {String} pageDetailUrl 页面详情链接
  136. */
  137. getPageDetailUrlByRules(url, pageRules) {
  138. if (!url || !pageRules) {
  139. return false
  140. }
  141. let urlInfo = parseUrl(url)
  142. if (!urlInfo.query) {
  143. return false
  144. }
  145. const urlParams = urlInfo.query.split('&').reduce((res, cur) => {
  146. const arr = cur.split('=')
  147. return Object.assign({
  148. [arr[0]]: arr[1]
  149. }, res)
  150. }, {})
  151. let isMatch
  152. let matchParams
  153. let matchRulePrams
  154. pageRules.forEach((item) => {
  155. isMatch = true
  156. matchParams = {}
  157. for (let rule of item) {
  158. if (Object.keys(urlParams).indexOf(rule) < 0) {
  159. isMatch = false
  160. break
  161. }
  162. matchParams[rule] = urlParams[rule]
  163. }
  164. if (isMatch) {
  165. const matchRuleKeys = Object.keys(matchParams)
  166. matchRuleKeys.sort()
  167. matchRulePrams = {}
  168. for(let key of matchRuleKeys) {
  169. matchRulePrams[key] = matchParams[key]
  170. }
  171. }
  172. })
  173. if (!matchRulePrams) {
  174. return false
  175. }
  176. const matchQuery = Object.keys(matchRulePrams).map((key) => key + '=' + matchRulePrams[key]).join('&')
  177. return urlInfo.path + '?' + matchQuery
  178. }
  179. }