张延森 4 年 前
コミット
6bda1b6223
共有6 個のファイルを変更した688 個の追加107 個の削除を含む
  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 ファイルの表示

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

@@ -6,6 +6,7 @@ import { Swiper, SwiperItem, Text } from '@tarojs/components'
6 6
 import request, { apis } from '@/utils/request'
7 7
 import { useModel } from '@/store'
8 8
 import useUserMounted from '@/utils/hooks/useUserMounted'
9
+import useMountTrack from '@/utils/hooks/useMountTrack'
9 10
 import Taro from '@tarojs/taro'
10 11
 import Page from '@/layouts'
11 12
 import '@/assets/css/reset.less'
@@ -35,17 +36,20 @@ export default function Index (props) {
35 36
   const [ActivityList, setActivityList] = useState([])
36 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 54
   const Init = (done = () => { }) => { // 初始化
51 55
     let DownCount = 0

+ 4
- 0
src/utils/api.js ファイルの表示

@@ -124,6 +124,10 @@ const $api = {
124 124
   updateTracking: { // 更新埋点
125 125
     method: 'put',
126 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 ファイルの表示

@@ -0,0 +1,51 @@
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 ファイルの表示

@@ -10,15 +10,14 @@ const pages = require('../pages')
10 10
 export async function trackUserSource(router, qrcode) {
11 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 15
   const trackPayload = {
16
+    ...(page.track || {}),
16 17
     event: 'start',
17
-    eventType: pageInfo.type,
18
-    propertyName: pageInfo.name,
18
+    propertyName: page.name,
19 19
     data: '{}',
20 20
     id: params.id,
21
-    buildingId: undefined,
22 21
     realScene: scene,
23 22
     sceneId: params.scene,
24 23
     sharePersonId: (qrcode || {}).recommender || params.recommender,
@@ -38,3 +37,49 @@ export async function trackUserSource(router, qrcode) {
38 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
ファイル差分が大きすぎるため省略します
ファイルの表示