visual-buried-point-platform-h5 1.3.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,172 @@
1
+ const dbName = "puvtrackdata";
2
+ const storeName = "puvPath";
3
+ let db = null;
4
+ // 初始化indexedDB且检查浏览器是否支持indexedDB API
5
+ export function initDB() {
6
+ if ('indexedDB' in window) {
7
+ openDB();
8
+ } else {
9
+ console.log("browser doesn't support a stable version of IndexedDB");
10
+ }
11
+ }
12
+ /**
13
+ * 打开数据库
14
+ */
15
+ function openDB(version = 1) {
16
+ const indexedDB = window.indexedDB
17
+ const request = indexedDB.open(dbName, version)
18
+ request.onsuccess = function (event: any) {
19
+ db = event.target.result // 数据库对象
20
+ console.log('onsuccess');
21
+ }
22
+ request.onerror = () => {
23
+ console.log('onerror');
24
+ }
25
+ request.onupgradeneeded = function (event: any) {
26
+ // 数据库创建或升级的时候会触发
27
+ console.log('onupgradeneeded');
28
+ db = event.target.result // 数据库对象
29
+ if (!db.objectStoreNames.contains(storeName)) {
30
+ db.createObjectStore(storeName, { autoIncrement: true }) // 创建表
31
+ }
32
+ }
33
+ }
34
+
35
+ /**
36
+ * 新增数据
37
+ * @param data
38
+ */
39
+ export async function addData(data) {
40
+ // 事务对象 指定表格名称和操作模式("只读"或"读写")
41
+ if (db) {
42
+ db.transaction([storeName], 'readwrite')
43
+ .objectStore(storeName) // 仓库对象
44
+ .add(data)
45
+ }
46
+ }
47
+
48
+ /**
49
+ * 通过游标读取数据
50
+ * @returns
51
+ */
52
+ export function cursorGetData() {
53
+ if (db) {
54
+ const list = []
55
+ const store = db.transaction(storeName, 'readwrite') // 事务
56
+ .objectStore(storeName) // 仓库对象
57
+ const request = store.openCursor() // 指针对象
58
+ return new Promise((resolve, reject) => {
59
+ request.onsuccess = function (e) {
60
+ const cursor = e.target.result
61
+ if (cursor) {
62
+ // 必须要检查
63
+ list.push(cursor.value)
64
+ cursor.continue() // 遍历了存储对象中的所有内容
65
+ } else {
66
+ resolve(list)
67
+ }
68
+ }
69
+ request.onerror = function (e) {
70
+ reject(e)
71
+ }
72
+ })
73
+ }
74
+ }
75
+
76
+ /**
77
+ * 通过索引读取数据
78
+ * @param indexName
79
+ * @param indexValue
80
+ * @returns
81
+ */
82
+ export function getDataByIndex(indexName, indexValue) {
83
+ const store = db.transaction(storeName, 'readwrite').objectStore(storeName)
84
+ const request = store.index(indexName).get(indexValue)
85
+ return new Promise((resolve, reject) => {
86
+ request.onerror = function (e) {
87
+ reject(e)
88
+ }
89
+ request.onsuccess = function (e) {
90
+ resolve(e.target.result)
91
+ }
92
+ })
93
+ }
94
+
95
+ /**
96
+ * 通过索引和游标查询记录
97
+ * @param indexName
98
+ * @param indexValue
99
+ * @returns
100
+ */
101
+ export function cursorGetDataByIndex(indexName, indexValue) {
102
+ const list = []
103
+ const store = db.transaction(storeName, 'readwrite').objectStore(storeName) // 仓库对象
104
+ const request = store.index(indexName) // 索引对象
105
+ .openCursor(IDBKeyRange.only(indexValue)) // 指针对象
106
+ return new Promise((resolve, reject) => {
107
+ request.onsuccess = function (e) {
108
+ const cursor = e.target.result
109
+ if (cursor) {
110
+ list.push(cursor.value)
111
+ cursor.continue() // 遍历了存储对象中的所有内容
112
+ } else {
113
+ resolve(list)
114
+ }
115
+ }
116
+ request.onerror = function (ev) {
117
+ reject(ev)
118
+ }
119
+ })
120
+ }
121
+
122
+ /**
123
+ * 删除数据
124
+ * @param id
125
+ * @returns
126
+ */
127
+ export function deleteDB(id) {
128
+ const request = db.transaction([storeName], 'readwrite').objectStore(storeName).delete(id)
129
+ return new Promise((resolve, reject) => {
130
+ request.onsuccess = function (ev) {
131
+ resolve(ev)
132
+ }
133
+
134
+ request.onerror = function (ev) {
135
+ resolve(ev)
136
+ }
137
+ })
138
+ }
139
+
140
+ /**
141
+ * 删除数据库
142
+ */
143
+ export function deleteDBAll(dbName) {
144
+ console.log(dbName)
145
+ const deleteRequest = window.indexedDB.deleteDatabase(dbName)
146
+ return new Promise((resolve, reject) => {
147
+ deleteRequest.onerror = function (event) {
148
+ console.log('删除失败')
149
+ }
150
+ deleteRequest.onsuccess = function (event) {
151
+ console.log('删除成功')
152
+ }
153
+ })
154
+ }
155
+
156
+ /**
157
+ * 关闭数据库
158
+ */
159
+ export function closeDB(db) {
160
+ if (db) db.close()
161
+ }
162
+
163
+ export default {
164
+ openDB,
165
+ addData,
166
+ cursorGetData,
167
+ getDataByIndex,
168
+ cursorGetDataByIndex,
169
+ deleteDB,
170
+ deleteDBAll,
171
+ closeDB
172
+ }
@@ -0,0 +1,166 @@
1
+ import { Config } from "../config";
2
+
3
+ /**
4
+ * 获取节点selector路径
5
+ * 由于业务系统存在动态ID 固路径查找沿当前元素向上查找到body
6
+ */
7
+ export function getPathSelector(e) {
8
+ try {
9
+ if (Config.isOpenCSSHash) {
10
+ return getJSDOMPathOld(e);
11
+ }
12
+ return getJSSelector(e);
13
+ } catch (error) {
14
+ console.error(error);
15
+ }
16
+ }
17
+
18
+ //获取被点击元素路径方法
19
+ export function getPath(e) {
20
+ // window.event ? (window.event.cancelBubble = true) : e.stopPropagation(); // 阻止冒泡
21
+ let domPath = Array(),
22
+ domPathStr: string = "";
23
+ let domText = ""; //元素文本
24
+ if (e.innerText) {
25
+ domText = e.innerText;
26
+ } else {
27
+ domText = e.nodeName.toLocaleLowerCase();
28
+ }
29
+ //判断是否存在ID
30
+ if (e.id) {
31
+ domPath.unshift("#" + e.id);
32
+ } else {
33
+ //循环匹配元素
34
+ while (e.nodeName.toLowerCase() !== "html") {
35
+ if (e.id) {
36
+ //判断是否存在ID
37
+ domPath.unshift(e.tagName.toLocaleLowerCase() + "#" + e.id);
38
+ break;
39
+ } else if (e.tagName.toLocaleLowerCase() == "body") {
40
+ //判断是否是BODY元素
41
+ domPath.unshift(e.tagName.toLocaleLowerCase());
42
+ } else {
43
+ //遍历获取元素顺序
44
+ for (let i = 0; i < e.parentNode.childElementCount; i++) {
45
+ if (e.parentNode.children[i] == e) {
46
+ domPath.unshift(e.tagName.toLocaleLowerCase());
47
+ }
48
+ }
49
+ }
50
+ e = e.parentNode;
51
+ }
52
+ }
53
+ return domPath.join(" > ");
54
+ }
55
+
56
+ // 重构获取DOM元素路径
57
+ export function getXPath(elm) {
58
+ try {
59
+ const allNodes = document.getElementsByTagName("*");
60
+ const segs = [];
61
+
62
+ for (; elm && elm.nodeType === 1; elm = elm.parentNode) {
63
+ if (elm.nodeName.toLowerCase() !== "html") {
64
+ let i = 1;
65
+ for (let sib = elm.previousSibling; sib; sib = sib.previousSibling) {
66
+ if (sib.localName === elm.localName) i++;
67
+ }
68
+
69
+ if (i === 1) {
70
+ if (elm.nextElementSibling) {
71
+ if (elm.nextElementSibling.localName !== elm.localName) {
72
+ segs.unshift(elm.localName.toLowerCase());
73
+ } else {
74
+ segs.unshift(elm.localName.toLowerCase() + "[" + i + "]");
75
+ }
76
+ } else {
77
+ segs.unshift(elm.localName.toLowerCase());
78
+ }
79
+ } else {
80
+ segs.unshift(elm.localName.toLowerCase() + "[" + i + "]");
81
+ }
82
+ }
83
+ }
84
+ return segs.length ? "/" + segs.join("/") : null;
85
+ } catch (err) {
86
+ return null;
87
+ }
88
+ }
89
+
90
+ /**
91
+ *
92
+ * @param element 原生JS获取元素在DOM中的路径
93
+ * @returns DOM路径
94
+ */
95
+ export function getJSDOMPathOld(e) {
96
+ let domPath = Array();
97
+ //循环匹配元素
98
+ while (e.nodeName.toLowerCase() !== "html") {
99
+ if (e.tagName.toLocaleLowerCase() == "body") {
100
+ //判断是否是BODY元素
101
+ domPath.unshift(e.tagName.toLocaleLowerCase());
102
+ } else {
103
+ //遍历获取元素顺序
104
+ for (let i = 0; i < e.parentNode.childElementCount; i++) {
105
+ if (e.parentNode.children[i] == e) {
106
+ domPath.unshift(
107
+ e.tagName.toLocaleLowerCase() + ":nth-child(" + (i + 1) + ")"
108
+ );
109
+ }
110
+ }
111
+ }
112
+ e = e.parentNode;
113
+ }
114
+ return domPath.join(" > ");
115
+ }
116
+
117
+ /**
118
+ *
119
+ * @param element 原生JS获取元素selector
120
+ * @returns
121
+ */
122
+ export function getJSSelector(element) {
123
+ var path = [];
124
+ while (element !== document && element.parentNode) {
125
+ var selector = element.tagName.toLowerCase();
126
+ if (element.id) {
127
+ selector += '#' + element.id;
128
+ } else if (element.className) {
129
+ var classes = Array.from(element.classList).join('.');
130
+ selector += '.' + classes;
131
+ }
132
+ path.unshift(selector);
133
+ element = element.parentNode;
134
+ }
135
+ return path.join(" > ");
136
+ }
137
+
138
+ /**
139
+ * .circle-active
140
+ * @param element 元素
141
+ * @returns copy selector 路径
142
+ */
143
+ export function getCopySelector(element) {
144
+ const path = [];
145
+ let currentElement = element;
146
+ while (currentElement !== document.documentElement) {
147
+ const selector = currentElement.tagName.toLowerCase();
148
+ const className = currentElement.className.trim();
149
+ const id = currentElement.id.trim();
150
+ if (id) {
151
+ // 如果元素有id,则使用id选择器
152
+ path.unshift(`#${id}`);
153
+ break;
154
+ } else if (className) {
155
+ // 如果元素有class,则使用class选择器
156
+ path.unshift(`.${className.replace(/\s+/g, '.')}`);
157
+ } else {
158
+ // 否则使用标签选择器
159
+ path.unshift(selector);
160
+ }
161
+ currentElement = currentElement.parentNode;
162
+ }
163
+ let copySeletor: string = path.join(" > ");
164
+ console.log("copySeletor: ", copySeletor);
165
+ return copySeletor;
166
+ }
@@ -0,0 +1,69 @@
1
+ import { Config } from "../config";
2
+ import { getLocationHref, randomString } from "./tools";
3
+ import { GlobalVal } from "../config/global";
4
+ import { CommonMsg } from "../typings";
5
+
6
+ export function getCommonMsg() {
7
+ let u = (navigator as any).connection;
8
+ let data: CommonMsg = {
9
+ t: "",
10
+ page: getPage(),
11
+ times: 1,
12
+ v: Config.appVersion,
13
+ token: Config.token,
14
+ e: Config.environment,
15
+ timestamp: new Date().getTime(),
16
+ uid: getUid(),
17
+ sid: GlobalVal.sid,
18
+ screen_resolution: screen.width + "x" + screen.height,
19
+ view_resolution: getScreen(),
20
+ network: u ? u.effectiveType : "",
21
+ language: getLang(),
22
+ sdk_version: "{{VERSION}}",
23
+ original_url: getLocationHref(),
24
+ };
25
+ return data;
26
+ }
27
+
28
+ // 获取页面
29
+ function getPage(): string {
30
+ if (GlobalVal.page) return GlobalVal.page;
31
+ else {
32
+ return location.pathname.toLowerCase();
33
+ }
34
+ }
35
+
36
+ // 获取uid
37
+ function getUid(): string {
38
+ let uid = localStorage.getItem("bombay_uid") || "";
39
+ if (!uid) {
40
+ uid = randomString();
41
+ localStorage.setItem("bombay_uid", uid);
42
+ }
43
+ return uid;
44
+ }
45
+
46
+ // 获得sid
47
+ // TODO: 单页面
48
+ // function getSid() {
49
+ // const date = new Date();
50
+ // let sid = sessionStorage.getItem('bombay_sid') || '';
51
+ // if (!sid) {
52
+ // sid = randomString();
53
+ // sessionStorage.setItem('bombay_sid', sid);
54
+ // }
55
+ // return sid;
56
+ // }
57
+
58
+ // 获取浏览器默认语言
59
+ function getLang() {
60
+ var lang = navigator.language || (navigator as any).userLanguage; //常规浏览器语言和IE浏览器
61
+ lang = lang.substr(0, 2); //截取lang前2位字符
62
+ return lang;
63
+ }
64
+
65
+ function getScreen() {
66
+ let w = document.documentElement.clientWidth || document.body.clientWidth;
67
+ let h = document.documentElement.clientHeight || document.body.clientHeight;
68
+ return w + "x" + h;
69
+ }