张延森 4 anni fa
parent
commit
6bda1b6223
6 ha cambiato i file con 688 aggiunte e 107 eliminazioni
  1. 104
    26
      src/pages.js
  2. 14
    10
      src/pages/ShouYe/index.jsx
  3. 4
    0
      src/utils/api.js
  4. 51
    0
      src/utils/hooks/useMountTrack.js
  5. 49
    4
      src/utils/track.js
  6. 466
    67
      yarn.lock

+ 104
- 26
src/pages.js Vedi File

3
   {
3
   {
4
     name: '首页',
4
     name: '首页',
5
     page: 'pages/ShouYe/index',
5
     page: 'pages/ShouYe/index',
6
-    type: 'main',
6
+    track: {
7
+      event: 'index',
8
+      eventType: 'main',
9
+    }
7
   },
10
   },
8
   {
11
   {
9
     name: '首页-活动',
12
     name: '首页-活动',
10
     page: 'pages/ShouYe/HuoDong/index',
13
     page: 'pages/ShouYe/HuoDong/index',
11
-    type: 'main',
14
+    track: {
15
+      event: 'list',
16
+      eventType: 'activity',
17
+    }
12
   },
18
   },
13
   {
19
   {
14
     name: '首页-资讯',
20
     name: '首页-资讯',
15
     page: 'pages/ShouYe/ZiXun/index',
21
     page: 'pages/ShouYe/ZiXun/index',
16
-    type: 'main',
22
+    track: {
23
+      event: 'list',
24
+      eventType: 'news',
25
+    }
17
   }
26
   }
18
 ]
27
 ]
19
 
28
 
21
   {
30
   {
22
     name: '物业',
31
     name: '物业',
23
     page: 'pages/WuYe/index',
32
     page: 'pages/WuYe/index',
24
-    type: 'property',
33
+    track: {
34
+      event: 'list',
35
+      eventType: 'property',
36
+    }
25
   },
37
   },
26
   {
38
   {
27
     name: '物业-服务详情',
39
     name: '物业-服务详情',
28
     page: 'pages/WuYe/FuWuDetail/index',
40
     page: 'pages/WuYe/FuWuDetail/index',
29
-    type: 'property',
41
+    track: {
42
+      event: 'detail',
43
+      eventType: 'property',
44
+    }
30
   },
45
   },
31
   {
46
   {
32
     name: '物业-公告详情',
47
     name: '物业-公告详情',
33
     page: 'pages/WuYe/GongGaoDetail/index',
48
     page: 'pages/WuYe/GongGaoDetail/index',
34
-    type: 'property',
49
+    track: {
50
+      event: 'detail',
51
+      eventType: 'property',
52
+    }
35
   },
53
   },
36
   {
54
   {
37
     name: '物业-报修区域',
55
     name: '物业-报修区域',
41
   {
59
   {
42
     name: '物业-添加报修',
60
     name: '物业-添加报修',
43
     page: 'pages/WuYe/TianJiaBaoXiu/index',
61
     page: 'pages/WuYe/TianJiaBaoXiu/index',
44
-    type: 'property',
62
+    track: {
63
+      event: 'detail',
64
+      eventType: 'property',
65
+    }
45
   },
66
   },
46
   {
67
   {
47
     name: '物业-报修详情',
68
     name: '物业-报修详情',
48
     page: 'pages/WuYe/BaoXiuDetail/index',
69
     page: 'pages/WuYe/BaoXiuDetail/index',
49
-    type: 'property',
70
+    track: {
71
+      event: 'detail',
72
+      eventType: 'property',
73
+    }
50
   },
74
   },
51
   {
75
   {
52
     name: '物业-编辑报修',
76
     name: '物业-编辑报修',
53
     page: 'pages/WuYe/XiuGaiBaoXiu/index',
77
     page: 'pages/WuYe/XiuGaiBaoXiu/index',
54
-    type: 'property',
78
+    track: {
79
+      event: 'detail',
80
+      eventType: 'property',
81
+    }
55
   },
82
   },
56
   {
83
   {
57
     name: '物业-报修费用',
84
     name: '物业-报修费用',
58
     page: 'pages/WuYe/BaoXiuFeiYong/index',
85
     page: 'pages/WuYe/BaoXiuFeiYong/index',
59
-    type: 'property',
86
+    track: {
87
+      event: 'detail',
88
+      eventType: 'property',
89
+    }
60
   },
90
   },
61
   {
91
   {
62
     name: '物业-缴费详情',
92
     name: '物业-缴费详情',
63
     page: 'pages/WuYe/JiaoFeiDetail/index',
93
     page: 'pages/WuYe/JiaoFeiDetail/index',
64
-    type: 'property',
94
+    track: {
95
+      event: 'detail',
96
+      eventType: 'property',
97
+    }
65
   }
98
   }
66
 ]
99
 ]
