@tmsfe/tms-core 0.0.54 → 0.0.57

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tmsfe/tms-core",
3
- "version": "0.0.54",
3
+ "version": "0.0.57",
4
4
  "description": "tms运行时框架",
5
5
  "repository": {
6
6
  "type": "git",
package/src/index.js CHANGED
@@ -28,6 +28,7 @@ import {
28
28
  formatTime,
29
29
  formatTimeStr,
30
30
  formatTimeWithDetails,
31
+ formatDateTime,
31
32
  dateToString,
32
33
  } from './timeUtils';
33
34
  import {
@@ -159,6 +160,7 @@ const api = {
159
160
  formatTime,
160
161
  formatTimeStr,
161
162
  formatTimeWithDetails,
163
+ formatDateTime,
162
164
  dateToString,
163
165
 
164
166
  /* IPX方法 */
@@ -8,8 +8,7 @@ import helper from './helper';
8
8
  /**
9
9
  * 获取埋点的基础字段
10
10
  */
11
- function getBaseData(deviceData: IDeviceData): { arr: DataItem[], nextIndex: number } {
12
- const { page, pageDepth } = helper.getPageInfo();
11
+ function getBaseData(page: IPage, deviceData: IDeviceData): { arr: DataItem[], nextIndex: number } {
13
12
  const { networkType, location } = deviceData;
14
13
  const { appVersion, client } = helper.getInitOptions();
15
14
  const arr = new Array<DataItem>(helper.dataArrLen);
@@ -51,11 +50,11 @@ function getBaseData(deviceData: IDeviceData): { arr: DataItem[], nextIndex: num
51
50
  // 22: f22,小程序启动时的url和参数
52
51
  arr[22] = helper.getLaunchOptions();
53
52
  // 23: f23,当前页面的url
54
- arr[23] = page?.route;
53
+ arr[23] = page.route;
55
54
  // 24: f24,当前页面的query
56
- arr[24] = page?.options;
55
+ arr[24] = page.options;
57
56
  // 25: f25,当前页面深度
58
- arr[25] = pageDepth;
57
+ arr[25] = page.depth;
59
58
  // 26: f26,一次小程序生命周期中的埋点统一标记
60
59
  arr[26] = helper.getLifeReportKey();
61
60
  // 27 ~ 30: 预留字段给后续扩展使用
@@ -67,8 +66,8 @@ function getBaseData(deviceData: IDeviceData): { arr: DataItem[], nextIndex: num
67
66
  /**
68
67
  * 拼接埋点数组
69
68
  */
70
- function jointData(data: any[], deviceData: IDeviceData): DataItem[] {
71
- const { arr, nextIndex } = getBaseData(deviceData);
69
+ function jointData(page: IPage, data: any[], deviceData: IDeviceData): DataItem[] {
70
+ const { arr, nextIndex } = getBaseData(page, deviceData);
72
71
  let index = nextIndex;
73
72
  for (const item of data) {
74
73
  if (index >= arr.length) {
@@ -85,9 +84,11 @@ function jointData(data: any[], deviceData: IDeviceData): DataItem[] {
85
84
  * 格式化上报埋点数据
86
85
  */
87
86
  function formatData(data: any[]): Promise<DataItem[]> {
87
+ // getDeviceData可能会太慢导致页面已跳转完,所以先获取page比较准确
88
+ const page = helper.getPageInfo();
88
89
  return new Promise<DataItem[]>((resolve) => {
89
90
  helper.getDeviceData().then((deviceData: IDeviceData) => {
90
- const arr = jointData(data, deviceData);
91
+ const arr = jointData(page, data, deviceData);
91
92
  resolve(arr);
92
93
  });
93
94
  });
@@ -97,7 +98,9 @@ function formatData(data: any[]): Promise<DataItem[]> {
97
98
  * 格式化快速上报埋点数据,不依赖用户位置
98
99
  */
99
100
  function formatFastData(data: any[]): DataItem[] {
100
- return jointData(data, helper.getCacheDeviceData());
101
+ const page = helper.getPageInfo();
102
+ const deviceData = helper.getCacheDeviceData();
103
+ return jointData(page, data, deviceData);
101
104
  }
102
105
 
103
106
  export default {
@@ -116,20 +116,29 @@ function getLifeReportKey(): string {
116
116
  /**
117
117
  * 获取当前页面信息
118
118
  */
119
- function getPageInfo(): { page: IPage, pageDepth: number } {
119
+ function getPageInfo(): IPage {
120
120
  const pages = getCurrentPages();
121
- let page: IPage;
122
- let pageDepth = 1; // 页面深度
123
- // 首页未渲染
121
+ let route: string;
122
+ let options: object;
123
+ let depth: number; // 页面深度
124
+ // 刚启动时首页未渲染
124
125
  if (pages.length === 0) {
125
126
  const launch = syncApi.getLaunchOptionsSync() as any;
126
- page = { route: launch.path, options: launch.query };
127
+ route = launch.path;
128
+ options = launch.qurey;
129
+ depth = 1;
127
130
  } else {
128
- pageDepth = pages.length;
129
131
  // 如果最后一个为空,则当前是在插件页,继续找上一个页面
130
- page = pages.reverse().find((t: IPage) => t);
132
+ const page = pages.reverse().find((t: any) => t);
133
+ route = page?.route;
134
+ options = page?.options;
135
+ depth = pages.length;
131
136
  }
132
- return { page, pageDepth };
137
+ // wx_navigate_before埋点上报时可能route是一个很大的对象而不是字符串,原因不详
138
+ if (typeof route as any !== 'string') {
139
+ route = '';
140
+ }
141
+ return { route, options, depth };
133
142
  }
134
143
 
135
144
  let launchOptions: object | null = null;
@@ -21,9 +21,9 @@ function proxyBindEvent(componentName: string, methods: any, methodName: string)
21
21
  return helper.executeFunc(this, original, args, () => {
22
22
  const extra = clone.getEventExtra(args[0]) ; // 把触发事件附加数据也带上
23
23
  const data = clone.deepClone(this.data);
24
- const eventName = `Component_${componentName}`;
25
- helper.setLastBindEvent({ eventName, methodName, data, extra });
26
- helper.reportData(eventName, methodName, data, extra);
24
+ const eventName = `Component_${componentName}_${methodName}`;
25
+ helper.setLastBindEvent({ eventName, data, extra });
26
+ helper.reportData(eventName, data, extra);
27
27
  });
28
28
  };
29
29
  }
@@ -93,7 +93,7 @@ function proxyBindEvent(pageOptions: any, methodName: string): void {
93
93
  return helper.executeFunc(this, original, args, () => {
94
94
  const data = clone.deepClone(this.data);
95
95
  const eventName = `Page_${methodName}`;
96
- helper.setLastBindEvent({ eventName, methodName, data, extra });
96
+ helper.setLastBindEvent({ eventName, data, extra });
97
97
  helper.reportData(eventName, data, extra);
98
98
  });
99
99
  };
@@ -9,13 +9,9 @@ interface IBindEvent {
9
9
  */
10
10
  pageUrl?: string,
11
11
  /**
12
- * 事件名,如 `Page_${methodName}`、`Component_${componentName}`
12
+ * 事件名,如 `Page_${methodName}`、`Component_${componentName}_${methodName}`
13
13
  */
14
14
  eventName: string,
15
- /**
16
- * 触发的函数名
17
- */
18
- methodName: string,
19
15
  /**
20
16
  * Page或者Component的data
21
17
  */
@@ -16,6 +16,7 @@ interface IInitOptions {
16
16
  interface IPage {
17
17
  route: string,
18
18
  options: object,
19
+ depth: number,
19
20
  }
20
21
 
21
22
  /**
package/src/timeUtils.js CHANGED
@@ -110,9 +110,41 @@ const formatTimeStr = (str = '', dateSeprator = '.', keepSeconds = false) => {
110
110
  return s;
111
111
  };
112
112
 
113
+ /**
114
+ * 格式化时间对象
115
+ * @param {Date|Number} date Date对象
116
+ * @param {String} fmt 目标格式,如:yyyy年MM月dd日,MM/dd/yyyy,yyyyMMdd,yyyy-MM-dd hh:mm:ss等
117
+ * @returns {String} 格式化结果;异常情况下返回空串
118
+ */
119
+ const formatDateTime = (date, fmt = 'yyyy-MM-dd hh:mm:ss') => {
120
+ const dateObj = date instanceof Date ? date : new Date(date);
121
+ if (isNaN(dateObj.getTime())) return '';
122
+
123
+ const obj = {
124
+ 'M+': dateObj.getMonth() + 1, // 月份
125
+ 'd+': dateObj.getDate(), // 日
126
+ 'h+': dateObj.getHours(), // 小时
127
+ 'm+': dateObj.getMinutes(), // 分
128
+ 's+': dateObj.getSeconds(), // 秒
129
+ S: dateObj.getMilliseconds(), // 毫秒
130
+ };
131
+
132
+ let dateStr = fmt || 'yyyy-MM-dd hh:mm:ss';
133
+ if (/(y+)/.test(dateStr)) {
134
+ dateStr = dateStr.replace(RegExp.$1, (`${dateObj.getFullYear()}`).substr(4 - RegExp.$1.length));
135
+ }
136
+
137
+ Object.entries(obj).forEach(([key, value]) => {
138
+ if (new RegExp(`(${key})`).test(dateStr)) {
139
+ dateStr = dateStr.replace(RegExp.$1, (RegExp.$1.length === 1) ? (value) : (`${value}`.padStart(2, '0')));
140
+ }
141
+ });
142
+
143
+ return dateStr;
144
+ };
113
145
 
114
146
  /**
115
- * @description 格式化时间戳为 yyyy-mm-dd, yyyy-mm-dd HH:MM, yyyy-mm-dd HH:MM:SS
147
+ * @description 格式化时间戳为 yyyy-MM-dd, yyyy-MM-dd hh:mm, yyyy-MM-dd hh:mm:ss
116
148
  * @param {Date} date 日期
117
149
  * @param {Boolean} withTime 是否带时间
118
150
  * @param {Boolean} withSeconds 是否带秒数
@@ -120,28 +152,13 @@ const formatTimeStr = (str = '', dateSeprator = '.', keepSeconds = false) => {
120
152
  * @returns {String} 格式化后的字符串,如 2021-03-18 或者 2021-03-18 10:11
121
153
  */
122
154
  const dateToString = (date, withTime = false, withSeconds = false, join = '-') => {
123
- const DATE = date ? new Date(date) : new Date();
124
- // 为兼容ios,android平台的差异,故而不使用toLocaleDateString方法
125
- const year = DATE.getFullYear();
126
- const month = DATE.getMonth() + 1;
127
- const day = DATE.getDate();
128
- const time = DATE.toTimeString().slice(0, 8);
129
- let dateStr = year + join + month + join + day;
130
-
131
- if (!withTime) {
132
- return dateStr.replace(/\b\d\b/g, '0$&');
133
- }
134
-
135
- dateStr = `${dateStr} ${time}`.replace(/\b\d\b/g, '0$&');
136
-
137
- if (!withSeconds) {
138
- dateStr = dateStr.slice(0, -3);
139
- }
140
-
141
- return dateStr;
155
+ let fmt = `yyyy${join}MM${join}dd`;
156
+ if (withTime) fmt += withSeconds ? 'hh:mm:ss' : 'hh:mm';
157
+ return formatDateTime(date, fmt);
142
158
  };
143
159
 
144
160
  export {
161
+ formatDateTime,
145
162
  formatTime,
146
163
  formatTimeStr,
147
164
  formatTimeWithDetails,