123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185 |
- /**
- * @class Page 页面模型
- */
- const BaseMod = require('./base')
- const {
- parseUrl
- } = require('../../shared')
- const {
- DateTime
- } = require('../lib')
- module.exports = class PageDetail extends BaseMod {
- constructor() {
- super()
- this.tableName = 'page-details'
- }
- /**
- * 获取页面详情信息
- * @param {String} appid Dcloud-appid
- * @param {String} pageId 页面id
- * @param {String} url 页面地址
- * @return {Object} pageDetailInfo 页面详情信息
- */
- async getPageDetail({
- appid,
- pageId,
- url
- } = {}) {
- const cacheKey = this.getCacheKeyByParams({
- module: 'pageDetail',
- appid,
- pageId,
- url
- })
- let pageDetailData = await this.getCache(cacheKey)
- if (!pageDetailData) {
- const pageDetailInfo = await this.getCollection(this.tableName).where({
- appid,
- page_id: pageId,
- page_link: url
- }).limit(1).get()
- pageDetailData = []
- if (pageDetailInfo.data.length > 0) {
- pageDetailData = pageDetailInfo.data[0]
- await this.setCache(cacheKey, pageDetailInfo)
- }
- }
- return pageDetailData
- }
- /**
- * 获取页面详情信息不存在则创建
- * @param {String} appid Dcloud-appid
- * @param {String} pageId 页面id
- * @param {String} url 页面详情匹配地址
- * @param {String} title 页面标题
- * @return {Object} pageDetailInfo 页面详情信息
- */
- async getPageDetailAndCreate({
- appid,
- pageId,
- url,
- title
- } = {}) {
- const pageDetailInfo = await this.getPageDetail({
- appid,
- pageId,
- url
- })
- //页面不存在则创建
- if (pageDetailInfo.length === 0) {
- const thisTime = new DateTime().getTime()
- const insertParam = {
- appid: appid,
- page_id: pageId,
- page_link: url,
- page_title: title,
- create_time: thisTime,
- update_time: thisTime
- }
- const res = await this.insert(this.tableName, insertParam)
- if (res && res.id) {
- return Object.assign(insertParam, {
- _id: res.id
- })
- }
- } else if (!pageDetailInfo.page_title && title) {
- const cacheKey = this.getCacheKeyByParams({
- module: 'pageDetail',
- appid,
- pageId,
- url
- })
- await this.clearCache(cacheKey)
- await this.update(this.tableName, {
- page_title: title
- }, {
- _id: pageDetailInfo._id
- })
- }
- return pageDetailInfo
- }
- /**
- * 通过页面规则获取页面详情信息
- * @param {String} appid DCloud appid
- * @param {String} pageUrl 页面链接
- * @param {String} pageTitle 页面标题
- * @param {String} pageId 页面编号
- * @param {Array} pageRules 页面规则
- * @return {Object} pageDetailInfo 页面详情信息
- */
- async getPageDetailByPageRules({
- appid,
- pageUrl,
- pageTitle,
- pageId,
- pageRules
- } = {}) {
- const pageDetailUrl = this.getPageDetailUrlByRules(pageUrl, pageRules)
- if(this.debug) {
- console.log('pageDetailUrl', pageDetailUrl, pageUrl)
- }
- if (!pageDetailUrl) {
- return false
- }
- return await this.getPageDetailAndCreate({
- appid,
- pageId,
- url: pageDetailUrl,
- title: pageTitle
- })
- }
- /**
- * 通过页面规则获取页面详情链接
- * @param {Object} url 原始页面地址
- * @param {Object} pageRules 页面规则
- * @return {String} pageDetailUrl 页面详情链接
- */
- getPageDetailUrlByRules(url, pageRules) {
- if (!url || !pageRules) {
- return false
- }
- let urlInfo = parseUrl(url)
- if (!urlInfo.query) {
- return false
- }
- const urlParams = urlInfo.query.split('&').reduce((res, cur) => {
- const arr = cur.split('=')
- return Object.assign({
- [arr[0]]: arr[1]
- }, res)
- }, {})
- let isMatch
- let matchParams
- let matchRulePrams
- pageRules.forEach((item) => {
- isMatch = true
- matchParams = {}
- for (let rule of item) {
- if (Object.keys(urlParams).indexOf(rule) < 0) {
- isMatch = false
- break
- }
- matchParams[rule] = urlParams[rule]
- }
- if (isMatch) {
- const matchRuleKeys = Object.keys(matchParams)
- matchRuleKeys.sort()
- matchRulePrams = {}
- for(let key of matchRuleKeys) {
- matchRulePrams[key] = matchParams[key]
- }
- }
- })
- if (!matchRulePrams) {
- return false
- }
- const matchQuery = Object.keys(matchRulePrams).map((key) => key + '=' + matchRulePrams[key]).join('&')
- return urlInfo.path + '?' + matchQuery
- }
- }
|