@uxda/appkit 4.2.96 → 4.2.98

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.
Files changed (36) hide show
  1. package/dist/index.js +137 -102
  2. package/package.json +1 -1
  3. package/src/balance/components/AccountView.vue +6 -6
  4. package/src/balance/components/BalanceCard.vue +2 -2
  5. package/src/balance/components/BalanceReminder.vue +1 -1
  6. package/src/balance/components/ConsumptionFilter.vue +1 -1
  7. package/src/balance/components/ConsumptionRules.vue +1 -1
  8. package/src/balance/components/DateFilter.vue +1 -1
  9. package/src/balance/components/DateRange.vue +1 -1
  10. package/src/balance/components/ListFilter.vue +1 -1
  11. package/src/balance/components/ListFilterPicker.vue +1 -1
  12. package/src/balance/components/PromoterCard.vue +5 -5
  13. package/src/components/dd-notice-bar/index.vue +2 -2
  14. package/src/notice/components/NoticeBanner.vue +2 -2
  15. package/src/notice/components/NoticeList.vue +2 -2
  16. package/src/notice/components/NoticeList2.vue +2 -5
  17. package/src/notice/components/NoticePopup.vue +2 -2
  18. package/src/payment/components/RechargeResult.vue +1 -1
  19. package/src/payment/components/RechargeView.vue +2 -2
  20. package/src/payment/components/TradeView.vue +2 -2
  21. package/src/register/components/SelfRegistration.vue +1 -1
  22. package/src/scenarios/components/SharePoster.vue +2 -2
  23. package/src/shared/components/AppVerify.vue +3 -3
  24. package/src/shared/components/OcrBusinessLicense.vue +1 -1
  25. package/src/shared/components/OcrIcon.vue +1 -1
  26. package/src/shared/components/PageHeader.vue +1 -1
  27. package/src/shared/tracking/README.md +2 -6
  28. package/src/shared/tracking/examples/directive-tracking-example.vue +3 -22
  29. package/src/shared/tracking/tracking-sdk.ts +83 -14
  30. package/src/user/components/UserAuth.vue +3 -3
  31. package/src/user/components/UserBinding.vue +4 -4
  32. package/src/user/components/UserBindingSuccess.vue +1 -1
  33. package/src/user/components/UserEntry.vue +5 -5
  34. package/src/user/components/UserFeedbackEntry.vue +3 -3
  35. package/src/user/components/UserHeadCrop.vue +2 -2
  36. package/src/user/components/UserInfo.vue +12 -12
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@uxda/appkit",
3
- "version": "4.2.96",
3
+ "version": "4.2.98",
4
4
  "description": "小程序应用开发包",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.ts",
@@ -4,7 +4,7 @@
4
4
  <page-header :title="Taro.getEnv() !== 'WEB' ? '我的账户' : ''" :class="{ 'with-background': scrolled > 0 }"
5
5
  @close="onPageHeaderClose" />
6
6
  <div class="row jusify-right">
7
- <div class="small-bean-button" v-track-click="'click'" @click="onSecondBalanceButtonClick">
7
+ <div class="small-bean-button" v-track-click @click="onSecondBalanceButtonClick">
8
8
  <label class="label">收支明细</label>
9
9
  </div>
10
10
  </div>
@@ -14,11 +14,11 @@
14
14
  <img class="bean-icon" src="https://cdn.ddjf.com/static/images/bpms-workBench/gold-bean.png" />
15
15
  <div class="bean-tag tag">云豆</div>
16
16
  </div>
17
- <div v-if="!isAppEnv || (isAppEnv && !isIOS())" class="rule" v-track-click="'click'" @click="rulesPopupOpen = true">规则说明</div>
17
+ <div v-if="!isAppEnv || (isAppEnv && !isIOS())" class="rule" v-track-click @click="rulesPopupOpen = true">规则说明</div>
18
18
  </div>
19
19
  <div class="bean-counts spa-between">
20
20
  <div class="counts number">{{ formatAmount(balance.total || 0) }}</div>
21
- <div v-if="!isAppEnv || (isAppEnv && !isIOS())" class="pay" v-track-click="'click'" @click="gotoRecharge">云豆充值</div>
21
+ <div v-if="!isAppEnv || (isAppEnv && !isIOS())" class="pay" v-track-click @click="gotoRecharge">云豆充值</div>
22
22
  </div>
23
23
  </div>
24
24
  <Tip />
@@ -32,7 +32,7 @@
32
32
  <div class="item-title">
33
33
  <div>{{ item.title }}</div>
34
34
  <div class="item-title-button" v-if="item.id && (!isAppEnv || (isAppEnv && !isIOS()))">