67
 
100
 
69
   {
102
   {
70
     name: '活动',
103
     name: '活动',
71
     page: 'pages/HuoDong/index',
104
     page: 'pages/HuoDong/index',
72
-    type: 'activity',
105
+    track: {
106
+      event: 'list',
107
+      eventType: 'activity',
108
+    }
73
   },
109
   },
74
   {
110
   {
75
     name: '活动-活动详情',
111
     name: '活动-活动详情',
76
     page: 'pages/HuoDong/HuoDongDetail/index',
112
     page: 'pages/HuoDong/HuoDongDetail/index',
77
-    type: 'activity',
113
+    track: {
114
+      event: 'detail',
115
+      eventType: 'activity',
116
+    }
78
   },
117
   },
79
   {
118
   {
80
     name: '活动-资讯详情',
119
     name: '活动-资讯详情',
81
     page: 'pages/HuoDong/ZiXunDetail/index',
120
     page: 'pages/HuoDong/ZiXunDetail/index',
82
-    type: 'activity',
121
+    track: {
122
+      event: 'detail',
123
+      eventType: 'news',
124
+    }
83
   }
125
   }
84
 ]
126
 ]
85
 
127
 
87
   {
129
   {
88
     name: '福利',
130
     name: '福利',
89
     page: 'pages/FuLi/index',
131
     page: 'pages/FuLi/index',
90
-    type: 'shop',
132
+    track: {
133
+      event: 'list',
134
+      eventType: 'shop',
135
+    }
91
   },
136
   },
92
   {
137
   {
93
     name: '福利-商品详情',
138
     name: '福利-商品详情',
94
     page: 'pages/FuLi/ShangPinXiangQing/index',
139
     page: 'pages/FuLi/ShangPinXiangQing/index',
95
-    type: 'shop',
140
+    track: {
141
+      event: 'detail',
142
+      eventType: 'shop',
143
+    }
96
   },
144
   },
97
   {
145
   {
98
     name: '福利-商品兑换',
146
     name: '福利-商品兑换',
99
     page: 'pages/FuLi/ShangPinDuiHuan/index',
147
     page: 'pages/FuLi/ShangPinDuiHuan/index',
100
-    type: 'shop',
148
+    track: {
149
+      event: 'exchange',
150
+      eventType: 'shop',
151
+    }
101
   },
152
   },
102
   {
153
   {
103
     name: '福利-积分规则',
154
     name: '福利-积分规则',
104
     page: 'pages/FuLi/JiFenGuiZe/index',
155
     page: 'pages/FuLi/JiFenGuiZe/index',
105
-    type: 'shop',
156
+    track: {
157
+      event: 'points_rule',
158
+      eventType: 'shop',
159
+    }
106
   },
160
   },
107
   {
161
   {
108
     name: '福利-积分明细',
162
     name: '福利-积分明细',
109
     page: 'pages/FuLi/JiFenMingXi/index',
163
     page: 'pages/FuLi/JiFenMingXi/index',
110
-    type: 'shop',
164
+    track: {
165
+      event: 'points_details',
166
+      eventType: 'shop',
167
+    }
111
   }
168
   }
112
 ]
169
 ]
113
 
170
 
115
   {
172
   {
116
     name: '我的',
173
     name: '我的',
117
     page: 'pages/WoDe/index',
174
     page: 'pages/WoDe/index',
118
-    type: 'other',
175
+    track: {
176
+      event: 'list',
177
+      eventType: 'other',
178
+    }
119
   },
179
   },
120
   {
180
   {
121
     name: '我的-个人信息',
181
     name: '我的-个人信息',
122
     page: 'pages/WoDe/GeRenXinXi/index',
182
     page: 'pages/WoDe/GeRenXinXi/index',
123
-    type: 'other',
183
+    track: {
184
+      event: 'detail',
185
+      eventType: 'other',
186
+    }
124
   },
187
   },
