/** * @class PageLog 页面日志模型 */ const BaseMod = require('./base') const Page = require('./page') const Platform = require('./platform') const Channel = require('./channel') const SessionLog = require('./sessionLog') const { DateTime } = require('../lib') const { parseUrl } = require('../../shared') module.exports = class PageLog extends BaseMod { constructor() { super() this.tableName = 'page-logs' this.sessionLogInfo = [] } /** * 页面日志数据填充 * @param {Object} reportParams 上报参数 */ async fill(reportParams) { let params; let sessionKey let sessionLogKey let sessionLogInfo let pageKey let pageInfo let referPageInfo const sessionData = [] const pageData = [] const fillParams = [] const sessionLog = new SessionLog() const page = new Page() const platform = new Platform() const dateTime = new DateTime() const channel = new Channel() for (const pk in reportParams) { params = reportParams[pk] if (['3', '4'].includes(params.lt) && !params.url && params.urlref) { params.url = params.urlref } // 页面信息 pageKey = params.ak + params.url if (pageData[pageKey]) { pageInfo = pageData[pageKey] } else { pageInfo = await page.getPageAndCreate(params.ak, params.url, params.ttpj) if (!pageInfo || pageInfo.length === 0) { console.log('Not found this page by param:', JSON.stringify(params)) continue } pageData[pageKey] = pageInfo } // 会话日志,暂存下会话数据,减少读库 sessionKey = params.ak + params.did + params.p if (!this.sessionLogInfo[sessionKey]) { sessionLogInfo = await sessionLog.getSession(params) if (sessionLogInfo.code) { return sessionLogInfo } if (this.debug) { console.log('sessionLogInfo', JSON.stringify(sessionLogInfo)) } this.sessionLogInfo[sessionKey] = sessionLogInfo } else { sessionLogInfo = this.sessionLogInfo[sessionKey] } // 会话数据 sessionLogKey = sessionLogInfo.data.sessionLogId.toString() if (!sessionData[sessionLogKey]) { //临时存储减少查询次数 sessionData[sessionLogKey] = { pageCount: sessionLogInfo.data.pageCount + 1, addPageCount: 1, createTime: sessionLogInfo.data.createTime, pageId: pageInfo._id, uid: sessionLogInfo.data.uid } if (this.debug) { console.log('add sessionData - ' + sessionLogKey, sessionData) } } else { sessionData[sessionLogKey].pageCount += 1 sessionData[sessionLogKey].addPageCount += 1 sessionData[sessionLogKey].pageId = pageInfo._id if (this.debug) { console.log('update sessionData - ' + sessionLogKey, sessionData) } } // 上级页面信息 pageKey = params.ak + params.urlref if (pageData[pageKey]) { referPageInfo = pageData[pageKey] } else { referPageInfo = await page.getPageAndCreate(params.ak, params.urlref, params.ttpj) if (!referPageInfo || referPageInfo.length === 0) { referPageInfo = {_id:''} } pageData[pageKey] = referPageInfo } //当前页面url信息 const urlInfo = parseUrl(params.url) // 填充数据 fillParams.push({ appid: params.ak, version: params.v ? params.v : '', platform: platform.getPlatformCode(params.ut, params.p), channel: channel.getChannelCode(params), device_id: params.did, uid: params.uid ? params.uid : '', session_id: sessionLogInfo.data.sessionLogId, page_id: pageInfo._id, query_string: urlInfo.query, //上级页面相关 previous_page_id: referPageInfo._id, previous_page_duration: params.urlref_ts ? parseInt(params.urlref_ts) : 0, previous_page_is_entry: referPageInfo._id === sessionLogInfo.data.entryPageId ? 1 : 0, create_time: dateTime.getTime() }) } if (fillParams.length === 0) { console.log('No page params') return { code: 200, msg: 'Invild param' } } //日志数据入库 const res = await this.insert(this.tableName, fillParams) if (res && res.inserted) { // 更新会话数据 const nowTime = dateTime.getTime() for (const sid in sessionData) { await sessionLog.updateSession(sid, sessionData[sid]) } return { code: 0, msg: 'success' } } else { return { code: 500, msg: 'Filled error' } } } /** * 页面日志清理 * @param {Number} days 页面日志保留天数 */ async clean(days) { days = Math.max(parseInt(days), 1) console.log('clean page logs - day:', days) const dateTime = new DateTime() const res = await this.delete(this.tableName, { create_time: { $lt: dateTime.getTimeBySetDays(0 - days) } }) if (!res.code) { console.log('clean page log:', res) } return res } }