35
- <div v-track-click="'click'" @click="gotoTrade(item)">企明星优惠充值</div>
35
+ <div v-track-click @click="gotoTrade(item)">企明星优惠充值</div>
36
36
  <img class="button-icon" src="https://cdn.ddjf.com/static/images/bpms-workBench/button-hg.svg" />
37
37
  </div>
38
38
  </div>
@@ -47,7 +47,7 @@
47
47
  <div class="item-title">
48
48
  <div>{{ item.title }}</div>
49
49
  <div class="item-title-button" v-if="item.id && (!isAppEnv || (isAppEnv && !isIOS()))">
50
- <div v-track-click="'click'" @click="gotoTrade(item)">AI审批充值</div>
50
+ <div v-track-click @click="gotoTrade(item)">AI审批充值</div>
51
51
  <img class="button-icon" src="https://cdn.ddjf.com/static/images/bpms-workBench/button-hg.svg" />
52
52
  </div>
53
53
  </div>
@@ -93,7 +93,7 @@
93
93
  src="https://cdn.ddjf.com/static/images/bpms-workBench/clound-bean-down.png" />
94
94
  </div>
95
95
  </div>
96
- <div class="search" v-track-click="'click'" @click="filterOpen = true">
96
+ <div class="search" v-track-click @click="filterOpen = true">
97
97
  <span class="text">筛选</span>
98
98
  <img class="time-icon" src="https://cdn.ddjf.com/static/images/bpms-workBench/clound-bean-select-icon.png" />
99
99
  </div>
@@ -12,7 +12,7 @@
12
12
  <div class="bean-nums number">{{ formatAmount(balance.total || 0) }}</div>
13
13
  </div>
14
14
  <div class="card-row-right">
15
- <div class="account-info-entry" v-track-click="'click'" @click="gotoDetail">
15
+ <div class="account-info-entry" v-track-click @click="gotoDetail">
16
16
  <div class="account-info-name">账户明细</div>
17
17
  <div class="account-info-icon">
18
18
  <img class="icon"
@@ -25,7 +25,7 @@
25
25
  <div class="card-row">
26
26
  <div class="card-row-left desc">权益使用时自动扣减云豆</div>
27
27
  <div class="card-row-right">
28
- <div class="pay" v-track-click="'click'" @click="gotoRecharge">
28
+ <div class="pay" v-track-click @click="gotoRecharge">
29
29
  <div>充值</div>
30
30
  <img
31
31
  class="pay-icon"
@@ -11,7 +11,7 @@
11
11
  <nut-button class="cancel-button" @click="emit('update:modelValue', false)" block>取消</nut-button>
12
12
  </div>
13
13
  <div class="col">
14
- <nut-button block class="recharge-button" v-track-click="'click'" @click="emit('recharge')">{{ buttonText }}</nut-button>
14
+ <nut-button block class="recharge-button" v-track-click @click="emit('recharge')">{{ buttonText }}</nut-button>
15
15
  </div>
16
16
  </div>
17
17
  </div>
@@ -20,7 +20,7 @@
20
20
  </div>
21
21
  <div class="consumption-filter-btn spa-between">
22
22
  <div class="btn" @click="reset">重置</div>
23
- <div class="btn confirm" v-track-click="{ event: 'click', elementText: '选择筛选项-确定' }" @click="onOkClick">确定</div>
23
+ <div class="btn confirm" v-track-click="'选择筛选项-确定'" @click="onOkClick">确定</div>
24
24
  </div>
25
25
  <div class="consumption-filter-bottom"></div>
26
26
  </div>
@@ -20,7 +20,7 @@
20
20
  2、产品权益的使用范围:产品权益用于大道云平台各个系统产品的消耗使用,系统包括但不限于企明星、AI审批、电子签约、蜂鸟周转系统、蜂鸟居间系统,各个系统的产品权益仅用于各产品专项使用,无法跨产品使用。
21
21
  </div>
22
22
  </div>
23
- <div class="know" v-track-click="{ event: 'click', elementText: '规则说明-我知道了' }" @click="emit('complete')">我知道了</div>
23
+ <div class="know" v-track-click="'规则说明-我知道了'" @click="emit('complete')">我知道了</div>
24
24
  </div>
25
25
  </template>
26
26
 
@@ -15,7 +15,7 @@
15
15
  </div>
16
16
  <div class="buttons spa-between">
17
17
  <div class="btn" @click="reset">重置</div>
18
- <div class="btn confirm" v-track-click="{ event: 'click', elementText: '日期选择-确定' }" @click="onOkClick">确定</div>
18
+ <div class="btn confirm" v-track-click="'日期选择-确定'" @click="onOkClick">确定</div>
19
19
  </div>
20
20
  <div class="bottom"></div>
