Browse Source

提交

master
chenkainan 10 months ago
parent
commit
fd99201401
  1. 66
      main.js
  2. 10
      mixins/myMixins.js
  3. BIN
      static/js/uniapp/.DS_Store
  4. 29
      static/js/uniapp/adapter/app.js
  5. 30
      static/js/uniapp/adapter/blankApi.js
  6. 77
      static/js/uniapp/adapter/mp.js
  7. 23
      static/js/uniapp/adapter/web.js
  8. 75
      static/js/uniapp/index.js
  9. 1
      static/js/uniapp/packages/QDTracker-app.js
  10. 15
      static/js/uniapp/packages/QDTracker-mp.js
  11. 15
      static/js/uniapp/packages/sz.sql.js
  12. 1
      static/js/uniapp/utils/autoTrack.js

66
main.js

@ -4,10 +4,64 @@ import '@/static/js/request.js'
import '@/static/js/CommonFunction.js'
// 引入字体样式
import "@/static/font/font.css"
import {myMixins} from '@/mixins/myMixins.js'
import {
myMixins
} from '@/mixins/myMixins.js'
Vue.mixin(myMixins)
import {
QDTracker,
QDTMixin,
} from '@/static/js/uniapp/index';
// sdk包接入动作,推荐做在全局主入口main.js中
// 用于统一qdt的变量
let qdTracker;
// #ifdef MP
// 小程序的初始化
QDTracker.init({
debug: true, // 开启调试模式,默认关闭
disableCache: true,
appid: 'wxcb555ab174f22ec9', //小程序appid
// kfuin: 2852150212,
appkey: '0MA006654M5XP4YR', // 上面第二步里新增的appKey
application: '同里测试_1', // 小程序名称
apiHost: 'https://qidian.tongli.net', // 接口请求域名,请联系项目交付同事提供上报域名。
apiMethod: 'post',
encryptMode: 'close', // 加密模式 close-关闭 default-base64 aes-aes加密
// useId: false, //设置为true后。微信,百度需上报openid,支付宝需上报aliUserId。已废弃,可忽略。
enable_compression: true, // 开启压缩
track_interval: 0, // 发送间隔时间(ms)
batch_max_time: 1, // 批量发送数量
url: '',
session_interval: 30 * 60 * 1000, // session 间隔时间(ms)
autoTrack: { // 自动上报开关
appLaunch: true, //小程序启动事件是否自动上报
appShow: true, //小程序展示事件是否自动上报
appHide: true, //小程序隐藏事件是否自动上报
pageShow: true, //小程序页面浏览是否自动上报
pageHide: true, //小程序页面隐藏是否自动上报
pageShare: true, //小程序分享是否自动上报
mpClick: false, //小程序元素点击是否自动上报
// mpClick为当Page中定义的事件处理函数被触发时采集,目前只支持tap/ longtap/longpress三类事件;
},
});
// 初始化后可以立刻开始自定义上报
QDTracker.track('navButtonClick', {buttonName: '123', buttonSort: '123'});
// 小程序与web统一变量
qdTracker = QDTracker;
// 注意:小程序为了补充每个Page事件,以mixin的形式进行页面混入
Vue.mixin(QDTMixin);
// #endif
// #ifndef VUE3
import Vue from 'vue'
import './uni.promisify.adaptor'
@ -15,13 +69,19 @@ Vue.config.productionTip = false
App.mpType = 'app'
const app = new Vue({
store: store,
...App
...App,
globalData: {
// 在这里定义全局数据
QDTracker: qdTracker
},
})
app.$mount()
// #endif
// #ifdef VUE3
import { createSSRApp } from 'vue'
import {
createSSRApp
} from 'vue'
export function createApp() {
const app = createSSRApp(App)
return {

10
mixins/myMixins.js

@ -15,10 +15,10 @@ export const myMixins ={
// 分享到朋友圈
onShareTimeline() {
return {
title: '盐都文旅',
title: '同里旅游',
type: 0,
summary: "edewdewdewf",
imageUrl: "https://static.ticket.sz-trip.com/dongtai/images/index/share.jpg"
imageUrl: ""
}
},
onShareAppMessage() {
@ -31,10 +31,10 @@ export const myMixins ={
}
return {
title: '盐都文旅', //分享的名称
title: '同里旅游', //分享的名称
path: `${view.route}`,
imageUrl: "https://static.ticket.sz-trip.com/dongtai/images/index/share.jpg",
mpId: 'wxb8f15afe2765976d' //此处配置微信小程序的AppId
imageUrl: "",
mpId: 'wxcb555ab174f22ec9' //此处配置微信小程序的AppId
}
}
}

BIN
static/js/uniapp/.DS_Store

Binary file not shown.

29
static/js/uniapp/adapter/app.js

@ -0,0 +1,29 @@
// 读取unimpsdk,由于不同版本unimp对App&Page覆写场景不同。
// 此处页面级别监控暂不做统一管理
import QDTracker from '../packages/QDTracker-app';
const QDTMini = {
// 提供扩展性
instance: QDTracker,
// 平台
uniPlatform: 'mp',
// 小程序分类
mpPltf: '',
// 提供初始化和配置参数
init(opt) {
QDTMini.adaptGlobalApi();
// 预留空间uni参数支持预加工
// 初始化
QDTracker.init({
...opt,
mpPltf: QDTMini.mpPltf,
});
},
// 覆写小程序全局应用
adaptGlobalApi() {
// #ifdef APP
QDTMini.mpPltf = 'uni';
// #endif
},
};
export default QDTMini;

30
static/js/uniapp/adapter/blankApi.js

@ -0,0 +1,30 @@
const validMessage = '该平台缺少';
const QDTracker = {
instance: null,
// 通用方法
init: () => {
console.log(`QDT|uni|init ${validMessage} 初始化方法`);
},
setAccountInfo: () => {
console.log(`QDT|uni|setAccountInfo ${validMessage} 设置自定义身份方法`);
},
setCommonData: () => {
console.log(`QDT|uni|setCommonData ${validMessage} 设置自定义属性方法`);
},
track: () => {
console.log(`QDT|uni|track ${validMessage} 自定义上报方法`);
},
setAes: () => {
console.log(`QDT|uni|track ${validMessage} 自定义上报方法`);
},
// 小程序方法
getIDs: () => {
console.log(`QDT|uni|getIDs ${validMessage} 获取用户账号信息`);
},
addParamsToUrl: () => {
console.log(`QDT|uni|addParamsToUrl ${validMessage} 给路径地址添加参数`);
},
};
export default QDTracker;

77
static/js/uniapp/adapter/mp.js

@ -0,0 +1,77 @@
// 读取小程序原版sdk
import QDTracker from '../packages/QDTracker-mp';
const QDTMini = {
// 提供扩展性
instance: QDTracker,
// 平台
uniPlatform: 'mp',
// 小程序分类
mpPltf: '',
// 提供初始化和配置参数
init(opt) {
QDTMini.adaptGlobalApi();
// 预留空间uni参数支持预加工
// 初始化
QDTracker.init({
...opt,
mpPltf: QDTMini.mpPltf,
});
},
// 覆写小程序全局应用
adaptGlobalApi() {
// 确定全局变量
// #ifdef MP-WEIXIN || MP-ALIPAY || MP-BAIDU
// #ifdef MP-WEIXIN
QDTMini.mpPltf = 'wx';
// #endif
// #ifdef MP-BAIDU
QDTMini.mpPltf = 'smart';
// #endif
// #ifdef MP-ALIPAY
QDTMini.mpPltf = 'alipay';
// #endif
// 通过额外绑定进行补充
// console.log('onload');
// #endif
},
// 覆写小程序页面应用
adaptPageApi(pageOpt) {
QDTracker.startPageMonitor(pageOpt, QDTracker);
},
// uni的页面page级别操作,专门用于页面级混入
QDTMixin: {
methods: {
// 重写的方法,例如 onLoad
customOnLoad(pageVm) {
// 在这里添加您的自定义逻辑
// 1. 页面包含自定义组件时,需要额外注册(自定义组件嵌套同理)
const traverseChildren = children => {
(children || []).forEach(child => {
QDTMini.adaptPageApi(child);
if (child.$children && child.$children.length) {
traverseChildren(child.$children);
}
});
};
traverseChildren(pageVm.$children);
// 2. 注册主页面
// 新版uniapp中,vue3下将$mp调整为$scope,为非向前兼容场景
// 故此处根据vue版本不同,针对性做相应调整
if (!pageVm.$mp.page) return;
QDTMini.adaptPageApi(pageVm.$mp.page);
},
},
// 使用 Vue 生命周期钩子来调用重写的方法
onLoad() {
// 此处同步需要更新页面生命周期的注册
this.customOnLoad(this);
},
},
};
export default QDTMini;

23
static/js/uniapp/adapter/web.js

@ -0,0 +1,23 @@
// 读取小程序原版sdk
import QDTracker from '../packages/QDTracker-web';
const QDTWeb = {
// 提供扩展性
instance: QDTracker,
// 平台
uniPlatform: 'web',
mpPltf: 'web',
// 提供初始化和配置参数
init(opt) {
QDTWeb.adaptGlobalApi();
// 预留空间uni参数支持预加工
// 初始化
return QDTracker.init(opt);
},
// 覆写小程序全局应用
adaptGlobalApi() {
// 确定全局变量
},
};
export default QDTWeb;

75
static/js/uniapp/index.js

@ -0,0 +1,75 @@
/*
* 2023.12.06 uniApp 兼容版本主入口
* */
// 兜底通用版本所有接口
import blankAPI from './adapter/blankApi';
// 参照环境变量设置当前环境
// #ifdef H5
import adaptApi from './adapter/web'
// #endif
// #ifdef MP-WEIXIN || MP-BAIDU || MP-ALIPAY
import adaptApi from './adapter/mp';
// #endif
// #ifdef APP
import adaptApi from './adapter/app';
// #endif
let QDTracker = {};
const refactTrack = function (QDTracker, key) {
if (key === 'track') {
const oldTrack = QDTracker.track;
QDTracker.track = function () {
const arr = [].slice.call(arguments, 0);
// 留有拓展uni后台感知逻辑
return oldTrack.apply(QDTracker, arr);
};
}
};
// 平台检测,目前支持H5 & MP & App
if (typeof adaptApi === 'undefined') {
console.error('该平台尚未兼容敬请期待');
QDTracker = blankAPI;
} else {
QDTracker = adaptApi;
// 单独抽离适配器init
const initFn = QDTracker.init
/*
由于小程默认跨三种小程序平台先遍历所有uni版本中需要暴露的api
1. 对应api中有适配版本优先使用适配版本
2. 没有适配版本则默认兼容从实例中直接获取默认接口
3. web版本无需通过
*/
// #ifdef H5 || APP
QDTracker = {
...QDTracker,
...adaptApi.instance,
init: initFn
};
// #endif
// #ifdef MP-WEIXIN || MP-BAIDU || MP-ALIPAY
Object.keys(blankAPI).forEach((key) => {
if (!(key in adaptApi)) {
if (typeof adaptApi.instance === 'object' && typeof adaptApi.instance[key] === 'function') {
QDTracker[key] = adaptApi.instance[key].bind(adaptApi.instance);
} else {
QDTracker[key] = blankAPI[key].bind(blankAPI);
}
}
// track更新逻辑
refactTrack(QDTracker, key);
});
// #endif
}
const QDTMixin = adaptApi.QDTMixin;
export {
QDTracker,
QDTMixin,
}

1
static/js/uniapp/packages/QDTracker-app.js

File diff suppressed because one or more lines are too long

15
static/js/uniapp/packages/QDTracker-mp.js

File diff suppressed because one or more lines are too long

15
static/js/uniapp/packages/sz.sql.js

File diff suppressed because one or more lines are too long

1
static/js/uniapp/utils/autoTrack.js

@ -0,0 +1 @@
const e={A:!0,BUTTON:!0,INPUT:!0,TEXTAREA:!0};let t={};const n=["MARK","STRONG","B","EM","I","U","ABBR","INS","DEL","S","SUP"];let r=["data-qidian-click"],o=[],a=!0;const c=window.TOLERANCE_TAGS||["BUTTON"],i=window.TOLERANCE_LEVEL||5;let s=!0,l=!1;function f(n){if(!n)return!1;const r=function(n){const r=(n.tagName||"").toUpperCase();return Object.assign({},e,t)[r]}(n);if(!0===r)return!0;if("object"==typeof r){let e=parseInt(r.max_level,10);isNaN(e)&&(e=1);return g(n)<=e}return!1}function u(e){if(!s||!e)return;if(!e.target)return;const{target:t}=e;let o=!1;t.tagName&&n.includes(t.tagName.toUpperCase())&&function(e){if(!e||!e.tagName||"DIV"!==e.tagName.toUpperCase())return!1;const{children:t}=e;if(!t.length)return!1;for(let e=0;e<t.length;e++){if(!t[e]||!t[e].tagName)return!1;if(!n.includes(t[e].tagName.toUpperCase()))return!1}return!0}(t.parentElement)&&(console.log("[QDTRACKER] div只包含样式标签"),!o&&m(QDTracker,d,t),o=!0),function(e){for(let t=0;t<r.length;t++)if(e.hasAttribute(r[t]))return!0;return!1}(t)&&(console.log("[QDTRACKER] track_attr 中自定义属性"),!o&&m(QDTracker,d,t),o=!0),f(t)&&(console.log("[QDTRACKER] interceptTags 中配置标签"),!o&&m(QDTracker,d,t),o=!0)}const m=function(e,n,r){if(!e.tracker||!e.tracker.track)return;const s=e.tracker.track;if("function"!=typeof s)return;const l=function(e){const n=e,r=n.id,s=n.innerText,l=n.getAttribute("name"),f=n.className,u=n.tagName?n.tagName.toLowerCase():"",m=function(e){const t=[];let n=e;function r(e){let t=1;for(;e.previousSibling;)1===(e=e.previousSibling).nodeType&&(t+=1);return t}for(;n&&n!==e.ownerDocument;){let e=n.tagName?n.tagName.toLowerCase():"";if(n.id)e+=`[@id='${n.id}']`;else if(n.className){let t="";t=n instanceof SVGElement?n.className.baseVal:n.className,e+=`[contains(@class, '${t.replace(/\s+/g," ")}')]`}else"html"!==e&&"body"!==e&&(e+=`[${r(n)}]`);t.unshift(e),n=n.parentNode}return`/${t.join("/")}`}(n),d=n.getBoundingClientRect().left+n.offsetWidth/2,g=n.getBoundingClientRect().top+n.offsetHeight/2,p={};o.forEach((e=>{const r=n.getAttribute(e);if(r)p[e]=r;else if(a){let r=n.parentNode,o=0;for(;r&&o<i;){const n=r.tagName.toUpperCase();if(c.includes(n)||t[n]){const t=r.getAttribute(e);if(t){p[e]=t;break}}r=r.parentNode,o+=1}}}));const N={element_id:r,element_content:s,element_name:l,element_class_name:f,element_type:u,element_path:m,touch_x:parseInt(d,10),touch_y:parseInt(g,10)};return Object.keys(p).forEach((e=>{p[e]&&(N[e]=p[e])})),N}(r);s("$WebClick",l)};let d="";function g(e,t=1){if(!e.children||0===e.children.length)return t;let n=t;for(const r of e.children){const e=g(r,t+1);n=Math.max(n,e)}return n}var p={apply:function(e,n){d=n;const c=((e.getCommonParams()||[])[0]||{}).heatmap||{},i="default"===c.clickmap;function s(e){try{e.contentWindow.document.removeEventListener("click",u,!0),e.contentWindow.document.addEventListener("click",u,!0)}catch(e){console.error("无法为 iframe 添加点击事件监听器:",e)}}if(a=!c.disabledToleracnce,t=c.collect_tags,c.track_attr&&(r=c.track_attr.concat(r)),c.tag_attr&&(o=c.tag_attr.concat(o)),l=c.iframeEnable,i&&(document.removeEventListener("click",u,!0),document.addEventListener("click",u,!0),l)){const e=document.getElementsByTagName("iframe");for(const t of e)s(t);new MutationObserver((e=>{for(const t of e)for(const e of t.addedNodes)e&&e.tagName&&"IFRAME"===e.tagName.toUpperCase()&&s(e)})).observe(document.body,{childList:!0,subtree:!0})}},startIntercepting:function(){s=!0},stopIntercepting:function(){s=!1},startInterceptingIframe:function(){l=!0},stopInterceptingIframe:function(){l=!1}};export{p as default};
Loading…
Cancel
Save