@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.
- package/dist/index.js +137 -102
- package/package.json +1 -1
- package/src/balance/components/AccountView.vue +6 -6
- package/src/balance/components/BalanceCard.vue +2 -2
- package/src/balance/components/BalanceReminder.vue +1 -1
- package/src/balance/components/ConsumptionFilter.vue +1 -1
- package/src/balance/components/ConsumptionRules.vue +1 -1
- package/src/balance/components/DateFilter.vue +1 -1
- package/src/balance/components/DateRange.vue +1 -1
- package/src/balance/components/ListFilter.vue +1 -1
- package/src/balance/components/ListFilterPicker.vue +1 -1
- package/src/balance/components/PromoterCard.vue +5 -5
- package/src/components/dd-notice-bar/index.vue +2 -2
- package/src/notice/components/NoticeBanner.vue +2 -2
- package/src/notice/components/NoticeList.vue +2 -2
- package/src/notice/components/NoticeList2.vue +2 -5
- package/src/notice/components/NoticePopup.vue +2 -2
- package/src/payment/components/RechargeResult.vue +1 -1
- package/src/payment/components/RechargeView.vue +2 -2
- package/src/payment/components/TradeView.vue +2 -2
- package/src/register/components/SelfRegistration.vue +1 -1
- package/src/scenarios/components/SharePoster.vue +2 -2
- package/src/shared/components/AppVerify.vue +3 -3
- package/src/shared/components/OcrBusinessLicense.vue +1 -1
- package/src/shared/components/OcrIcon.vue +1 -1
- package/src/shared/components/PageHeader.vue +1 -1
- package/src/shared/tracking/README.md +2 -6
- package/src/shared/tracking/examples/directive-tracking-example.vue +3 -22
- package/src/shared/tracking/tracking-sdk.ts +83 -14
- package/src/user/components/UserAuth.vue +3 -3
- package/src/user/components/UserBinding.vue +4 -4
- package/src/user/components/UserBindingSuccess.vue +1 -1
- package/src/user/components/UserEntry.vue +5 -5
- package/src/user/components/UserFeedbackEntry.vue +3 -3
- package/src/user/components/UserHeadCrop.vue +2 -2
- package/src/user/components/UserInfo.vue +12 -12
package/package.json
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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="
|
|
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="
|
|
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="
|
|
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="
|
|
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="
|
|
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="
|
|
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
|
|
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="
|
|
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
|
|
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="
|
|
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
|
|
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="
|
|
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="
|
|
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="
|
|
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="
|
|
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="
|
|
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="
|
|
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
|
|
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
|
|
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="
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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="
|
|
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="
|
|
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="
|
|
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="
|
|
21
|
-
<ns-button color="primary" v-track-click="
|
|
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="
|
|
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="
|
|
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="
|
|
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
|
|
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
|
|
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.
|
|
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
|
-
*
|
|
230
|
+
* 手动实现 btoa 方法(小程序端降级方案)
|
|
231
|
+
* 与浏览器 btoa(unescape(encodeURIComponent(str))) 行为一致
|
|
232
|
+
* @param str 要编码的字符串
|
|
233
|
+
* @returns Base64 编码后的字符串
|
|
231
234
|
*/
|
|
232
|
-
private
|
|
233
|
-
|
|
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 <
|
|
238
|
-
const a =
|
|
239
|
-
const
|
|
240
|
-
const
|
|
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
|
-
|
|
247
|
-
|
|
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="
|
|
35
|
+
<span v-track-click="'用户认证-个人信息授权协议'" @click="showAgreement" class="book">《个人信息授权协议》</span>
|
|
36
36
|
</div>
|
|
37
|
-
<ns-button v-if="!已认证" class="btn" v-track-click="
|
|
38
|
-
<ns-button v-else class="btn" v-track-click="
|
|
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>
|