21
21
  <nut-popup v-model:visible="datePickerOpen" class="appkit-date-filter-picker-popup" position="bottom"
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <div class="date-range" v-track-click="{ event: 'click', elementText: '日期范围-点击' }" @click="openDateRangePicker">
2
+ <div class="date-range" v-track-click="'日期范围-点击'" @click="openDateRangePicker">
3
3
  <div class="text">{{ dateRangeDisplay }}</div>
4
4
  <img style="margin-top: -2px" class="time-icon"
5
5
  src="https://cdn.ddjf.com/static/images/bpms-workBench/clound-bean-down.png" />
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <div class="list-filter" v-track-click="{ event: 'click', elementText: '筛选-点击' }" @click="openPicker">
2
+ <div class="list-filter" v-track-click="'筛选-点击'" @click="openPicker">
3
3
  <span class="text">筛选</span>
4
4
  <img class="icon" src="https://cdn.ddjf.com/static/images/bpms-workBench/clound-bean-select-icon.png" />
5
5
  </div>
@@ -16,7 +16,7 @@
16
16
  </div>
17
17
  <div class="list-filter-picker-btn spa-between">
18
18
  <div class="btn" @click="reset">重置</div>
19
- <div class="btn confirm" v-track-click="{ event: 'click', elementText: '选择筛选项-确定' }" @click="onOkClick">确定</div>
19
+ <div class="btn confirm" v-track-click="'选择筛选项-确定'" @click="onOkClick">确定</div>
20
20
  </div>
21
21
  <div class="list-filter-picker-bottom"></div>
22
22
  </div>
@@ -8,7 +8,7 @@
8
8
  </div>
9
9
  <slot name="tab-btn"></slot>
10
10
  </div>
11
- <div class="promoter-card-hd" v-track-click="'click'" @click="emits('blance', tab)"
11
+ <div class="promoter-card-hd" v-track-click @click="emits('blance', tab)"
12
12
  v-if="applyRecord.distributorFlag === 'Y' || applyRecord.accessCheckStatus === 'Y'">
13
13
  <div class="promoter-card-hd-num number">{{ formatAmount(promoter.allowWithdrawalBalance || 0) }}</div>
14
14
  <div class="promoter-card-hd-info">可提现余额(元)</div>
@@ -24,9 +24,9 @@
24
24
  </template>
25
25
  <template v-else>
26
26
  <div class="promoter-card-ft-info">产品销售收益(元)
27
- <IconFont class="icon" name="ask" v-track-click="{event: 'click', elementText: '产品销售收益-说明'}" @click="onHelpClick('profits')" />
27
+ <IconFont class="icon" name="ask" v-track-click="'产品销售收益-说明'" @click="onHelpClick('profits')" />
28
28
  </div>
29
- <div class="promoter-card-ft-num number" v-track-click="'click'" @click="emits('profits', tab)">
29
+ <div class="promoter-card-ft-num number" v-track-click @click="emits('profits', tab)">
30
30
  {{ formatAmount(promoter.totalIncome || 0) }}
31
31
  <img class="arrow-img" :src="arrowImg" alt="">
32
32
  </div>
@@ -37,9 +37,9 @@
37
37
  </div>
38
38
  <div class="promoter-card-ft-item" v-if="applyRecord.distributorFlag === 'Y'">
39
39
  <div class="promoter-card-ft-info">分销返佣收益(元)
40
- <IconFont class="icon" name="ask" v-track-click="{event: 'click', elementText: '分销返佣收益-说明'}" @click="onHelpClick('rebate')" />
40
+ <IconFont class="icon" name="ask" v-track-click="'分销返佣收益-说明'" @click="onHelpClick('rebate')" />
41
41
  </div>
42
- <div class="promoter-card-ft-num number" v-track-click="'click'" @click="emits('rebate', tab)">
42
+ <div class="promoter-card-ft-num number" v-track-click @click="emits('rebate', tab)">
43
43
  {{ formatAmount(promoter.totalRebateIncome || 0) }}
44
44
  <img class="arrow-img" :src="arrowImg" alt="">
45
45
  </div>