125
   {
188
   {
126
     name: '我的-业主认证',
189
     name: '我的-业主认证',
127
     page: 'pages/WoDe/YeZhuRenZheng/index',
190
     page: 'pages/WoDe/YeZhuRenZheng/index',
128
-    type: 'other',
191
+    track: {
192
+      event: 'detail',
193
+      eventType: 'property',
194
+    }
129
   },
195
   },
130
   {
196
   {
131
     name: '我的-业主审核',
197
     name: '我的-业主审核',
132
     page: 'pages/WoDe/YeZhuShenHe/index',
198
     page: 'pages/WoDe/YeZhuShenHe/index',
133
-    type: 'other',
199
+    track: {
200
+      event: 'detail',
201
+      eventType: 'property',
202
+    }
134
   },
203
   },
135
   {
204
   {
136
     name: '我的-我的活动',
205
     name: '我的-我的活动',
137
     page: 'pages/WoDe/WoDeHuoDong/index',
206
     page: 'pages/WoDe/WoDeHuoDong/index',
138
-    type: 'other',
207
+    track: {
208
+      event: 'list',
209
+      eventType: 'activity',
210
+    }
139
   },
211
   },
140
   {
212
   {
141
     name: '我的-推荐二维码',
213
     name: '我的-推荐二维码',
142
     page: 'pages/WoDe/TuiJianErWeiMa/index',
214
     page: 'pages/WoDe/TuiJianErWeiMa/index',
143
-    type: 'other',
215
+    track: {
216
+      event: 'detail',
217
+      eventType: 'other',
218
+    }
144
   },
219
   },
145
   {
220
   {
146
     name: '我的-推荐分享',
221
     name: '我的-推荐分享',
147
     page: 'pages/WoDe/TuiJianFenXiang/index',
222
     page: 'pages/WoDe/TuiJianFenXiang/index',
148
-    type: 'other',
223
+    track: {
224
+      event: 'detail',
225
+      eventType: 'other',
226
+    }
149
   },
227
   },
150
 ]
228
 ]
151
 
229
 

+ 14
- 10
src/pages/ShouYe/index.jsx Vedi File

6
 import request, { apis } from '@/utils/request'
6
 import request, { apis } from '@/utils/request'
7
 import { useModel } from '@/store'
7
 import { useModel } from '@/store'
8
 import useUserMounted from '@/utils/hooks/useUserMounted'
8
 import useUserMounted from '@/utils/hooks/useUserMounted'
9
+import useMountTrack from '@/utils/hooks/useMountTrack'
9
 import Taro from '@tarojs/taro'
10
 import Taro from '@tarojs/taro'
10
 import Page from '@/layouts'
11
 import Page from '@/layouts'
11
 import '@/assets/css/reset.less'
12
 import '@/assets/css/reset.less'
35
   const [ActivityList, setActivityList] = useState([])
36
   const [ActivityList, setActivityList] = useState([])
36
   const [NewsList, setNewsList] = useState([])
37
   const [NewsList, setNewsList] = useState([])
37
 
38
 
38
-  useEffect(() => {
39
-    if (user) {
40
-      console.log(user, `user`)
41
-      OnRefresh()
42
-    }
43
-  }, [user])
39
+  // useEffect(() => {
40
+  //   if (user) {
41
+  //     console.log(user, `user`)
42
+  //     OnRefresh()
43
+  //   }
44
+  // }, [user])
45
+
46
+  useUserMounted(() => {
47
+    console.log(user, `user`)
48
+    OnRefresh()
49
+  })
44
 
50
 
45
-  // useUserMounted(() => {
46
-  //   console.log(user, `user`)
47
-  //   OnRefresh()
48
-  // })
51
+  // 埋点
52
+  useMountTrack()
49
 
53
 
50
   const Init = (done = () => { }) => { // 初始化
54
   const Init = (done = () => { }) => { // 初始化
51
     let DownCount = 0
55
     let DownCount = 0

+ 4
- 0
src/utils/api.js Vedi File

124
   updateTracking: { // 更新埋点
124
   updateTracking: { // 更新埋点
125
     method: 'put',
125
     method: 'put',
126
     url: `${prefix}/taPersonVisitRecord/:id`
126
     url: `${prefix}/taPersonVisitRecord/:id`
127
+  },
128
+  setShare: { // 分享
129
+    method: 'put',
130
+    url: `${prefix}/:type/share/:id`
127
   }
131
   }
128
 
132
 
129
 }
133
 }

+ 51
- 0
src/utils/hooks/useMountTrack.js Vedi File

