@uxda/appkit 4.1.44 → 4.1.48
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/appkit.css +4 -5
- package/dist/index.js +223 -233
- package/package.json +1 -1
- package/src/balance/components/AccountView.vue +5 -3
- package/src/balance/components/BalanceCard.vue +3 -1
- package/src/balance/components/PromoterCard.vue +6 -4
- package/src/payment/components/TradeView.vue +76 -54
- package/src/register/components/SelfRegistration.vue +16 -37
- package/src/shared/components/OcrBusinessLicense.vue +3 -6
- package/src/shared/components/OcrIcon.vue +133 -64
- package/src/shared/composables/useAmount.ts +46 -0
- package/src/shared/composables/useValidator.ts +2 -2
- package/src/components/ocr-id/index.vue +0 -114
- package/src/components/ocr-id/types.d.ts +0 -13
|
@@ -1,29 +1,53 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<div
|
|
3
|
-
<
|
|
4
|
-
|
|
2
|
+
<div class="ocr-icon" :class="[disabled ? 'disabled' : '']" @click="onPhotograph">
|
|
3
|
+
<slot name="icon">
|
|
4
|
+
<ns-icon name="https://cdn.ddjf.com/static/images/beidouxing/ocr-icon.png" />
|
|
5
|
+
</slot>
|
|
6
|
+
</div>
|
|
7
|
+
|
|
8
|
+
<nut-action-sheet v-model:visible="activeSheetVisible" :menu-items="actionSheetMenus" @choose="chooseImages"
|
|
9
|
+
cancel-txt="取消" />
|
|
5
10
|
</template>
|
|
6
11
|
|
|
7
12
|
<script lang="ts" setup>
|
|
8
|
-
import Taro from '@tarojs/taro'
|
|
9
|
-
import { NsIcon } from '@uxda/nutshell/taro'
|
|
10
|
-
import { useAppKitOptions } from '../../Appkit'
|
|
13
|
+
import Taro from '@tarojs/taro'
|
|
14
|
+
import { NsIcon } from '@uxda/nutshell/taro'
|
|
15
|
+
import { useAppKitOptions } from '../../Appkit'
|
|
16
|
+
import { ref } from 'vue';
|
|
11
17
|
|
|
12
|
-
const appKitOptions = useAppKitOptions()
|
|
18
|
+
const appKitOptions = useAppKitOptions()
|
|
13
19
|
|
|
14
|
-
const emits = defineEmits(['complete'])
|
|
20
|
+
const emits = defineEmits(['complete'])
|
|
15
21
|
|
|
16
22
|
type OcrIconProps = {
|
|
17
|
-
disabled
|
|
18
|
-
|
|
23
|
+
disabled?: boolean,
|
|
24
|
+
side?: 'face' | 'back',
|
|
25
|
+
class?: string
|
|
26
|
+
}
|
|
19
27
|
|
|
20
|
-
const props = defineProps<OcrIconProps>()
|
|
28
|
+
const props = withDefaults(defineProps<OcrIconProps>(), {
|
|
29
|
+
disabled: false,
|
|
30
|
+
side: 'face',
|
|
31
|
+
class: ''
|
|
32
|
+
})
|
|
21
33
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
34
|
+
type OcrResultType = {
|
|
35
|
+
faceInfo: {
|
|
36
|
+
name: string
|
|
37
|
+
certNo: string
|
|
38
|
+
address: string
|
|
39
|
+
}
|
|
40
|
+
backInfo: {
|
|
41
|
+
startDate: string
|
|
42
|
+
endDate: string
|
|
43
|
+
}
|
|
44
|
+
fileUploadVO: {
|
|
45
|
+
fileKey: string
|
|
46
|
+
fileUrl: string
|
|
47
|
+
objectNo: string
|
|
48
|
+
thumbnailUrl?: string
|
|
49
|
+
}
|
|
50
|
+
}
|
|
27
51
|
|
|
28
52
|
async function taroImgCompress(src: string, quality = 80) {
|
|
29
53
|
return new Promise((resolve, reject) => {
|
|
@@ -31,88 +55,129 @@ async function taroImgCompress(src: string, quality = 80) {
|
|
|
31
55
|
src: src,
|
|
32
56
|
quality: quality,
|
|
33
57
|
success: (res) => {
|
|
34
|
-
resolve(res)
|
|
58
|
+
resolve(res)
|
|
35
59
|
},
|
|
36
60
|
fail: (res) => {
|
|
37
|
-
reject(res)
|
|
61
|
+
reject(res)
|
|
38
62
|
},
|
|
39
|
-
})
|
|
40
|
-
})
|
|
63
|
+
})
|
|
64
|
+
})
|
|
41
65
|
}
|
|
42
66
|
|
|
43
67
|
function getCompressQuality(size: number) {
|
|
44
|
-
let quality = 100
|
|
45
|
-
const curSize = size / (1024 * 1024)
|
|
68
|
+
let quality = 100
|
|
69
|
+
const curSize = size / (1024 * 1024)
|
|
46
70
|
if (curSize > 6) {
|
|
47
|
-
quality = quality - ((curSize - 6) / curSize) * 100
|
|
71
|
+
quality = quality - ((curSize - 6) / curSize) * 100
|
|
48
72
|
}
|
|
49
|
-
return quality
|
|
73
|
+
return quality
|
|
50
74
|
}
|
|
51
75
|
|
|
52
76
|
function allTrim(str: string) {
|
|
53
|
-
return str.replace(/\s+/g, '')
|
|
77
|
+
return str.replace(/\s+/g, '')
|
|
54
78
|
}
|
|
55
79
|
|
|
56
|
-
async function
|
|
57
|
-
|
|
58
|
-
return;
|
|
59
|
-
}
|
|
60
|
-
let result: OcrResult | null = null;
|
|
80
|
+
async function onUploadFile(csRes: any) {
|
|
81
|
+
let result: OcrResultType | null = null
|
|
61
82
|
try {
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
const
|
|
69
|
-
Taro.showLoading({ title: '身份证识别中..' });
|
|
70
|
-
const session = appKitOptions.token();
|
|
71
|
-
const baseUrl = appKitOptions.baseUrl();
|
|
83
|
+
let { path, size, tempFilePath } = csRes.tempFiles[0]
|
|
84
|
+
const compressImg: any = (await taroImgCompress(path || tempFilePath, getCompressQuality(size))) || {}
|
|
85
|
+
const filePath = compressImg.tempFilePath || path
|
|
86
|
+
Taro.showLoading({ title: '身份证识别中..' })
|
|
87
|
+
|
|
88
|
+
const session = appKitOptions.token()
|
|
89
|
+
const baseUrl = appKitOptions.baseUrl()
|
|
72
90
|
const upRes: any = await Taro.uploadFile({
|
|
73
91
|
url: baseUrl + '/hkapprove/ocr/idcard',
|
|
74
92
|
filePath,
|
|
75
93
|
name: 'file',
|
|
76
94
|
formData: {
|
|
77
95
|
objectNo: `min${Date.now()}`,
|
|
78
|
-
side:
|
|
96
|
+
side: props.side,
|
|
79
97
|
},
|
|
80
98
|
header: {
|
|
81
|
-
sessionKey: session || '',
|
|
82
99
|
token: session || '',
|
|
83
100
|
},
|
|
84
|
-
})
|
|
85
|
-
Taro.hideLoading()
|
|
86
|
-
|
|
101
|
+
})
|
|
102
|
+
Taro.hideLoading()
|
|
103
|
+
|
|
104
|
+
const res = JSON.parse(upRes.data)
|
|
87
105
|
if (res.code === '200') {
|
|
88
|
-
const faceInfo = res.result.faceInfo || {}
|
|
89
|
-
|
|
106
|
+
const faceInfo = res.result.faceInfo || {}
|
|
107
|
+
const backInfo = res.result.backInfo || {}
|
|
90
108
|
result = {
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
109
|
+
faceInfo: {
|
|
110
|
+
name: allTrim(faceInfo.name || ''),
|
|
111
|
+
certNo: allTrim(faceInfo.num || ''),
|
|
112
|
+
address: allTrim(faceInfo.address || ''),
|
|
113
|
+
},
|
|
114
|
+
backInfo: {
|
|
115
|
+
startDate: backInfo?.startDate || '',
|
|
116
|
+
endDate: backInfo?.endDate || ''
|
|
117
|
+
},
|
|
118
|
+
fileUploadVO: res.result.fileUploadVO || {},
|
|
119
|
+
}
|
|
120
|
+
console.log('===识别', result)
|
|
121
|
+
if (props.side === 'face' && !result.faceInfo.name && !result.faceInfo.certNo) {
|
|
122
|
+
Taro.showToast({ title: '识别失败,请重试', icon: 'none' })
|
|
123
|
+
}
|
|
124
|
+
if (props.side === 'back' && !result.backInfo?.startDate && !result.backInfo?.endDate) {
|
|
125
|
+
Taro.showToast({ title: '识别失败,请重试', icon: 'none' })
|
|
104
126
|
}
|
|
105
127
|
} else {
|
|
106
128
|
Taro.showToast({
|
|
107
129
|
title: res.msg,
|
|
108
130
|
icon: 'error',
|
|
109
|
-
})
|
|
131
|
+
})
|
|
110
132
|
}
|
|
111
133
|
} catch (err) {
|
|
112
|
-
Taro.hideLoading()
|
|
113
|
-
console.log(err)
|
|
134
|
+
Taro.hideLoading()
|
|
135
|
+
console.log(err)
|
|
114
136
|
}
|
|
115
|
-
emits('complete', result)
|
|
137
|
+
emits('complete', result)
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
// 上传图片操作面板
|
|
142
|
+
const activeSheetVisible = ref(false)
|
|
143
|
+
const actionSheetMenus = [
|
|
144
|
+
{
|
|
145
|
+
name: '拍摄',
|
|
146
|
+
type: 'camera',
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
name: '从相册选择',
|
|
150
|
+
type: 'album',
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
name: '从聊天会话选择',
|
|
154
|
+
type: 'message',
|
|
155
|
+
},
|
|
156
|
+
]
|
|
157
|
+
// 选择图像上传
|
|
158
|
+
async function chooseImages(item: any) {
|
|
159
|
+
if (['camera', 'album'].includes(item.type)) {
|
|
160
|
+
const csRes = await Taro.chooseMedia({
|
|
161
|
+
count: 1,
|
|
162
|
+
sourceType: [item.type], // "camera" | "album"
|
|
163
|
+
maxDuration: 60, // 使用duration属性判断是图片还是视频,图片没有该属性
|
|
164
|
+
})
|
|
165
|
+
|
|
166
|
+
onUploadFile(csRes)
|
|
167
|
+
} else {
|
|
168
|
+
const csRes = await Taro.chooseMessageFile({
|
|
169
|
+
count: 1,
|
|
170
|
+
type: 'image',
|
|
171
|
+
})
|
|
172
|
+
|
|
173
|
+
onUploadFile(csRes)
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
function onPhotograph() {
|
|
178
|
+
if (props.disabled) return
|
|
179
|
+
|
|
180
|
+
activeSheetVisible.value = true
|
|
116
181
|
}
|
|
117
182
|
</script>
|
|
118
183
|
|
|
@@ -120,10 +185,14 @@ async function onIconClick() {
|
|
|
120
185
|
.ocr-icon {
|
|
121
186
|
width: 24px;
|
|
122
187
|
height: 24px;
|
|
188
|
+
display: inline-flex;
|
|
189
|
+
align-items: center;
|
|
190
|
+
|
|
123
191
|
.ns-icon {
|
|
124
192
|
width: 24px;
|
|
125
193
|
height: 24px;
|
|
126
194
|
}
|
|
195
|
+
|
|
127
196
|
&.disabled {
|
|
128
197
|
.ns-icon {
|
|
129
198
|
filter: brightness(1.5) grayscale(1);
|
|
@@ -0,0 +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
|
+
}
|
|
@@ -5,7 +5,7 @@ import { isMobilePhone, isIdentityCard } from 'validator'
|
|
|
5
5
|
|
|
6
6
|
export function useValidator() {
|
|
7
7
|
// 身份证号码校验
|
|
8
|
-
function certNoValidator(value:
|
|
8
|
+
function certNoValidator(value: string) {
|
|
9
9
|
if (!value) {
|
|
10
10
|
return '请输入身份证号'
|
|
11
11
|
} else if (!isIdentityCard(value, 'zh-CN')) {
|
|
@@ -15,7 +15,7 @@ export function useValidator() {
|
|
|
15
15
|
}
|
|
16
16
|
|
|
17
17
|
// 电话号码校验
|
|
18
|
-
function phoneValidator(value:
|
|
18
|
+
function phoneValidator(value: string) {
|
|
19
19
|
if (!value) {
|
|
20
20
|
return '请输入手机号码'
|
|
21
21
|
} else if (!isMobilePhone(value, 'zh-CN')) {
|
|
@@ -1,114 +0,0 @@
|
|
|
1
|
-
<script setup lang="ts">
|
|
2
|
-
import Taro from '@tarojs/taro'
|
|
3
|
-
import { OcrResultType } from './types'
|
|
4
|
-
import { useAppKitOptions } from '../../Appkit'
|
|
5
|
-
|
|
6
|
-
const emits = defineEmits(['ocr'])
|
|
7
|
-
|
|
8
|
-
const appKitOptions = useAppKitOptions()
|
|
9
|
-
|
|
10
|
-
// 压缩图片
|
|
11
|
-
async function taroImgCompress(src: string, quality = 80) {
|
|
12
|
-
return new Promise((resolve, reject) => {
|
|
13
|
-
Taro.compressImage({
|
|
14
|
-
src: src,
|
|
15
|
-
quality: quality,
|
|
16
|
-
success: (res) => {
|
|
17
|
-
resolve(res)
|
|
18
|
-
},
|
|
19
|
-
fail: (res) => {
|
|
20
|
-
reject(res)
|
|
21
|
-
},
|
|
22
|
-
})
|
|
23
|
-
})
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
// 压缩质量
|
|
27
|
-
function getCompressQuality(size: number) {
|
|
28
|
-
let quality = 100
|
|
29
|
-
const curSize = size / (1024 * 1024)
|
|
30
|
-
if (curSize > 6) {
|
|
31
|
-
quality = quality - ((curSize - 6) / curSize) * 100
|
|
32
|
-
}
|
|
33
|
-
return quality
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
// 清除字符串内空格
|
|
37
|
-
function allTrim(str: string) {
|
|
38
|
-
return str.replace(/\s+/g, '')
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
// 拍照识别
|
|
42
|
-
async function ocrIDCard() {
|
|
43
|
-
let ocrResult: OcrResultType = null
|
|
44
|
-
try {
|
|
45
|
-
const csRes = await Taro.chooseImage({
|
|
46
|
-
count: 1,
|
|
47
|
-
})
|
|
48
|
-
let { path, size } = csRes.tempFiles[0]
|
|
49
|
-
const compressImg: any = (await taroImgCompress(path, getCompressQuality(size))) || {}
|
|
50
|
-
const filePath = compressImg.tempFilePath || path
|
|
51
|
-
Taro.showLoading({ title: '身份证识别中..' })
|
|
52
|
-
const session = appKitOptions.token()
|
|
53
|
-
const baseUrl = appKitOptions.baseUrl()
|
|
54
|
-
const upRes: any = await Taro.uploadFile({
|
|
55
|
-
url: baseUrl + '/hkapprove/ocr/idcard',
|
|
56
|
-
filePath,
|
|
57
|
-
name: 'file',
|
|
58
|
-
formData: {
|
|
59
|
-
objectNo: `min${Date.now()}`,
|
|
60
|
-
side: 'face',
|
|
61
|
-
},
|
|
62
|
-
header: {
|
|
63
|
-
sessionKey: session || '',
|
|
64
|
-
token: session || '',
|
|
65
|
-
},
|
|
66
|
-
})
|
|
67
|
-
Taro.hideLoading()
|
|
68
|
-
const res = JSON.parse(upRes.data)
|
|
69
|
-
if (res.code === '200') {
|
|
70
|
-
const faceInfo = res.result.faceInfo || {}
|
|
71
|
-
ocrResult = {
|
|
72
|
-
faceInfo: {
|
|
73
|
-
name: allTrim(faceInfo.name || ''),
|
|
74
|
-
certNo: allTrim(faceInfo.num || ''),
|
|
75
|
-
address: allTrim(faceInfo.address || ''),
|
|
76
|
-
},
|
|
77
|
-
fileUploadVO: res.result.fileUploadVO || {},
|
|
78
|
-
}
|
|
79
|
-
if (!ocrResult.faceInfo.name && !ocrResult.faceInfo.certNo) {
|
|
80
|
-
Taro.showToast({ title: '识别失败,请重试', icon: 'none' })
|
|
81
|
-
}
|
|
82
|
-
} else {
|
|
83
|
-
Taro.showToast({
|
|
84
|
-
title: res.msg,
|
|
85
|
-
icon: 'error',
|
|
86
|
-
})
|
|
87
|
-
}
|
|
88
|
-
} catch (err) {
|
|
89
|
-
Taro.hideLoading()
|
|
90
|
-
console.log(err)
|
|
91
|
-
}
|
|
92
|
-
emits('ocr', ocrResult)
|
|
93
|
-
}
|
|
94
|
-
</script>
|
|
95
|
-
|
|
96
|
-
<template>
|
|
97
|
-
<div class="ocr-id" @click="ocrIDCard">
|
|
98
|
-
<slot name="icon">
|
|
99
|
-
<img
|
|
100
|
-
class="ocr-id__img"
|
|
101
|
-
src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0MCIgaGVpZ2h0PSI0MCIgZmlsbD0ibm9uZSI+PHBhdGggb3BhY2l0eT0iLjAxIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTQwIDB2NDBIMFYwaDQweiIgZmlsbD0iI0M0QzRDNCIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMzMuMDQ0IDE3LjM2M2MuOTYgMCAxLjczOS0uNzkgMS43MzktMS43NjYgMC0uOTc1LS43NzktMS43NjYtMS43NC0xLjc2Ni0uOTYgMC0xLjczOC43OS0xLjczOCAxLjc2NnMuNzc4IDEuNzY2IDEuNzM5IDEuNzY2eiIgZmlsbD0iIzRCQ0I5MyIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMCAzMS44MTJWMTQuNzg4YzAtMi4yNTggMi4wNDktNC4wOTcgNC41NjQtNC4wOTdoMy44NDRsMS4xMzYtMy42NThDOS44ODggNS45MTMgMTEuMjM3IDUgMTIuNTQ4IDVIMjcuNDVjMS4zOSAwIDIuNjguODc2IDMuMDEgMi4wNDRsMS4xMzMgMy42NDdoMy44NDRjMi41MTUgMCA0LjU2NCAxLjgzOSA0LjU2NCA0LjA5N3YxLjczOWMwIC41MDMtLjQ1NC45MS0xLjAxNC45MXMtMS4wMTQtLjQwNy0xLjAxNC0uOTF2LTEuNzRjMC0xLjI1My0xLjEzOS0yLjI3NS0yLjUzNi0yLjI3NWgtMy44NDRjLS45MDcgMC0xLjcxMS0uNTQ5LTEuOTU1LTEuMzMybC0xLjEzNi0zLjY2YS4zNDIuMzQyIDAgMCAwLS4wMDctLjAyNWMtLjExLS4zOTYtLjYzOS0uNjc0LTEuMDQ1LS42NzRoLTE0LjljLS4zOTkgMC0uOTUuMzY2LTEuMDUzLjY5OWwtMS4xMzYgMy42NmMtLjI0Ny43ODYtMS4wNDUgMS4zMy0xLjk1NSAxLjMzMkg0LjU2NGMtMS4zOTcgMC0yLjUzNiAxLjAyMi0yLjUzNiAyLjI3NnYxNy4wMjRjMCAxLjI1NCAxLjEzOSAyLjI3NiAyLjUzNiAyLjI3NmgzMC44N2MxLjM5NyAwIDIuNTM1LTEuMDIyIDIuNTM1LTIuMjc2VjIxLjU5NmMwLS41MDMuNDU0LS45MSAxLjAxNC0uOTFzMS4wMTUuNDA3IDEuMDE1LjkxVjMxLjgxYy0uMDAzIDIuMjYtMi4wNSA0LjEtNC41NjcgNC4xSDQuNTY0QzIuMDQ5IDM1LjkxIDAgMzQuMDcgMCAzMS44MTF6IiBmaWxsPSIjNEJDQjkzIi8+PHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xMi4xNzQgMjEuNzc4YzAtNC44NyAzLjcwNS04LjgzIDguMjYtOC44MyA0LjU1NiAwIDguMjYyIDMuOTYgOC4yNjIgOC44M3MtMy43MDYgOC44MzItOC4yNjEgOC44MzJjLTQuNTU2IDAtOC4yNjEtMy45NjItOC4yNjEtOC44MzJ6bTEuNzc5LjEzYzAgMy43OTYgMi45MDcgNi44ODMgNi40ODIgNi44ODMgMy41NzQgMCA2LjQ4MS0zLjA4NyA2LjQ4MS02Ljg4M3MtMi45MDctNi44ODMtNi40ODItNi44ODNjLTMuNTc0IDAtNi40ODEgMy4wODctNi40ODEgNi44ODN6IiBmaWxsPSIjNEJDQjkzIi8+PC9zdmc+"
|
|
102
|
-
/>
|
|
103
|
-
</slot>
|
|
104
|
-
</div>
|
|
105
|
-
</template>
|
|
106
|
-
|
|
107
|
-
<style lang="scss">
|
|
108
|
-
.ocr-id {
|
|
109
|
-
&__img {
|
|
110
|
-
width: 20px;
|
|
111
|
-
height: 20px;
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
</style>
|