@@ -16,11 +16,11 @@ function txtClick() {
16
16
 
17
17
  <template>
18
18
  <div class="dd-notice-bar" :class="{ close: showClose }" :style="style">
19
- <div class="dd-notice-bar__txt" name="text" v-track-click="{event: 'click', elementText: '通知栏-文本'}" @click="txtClick">
19
+ <div class="dd-notice-bar__txt" name="text" v-track-click="'通知栏-文本'" @click="txtClick">
20
20
  <span v-if="text">{{ text }}</span>
21
21
  <slot></slot>
22
22
  </div>
23
- <div v-if="showClose" class="dd-notice-bar__close" v-track-click="{event: 'click', elementText: '通知栏-关闭'}" @click="close">
23
+ <div v-if="showClose" class="dd-notice-bar__close" v-track-click="'通知栏-关闭'" @click="close">
24
24
  <img
25
25
  src="https://cdn.ddjf.com/static/images/wechat-yunservice/close-icon.png"
26
26
  class="dd-notice-bar__close-img"
@@ -2,12 +2,12 @@
2
2
  <div class="notice-banner" :class="{ fixed: fixed }" :style="topStype" v-if="bannerMessages.length"
3
3
  @touchstart="onTouchStart" @touchend="onTouchEnd">
4
4
  <DdNoticeBar :class="{ show: key === activeKey }" v-for="(item, key) in bannerMessages" :key="key"
5
- :showClose="item.noticeType === 0" v-track-click="{event: 'click', elementText: '通知栏-关闭'}" @close="onClose(item, key)">
5
+ :showClose="item.noticeType === 0" v-track-click="'通知栏-关闭'" @close="onClose(item, key)">
6
6
  <img class="notice-banner-icon" src="https://cdn.ddjf.com/static/images/customer-center/notice-icon.png" alt="" />
7
7
  <div class="notice-banner-text">
8
8
  {{ item.context }}
9
9
  </div>
10
- <div class="notice-banner-btn" v-track-click="{event: 'click', elementText: '通知栏-详情'}" @click="onDetail(item)">详情</div>
10
+ <div class="notice-banner-btn" v-track-click="'通知栏-详情'" @click="onDetail(item)">详情</div>
11
11
  </DdNoticeBar>
12
12
  </div>
13
13
 
@@ -6,7 +6,7 @@
6
6
  <div class="wrapper" v-if="list.length">
7
7
  <ScrollView class="content" :scroll-y="true" :refresher-enabled="true" :refresherTriggered="isRefresh"
8
8
  @refresherrefresh="onRefresh" :lower-threshold="100" @scrolltolower="runNext" bindscroll="">
9
- <div class="card" :class="{ active: item.isRead != '1' }" v-for="(item, index) in list" :key="index" v-track-click="{event: 'click', elementText: '消息详情'}"
9
+ <div class="card" :class="{ active: item.isRead != '1' }" v-for="(item, index) in list" :key="index" v-track-click="'消息详情'"
10
10
  @click="notifyRead(item, index)">
11
11
  <div class="point"></div>
12
12
  <div>
@@ -20,7 +20,7 @@
20
20
  </div>
21
21
  <div class="text" :class="{ gray: item.isRead == '1' }">
22
22
  <rich-text style="white-space: pre-wrap" :nodes="item.context"></rich-text>
23
- <span v-if="item.link && item.msgType == 3" class="notice-list-file" v-track-click="{event: 'click', elementText: '消息详情-附件'}" @click="onNoticeView(item.link)">
23
+ <span v-if="item.link && item.msgType == 3" class="notice-list-file" v-track-click="'消息详情-附件'" @click="onNoticeView(item.link)">
24
24
  查看附件
25
25
  </span>
26
26
  </div>
@@ -18,7 +18,7 @@
18
18
  <ns-tabs-item key="未读" tab="未读"></ns-tabs-item>
19
19
  </ns-tabs>
20
20
  <div v-if="state.list.length > 0" class="read-all">
21
- <div v-track-click="'click'" class="btn" @click="readAll">全部已读</div>
21
+ <div v-track-click class="btn" @click="readAll">全部已读</div>
22
22
  </div>
23
23
  </div>
24
24
  <ns-page-content class="mt-68px" scrollable refreshable :refresh-triggered="isRefresh"
@@ -28,10 +28,7 @@
28
28
  <template v-else>
29
29
  <ns-repeator v-slot="item" align="stretch" direction="column" :gap="10" :data="state.list"
30
30
  :show-no-more="paging.isLastPage">
31
- <ns-card v-track-click="{
32
- event: 'click',
33
- elementText: '消息详情',
34
- }" :r="5" fill="#fff" class="news-item w-full" @click="itemClick(item)">
31
+ <ns-card v-track-click="'消息详情'" :r="5" fill="#fff" class="news-item w-full" @click="itemClick(item)">
35
32
  <div v-if="item.标题" :style="{ color: item.已读 ? '#35353599' : '#353535' }" class="news-item-title">
36
33
  <img v-if="item.是公告" class="news-item-title-icon"
37
34
  src="https://cdn.ddjf.com/static/images/loan-manage-app/ic_msg_system_notice.webp" />
@@ -6,12 +6,12 @@
6
6
  </div>
7
7
  <div class="notice-popup-bd">
