@uxda/appkit 4.0.3 → 4.0.14
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/package.json +75 -80
- package/project.config.json +15 -15
- package/project.tt.json +13 -13
- package/rollup.config.mjs +56 -56
- package/src/Appkit.ts +65 -65
- package/src/balance/api/endpoints.ts +126 -126
- package/src/balance/api/index.ts +82 -82
- package/src/balance/components/AccountView.vue +748 -748
- package/src/balance/components/BalanceCard.vue +205 -209
- package/src/balance/components/BalanceReminder.vue +85 -85
- package/src/balance/components/ConsumptionFilter.vue +218 -218
- package/src/balance/components/ConsumptionRules.vue +68 -68
- package/src/balance/components/DateFilter.vue +227 -226
- package/src/balance/components/DateRange.vue +78 -0
- package/src/balance/components/ListFilter.vue +64 -0
- package/src/balance/components/ListFilterPicker.vue +187 -0
- package/src/balance/components/SecondBalance.vue +71 -71
- package/src/balance/components/Tip.vue +45 -45
- package/src/balance/components/index.ts +13 -9
- package/src/balance/types.ts +91 -90
- package/src/components/bt-cropper/index.vue +774 -774
- 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/components/ocr-id/index.vue +114 -114
- package/src/components/ocr-id/types.d.ts +12 -12
- package/src/global.ts +6 -6
- package/src/index.ts +89 -89
- package/src/main.scss +1 -1
- package/src/notice/api/endpoints.ts +17 -17
- package/src/notice/api/index.ts +82 -82
- package/src/notice/components/NoticeBanner.vue +243 -243
- package/src/notice/components/NoticeEntry.vue +99 -99
- package/src/notice/components/NoticeList.vue +315 -315
- package/src/notice/components/NoticePopup.vue +161 -161
- package/src/notice/components/index.ts +5 -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 +103 -103
- package/src/payment/api/index.ts +71 -71
- package/src/payment/components/AmountPicker.vue +93 -93
- package/src/payment/components/RechargeResult.vue +69 -69
- package/src/payment/components/RechargeView.vue +154 -154
- package/src/payment/components/RightsPicker.vue +105 -105
- package/src/payment/components/TradeView.vue +298 -298
- 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 +58 -58
- package/src/payment/types.ts +28 -28
- package/src/register/components/SelfRegistration.vue +254 -254
- package/src/register/components/index.ts +2 -2
- package/src/shared/components/AppDrawer.vue +58 -58
- package/src/shared/components/AppVerify.vue +98 -0
- package/src/shared/components/DeviceVersion.vue +68 -68
- package/src/shared/components/EmptyView.vue +33 -33
- package/src/shared/components/OcrIcon.vue +119 -0
- package/src/shared/components/PageHeader.vue +79 -79
- package/src/shared/components/index.ts +7 -5
- package/src/shared/composables/index.ts +7 -5
- package/src/shared/composables/useCountdown.ts +46 -46
- package/src/shared/composables/useCrypto.ts +76 -0
- package/src/shared/composables/useDragBox.ts +97 -97
- package/src/shared/composables/useEncode.ts +43 -43
- package/src/shared/composables/useSafeArea.ts +46 -46
- package/src/shared/composables/useTabbar.ts +24 -24
- package/src/shared/composables/useUpload.ts +55 -0
- package/src/shared/composables/useValidator.ts +31 -31
- package/src/shared/http/Http.ts +136 -136
- package/src/shared/http/index.ts +1 -1
- package/src/shared/http/types.ts +157 -157
- package/src/shared/index.ts +3 -3
- package/src/shared/weixin/payment.ts +38 -38
- package/src/styles/fonts.scss +2 -2
- package/src/styles/vars.scss +3 -3
- package/src/user/api/endpoints.ts +17 -17
- package/src/user/api/index.ts +87 -87
- package/src/user/components/LoginSetting.vue +114 -114
- package/src/user/components/UserBinding.vue +307 -307
- package/src/user/components/UserBindingSuccess.vue +80 -80
- package/src/user/components/UserEntry.vue +137 -142
- package/src/user/components/UserFeedback.vue +440 -440
- package/src/user/components/UserFeedbackEntry.vue +192 -192
- package/src/user/components/UserHeadCrop.vue +65 -65
- package/src/user/components/UserInfo.vue +632 -632
- package/src/user/components/UserResourceEmpty.vue +75 -75
- package/src/user/components/index.ts +21 -21
- package/src/user/index.ts +1 -1
- package/tsconfig.json +30 -30
- package/types/global.d.ts +21 -21
- package/types/vue.d.ts +10 -10
- package/dist/appkit.css +0 -2331
- package/dist/assets/asset-3B_CoPto +0 -1
- package/dist/assets/asset-DcH8Kg-2 +0 -1
- package/dist/index.js +0 -7176
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import SelfRegistration from './SelfRegistration.vue'
|
|
2
|
-
|
|
1
|
+
import SelfRegistration from './SelfRegistration.vue'
|
|
2
|
+
|
|
3
3
|
export { SelfRegistration }
|
|
@@ -1,59 +1,59 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<nut-popup
|
|
3
|
-
:pop-class="`app-drawer ${modelValue ? 'open' : ''}`"
|
|
4
|
-
position="right"
|
|
5
|
-
:visible="modelValue"
|
|
6
|
-
@update:visible="onVisibleChange">
|
|
7
|
-
<page-header
|
|
8
|
-
:title="title"
|
|
9
|
-
@close="onPageHeaderClose" />
|
|
10
|
-
<div class="drawer-body">
|
|
11
|
-
<slot></slot>
|
|
12
|
-
</div>
|
|
13
|
-
</nut-popup>
|
|
14
|
-
</template>
|
|
15
|
-
|
|
16
|
-
<script lang="ts" setup>
|
|
17
|
-
// 右侧页面
|
|
18
|
-
// 模仿页面打开
|
|
19
|
-
// 假的标题栏和返回按钮
|
|
20
|
-
import PageHeader from './PageHeader.vue'
|
|
21
|
-
|
|
22
|
-
export interface AppDrawerProps {
|
|
23
|
-
modelValue: boolean,
|
|
24
|
-
title?: string,
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
const emit = defineEmits<{
|
|
28
|
-
(event: 'update:modelValue', value: boolean): void
|
|
29
|
-
}>()
|
|
30
|
-
|
|
31
|
-
const onVisibleChange = (value: boolean) => {
|
|
32
|
-
emit('update:modelValue', value)
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
defineProps<AppDrawerProps>()
|
|
36
|
-
|
|
37
|
-
const onPageHeaderClose = () => {
|
|
38
|
-
emit('update:modelValue', false)
|
|
39
|
-
}
|
|
40
|
-
</script>
|
|
41
|
-
|
|
42
|
-
<style lang="scss">
|
|
43
|
-
.app-drawer {
|
|
44
|
-
position: absolute;
|
|
45
|
-
display: flex;
|
|
46
|
-
flex-direction: column;
|
|
47
|
-
&.open {
|
|
48
|
-
height: 100vh;
|
|
49
|
-
}
|
|
50
|
-
.page-header {
|
|
51
|
-
flex-grow: 0;
|
|
52
|
-
background-color: #fff;
|
|
53
|
-
}
|
|
54
|
-
.drawer-body {
|
|
55
|
-
flex-grow: 1;
|
|
56
|
-
overflow: scroll;
|
|
57
|
-
}
|
|
58
|
-
}
|
|
1
|
+
<template>
|
|
2
|
+
<nut-popup
|
|
3
|
+
:pop-class="`app-drawer ${modelValue ? 'open' : ''}`"
|
|
4
|
+
position="right"
|
|
5
|
+
:visible="modelValue"
|
|
6
|
+
@update:visible="onVisibleChange">
|
|
7
|
+
<page-header
|
|
8
|
+
:title="title"
|
|
9
|
+
@close="onPageHeaderClose" />
|
|
10
|
+
<div class="drawer-body">
|
|
11
|
+
<slot></slot>
|
|
12
|
+
</div>
|
|
13
|
+
</nut-popup>
|
|
14
|
+
</template>
|
|
15
|
+
|
|
16
|
+
<script lang="ts" setup>
|
|
17
|
+
// 右侧页面
|
|
18
|
+
// 模仿页面打开
|
|
19
|
+
// 假的标题栏和返回按钮
|
|
20
|
+
import PageHeader from './PageHeader.vue'
|
|
21
|
+
|
|
22
|
+
export interface AppDrawerProps {
|
|
23
|
+
modelValue: boolean,
|
|
24
|
+
title?: string,
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const emit = defineEmits<{
|
|
28
|
+
(event: 'update:modelValue', value: boolean): void
|
|
29
|
+
}>()
|
|
30
|
+
|
|
31
|
+
const onVisibleChange = (value: boolean) => {
|
|
32
|
+
emit('update:modelValue', value)
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
defineProps<AppDrawerProps>()
|
|
36
|
+
|
|
37
|
+
const onPageHeaderClose = () => {
|
|
38
|
+
emit('update:modelValue', false)
|
|
39
|
+
}
|
|
40
|
+
</script>
|
|
41
|
+
|
|
42
|
+
<style lang="scss">
|
|
43
|
+
.app-drawer {
|
|
44
|
+
position: absolute;
|
|
45
|
+
display: flex;
|
|
46
|
+
flex-direction: column;
|
|
47
|
+
&.open {
|
|
48
|
+
height: 100vh;
|
|
49
|
+
}
|
|
50
|
+
.page-header {
|
|
51
|
+
flex-grow: 0;
|
|
52
|
+
background-color: #fff;
|
|
53
|
+
}
|
|
54
|
+
.drawer-body {
|
|
55
|
+
flex-grow: 1;
|
|
56
|
+
overflow: scroll;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
59
|
</style>
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div class="app-verify column">
|
|
3
|
+
<h2>{{ title || '手机号验证' }}</h2>
|
|
4
|
+
<p class="caption">{{ message || '短信将发送至账号绑定手机号' }}</p>
|
|
5
|
+
<p class="number">{{ phone }}</p>
|
|
6
|
+
<ns-form v-model="formData">
|
|
7
|
+
<ns-input
|
|
8
|
+
name="code"
|
|
9
|
+
v-model="formData.code"
|
|
10
|
+
placeholder="请输入验证码"
|
|
11
|
+
variant="solid"
|
|
12
|
+
:rules="['required', {
|
|
13
|
+
name: 'function',
|
|
14
|
+
message: '输入错误, 请重新输入',
|
|
15
|
+
method: (value: string) => value.length === 6,
|
|
16
|
+
}]"
|
|
17
|
+
>
|
|
18
|
+
<template #append>
|
|
19
|
+
<ns-button
|
|
20
|
+
v-if="!sent"
|
|
21
|
+
size="xs"
|
|
22
|
+
variant="plain"
|
|
23
|
+
color="primary"
|
|
24
|
+
@click="send"
|
|
25
|
+
label="获取验证码"
|
|
26
|
+
/>
|
|
27
|
+
<div class="caption" v-if="sent">{{ countdown }} 秒收重新发送</div>
|
|
28
|
+
</template>
|
|
29
|
+
</ns-input>
|
|
30
|
+
</ns-form>
|
|
31
|
+
<div class="row buttons">
|
|
32
|
+
<ns-button round @click="emits('cancel')">取消</ns-button>
|
|
33
|
+
<ns-button round gradient="#FFEBC1,#FFD7A7,#FFB875/90" @click="onOk">确认</ns-button>
|
|
34
|
+
</div>
|
|
35
|
+
</div>
|
|
36
|
+
</template>
|
|
37
|
+
|
|
38
|
+
<script lang="ts" setup>
|
|
39
|
+
import { NsForm, NsInput, NsButton } from '@uxda/nutshell/taro'
|
|
40
|
+
import { reactive, ref } from 'vue'
|
|
41
|
+
|
|
42
|
+
export interface AppVerifyProps {
|
|
43
|
+
phone: string
|
|
44
|
+
title?: string
|
|
45
|
+
message?: string
|
|
46
|
+
onSend?: Function
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const emits = defineEmits(['complete', 'cancel'])
|
|
50
|
+
|
|
51
|
+
const sent = ref(false),
|
|
52
|
+
countdown = ref(60)
|
|
53
|
+
|
|
54
|
+
let formData = reactive({
|
|
55
|
+
code: '',
|
|
56
|
+
})
|
|
57
|
+
|
|
58
|
+
const send = () => {
|
|
59
|
+
sent.value = true
|
|
60
|
+
|
|
61
|
+
props.onSend && props.onSend()
|
|
62
|
+
|
|
63
|
+
countdown.value = 60
|
|
64
|
+
let timer = setInterval(() => {
|
|
65
|
+
countdown.value--
|
|
66
|
+
if (countdown.value <= 0) {
|
|
67
|
+
clearInterval(timer)
|
|
68
|
+
sent.value = false
|
|
69
|
+
}
|
|
70
|
+
}, 1000)
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const onOk = () => {
|
|
74
|
+
emits('complete', { code: formData.code })
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const props = defineProps<AppVerifyProps>()
|
|
78
|
+
</script>
|
|
79
|
+
|
|
80
|
+
<style lang="scss">
|
|
81
|
+
.app-verify {
|
|
82
|
+
padding: var(--ns-spacing);
|
|
83
|
+
h2 {
|
|
84
|
+
font-size: 16px;
|
|
85
|
+
font-weight: bold;
|
|
86
|
+
margin: 10px;
|
|
87
|
+
}
|
|
88
|
+
.caption {
|
|
89
|
+
font-size: 14px;
|
|
90
|
+
color: #666;
|
|
91
|
+
}
|
|
92
|
+
.buttons {
|
|
93
|
+
.ns-button {
|
|
94
|
+
width: 104px;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
</style>
|
|
@@ -1,68 +1,68 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<DdNoticeBar
|
|
3
|
-
v-if="showAlert"
|
|
4
|
-
showClose
|
|
5
|
-
:style="topStype"
|
|
6
|
-
@close="showAlert = !showAlert"
|
|
7
|
-
text="您当前使用的微信客户端版本较低,可能不支持全部功能或体验效果可能不佳,建议至应用商店或App Store升级至最新版本。"
|
|
8
|
-
/>
|
|
9
|
-
</template>
|
|
10
|
-
|
|
11
|
-
<script setup lang="ts">
|
|
12
|
-
import { ref, onMounted, computed } from 'vue'
|
|
13
|
-
import DdNoticeBar from '../../components/dd-notice-bar/index.vue'
|
|
14
|
-
import { useSafeArea } from '../composables'
|
|
15
|
-
import Taro from '@tarojs/taro'
|
|
16
|
-
import { useHttp } from '../../balance/api'
|
|
17
|
-
import debounce from 'lodash/debounce'
|
|
18
|
-
|
|
19
|
-
const showAlert = ref(false)
|
|
20
|
-
const safeArea = useSafeArea()
|
|
21
|
-
|
|
22
|
-
const topStype = computed(() => {
|
|
23
|
-
return `top: ${safeArea.nav + safeArea.status}px;`
|
|
24
|
-
})
|
|
25
|
-
|
|
26
|
-
const recommendVersions = ref()
|
|
27
|
-
// 获取系统配置 - 小程序推荐版本
|
|
28
|
-
const getPropertieByCode = debounce(async () => {
|
|
29
|
-
if (recommendVersions.value) return
|
|
30
|
-
|
|
31
|
-
const $http = useHttp()
|
|
32
|
-
$http
|
|
33
|
-
.get('/cas/properties/getPropertie', {
|
|
34
|
-
code: 'pcRecommendVersion',
|
|
35
|
-
})
|
|
36
|
-
.then((res: any) => {
|
|
37
|
-
recommendVersions.value = JSON.parse(res.value || '{}')
|
|
38
|
-
})
|
|
39
|
-
}, 100)
|
|
40
|
-
|
|
41
|
-
onMounted(async () => {
|
|
42
|
-
await getPropertieByCode()
|
|
43
|
-
|
|
44
|
-
const systemInfo = Taro.getSystemInfoSync()
|
|
45
|
-
const version = systemInfo.SDKVersion
|
|
46
|
-
|
|
47
|
-
// 版本号比较函数
|
|
48
|
-
function compareVersion(v1, v2) {
|
|
49
|
-
const v1Arr = v1.split('.').map(Number)
|
|
50
|
-
const v2Arr = v2.split('.').map(Number)
|
|
51
|
-
|
|
52
|
-
for (let i = 0; i < v1Arr.length || i < v2Arr.length; i++) {
|
|
53
|
-
if ((v1Arr[i] || 0) > (v2Arr[i] || 0)) {
|
|
54
|
-
return true
|
|
55
|
-
} else if ((v1Arr[i] || 0) < (v2Arr[i] || 0)) {
|
|
56
|
-
return false
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
return false
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
if (!compareVersion(version, (recommendVersions.value || {}).Mini || '2.24.0')) {
|
|
63
|
-
showAlert.value = true
|
|
64
|
-
}
|
|
65
|
-
})
|
|
66
|
-
</script>
|
|
67
|
-
|
|
68
|
-
<style lang="less"></style>
|
|
1
|
+
<template>
|
|
2
|
+
<DdNoticeBar
|
|
3
|
+
v-if="showAlert"
|
|
4
|
+
showClose
|
|
5
|
+
:style="topStype"
|
|
6
|
+
@close="showAlert = !showAlert"
|
|
7
|
+
text="您当前使用的微信客户端版本较低,可能不支持全部功能或体验效果可能不佳,建议至应用商店或App Store升级至最新版本。"
|
|
8
|
+
/>
|
|
9
|
+
</template>
|
|
10
|
+
|
|
11
|
+
<script setup lang="ts">
|
|
12
|
+
import { ref, onMounted, computed } from 'vue'
|
|
13
|
+
import DdNoticeBar from '../../components/dd-notice-bar/index.vue'
|
|
14
|
+
import { useSafeArea } from '../composables'
|
|
15
|
+
import Taro from '@tarojs/taro'
|
|
16
|
+
import { useHttp } from '../../balance/api'
|
|
17
|
+
import debounce from 'lodash/debounce'
|
|
18
|
+
|
|
19
|
+
const showAlert = ref(false)
|
|
20
|
+
const safeArea = useSafeArea()
|
|
21
|
+
|
|
22
|
+
const topStype = computed(() => {
|
|
23
|
+
return `top: ${safeArea.nav + safeArea.status}px;`
|
|
24
|
+
})
|
|
25
|
+
|
|
26
|
+
const recommendVersions = ref()
|
|
27
|
+
// 获取系统配置 - 小程序推荐版本
|
|
28
|
+
const getPropertieByCode = debounce(async () => {
|
|
29
|
+
if (recommendVersions.value) return
|
|
30
|
+
|
|
31
|
+
const $http = useHttp()
|
|
32
|
+
$http
|
|
33
|
+
.get('/cas/properties/getPropertie', {
|
|
34
|
+
code: 'pcRecommendVersion',
|
|
35
|
+
})
|
|
36
|
+
.then((res: any) => {
|
|
37
|
+
recommendVersions.value = JSON.parse(res.value || '{}')
|
|
38
|
+
})
|
|
39
|
+
}, 100)
|
|
40
|
+
|
|
41
|
+
onMounted(async () => {
|
|
42
|
+
await getPropertieByCode()
|
|
43
|
+
|
|
44
|
+
const systemInfo = Taro.getSystemInfoSync()
|
|
45
|
+
const version = systemInfo.SDKVersion
|
|
46
|
+
|
|
47
|
+
// 版本号比较函数
|
|
48
|
+
function compareVersion(v1, v2) {
|
|
49
|
+
const v1Arr = v1.split('.').map(Number)
|
|
50
|
+
const v2Arr = v2.split('.').map(Number)
|
|
51
|
+
|
|
52
|
+
for (let i = 0; i < v1Arr.length || i < v2Arr.length; i++) {
|
|
53
|
+
if ((v1Arr[i] || 0) > (v2Arr[i] || 0)) {
|
|
54
|
+
return true
|
|
55
|
+
} else if ((v1Arr[i] || 0) < (v2Arr[i] || 0)) {
|
|
56
|
+
return false
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return false
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
if (!compareVersion(version, (recommendVersions.value || {}).Mini || '2.24.0')) {
|
|
63
|
+
showAlert.value = true
|
|
64
|
+
}
|
|
65
|
+
})
|
|
66
|
+
</script>
|
|
67
|
+
|
|
68
|
+
<style lang="less"></style>
|
|
@@ -1,34 +1,34 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<div class="empty-view">
|
|
3
|
-
<img
|
|
4
|
-
class="empty-view-image"
|
|
5
|
-
src="https://cdn.ddjf.com/static/images/nutshell/empty-data.png" />
|
|
6
|
-
<div class="empty-view-text">暂无数据</div>
|
|
7
|
-
</div>
|
|
8
|
-
</template>
|
|
9
|
-
|
|
10
|
-
<script lang="ts" setup>
|
|
11
|
-
</script>
|
|
12
|
-
|
|
13
|
-
<style lang="scss">
|
|
14
|
-
.empty-view {
|
|
15
|
-
display: flex;
|
|
16
|
-
flex-direction: column;
|
|
17
|
-
justify-content: center;
|
|
18
|
-
align-items: center;
|
|
19
|
-
margin-top: 80px;
|
|
20
|
-
&-image {
|
|
21
|
-
display: block;
|
|
22
|
-
font-size: 0;
|
|
23
|
-
width: 144px;
|
|
24
|
-
height: 80px;
|
|
25
|
-
filter: grayscale(1);
|
|
26
|
-
}
|
|
27
|
-
&-text {
|
|
28
|
-
opacity: 0.4;
|
|
29
|
-
color: #353535;
|
|
30
|
-
font-size: 12px;
|
|
31
|
-
line-height: 28px;
|
|
32
|
-
}
|
|
33
|
-
}
|
|
1
|
+
<template>
|
|
2
|
+
<div class="empty-view">
|
|
3
|
+
<img
|
|
4
|
+
class="empty-view-image"
|
|
5
|
+
src="https://cdn.ddjf.com/static/images/nutshell/empty-data.png" />
|
|
6
|
+
<div class="empty-view-text">暂无数据</div>
|
|
7
|
+
</div>
|
|
8
|
+
</template>
|
|
9
|
+
|
|
10
|
+
<script lang="ts" setup>
|
|
11
|
+
</script>
|
|
12
|
+
|
|
13
|
+
<style lang="scss">
|
|
14
|
+
.empty-view {
|
|
15
|
+
display: flex;
|
|
16
|
+
flex-direction: column;
|
|
17
|
+
justify-content: center;
|
|
18
|
+
align-items: center;
|
|
19
|
+
margin-top: 80px;
|
|
20
|
+
&-image {
|
|
21
|
+
display: block;
|
|
22
|
+
font-size: 0;
|
|
23
|
+
width: 144px;
|
|
24
|
+
height: 80px;
|
|
25
|
+
filter: grayscale(1);
|
|
26
|
+
}
|
|
27
|
+
&-text {
|
|
28
|
+
opacity: 0.4;
|
|
29
|
+
color: #353535;
|
|
30
|
+
font-size: 12px;
|
|
31
|
+
line-height: 28px;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
34
|
</style>
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div class="ocr-icon" @click="onIconClick">
|
|
3
|
+
<ns-icon name="https://simple.shensi.tech/icons/ocr.svg" />
|
|
4
|
+
</div>
|
|
5
|
+
</template>
|
|
6
|
+
|
|
7
|
+
<script lang="ts" setup>
|
|
8
|
+
import Taro from '@tarojs/taro'
|
|
9
|
+
import { NsIcon } from '@uxda/nutshell/taro'
|
|
10
|
+
import { useAppKitOptions } from '../../Appkit'
|
|
11
|
+
|
|
12
|
+
const appKitOptions = useAppKitOptions()
|
|
13
|
+
|
|
14
|
+
const emits = defineEmits(['complete'])
|
|
15
|
+
|
|
16
|
+
export type OcrResult = {
|
|
17
|
+
name: string
|
|
18
|
+
number: string
|
|
19
|
+
address: string
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
async function taroImgCompress(src: string, quality = 80) {
|
|
23
|
+
return new Promise((resolve, reject) => {
|
|
24
|
+
Taro.compressImage({
|
|
25
|
+
src: src,
|
|
26
|
+
quality: quality,
|
|
27
|
+
success: (res) => {
|
|
28
|
+
resolve(res)
|
|
29
|
+
},
|
|
30
|
+
fail: (res) => {
|
|
31
|
+
reject(res)
|
|
32
|
+
},
|
|
33
|
+
})
|
|
34
|
+
})
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function getCompressQuality(size: number) {
|
|
38
|
+
let quality = 100
|
|
39
|
+
const curSize = size / (1024 * 1024)
|
|
40
|
+
if (curSize > 6) {
|
|
41
|
+
quality = quality - ((curSize - 6) / curSize) * 100
|
|
42
|
+
}
|
|
43
|
+
return quality
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function allTrim(str: string) {
|
|
47
|
+
return str.replace(/\s+/g, '')
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
async function onIconClick() {
|
|
51
|
+
console.log('===onIconClick')
|
|
52
|
+
let result: OcrResult | null = null
|
|
53
|
+
try {
|
|
54
|
+
const csRes = await Taro.chooseImage({
|
|
55
|
+
count: 1,
|
|
56
|
+
})
|
|
57
|
+
let { path, size } = csRes.tempFiles[0]
|
|
58
|
+
const compressImg: any = (await taroImgCompress(path, getCompressQuality(size))) || {}
|
|
59
|
+
const filePath = compressImg.tempFilePath || path
|
|
60
|
+
Taro.showLoading({ title: '身份证识别中..' })
|
|
61
|
+
const session = appKitOptions.token()
|
|
62
|
+
const baseUrl = appKitOptions.baseUrl()
|
|
63
|
+
const upRes: any = await Taro.uploadFile({
|
|
64
|
+
url: baseUrl + '/hkapprove/ocr/idcard',
|
|
65
|
+
filePath,
|
|
66
|
+
name: 'file',
|
|
67
|
+
formData: {
|
|
68
|
+
objectNo: `min${Date.now()}`,
|
|
69
|
+
side: 'face',
|
|
70
|
+
},
|
|
71
|
+
header: {
|
|
72
|
+
sessionKey: session || '',
|
|
73
|
+
token: session || '',
|
|
74
|
+
},
|
|
75
|
+
})
|
|
76
|
+
Taro.hideLoading()
|
|
77
|
+
const res = JSON.parse(upRes.data)
|
|
78
|
+
if (res.code === '200') {
|
|
79
|
+
const faceInfo = res.result.faceInfo || {},
|
|
80
|
+
file = res.result.fileUploadVO
|
|
81
|
+
result = {
|
|
82
|
+
name: allTrim(faceInfo.name || ''),
|
|
83
|
+
number: allTrim(faceInfo.num || ''),
|
|
84
|
+
address: allTrim(faceInfo.address || ''),
|
|
85
|
+
// file: {
|
|
86
|
+
// key: file.fileKey,
|
|
87
|
+
// url: file.fileUrl,
|
|
88
|
+
// object: file.objectNo,
|
|
89
|
+
// thumb: file.thumbnailUrl
|
|
90
|
+
// }
|
|
91
|
+
}
|
|
92
|
+
console.log('===识别', result)
|
|
93
|
+
if (!result.name && !result.number) {
|
|
94
|
+
Taro.showToast({ title: '识别失败,请重试', icon: 'none' })
|
|
95
|
+
}
|
|
96
|
+
} else {
|
|
97
|
+
Taro.showToast({
|
|
98
|
+
title: res.msg,
|
|
99
|
+
icon: 'error',
|
|
100
|
+
})
|
|
101
|
+
}
|
|
102
|
+
} catch (err) {
|
|
103
|
+
Taro.hideLoading()
|
|
104
|
+
console.log(err)
|
|
105
|
+
}
|
|
106
|
+
emits('complete', result)
|
|
107
|
+
}
|
|
108
|
+
</script>
|
|
109
|
+
|
|
110
|
+
<style lang="scss">
|
|
111
|
+
.ocr-icon {
|
|
112
|
+
width: 24px;
|
|
113
|
+
height: 24px;
|
|
114
|
+
.ns-icon {
|
|
115
|
+
width: 24px;
|
|
116
|
+
height: 24px;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
</style>
|