@uxda/appkit 4.2.82 → 4.2.84
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/.eslintrc.mjs +7 -7
- package/README.md +187 -187
- package/babel.config.js +12 -12
- package/dist/appkit.css +41 -3
- package/dist/index.js +994 -535
- package/package.json +81 -81
- package/project.config.json +15 -15
- package/project.tt.json +13 -13
- package/rollup.config.mjs +77 -77
- package/src/Appkit.ts +67 -67
- package/src/balance/api/endpoints.ts +133 -133
- package/src/balance/api/index.ts +112 -106
- package/src/balance/components/AccountView.vue +773 -773
- package/src/balance/components/BalanceCard.vue +210 -210
- package/src/balance/components/BalanceReminder.vue +84 -84
- package/src/balance/components/ConsumptionFilter.vue +218 -218
- package/src/balance/components/ConsumptionRules.vue +68 -68
- package/src/balance/components/DateFilter.vue +259 -259
- package/src/balance/components/DateRange.vue +111 -111
- package/src/balance/components/ListFilter.vue +62 -62
- package/src/balance/components/ListFilterPicker.vue +191 -191
- package/src/balance/components/PromoterCard.vue +310 -310
- package/src/balance/components/SecondBalance.vue +77 -77
- package/src/balance/components/Tip.vue +45 -45
- package/src/balance/components/index.ts +8 -8
- package/src/balance/types.ts +99 -99
- package/src/components/bt-cropper/index.vue +730 -730
- package/src/components/bt-cropper/utils/calcCropper.js +42 -42
- package/src/components/bt-cropper/utils/calcImagePosition.js +23 -23
- package/src/components/bt-cropper/utils/calcImageSize.js +37 -37
- package/src/components/bt-cropper/utils/calcPointDistance.js +12 -12
- package/src/components/bt-cropper/utils/calcRightAndBottom.js +7 -7
- package/src/components/bt-cropper/utils/ratio.js +3 -3
- package/src/components/bt-cropper/utils/tools.js +25 -25
- package/src/components/dd-area/index.vue +225 -225
- package/src/components/dd-icon/doc.md +21 -21
- package/src/components/dd-icon/index.vue +23 -23
- package/src/components/dd-notice-bar/index.vue +78 -78
- package/src/components/dd-search/doc.md +34 -34
- package/src/components/dd-search/index.vue +168 -168
- package/src/components/dd-selector/index.vue +124 -124
- package/src/components/dd-skeleton/doc.md +19 -19
- package/src/components/dd-skeleton/index.vue +36 -36
- package/src/global.ts +6 -6
- package/src/index.ts +93 -93
- package/src/main.scss +1 -1
- package/src/notice/api/endpoints.ts +54 -17
- package/src/notice/api/index.ts +115 -106
- package/src/notice/components/NoticeBanner.vue +247 -247
- package/src/notice/components/NoticeEntry.vue +99 -99
- package/src/notice/components/NoticeList.vue +311 -311
- package/src/notice/components/NoticeList2.vue +243 -0
- package/src/notice/components/NoticePopup.vue +163 -163
- package/src/notice/components/index.ts +6 -5
- package/src/notice/components/useCommonList.ts +86 -86
- package/src/notice/components/useNotice.ts +35 -35
- package/src/notice/index.ts +1 -1
- package/src/notice/types.ts +25 -25
- package/src/payment/api/config.ts +7 -7
- package/src/payment/api/endpoints.ts +95 -95
- package/src/payment/api/index.ts +101 -101
- package/src/payment/components/AmountPicker.vue +90 -90
- package/src/payment/components/RechargeResult.vue +69 -69
- package/src/payment/components/RechargeView.vue +190 -190
- package/src/payment/components/RightsPicker.vue +105 -105
- package/src/payment/components/TradeView.vue +363 -363
- package/src/payment/components/UserAgreement.vue +234 -234
- package/src/payment/components/index.ts +22 -22
- package/src/payment/index.ts +5 -5
- package/src/payment/services/index.ts +16 -16
- package/src/payment/services/invoke-recharge.ts +25 -25
- package/src/payment/services/request-payment.ts +130 -130
- package/src/payment/types.ts +32 -32
- package/src/register/components/SelfRegistration.vue +233 -233
- package/src/register/components/index.ts +2 -2
- package/src/scenarios/components/SharePoster.vue +364 -364
- package/src/scenarios/components/index.ts +2 -2
- package/src/scenarios/components/poster-paste.vue +93 -93
- package/src/scenarios/components/share-poster.md +273 -273
- package/src/shared/components/AppDrawer.vue +53 -53
- package/src/shared/components/AppVerify.vue +128 -128
- package/src/shared/components/DeviceVersion.vue +78 -78
- package/src/shared/components/EmptyView.vue +33 -33
- package/src/shared/components/OcrBusinessLicense.vue +137 -137
- package/src/shared/components/OcrIcon.vue +229 -229
- package/src/shared/components/PageHeader.vue +84 -84
- package/src/shared/components/index.ts +8 -8
- package/src/shared/composables/index.ts +9 -9
- package/src/shared/composables/useAmount.ts +46 -46
- package/src/shared/composables/useCountdown.ts +46 -46
- package/src/shared/composables/useCrypto.ts +76 -76
- package/src/shared/composables/useDeviceEnv.ts +11 -11
- package/src/shared/composables/useDragBox.ts +97 -97
- package/src/shared/composables/useEncode.ts +43 -43
- package/src/shared/composables/useLogger.ts +131 -131
- package/src/shared/composables/useSafeArea.ts +46 -46
- package/src/shared/composables/useTabbar.ts +24 -24
- package/src/shared/composables/useUpload.ts +61 -61
- package/src/shared/composables/useValidator.ts +32 -32
- package/src/shared/composables/useWxAuth.ts +48 -48
- package/src/shared/http/Http.ts +148 -146
- package/src/shared/http/index.ts +1 -1
- package/src/shared/http/types.ts +163 -160
- package/src/shared/index.ts +8 -8
- package/src/shared/weixin/index.ts +9 -9
- package/src/shared/weixin/jssdk.ts +103 -103
- package/src/shared/weixin/payment.ts +38 -38
- package/src/styles/vars.scss +3 -3
- package/src/user/api/endpoints.ts +17 -17
- package/src/user/api/index.ts +117 -111
- package/src/user/components/LoginSetting.vue +114 -114
- package/src/user/components/UserAuth.vue +220 -220
- package/src/user/components/UserBinding.vue +277 -277
- package/src/user/components/UserBindingSuccess.vue +80 -80
- package/src/user/components/UserEntry.vue +139 -139
- package/src/user/components/UserFeedback.vue +427 -427
- package/src/user/components/UserFeedbackEntry.vue +175 -175
- package/src/user/components/UserHeadCrop.vue +65 -65
- package/src/user/components/UserInfo.vue +708 -708
- package/src/user/components/UserResourceEmpty.vue +75 -75
- package/src/user/components/index.ts +23 -23
- package/src/user/index.ts +1 -1
- package/src/utils/utils.ts +28 -28
- package/tsconfig.json +30 -30
- package/types/global.d.ts +22 -22
- package/types/vue.d.ts +10 -10
- /package/dist/assets/{asset-DcH8Kg-2 → asset-3B_CoPto} +0 -0
|
@@ -1,46 +1,46 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 金额通用方法
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
export function useAmount() {
|
|
6
|
-
/**
|
|
7
|
-
* 限制数字小数位
|
|
8
|
-
*/
|
|
9
|
-
function limitDecimal(value, precision = 1) {
|
|
10
|
-
if (!value) return value
|
|
11
|
-
|
|
12
|
-
value = String(value)
|
|
13
|
-
|
|
14
|
-
// 限制最多precision位小数
|
|
15
|
-
if (value.includes('.')) {
|
|
16
|
-
value = value.slice(0, value.indexOf('.') + (precision + 1))
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
// 移除非数字字符
|
|
20
|
-
value = value.replace(/[^0-9.]/g, '')
|
|
21
|
-
|
|
22
|
-
// 防止出现多个小数点
|
|
23
|
-
value = value.replace(/\.{2,}/g, '.')
|
|
24
|
-
|
|
25
|
-
return value
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* 格式化金额
|
|
30
|
-
*/
|
|
31
|
-
function formatAmount(value: string | number, digits = 2) {
|
|
32
|
-
if (!value) {
|
|
33
|
-
return '0'
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
return value.toLocaleString('en-US', {
|
|
37
|
-
minimumFractionDigits: 0,
|
|
38
|
-
maximumFractionDigits: digits,
|
|
39
|
-
})
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
return {
|
|
43
|
-
limitDecimal,
|
|
44
|
-
formatAmount,
|
|
45
|
-
}
|
|
46
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* 金额通用方法
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
export function useAmount() {
|
|
6
|
+
/**
|
|
7
|
+
* 限制数字小数位
|
|
8
|
+
*/
|
|
9
|
+
function limitDecimal(value, precision = 1) {
|
|
10
|
+
if (!value) return value
|
|
11
|
+
|
|
12
|
+
value = String(value)
|
|
13
|
+
|
|
14
|
+
// 限制最多precision位小数
|
|
15
|
+
if (value.includes('.')) {
|
|
16
|
+
value = value.slice(0, value.indexOf('.') + (precision + 1))
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// 移除非数字字符
|
|
20
|
+
value = value.replace(/[^0-9.]/g, '')
|
|
21
|
+
|
|
22
|
+
// 防止出现多个小数点
|
|
23
|
+
value = value.replace(/\.{2,}/g, '.')
|
|
24
|
+
|
|
25
|
+
return value
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* 格式化金额
|
|
30
|
+
*/
|
|
31
|
+
function formatAmount(value: string | number, digits = 2) {
|
|
32
|
+
if (!value) {
|
|
33
|
+
return '0'
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
return value.toLocaleString('en-US', {
|
|
37
|
+
minimumFractionDigits: 0,
|
|
38
|
+
maximumFractionDigits: digits,
|
|
39
|
+
})
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
return {
|
|
43
|
+
limitDecimal,
|
|
44
|
+
formatAmount,
|
|
45
|
+
}
|
|
46
|
+
}
|
|
@@ -1,46 +1,46 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @description: 倒计时
|
|
3
|
-
* @param {number} time
|
|
4
|
-
* @return {*}
|
|
5
|
-
*/
|
|
6
|
-
import { ref, onUnmounted, computed } from 'vue'
|
|
7
|
-
|
|
8
|
-
export function useCountdown() {
|
|
9
|
-
let timer: any = null
|
|
10
|
-
const countdown = ref(60)
|
|
11
|
-
const countdownActive = computed(() => countdown.value > 0 && countdown.value < 60)
|
|
12
|
-
|
|
13
|
-
const startCountdown = () => {
|
|
14
|
-
countdown.value = 60
|
|
15
|
-
timer = setInterval(() => {
|
|
16
|
-
countdown.value--
|
|
17
|
-
if (countdown.value <= 0) {
|
|
18
|
-
stopCountdown()
|
|
19
|
-
}
|
|
20
|
-
}, 1000)
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
const stopCountdown = () => {
|
|
24
|
-
clearInterval(timer)
|
|
25
|
-
countdown.value = 60 // 重置倒计时
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
onUnmounted(() => {
|
|
29
|
-
// stopCountdown() // 组件卸载时确保清除定时器
|
|
30
|
-
})
|
|
31
|
-
|
|
32
|
-
const countdownText = computed(() => {
|
|
33
|
-
if (countdown.value === 60) {
|
|
34
|
-
return '获取验证码'
|
|
35
|
-
} else {
|
|
36
|
-
return `重新发送(${countdown.value}s)`
|
|
37
|
-
}
|
|
38
|
-
})
|
|
39
|
-
|
|
40
|
-
return {
|
|
41
|
-
countdownActive,
|
|
42
|
-
countdownText,
|
|
43
|
-
startCountdown,
|
|
44
|
-
stopCountdown,
|
|
45
|
-
}
|
|
46
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* @description: 倒计时
|
|
3
|
+
* @param {number} time
|
|
4
|
+
* @return {*}
|
|
5
|
+
*/
|
|
6
|
+
import { ref, onUnmounted, computed } from 'vue'
|
|
7
|
+
|
|
8
|
+
export function useCountdown() {
|
|
9
|
+
let timer: any = null
|
|
10
|
+
const countdown = ref(60)
|
|
11
|
+
const countdownActive = computed(() => countdown.value > 0 && countdown.value < 60)
|
|
12
|
+
|
|
13
|
+
const startCountdown = () => {
|
|
14
|
+
countdown.value = 60
|
|
15
|
+
timer = setInterval(() => {
|
|
16
|
+
countdown.value--
|
|
17
|
+
if (countdown.value <= 0) {
|
|
18
|
+
stopCountdown()
|
|
19
|
+
}
|
|
20
|
+
}, 1000)
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const stopCountdown = () => {
|
|
24
|
+
clearInterval(timer)
|
|
25
|
+
countdown.value = 60 // 重置倒计时
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
onUnmounted(() => {
|
|
29
|
+
// stopCountdown() // 组件卸载时确保清除定时器
|
|
30
|
+
})
|
|
31
|
+
|
|
32
|
+
const countdownText = computed(() => {
|
|
33
|
+
if (countdown.value === 60) {
|
|
34
|
+
return '获取验证码'
|
|
35
|
+
} else {
|
|
36
|
+
return `重新发送(${countdown.value}s)`
|
|
37
|
+
}
|
|
38
|
+
})
|
|
39
|
+
|
|
40
|
+
return {
|
|
41
|
+
countdownActive,
|
|
42
|
+
countdownText,
|
|
43
|
+
startCountdown,
|
|
44
|
+
stopCountdown,
|
|
45
|
+
}
|
|
46
|
+
}
|
|
@@ -1,77 +1,77 @@
|
|
|
1
|
-
// 解析脱敏姓名、手机号码等
|
|
2
|
-
|
|
3
|
-
export type CryptoConfig = {
|
|
4
|
-
maskField: string,
|
|
5
|
-
secretField: string,
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
export const defaultCryptoConfig: CryptoConfig = {
|
|
9
|
-
maskField: 'mask',
|
|
10
|
-
secretField: 'secretKey'
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export type DecodeResult<T extends string> = {
|
|
14
|
-
[key in T | `${T}Secret`]: string
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export type DefaultDecodeResult = DecodeResult<'masked'>
|
|
18
|
-
|
|
19
|
-
export type DecodeFunction = (encoded: string, key: string) => DecodeResult<`${key}`>
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* 解析以及解密脱敏数据
|
|
23
|
-
* @param config
|
|
24
|
-
* @returns
|
|
25
|
-
*/
|
|
26
|
-
export function useCrypto (config?: CryptoConfig) {
|
|
27
|
-
|
|
28
|
-
const conf = config || defaultCryptoConfig
|
|
29
|
-
|
|
30
|
-
const parse: DecodeFunction = (data: string, key?: string) => {
|
|
31
|
-
let k = key || 'masked'
|
|
32
|
-
let result: Record<string, any> = {}
|
|
33
|
-
try {
|
|
34
|
-
result = JSON.parse(data)
|
|
35
|
-
result = {
|
|
36
|
-
[k]: result.mask,
|
|
37
|
-
// 字段后加$表示用于解密的 secret
|
|
38
|
-
[`${k}$`]: result.secretKey
|
|
39
|
-
}
|
|
40
|
-
} catch (e) {}
|
|
41
|
-
return result
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
/**
|
|
45
|
-
* 批量解析数组内的数据
|
|
46
|
-
* @param list
|
|
47
|
-
* @param field
|
|
48
|
-
* @returns
|
|
49
|
-
*/
|
|
50
|
-
const resolve = (list: any[], field?: string | string[]) => {
|
|
51
|
-
if (list.length === 0) return []
|
|
52
|
-
const [first] = list,
|
|
53
|
-
f = field
|
|
54
|
-
? Array.isArray(field) ? field : [field]
|
|
55
|
-
// 自动探测需要解密的字段
|
|
56
|
-
// '{"secretKey":"","mask":""}' 形式
|
|
57
|
-
: Object.entries(first)
|
|
58
|
-
.filter(([_, v]) => /^\{.*\}$/.test(v as string))
|
|
59
|
-
.map(([k]) => k)
|
|
60
|
-
return list
|
|
61
|
-
.map(item => {
|
|
62
|
-
let result = { ...item }
|
|
63
|
-
f.forEach(r => {
|
|
64
|
-
result = {
|
|
65
|
-
...result,
|
|
66
|
-
...parse(item[r], r)
|
|
67
|
-
}
|
|
68
|
-
})
|
|
69
|
-
return result
|
|
70
|
-
})
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
return {
|
|
74
|
-
parse,
|
|
75
|
-
resolve,
|
|
76
|
-
}
|
|
1
|
+
// 解析脱敏姓名、手机号码等
|
|
2
|
+
|
|
3
|
+
export type CryptoConfig = {
|
|
4
|
+
maskField: string,
|
|
5
|
+
secretField: string,
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export const defaultCryptoConfig: CryptoConfig = {
|
|
9
|
+
maskField: 'mask',
|
|
10
|
+
secretField: 'secretKey'
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export type DecodeResult<T extends string> = {
|
|
14
|
+
[key in T | `${T}Secret`]: string
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export type DefaultDecodeResult = DecodeResult<'masked'>
|
|
18
|
+
|
|
19
|
+
export type DecodeFunction = (encoded: string, key: string) => DecodeResult<`${key}`>
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* 解析以及解密脱敏数据
|
|
23
|
+
* @param config
|
|
24
|
+
* @returns
|
|
25
|
+
*/
|
|
26
|
+
export function useCrypto (config?: CryptoConfig) {
|
|
27
|
+
|
|
28
|
+
const conf = config || defaultCryptoConfig
|
|
29
|
+
|
|
30
|
+
const parse: DecodeFunction = (data: string, key?: string) => {
|
|
31
|
+
let k = key || 'masked'
|
|
32
|
+
let result: Record<string, any> = {}
|
|
33
|
+
try {
|
|
34
|
+
result = JSON.parse(data)
|
|
35
|
+
result = {
|
|
36
|
+
[k]: result.mask,
|
|
37
|
+
// 字段后加$表示用于解密的 secret
|
|
38
|
+
[`${k}$`]: result.secretKey
|
|
39
|
+
}
|
|
40
|
+
} catch (e) {}
|
|
41
|
+
return result
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* 批量解析数组内的数据
|
|
46
|
+
* @param list
|
|
47
|
+
* @param field
|
|
48
|
+
* @returns
|
|
49
|
+
*/
|
|
50
|
+
const resolve = (list: any[], field?: string | string[]) => {
|
|
51
|
+
if (list.length === 0) return []
|
|
52
|
+
const [first] = list,
|
|
53
|
+
f = field
|
|
54
|
+
? Array.isArray(field) ? field : [field]
|
|
55
|
+
// 自动探测需要解密的字段
|
|
56
|
+
// '{"secretKey":"","mask":""}' 形式
|
|
57
|
+
: Object.entries(first)
|
|
58
|
+
.filter(([_, v]) => /^\{.*\}$/.test(v as string))
|
|
59
|
+
.map(([k]) => k)
|
|
60
|
+
return list
|
|
61
|
+
.map(item => {
|
|
62
|
+
let result = { ...item }
|
|
63
|
+
f.forEach(r => {
|
|
64
|
+
result = {
|
|
65
|
+
...result,
|
|
66
|
+
...parse(item[r], r)
|
|
67
|
+
}
|
|
68
|
+
})
|
|
69
|
+
return result
|
|
70
|
+
})
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
return {
|
|
74
|
+
parse,
|
|
75
|
+
resolve,
|
|
76
|
+
}
|
|
77
77
|
}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
// 是否微信环境
|
|
2
|
-
export function isWechat() {
|
|
3
|
-
let ua = window.navigator.userAgent.toLowerCase()
|
|
4
|
-
return ua.includes('micromessenger')
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
// 是否支付宝环境
|
|
8
|
-
export function isAlipay() {
|
|
9
|
-
let ua = window.navigator.userAgent.toLowerCase()
|
|
10
|
-
return ua.includes('alipayclient')
|
|
11
|
-
}
|
|
1
|
+
// 是否微信环境
|
|
2
|
+
export function isWechat() {
|
|
3
|
+
let ua = window.navigator.userAgent.toLowerCase()
|
|
4
|
+
return ua.includes('micromessenger')
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
// 是否支付宝环境
|
|
8
|
+
export function isAlipay() {
|
|
9
|
+
let ua = window.navigator.userAgent.toLowerCase()
|
|
10
|
+
return ua.includes('alipayclient')
|
|
11
|
+
}
|
|
@@ -1,97 +1,97 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 元素拖拽功能
|
|
3
|
-
*/
|
|
4
|
-
import Taro, { getSystemInfoSync } from '@tarojs/taro'
|
|
5
|
-
import { reactive } from 'vue'
|
|
6
|
-
|
|
7
|
-
export function useDragBox() {
|
|
8
|
-
const dragData = reactive({
|
|
9
|
-
left: 0, // 浮动按钮的左边距
|
|
10
|
-
top: 0, // 浮动按钮的上边距
|
|
11
|
-
width: 0, // 浮动按钮的宽度
|
|
12
|
-
height: 0, // 浮动按钮的高度
|
|
13
|
-
startX: 0, // 手指触摸起始点的横坐标
|
|
14
|
-
startY: 0, // 手指触摸起始点的纵坐标
|
|
15
|
-
screenWidth: 0, // 屏幕宽度
|
|
16
|
-
screenHeight: 0, // 屏幕高度
|
|
17
|
-
isDrag: false, // 是否开始拖拽
|
|
18
|
-
oldLeft: 0,
|
|
19
|
-
limitHorizontal: [0, 0], // 横向拖动限制范围
|
|
20
|
-
limitVertical: [0, 0], // 纵向拖动限制范围
|
|
21
|
-
})
|
|
22
|
-
|
|
23
|
-
// 初始化元素拖拽模型
|
|
24
|
-
function initDragData(data: any) {
|
|
25
|
-
// 获取屏幕宽度和高度
|
|
26
|
-
const res = getSystemInfoSync()
|
|
27
|
-
dragData.screenWidth = res.windowWidth
|
|
28
|
-
dragData.screenHeight = res.windowHeight
|
|
29
|
-
if (!data) data = {}
|
|
30
|
-
|
|
31
|
-
const scale = dragData.screenWidth / 375
|
|
32
|
-
dragData.width = data.width * scale || 0
|
|
33
|
-
dragData.height = data.height * scale || 0
|
|
34
|
-
dragData.left = data.left * scale || 0
|
|
35
|
-
dragData.top = data.top * scale || 0
|
|
36
|
-
dragData.oldLeft = data.left * scale || 0
|
|
37
|
-
|
|
38
|
-
if (data.limitHorizontal && data.limitHorizontal.length) {
|
|
39
|
-
dragData.limitHorizontal = data.limitHorizontal
|
|
40
|
-
}
|
|
41
|
-
if (data.limitVertical && data.limitVertical.length) {
|
|
42
|
-
dragData.limitVertical = data.limitVertical
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
// 触屏开始
|
|
47
|
-
function onDragStart(event: any) {
|
|
48
|
-
dragData.startX = event.touches[0].clientX
|
|
49
|
-
dragData.startY = event.touches[0].clientY
|
|
50
|
-
dragData.isDrag = true
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
// 触屏移动
|
|
54
|
-
function onDragMove(event: any) {
|
|
55
|
-
const moveX = event.touches[0].clientX - dragData.startX
|
|
56
|
-
const moveY = event.touches[0].clientY - dragData.startY
|
|
57
|
-
|
|
58
|
-
let left = dragData.left + moveX
|
|
59
|
-
let top = dragData.top + moveY
|
|
60
|
-
|
|
61
|
-
// 防止浮动按钮移出屏幕
|
|
62
|
-
if (left < dragData.limitHorizontal[0]) {
|
|
63
|
-
left = dragData.limitHorizontal[0]
|
|
64
|
-
} else if (left > dragData.screenWidth - dragData.width - dragData.limitHorizontal[1]) {
|
|
65
|
-
left = dragData.screenWidth - dragData.width - dragData.limitHorizontal[1]
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
if (top < dragData.limitVertical[0]) {
|
|
69
|
-
top = dragData.limitVertical[0]
|
|
70
|
-
} else if (top > dragData.screenHeight - dragData.height - dragData.limitVertical[1]) {
|
|
71
|
-
top = dragData.screenHeight - dragData.height - dragData.limitVertical[1]
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
dragData.left = left
|
|
75
|
-
dragData.top = top
|
|
76
|
-
|
|
77
|
-
dragData.startX = event.touches[0].clientX
|
|
78
|
-
dragData.startY = event.touches[0].clientY
|
|
79
|
-
|
|
80
|
-
// 阻止页面滚动
|
|
81
|
-
event.preventDefault()
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
// 触屏结束
|
|
85
|
-
function onDragEnd() {
|
|
86
|
-
dragData.isDrag = false
|
|
87
|
-
dragData.left = dragData.oldLeft
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
return {
|
|
91
|
-
dragData,
|
|
92
|
-
initDragData,
|
|
93
|
-
onDragStart,
|
|
94
|
-
onDragMove,
|
|
95
|
-
onDragEnd,
|
|
96
|
-
}
|
|
97
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* 元素拖拽功能
|
|
3
|
+
*/
|
|
4
|
+
import Taro, { getSystemInfoSync } from '@tarojs/taro'
|
|
5
|
+
import { reactive } from 'vue'
|
|
6
|
+
|
|
7
|
+
export function useDragBox() {
|
|
8
|
+
const dragData = reactive({
|
|
9
|
+
left: 0, // 浮动按钮的左边距
|
|
10
|
+
top: 0, // 浮动按钮的上边距
|
|
11
|
+
width: 0, // 浮动按钮的宽度
|
|
12
|
+
height: 0, // 浮动按钮的高度
|
|
13
|
+
startX: 0, // 手指触摸起始点的横坐标
|
|
14
|
+
startY: 0, // 手指触摸起始点的纵坐标
|
|
15
|
+
screenWidth: 0, // 屏幕宽度
|
|
16
|
+
screenHeight: 0, // 屏幕高度
|
|
17
|
+
isDrag: false, // 是否开始拖拽
|
|
18
|
+
oldLeft: 0,
|
|
19
|
+
limitHorizontal: [0, 0], // 横向拖动限制范围
|
|
20
|
+
limitVertical: [0, 0], // 纵向拖动限制范围
|
|
21
|
+
})
|
|
22
|
+
|
|
23
|
+
// 初始化元素拖拽模型
|
|
24
|
+
function initDragData(data: any) {
|
|
25
|
+
// 获取屏幕宽度和高度
|
|
26
|
+
const res = getSystemInfoSync()
|
|
27
|
+
dragData.screenWidth = res.windowWidth
|
|
28
|
+
dragData.screenHeight = res.windowHeight
|
|
29
|
+
if (!data) data = {}
|
|
30
|
+
|
|
31
|
+
const scale = dragData.screenWidth / 375
|
|
32
|
+
dragData.width = data.width * scale || 0
|
|
33
|
+
dragData.height = data.height * scale || 0
|
|
34
|
+
dragData.left = data.left * scale || 0
|
|
35
|
+
dragData.top = data.top * scale || 0
|
|
36
|
+
dragData.oldLeft = data.left * scale || 0
|
|
37
|
+
|
|
38
|
+
if (data.limitHorizontal && data.limitHorizontal.length) {
|
|
39
|
+
dragData.limitHorizontal = data.limitHorizontal
|
|
40
|
+
}
|
|
41
|
+
if (data.limitVertical && data.limitVertical.length) {
|
|
42
|
+
dragData.limitVertical = data.limitVertical
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// 触屏开始
|
|
47
|
+
function onDragStart(event: any) {
|
|
48
|
+
dragData.startX = event.touches[0].clientX
|
|
49
|
+
dragData.startY = event.touches[0].clientY
|
|
50
|
+
dragData.isDrag = true
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// 触屏移动
|
|
54
|
+
function onDragMove(event: any) {
|
|
55
|
+
const moveX = event.touches[0].clientX - dragData.startX
|
|
56
|
+
const moveY = event.touches[0].clientY - dragData.startY
|
|
57
|
+
|
|
58
|
+
let left = dragData.left + moveX
|
|
59
|
+
let top = dragData.top + moveY
|
|
60
|
+
|
|
61
|
+
// 防止浮动按钮移出屏幕
|
|
62
|
+
if (left < dragData.limitHorizontal[0]) {
|
|
63
|
+
left = dragData.limitHorizontal[0]
|
|
64
|
+
} else if (left > dragData.screenWidth - dragData.width - dragData.limitHorizontal[1]) {
|
|
65
|
+
left = dragData.screenWidth - dragData.width - dragData.limitHorizontal[1]
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
if (top < dragData.limitVertical[0]) {
|
|
69
|
+
top = dragData.limitVertical[0]
|
|
70
|
+
} else if (top > dragData.screenHeight - dragData.height - dragData.limitVertical[1]) {
|
|
71
|
+
top = dragData.screenHeight - dragData.height - dragData.limitVertical[1]
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
dragData.left = left
|
|
75
|
+
dragData.top = top
|
|
76
|
+
|
|
77
|
+
dragData.startX = event.touches[0].clientX
|
|
78
|
+
dragData.startY = event.touches[0].clientY
|
|
79
|
+
|
|
80
|
+
// 阻止页面滚动
|
|
81
|
+
event.preventDefault()
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// 触屏结束
|
|
85
|
+
function onDragEnd() {
|
|
86
|
+
dragData.isDrag = false
|
|
87
|
+
dragData.left = dragData.oldLeft
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
return {
|
|
91
|
+
dragData,
|
|
92
|
+
initDragData,
|
|
93
|
+
onDragStart,
|
|
94
|
+
onDragMove,
|
|
95
|
+
onDragEnd,
|
|
96
|
+
}
|
|
97
|
+
}
|
|
@@ -1,43 +1,43 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @description: 脱敏相关方法
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
export function useEncode() {
|
|
6
|
-
// 姓名脱敏
|
|
7
|
-
function encodeName(name: string) {
|
|
8
|
-
name = name.trim()
|
|
9
|
-
if (name.length > 2) {
|
|
10
|
-
return name[0].padEnd(name.length - 1, '*') + (name[name.length - 1] || '')
|
|
11
|
-
}
|
|
12
|
-
if (name.length == 0) {
|
|
13
|
-
return ''
|
|
14
|
-
} else {
|
|
15
|
-
return name[0].padEnd(name.length, '*')
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
// 证件脱敏
|
|
20
|
-
function encodeCard(card: string) {
|
|
21
|
-
if (card.length === 18) {
|
|
22
|
-
return card.replace(/(\d{6})\d{8}(\d{3}.)/g, '$1********$2')
|
|
23
|
-
} else {
|
|
24
|
-
return card
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
// 手机脱敏
|
|
29
|
-
function encodePhone(phone: string) {
|
|
30
|
-
phone = String(phone)
|
|
31
|
-
if (phone.length === 11) {
|
|
32
|
-
return phone.replace(/(1\d{2})\d{4}(\d{4})/g, '$1****$2')
|
|
33
|
-
} else {
|
|
34
|
-
return phone
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
return {
|
|
39
|
-
encodeName,
|
|
40
|
-
encodeCard,
|
|
41
|
-
encodePhone,
|
|
42
|
-
}
|
|
43
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* @description: 脱敏相关方法
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
export function useEncode() {
|
|
6
|
+
// 姓名脱敏
|
|
7
|
+
function encodeName(name: string) {
|
|
8
|
+
name = name.trim()
|
|
9
|
+
if (name.length > 2) {
|
|
10
|
+
return name[0].padEnd(name.length - 1, '*') + (name[name.length - 1] || '')
|
|
11
|
+
}
|
|
12
|
+
if (name.length == 0) {
|
|
13
|
+
return ''
|
|
14
|
+
} else {
|
|
15
|
+
return name[0].padEnd(name.length, '*')
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// 证件脱敏
|
|
20
|
+
function encodeCard(card: string) {
|
|
21
|
+
if (card.length === 18) {
|
|
22
|
+
return card.replace(/(\d{6})\d{8}(\d{3}.)/g, '$1********$2')
|
|
23
|
+
} else {
|
|
24
|
+
return card
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// 手机脱敏
|
|
29
|
+
function encodePhone(phone: string) {
|
|
30
|
+
phone = String(phone)
|
|
31
|
+
if (phone.length === 11) {
|
|
32
|
+
return phone.replace(/(1\d{2})\d{4}(\d{4})/g, '$1****$2')
|
|
33
|
+
} else {
|
|
34
|
+
return phone
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
return {
|
|
39
|
+
encodeName,
|
|
40
|
+
encodeCard,
|
|
41
|
+
encodePhone,
|
|
42
|
+
}
|
|
43
|
+
}
|