8
8
  <div style="white-space: pre-wrap">{{ message.context.replace('【系统公告】 ', '') }}</div>
9
- <div v-if="message.jumpUrl || message.link" class="notice-popup-bd-link" v-track-click="'click'" @click="toViewAttachment">
9
+ <div v-if="message.jumpUrl || message.link" class="notice-popup-bd-link" v-track-click @click="toViewAttachment">
10
10
  点击查看附件
11
11
  </div>
12
12
  </div>
13
13
  <div class="notice-popup-ft">
14
- <div class="notice-popup-ft-btn" v-track-click="{event: 'click', elementText: '系统公告-我知道了'}" @click="onClose">我知道了</div>
14
+ <div class="notice-popup-ft-btn" v-track-click="'系统公告-我知道了'" @click="onClose">我知道了</div>
15
15
  </div>
16
16
  </nut-popup>
17
17
  </template>
@@ -5,7 +5,7 @@
5
5
  <h2>{{views[type][0]}}成功</h2>
6
6
  <div class="caption" v-if="payMethod == 'bean'">权益已到账</div>
7
7
  <div class="caption" v-else>{{views[type][1]}}将在1分钟之内到账</div>
8
- <nut-button class="back-button" type="default" v-track-click="'click'" @click="onBackClick">返回</nut-button>
8
+ <nut-button class="back-button" type="default" v-track-click @click="onBackClick">返回</nut-button>
9
9
  </div>
10
10
  </div>
11
11
  </template>
@@ -5,10 +5,10 @@
5
5
  </view>
6
6
  <view class="amount-footer">
7
7
  <view class="agreement">
8
- <nut-checkbox v-model="state.agreed">我已阅读并同意<a v-track-click="'click'" class="link inline"
8
+ <nut-checkbox v-model="state.agreed">我已阅读并同意<a v-track-click class="link inline"
9
9
  @click="onAgreementLinkClick">《大道云平台云豆充值服务协议》</a></nut-checkbox>
10
10
  </view>
11
- <nut-button block shape="square" :loading="state.buttonLoading" v-track-click="'click'" @click="onPayClick"
11
+ <nut-button block shape="square" :loading="state.buttonLoading" v-track-click @click="onPayClick"
12
12
  class="recharge-button">立即充值</nut-button>
13
13
  </view>
14
14
  </view>
@@ -21,7 +21,7 @@
21
21
 
22
22
  <view class="amount-footer">
23
23
  <view class="agreement" v-if="!selectBean">
24
- <nut-checkbox v-model="state.agreed">我已阅读并同意<a v-track-click="'click'" class="link inline"
24
+ <nut-checkbox v-model="state.agreed">我已阅读并同意<a v-track-click class="link inline"
25
25
  @click="onAgreementLinkClick">《大道云平台云豆充值服务协议》</a></nut-checkbox>
26
26
  </view>
27
27
  <div class="buy-amount">
@@ -31,7 +31,7 @@
31
31
  <i>¥</i>{{ formatAmount(currentAmount) }}
32
32
  </span>
33
33
  </div>
34
- <nut-button block shape="square" :loading="state.buttonLoading" v-track-click="'click'" @click="onPayClick"
34
+ <nut-button block shape="square" :loading="state.buttonLoading" v-track-click @click="onPayClick"
35
35
  class="recharge-button">购买</nut-button>
36
36
  </div>
37
37
  </view>
@@ -155,7 +155,7 @@ async function submit() {
155
155
  </nut-form>
156
156
  </div>
157
157
  <div class="self-registration-bottom">
158
- <nut-button block type="primary" class="experience-button" v-track-click="'click'" @click="submit">立即体验</nut-button>
158
+ <nut-button block type="primary" class="experience-button" v-track-click @click="submit">立即体验</nut-button>
159
159
  </div>
160
160
  </div>
161
161
  </template>
@@ -60,10 +60,10 @@
60
60
  </div>
61
61
  <div class="line"></div>
62
62
  <div class="bottom">
63
- <nut-button class="cancel-btn" v-track-click="{ event: 'click', elementText: '海报分享-取消' }" @click="onCancelClick"
63
+ <nut-button class="cancel-btn" v-track-click="'海报分享-取消'" @click="onCancelClick"
64
64
  >取消</nut-button
65
65
  >
66
- <nut-button type="primary" v-track-click="{ event: 'click', elementText: '海报分享-确定' }" @click="onPosterShare">确定</nut-button>
66
+ <nut-button type="primary" v-track-click="'海报分享-确定'" @click="onPosterShare">确定</nut-button>
67
67
  </div>
68
68
  </div>
69
69
  <canvas
@@ -12,13 +12,13 @@
12
12
  }]">
13
13
  </ns-input>
