pageLog.js 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. /**
  2. * @class PageLog 页面日志模型
  3. */
  4. const BaseMod = require('./base')
  5. const Page = require('./page')
  6. const Platform = require('./platform')
  7. const Channel = require('./channel')
  8. const SessionLog = require('./sessionLog')
  9. const PageDetail = require('./pageDetail')
  10. const {
  11. DateTime
  12. } = require('../lib')
  13. const {
  14. parseUrl
  15. } = require('../../shared')
  16. module.exports = class PageLog extends BaseMod {
  17. constructor() {
  18. super()
  19. this.tableName = 'page-logs'
  20. this.sessionLogInfo = []
  21. }
  22. /**
  23. * 页面日志数据填充
  24. * @param {Object} reportParams 上报参数
  25. */
  26. async fill(reportParams) {
  27. let params;
  28. let sessionKey
  29. let sessionLogKey
  30. let sessionLogInfo
  31. let pageKey
  32. let pageInfo
  33. let referPageInfo
  34. const sessionData = []
  35. const pageData = []
  36. const fillParams = []
  37. const sessionLog = new SessionLog()
  38. const page = new Page()
  39. const platform = new Platform()
  40. const dateTime = new DateTime()
  41. const channel = new Channel()
  42. const pageDetail = new PageDetail()
  43. for (const pk in reportParams) {
  44. params = reportParams[pk]
  45. if (['3', '4'].includes(params.lt) && !params.url && params.urlref) {
  46. params.url = params.urlref
  47. }
  48. // 页面信息
  49. pageKey = params.ak + params.url
  50. if (pageData[pageKey]) {
  51. pageInfo = pageData[pageKey]
  52. } else {
  53. pageInfo = await page.getPageAndCreate(params.ak, params.url, params.ttpj)
  54. if (!pageInfo || pageInfo.length === 0) {
  55. console.log('Not found this page by param:', JSON.stringify(params))
  56. continue
  57. }
  58. pageData[pageKey] = pageInfo
  59. }
  60. // 会话日志,暂存下会话数据,减少读库
  61. sessionKey = params.ak + params.did + params.p
  62. if (!this.sessionLogInfo[sessionKey]) {
  63. sessionLogInfo = await sessionLog.getSession(params)
  64. if (sessionLogInfo.code) {
  65. return sessionLogInfo
  66. }
  67. if (this.debug) {
  68. console.log('sessionLogInfo', JSON.stringify(sessionLogInfo))
  69. }
  70. this.sessionLogInfo[sessionKey] = sessionLogInfo
  71. } else {
  72. sessionLogInfo = this.sessionLogInfo[sessionKey]
  73. }
  74. // 会话数据
  75. sessionLogKey = sessionLogInfo.data.sessionLogId.toString()
  76. if (!sessionData[sessionLogKey]) {
  77. //临时存储减少查询次数
  78. sessionData[sessionLogKey] = {
  79. pageCount: sessionLogInfo.data.pageCount + 1,
  80. addPageCount: 1,
  81. createTime: sessionLogInfo.data.createTime,
  82. pageId: pageInfo._id,
  83. uid: sessionLogInfo.data.uid
  84. }
  85. if (this.debug) {
  86. console.log('add sessionData - ' + sessionLogKey, sessionData)
  87. }
  88. } else {
  89. sessionData[sessionLogKey].pageCount += 1
  90. sessionData[sessionLogKey].addPageCount += 1
  91. sessionData[sessionLogKey].pageId = pageInfo._id
  92. if (this.debug) {
  93. console.log('update sessionData - ' + sessionLogKey, sessionData)
  94. }
  95. }
  96. // 上级页面信息
  97. pageKey = params.ak + params.urlref
  98. if (pageData[pageKey]) {
  99. referPageInfo = pageData[pageKey]
  100. } else {
  101. referPageInfo = await page.getPageAndCreate(params.ak, params.urlref, params.ttpj)
  102. if (!referPageInfo || referPageInfo.length === 0) {
  103. referPageInfo = {_id:''}
  104. }
  105. pageData[pageKey] = referPageInfo
  106. }
  107. //当前页面url信息
  108. const urlInfo = parseUrl(params.url)
  109. //记录页面内容统计数据
  110. let pageDetailInfo
  111. let referPageDetailInfo
  112. if(this.getConfig('pageDetailStat')) {
  113. pageDetailInfo = await pageDetail.getPageDetailByPageRules({
  114. appid: params.ak,
  115. pageUrl: params.url,
  116. pageTitle: params.ttpj,
  117. pageId: pageInfo._id,
  118. pageRules: pageInfo.page_rules
  119. })
  120. if(this.debug) {
  121. console.log('pageDetailInfo', pageDetailInfo)
  122. }
  123. if(params.urlref && referPageInfo) {
  124. referPageDetailInfo = await pageDetail.getPageDetailByPageRules({
  125. appid: params.ak,
  126. pageUrl: params.urlref,
  127. pageTitle: params.ttpj,
  128. pageId: referPageInfo._id,
  129. pageRules: referPageInfo.page_rules
  130. })
  131. }
  132. }
  133. // 填充数据
  134. fillParams.push({
  135. appid: params.ak,
  136. version: params.v ? params.v : '',
  137. platform: platform.getPlatformCode(params.ut, params.p),
  138. channel: channel.getChannelCode(params),
  139. device_id: params.did,
  140. uid: params.uid ? params.uid : '',
  141. session_id: sessionLogInfo.data.sessionLogId,
  142. page_id: pageInfo._id,
  143. query_string: urlInfo.query,
  144. //上级页面相关
  145. previous_page_id: referPageInfo._id,
  146. previous_page_duration: params.urlref_ts ? parseInt(params.urlref_ts) : 0,
  147. previous_page_is_entry: referPageInfo._id === sessionLogInfo.data.entryPageId ? 1 : 0,
  148. page_detail_id: (pageDetailInfo && pageDetailInfo._id) || undefined,
  149. previous_page_detail_id: (referPageDetailInfo && referPageDetailInfo._id) || undefined,
  150. create_time: dateTime.getTime()
  151. })
  152. }
  153. if (fillParams.length === 0) {
  154. console.log('No page params')
  155. return {
  156. code: 200,
  157. msg: 'Invild param'
  158. }
  159. }
  160. //日志数据入库
  161. const res = await this.insert(this.tableName, fillParams)
  162. if (res && res.inserted) {
  163. // 更新会话数据
  164. const nowTime = dateTime.getTime()
  165. for (const sid in sessionData) {
  166. await sessionLog.updateSession(sid, sessionData[sid])
  167. }
  168. return {
  169. code: 0,
  170. msg: 'success'
  171. }
  172. } else {
  173. return {
  174. code: 500,
  175. msg: 'Filled error'
  176. }
  177. }
  178. }
  179. /**
  180. * 页面日志清理
  181. * @param {Number} days 页面日志保留天数
  182. */
  183. async clean(days) {
  184. days = Math.max(parseInt(days), 1)
  185. console.log('clean page logs - day:', days)
  186. const dateTime = new DateTime()
  187. const res = await this.delete(this.tableName, {
  188. create_time: {
  189. $lt: dateTime.getTimeBySetDays(0 - days)
  190. }
  191. })
  192. if (!res.code) {
  193. console.log('clean page log:', res)
  194. }
  195. return res
  196. }
  197. }