1
+import React, { useEffect, useRef } from 'react'
2
+import { getCurrentInstance } from '@tarojs/taro'
3
+import { useModel } from '@/store'
4
+import request, { apis } from '../request'
5
+
6
+const pages = require('../../pages')
7
+
8
+/**
9
+ * 页面埋点
10
+ * params 一般不需要传值,
11
+ * 特殊情况, 可以参考 ta_person_visit 表
12
+ * 
13
+ * @param {*} params 
14
+ */
15
+export default function useMountTrack(params) {
16
+  const execed = useRef(false)
17
+  const { user } = useModel('user')
18
+
19
+  useEffect(() => {
20
+    if (!user || !user.personId) {
21
+      return
22
+    }
23
+
24
+    const router = getCurrentInstance().router
25
+    const page = pages.filter(x => router.path.indexOf(x.page) > -1)[0]
26
+    if (!page) {
27
+      return
28
+    }
29
+
30
+    // 只执行一次
31
+    if (execed.current) {
32
+      return
33
+    } else {
34
+      execed.current = true
35
+    }
36
+
37
+    const data = {
38
+      propertyName: page.name,
39
+      data: '{}',
40
+      ...page.track,
41
+      ...(params || {})
42
+    }
43
+
44
+    let id = undefined
45
+    request({ ...apis.saveTracking, silent: true, data }).then(res => {
46
+      id = res.recordId
47
+    })
48
+
49
+    return () => id && request({ ...apis.updateTracking, silent: true, args: { id } })
50
+  }, [params, user])
51
+}

+ 49
- 4
src/utils/track.js Vedi File

10
 export async function trackUserSource(router, qrcode) {
10
 export async function trackUserSource(router, qrcode) {
11
   const { path, scene, params } = router || {}
11
   const { path, scene, params } = router || {}
12
 
12
 
13
-  const pageInfo = pages.filter(x => path.indexOf(x.page) > -1)[0] || { type: 'other', name: '其他' }
13
+  const page = pages.filter(x => path.indexOf(x.page) > -1)[0] || {}
14
 
14
 
15
   const trackPayload = {
15
   const trackPayload = {
16
+    ...(page.track || {}),
16
     event: 'start',
17
     event: 'start',
17
-    eventType: pageInfo.type,
18
-    propertyName: pageInfo.name,
18
+    propertyName: page.name,
19
     data: '{}',
19
     data: '{}',
20
     id: params.id,
20
     id: params.id,
21
-    buildingId: undefined,
22
     realScene: scene,
21
     realScene: scene,
23
     sceneId: params.scene,
22
     sceneId: params.scene,
24
     sharePersonId: (qrcode || {}).recommender || params.recommender,
23
     sharePersonId: (qrcode || {}).recommender || params.recommender,
38
     return function () { }
37
     return function () { }
39
   }
38
   }
40
 }
39
 }
40
+
41
+/**
42
+ * 分享埋点
43
+ * params 一般需要如下传值:
44
+ *    targetId: 当前页面的ID
45
+ *    shareType: 分享内容类型, 目前约定的有 main 首页, project 项目, activity 普通活动, news 资讯 等
46
+ *    event: 默认是 share, 如果是海报分享, 请传值 poster
47
+ * 
48
+ * @param {*} params 
49
+ */
50
+export function shareTrack(params, user) {
51
+  const { shareType, targetId, ...trackParams } = params || {}
52
+  if (!shareType || !user || !user.personId) {
53
+    return
54
+  }
55
+
56
+  // 分享设置
57
+  if (targetId) {
58
+    request({
59
+      ...apis.setShare,
60
+      silent: true,
61
+      args: {
62
+        type: shareType,
63
+        id: targetId
64
+      }
65
+    }).then(res => console.log('--分享设置-->', res))
66
+  }
67
+
68
+  // 埋点
69
+  const router = getCurrentInstance().router
70
+  const page = pages.filter(x => router.path.indexOf(x.page) > -1)[0] || {}
71
+
72
+  const data = {
73
+    propertyName: page.name,
74
+    data: '{}',
75
+    ...(page.track || {}),
76
+    targetId,
77
+    sharePersonId: user.personId,
78
+    event: 'share',
79
+    ...trackParams
80
+  }
81
+
82
+  request({ ...apis.saveTracking, silent: true, data }).then(res => {
83
+    console.log('--分享埋点-->', res)
84
+  })
85
+}

+ 466
- 67
yarn.lock
File diff suppressed because it is too large
Vedi File