14
14
  <div class="form-btn">
15
- <ns-button v-if="!sent" size="xs" variant="plain" color="primary" v-track-click="{ event: 'click', elementText: '手机号验证-获取验证码' }" @click="send" label="获取验证码" />
15
+ <ns-button v-if="!sent" size="xs" variant="plain" color="primary" v-track-click="'手机号验证-获取验证码'" @click="send" label="获取验证码" />
16
16
  <div class="caption" v-if="sent">{{ countdown }}s后重新发送</div>
17
17
  </div>
18
18
  </ns-form>
19
19
  <div class="row buttons">
20
- <ns-button class="cancel-btn" v-track-click="{ event: 'click', elementText: '手机号验证-取消' }" @click="emits('cancel')">取消</ns-button>
21
- <ns-button color="primary" v-track-click="{ event: 'click', elementText: '手机号验证-确认' }" @click="onOk">确认</ns-button>
20
+ <ns-button class="cancel-btn" v-track-click="'手机号验证-取消'" @click="emits('cancel')">取消</ns-button>
21
+ <ns-button color="primary" v-track-click="'手机号验证-确认'" @click="onOk">确认</ns-button>
22
22
  </div>
23
23
  </div>
24
24
  </template>
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <div :class="['ocr-business-license', disabled ? 'disabled' : '']" class="ocr-icon" v-track-click="{ event: 'click', elementText: '营业执照识别-点击' }" @click="onIconClick">
2
+ <div :class="['ocr-business-license', disabled ? 'disabled' : '']" class="ocr-icon" v-track-click="'营业执照识别-点击'" @click="onIconClick">
3
3
  <ns-icon name="https://cdn.ddjf.com/static/images/beidouxing/ocr-icon.png" />
4
4
  </div>
5
5
  </template>
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <div class="ocr-icon" :class="[disabled ? 'disabled' : '']" v-track-click="{ event: 'click', elementText: '身份证识别-点击' }" @click="onPhotograph">
2
+ <div class="ocr-icon" :class="[disabled ? 'disabled' : '']" v-track-click="'身份证识别-点击'" @click="onPhotograph">
3
3
  <slot name="icon">
4
4
  <ns-icon name="https://cdn.ddjf.com/static/images/beidouxing/ocr-icon.png" />
5
5
  </slot>
@@ -4,7 +4,7 @@
4
4
  `color-mode-${colorMode}`
5
5
  ]" :style="cssVars">
6
6
  <h1 class="page-title" v-if="title">{{ title }}</h1>
7
- <view class="back-button" v-track-click="{ event: 'click', elementText: '页面头部-返回' }" @click="onBackButtonClick"></view>
7
+ <view class="back-button" v-track-click="'页面头部-返回'" @click="onBackButtonClick"></view>
8
8
  <slot></slot>
9
9
  </div>
10
10
  </template>
@@ -273,16 +273,12 @@ const handleClick = async () => {
273
273
  </view>
274
274
 
275
275
  <!-- 基础点击埋点 -->
276
- <button v-track-click="'button_click'">
276
+ <button v-track-click=>
277
277
  点击按钮
278
278
  </button>
279
279
 
280
280
  <!-- 自定义点击埋点 -->
281
- <button v-track-click="{
282
- event: 'custom_click',
283
- data: { buttonType: 'primary', value: 123 },
284
- elementId: 'submit-btn',
285
- }">
281
+ <button v-track-click="'自定义文本'">
286
282
  自定义点击按钮
287
283
  </button>
288
284
 
@@ -23,30 +23,14 @@
23
23
  <text class="section-title">点击埋点</text>
24
24
  <view class="content">
25
25
  <!-- 基础点击埋点 -->
26
- <button v-track-click="'basic_click'" class="btn">基础点击埋点</button>
26
+ <button v-track-click class="btn">基础点击埋点</button>
27
27
 
28
28
  <!-- 带数据的点击埋点 -->
29
29
  <button
30
- v-track-click="{
31
- event: 'custom_click',
32
- data: { buttonType: 'primary', value: 123 },
33
- }"
30
+ v-track-click="'自定义数据点击埋点'"
34
31
  class="btn">
35
32
  自定义数据点击埋点
36
33
  </button>
37
-
38
- <!-- 带元素信息的点击埋点 -->
39
- <button
40
- id="custom-btn"
41
- v-track-click="{
42
- event: 'element_click',
43
- elementId: 'custom-btn',
44
- elementText: '自定义元素信息',
45
- data: { action: 'submit' },
46
- }"
47
- class="btn btn-secondary">
48
- 自定义元素信息点击埋点
49
- </button>
50
34
  </view>
51
35
  </view>
52
36
 
@@ -78,10 +62,7 @@
78
62
  <view class="content">
79
63
  <view v-track-page="{ pageTitle: '组合示例页面' }" v-track-scroll="{ threshold: 0.5 }">
80
64
  <button
81
- v-track-click="{
82
- event: 'combo_click',
83
- data: { combo: true },
84
- }"
65
+ v-track-click="'组合埋点按钮'"
85
66
  class="btn">
86
67
  组合埋点按钮
87
68
  </button>
@@ -219,32 +219,99 @@ class TrackingSDK {
219
219
  // H5 环境使用 btoa
220
220
  base64 = btoa(unescape(encodeURIComponent(raw)))
221
221
  } else {
222
- // 小程序环境使用手动实现的 Base64 编码
223
- base64 = this.base64Encode(raw)
222
+ // 小程序环境使用手动实现的 Base64 编码(兼容 btoa 的 UTF-8 处理逻辑)
223
+ base64 = this.btoa(raw)
224
224
  }
225
225
 
226
226
  // 反转字符串
227
227
  return base64.split('').reverse().join('')
228
228
  }
229
229
  /**
230
- * Base64 编码(降级方案)
230
+ * 手动实现 btoa 方法(小程序端降级方案)
231
+ * 与浏览器 btoa(unescape(encodeURIComponent(str))) 行为一致
232
+ * @param str 要编码的字符串
233
+ * @returns Base64 编码后的字符串
231
234
  */
232
- private base64Encode(str: string): string {
233
- const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='
235
+ private btoa(str: string): string {
236
+ // 先将字符串转换为 UTF-8 字节序列(模拟 encodeURIComponent + unescape 的行为)
237
+ const utf8Bytes: number[] = []
238
+ for (let i = 0; i < str.length; i++) {
239
+ const codePoint = str.charCodeAt(i)
240
+ if (codePoint < 0x80) {
241
+ // ASCII 字符,直接使用
242
+ utf8Bytes.push(codePoint)
243
+ } else if (codePoint < 0x800) {
244
+ // 2字节 UTF-8 字符
245
+ utf8Bytes.push(0xc0 | (codePoint >> 6))
246
+ utf8Bytes.push(0x80 | (codePoint & 0x3f))
247
+ } else if (codePoint >= 0xd800 && codePoint <= 0xdbff) {
248
+ // 代理对高位
249
+ if (i + 1 < str.length) {
250
+ const lowSurrogate = str.charCodeAt(i + 1)
251
+ if (lowSurrogate >= 0xdc00 && lowSurrogate <= 0xdfff) {
252
+ // 完整的代理对,转换为 4 字节 UTF-8
253
+ const unicodeCodePoint = 0x10000 + ((codePoint & 0x3ff) << 10) + (lowSurrogate & 0x3ff)
254
+ utf8Bytes.push(0xf0 | (unicodeCodePoint >> 18))
255
+ utf8Bytes.push(0x80 | ((unicodeCodePoint >> 12) & 0x3f))
256
+ utf8Bytes.push(0x80 | ((unicodeCodePoint >> 6) & 0x3f))
257
+ utf8Bytes.push(0x80 | (unicodeCodePoint & 0x3f))
258
+ i++ // 跳过低位代理
259
+ continue
260
+ }
261
+ }
262
+ // 无效的代理对,使用替换字符
263
+ utf8Bytes.push(0xef, 0xbf, 0xbd)
264
+ } else {
265
+ // 3字节 UTF-8 字符
266
+ utf8Bytes.push(0xe0 | (codePoint >> 12))
267
+ utf8Bytes.push(0x80 | ((codePoint >> 6) & 0x3f))
268
+ utf8Bytes.push(0x80 | (codePoint & 0x3f))
269
+ }
270
+ }
271
+
272
+ // 将字节序列转换为 Base64
273
+ return this.base64EncodeBytes(utf8Bytes)
274
+ }
275
+ /**
276
+ * Base64 编码(字节数组版本)
277
+ * @param bytes 字节数组
278
+ * @returns Base64 编码后的字符串
279
+ */
280
+ private base64EncodeBytes(bytes: number[]): string {
281
+ const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
234
282
  let output = ''
235
283
  let i = 0
236
284
 
237
- while (i < str.length) {
238
- const a = str.charCodeAt(i++)
239
- const b = i < str.length ? str.charCodeAt(i++) : 0
240
- const c = i < str.length ? str.charCodeAt(i++) : 0
285
+ while (i < bytes.length) {
286
+ const a = bytes[i++]
287
+ const hasB = i < bytes.length
288
+ const b = hasB ? bytes[i++] : 0
289
+ const hasC = i < bytes.length
290
+ const c = hasC ? bytes[i++] : 0
241
291
 
242
292
  const bitmap = (a << 16) | (b << 8) | c
243
293
 
244
294
  output += chars.charAt((bitmap >> 18) & 63)
245
295
  output += chars.charAt((bitmap >> 12) & 63)
246
- output += i - 2 < str.length ? chars.charAt((bitmap >> 6) & 63) : '='
247
- output += i - 1 < str.length ? chars.charAt(bitmap & 63) : '='
296
+
297
+ // 填充逻辑:
298
+ // - 如果有 3 个字节:所有字符都有效
299
+ // - 如果只有 2 个字节:第 4 个字符是 '='
300
+ // - 如果只有 1 个字节:第 3、4 个字符都是 '='
301
+ if (hasB) {
302
+ // 有第 2 个字节
303
+ output += chars.charAt((bitmap >> 6) & 63)
304
+ if (hasC) {
305
+ // 有第 3 个字节,所有字符都有效
306
+ output += chars.charAt(bitmap & 63)
307
+ } else {
308
+ // 只有 2 个字节,第 4 个字符是填充符
309
+ output += '='
310
+ }
311
+ } else {
312
+ // 只有 1 个字节,第 3、4 个字符都是填充符
313
+ output += '=='
314
+ }
248
315
  }
249
316
 
250
317
  return output
@@ -630,6 +697,7 @@ class TrackingSDK {
630
697
  * 发送埋点数据
631
698
  */
632
699
  private async flush(): Promise<void> {
700
+ console.log(this.eventQueue.length, 'this.eventQueue.length')
633
701
  if (this.eventQueue.length === 0) return
634
702
 
635
703
  const events = [...this.eventQueue]
@@ -640,7 +708,7 @@ class TrackingSDK {
640
708
  const jsonStr = JSON.stringify(events)
641
709
 
642
710
  // 使用 pako 压缩
643
- const compressed = pako.deflate(jsonStr)
711
+ const compressed = getEnv() === 'WEAPP' ? jsonStr: pako.deflate(jsonStr)
644
712
 
645
713
  // if (this.config.debug) {
646
714
  // console.log('[TrackingSDK] 原始数据大小:', new Blob([jsonStr]).size, 'bytes')
@@ -658,7 +726,7 @@ class TrackingSDK {
658
726
  method: 'POST',
659
727
  data: compressed,
660
728
  header: {
661
- 'Content-Encoding': 'deflate',
729
+ 'Content-Encoding': getEnv() === 'WEAPP' ? '' : 'deflate',
662
730
  },
663
731
  })
664
732
 
@@ -904,13 +972,14 @@ class TrackingSDK {
904
972
  if (this.eventQueue.length === 0) return
905
973
 
906
974
  const events = [...this.eventQueue]
907
- this.eventQueue = []
908
975
 
909
976
  try {
910
977
  // 使用同步方式发送(适用于页面关闭场景)
911
978
  const env = getEnv()
912
979
 
913
980
  if (env === 'WEB' && typeof navigator !== 'undefined' && navigator.sendBeacon) {
981
+ this.eventQueue = []
982
+
914
983
  // H5 环境:使用 sendBeacon API(专为页面卸载场景设计)(sendBeacon无法指定header头, 无法deflate压缩)
915
984
  const blob = new Blob([JSON.stringify(events)], {
916
985
  type: 'application/json',
@@ -32,10 +32,10 @@
32
32
  <div class="user-auth-footer">
33
33
  <div v-if="!已认证" class="checkbox-row">
34
34
  <ns-checkbox style="font-size: 11px" v-model="formData.同意">我已阅读并同意</ns-checkbox>
35
- <span v-track-click="{ event: 'click', elementText: '用户认证-个人信息授权协议' }" @click="showAgreement" class="book">《个人信息授权协议》</span>
35
+ <span v-track-click="'用户认证-个人信息授权协议'" @click="showAgreement" class="book">《个人信息授权协议》</span>
36
36
  </div>
37
- <ns-button v-if="!已认证" class="btn" v-track-click="{ event: 'click', elementText: '用户认证-立即认证' }" color="#163391" type="primary" @click="toSubmit">立即认证</ns-button>
38
- <ns-button v-else class="btn" v-track-click="{ event: 'click', elementText: '用户认证-返回' }" color="#163391" type="primary" @click="toBack">返回</ns-button>
37
+ <ns-button v-if="!已认证" class="btn" v-track-click="'用户认证-立即认证'" color="#163391" type="primary" @click="toSubmit">立即认证</ns-button>
38
+ <ns-button v-else class="btn" v-track-click="'用户认证-返回'" color="#163391" type="primary" @click="toBack">返回</ns-button>
39
39
  </div>
40
40
  </ns-page-content>
41
41
  </ns-page>