@uxda/appkit 4.3.8 → 4.3.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/.eslintrc.mjs +7 -7
  2. package/COMPONENT_USAGE.md +1523 -1523
  3. package/PROJECT_DOCS.md +142 -142
  4. package/README.md +187 -187
  5. package/babel.config.js +12 -12
  6. package/dist/appkit.css +63 -15
  7. package/dist/index.js +881 -259
  8. package/package.json +79 -79
  9. package/project.config.json +15 -15
  10. package/project.tt.json +13 -13
  11. package/rollup.config.mjs +78 -78
  12. package/src/Appkit.ts +72 -72
  13. package/src/balance/api/endpoints.ts +133 -133
  14. package/src/balance/api/index.ts +118 -118
  15. package/src/balance/components/AccountView.vue +770 -770
  16. package/src/balance/components/BalanceCard.vue +210 -210
  17. package/src/balance/components/BalanceReminder.vue +84 -84
  18. package/src/balance/components/ConsumptionFilter.vue +218 -218
  19. package/src/balance/components/ConsumptionRules.vue +68 -68
  20. package/src/balance/components/DateFilter.vue +259 -259
  21. package/src/balance/components/DateRange.vue +111 -111
  22. package/src/balance/components/ListFilter.vue +62 -62
  23. package/src/balance/components/ListFilterPicker.vue +191 -191
  24. package/src/balance/components/PromoterCard.vue +308 -307
  25. package/src/balance/components/SecondBalance.vue +77 -77
  26. package/src/balance/components/Tip.vue +45 -45
  27. package/src/balance/components/index.ts +8 -8
  28. package/src/balance/types.ts +99 -99
  29. package/src/components/bt-cropper/index.vue +730 -730
  30. package/src/components/bt-cropper/utils/calcCropper.js +42 -42
  31. package/src/components/bt-cropper/utils/calcImagePosition.js +23 -23
  32. package/src/components/bt-cropper/utils/calcImageSize.js +37 -37
  33. package/src/components/bt-cropper/utils/calcPointDistance.js +12 -12
  34. package/src/components/bt-cropper/utils/calcRightAndBottom.js +7 -7
  35. package/src/components/bt-cropper/utils/ratio.js +3 -3
  36. package/src/components/bt-cropper/utils/tools.js +25 -25
  37. package/src/components/dd-area/index.vue +225 -225
  38. package/src/components/dd-icon/doc.md +21 -21
  39. package/src/components/dd-icon/index.vue +23 -23
  40. package/src/components/dd-notice-bar/index.vue +78 -78
  41. package/src/components/dd-search/doc.md +34 -34
  42. package/src/components/dd-search/index.vue +168 -168
  43. package/src/components/dd-selector/index.vue +124 -124
  44. package/src/components/dd-skeleton/doc.md +19 -19
  45. package/src/components/dd-skeleton/index.vue +36 -36
  46. package/src/global.ts +6 -6
  47. package/src/index.ts +101 -101
  48. package/src/main.scss +1 -1
  49. package/src/notice/api/endpoints.ts +54 -54
  50. package/src/notice/api/index.ts +121 -121
  51. package/src/notice/components/NoticeBanner.vue +247 -247
  52. package/src/notice/components/NoticeEntry.vue +99 -99
  53. package/src/notice/components/NoticeList.vue +311 -311
  54. package/src/notice/components/NoticeList2.vue +401 -400
  55. package/src/notice/components/NoticePopup.vue +163 -163
  56. package/src/notice/components/index.ts +6 -6
  57. package/src/notice/components/useCommonList.ts +87 -86
  58. package/src/notice/components/useNotice.ts +35 -35
  59. package/src/notice/index.ts +1 -1
  60. package/src/notice/types.ts +25 -25
  61. package/src/payment/api/config.ts +7 -7
  62. package/src/payment/api/endpoints.ts +98 -96
  63. package/src/payment/api/index.ts +108 -107
  64. package/src/payment/components/AmountPicker.vue +90 -90
  65. package/src/payment/components/RechargeResult.vue +68 -69
  66. package/src/payment/components/RechargeView.vue +195 -191
  67. package/src/payment/components/RightsPicker.vue +105 -105
  68. package/src/payment/components/TradeView.vue +573 -363
  69. package/src/payment/components/UserAgreement.vue +234 -234
  70. package/src/payment/components/index.ts +22 -22
  71. package/src/payment/index.ts +5 -5
  72. package/src/payment/services/index.ts +16 -16
  73. package/src/payment/services/invoke-recharge.ts +25 -25
  74. package/src/payment/services/request-payment.ts +132 -130
  75. package/src/payment/types.ts +34 -33
  76. package/src/register/components/SelfRegistration.vue +233 -233
  77. package/src/register/components/index.ts +2 -2
  78. package/src/scenarios/components/SharePoster.vue +364 -364
  79. package/src/scenarios/components/index.ts +2 -2
  80. package/src/scenarios/components/poster-paste.vue +93 -93
  81. package/src/scenarios/components/share-poster.md +273 -273
  82. package/src/shared/components/AppDrawer.vue +53 -53
  83. package/src/shared/components/AppVerify.vue +137 -128
  84. package/src/shared/components/DeviceVersion.vue +78 -78
  85. package/src/shared/components/EmptyView.vue +33 -33
  86. package/src/shared/components/OcrBank.vue +202 -0
  87. package/src/shared/components/OcrBusinessLicense.vue +120 -137
  88. package/src/shared/components/OcrIcon.vue +267 -229
  89. package/src/shared/components/OcrInvoice.vue +322 -0
  90. package/src/shared/components/PageHeader.vue +84 -84
  91. package/src/shared/components/index.ts +10 -8
  92. package/src/shared/composables/index.ts +10 -9
  93. package/src/shared/composables/useAmount.ts +46 -46
  94. package/src/shared/composables/useCompress.ts +64 -0
  95. package/src/shared/composables/useCountdown.ts +46 -46
  96. package/src/shared/composables/useCrypto.ts +76 -76
  97. package/src/shared/composables/useDeviceEnv.ts +26 -26
  98. package/src/shared/composables/useDragBox.ts +97 -97
  99. package/src/shared/composables/useEncode.ts +43 -43
  100. package/src/shared/composables/useLogger.ts +144 -144
  101. package/src/shared/composables/useSafeArea.ts +46 -46
  102. package/src/shared/composables/useTabbar.ts +24 -24
  103. package/src/shared/composables/useUpload.ts +106 -61
  104. package/src/shared/composables/useValidator.ts +32 -32
  105. package/src/shared/composables/useWxAuth.ts +48 -48
  106. package/src/shared/http/Http.ts +149 -148
  107. package/src/shared/http/index.ts +1 -1
  108. package/src/shared/http/types.ts +163 -163
  109. package/src/shared/index.ts +9 -9
  110. package/src/shared/tracking/directives/index.ts +40 -40
  111. package/src/shared/tracking/examples/page-tracking-template.vue +27 -27
  112. package/src/shared/tracking/tracking-sdk.ts +0 -1
  113. package/src/shared/weixin/index.ts +9 -9
  114. package/src/shared/weixin/jssdk.ts +104 -103
  115. package/src/shared/weixin/payment.ts +38 -38
  116. package/src/styles/vars.scss +3 -3
  117. package/src/user/api/endpoints.ts +17 -17
  118. package/src/user/api/index.ts +123 -123
  119. package/src/user/components/LoginSetting.vue +114 -114
  120. package/src/user/components/UserAuth.vue +218 -218
  121. package/src/user/components/UserBinding.vue +277 -277
  122. package/src/user/components/UserBindingSuccess.vue +80 -80
  123. package/src/user/components/UserEntry.vue +139 -139
  124. package/src/user/components/UserFeedback.vue +428 -427
  125. package/src/user/components/UserFeedbackEntry.vue +175 -175
  126. package/src/user/components/UserHeadCrop.vue +65 -65
  127. package/src/user/components/UserInfo.vue +711 -709
  128. package/src/user/components/UserResourceEmpty.vue +75 -75
  129. package/src/user/components/index.ts +23 -23
  130. package/src/user/index.ts +1 -1
  131. package/src/utils/utils.ts +33 -33
  132. package/tsconfig.json +30 -30
  133. package/types/global.d.ts +24 -22
  134. package/types/vue.d.ts +10 -10
  135. package/dist/assets/asset-DcH8Kg-2 +0 -1
@@ -1,128 +1,137 @@
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" class="form">
7
- <ns-input class="form-input" name="code" v-model="formData.code" placeholder="请输入验证码" maxlength="6"
8
- variant="solid" :rules="['required', {
9
- name: 'function',
10
- message: '输入错误, 请重新输入',
11
- method: (value: string) => value.length === 6,
12
- }]">
13
- </ns-input>
14
- <div class="form-btn">
15
- <ns-button v-if="!sent" size="xs" variant="plain" color="primary" v-track-click="'手机号验证-获取验证码'" @click="send" label="获取验证码" />
16
- <div class="caption" v-if="sent">{{ countdown }}s后重新发送</div>
17
- </div>
18
- </ns-form>
19
- <div class="row buttons">
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
- </div>
23
- </div>
24
- </template>
25
-
26
- <script lang="ts" setup>
27
- import { NsForm, NsInput, NsButton } from '@uxda/nutshell/taro';
28
- import { reactive, ref } from 'vue';
29
-
30
- export interface AppVerifyProps {
31
- phone: string;
32
- title?: string;
33
- message?: string;
34
- onSend?: Function;
35
- }
36
-
37
- const emits = defineEmits(['complete', 'cancel']);
38
-
39
- const sent = ref(false),
40
- countdown = ref(60);
41
-
42
- let formData = reactive({
43
- code: '',
44
- });
45
-
46
- const send = () => {
47
- sent.value = true;
48
-
49
- props.onSend && props.onSend();
50
-
51
- countdown.value = 60;
52
- let timer = setInterval(() => {
53
- countdown.value--;
54
- if (countdown.value <= 0) {
55
- clearInterval(timer);
56
- sent.value = false;
57
- }
58
- }, 1000);
59
- };
60
-
61
- const onOk = () => {
62
- emits('complete', { code: formData.code });
63
- };
64
-
65
- const props = defineProps<AppVerifyProps>();
66
- </script>
67
-
68
- <style lang="scss">
69
- .app-verify {
70
- padding: 10px 30px 20px;
71
-
72
- h2 {
73
- font-size: 16px;
74
- font-weight: bold;
75
- }
76
-
77
- .caption {
78
- font-size: 13px !important;
79
- color: #ccc;
80
- line-height: 21px;
81
- }
82
-
83
- .number {
84
- line-height: 21px;
85
- }
86
-
87
- .form .nut-cell-group__wrap {
88
- display: flex;
89
- align-items: center;
90
- margin: 20px 0 !important;
91
-
92
- .form-input {
93
- height: 36px;
94
- line-height: 36px;
95
- border: none;
96
- background: #f5f5f5;
97
- border-radius: 5px;
98
- flex: 1;
99
- padding-left: 12px;
100
- }
101
-
102
- .form-btn {
103
- margin-left: 12px;
104
- width: 105px;
105
- }
106
- }
107
-
108
- .buttons {
109
- width: 100%;
110
- justify-content: space-between;
111
- margin-top: 10px;
112
-
113
- .ns-button {
114
- width: 104px;
115
- border-radius: 30px;
116
- --radius: 30px;
117
- }
118
-
119
- .cancel-btn {
120
- border: 1px solid #969696 !important;
121
- }
122
- }
123
-
124
- .nut-input {
125
- background: transparent !important;
126
- }
127
- }
128
- </style>
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" class="form">
7
+ <ns-input class="form-input" name="code" v-model="formData.code" placeholder="请输入验证码" maxlength="6"
8
+ variant="solid" :rules="['required', {
9
+ name: 'function',
10
+ message: '输入错误, 请重新输入',
11
+ method: (value: string) => value.length === 6,
12
+ }]">
13
+ </ns-input>
14
+ <div class="form-btn">
15
+ <ns-button v-if="!sent" size="xs" variant="plain" color="primary" v-track-click="'手机号验证-获取验证码'" @click="send" label="获取验证码" />
16
+ <div class="caption" v-if="sent">{{ countdown }}s后重新发送</div>
17
+ </div>
18
+ </ns-form>
19
+ <div class="row buttons">
20
+ <ns-button class="cancel-btn" v-track-click="'手机号验证-取消'" :r="20" @click="emits('cancel')">取消</ns-button>
21
+ <ns-button color="primary" v-track-click="'手机号验证-确认'" :r="20" @click="onOk">确认</ns-button>
22
+ </div>
23
+ </div>
24
+ </template>
25
+
26
+ <script lang="ts" setup>
27
+ import { NsForm, NsInput, NsButton } from '@uxda/nutshell/taro';
28
+ import { reactive, ref } from 'vue';
29
+
30
+ export interface AppVerifyProps {
31
+ phone: string;
32
+ title?: string;
33
+ message?: string;
34
+ onSend?: Function;
35
+ }
36
+
37
+ const emits = defineEmits(['complete', 'cancel']);
38
+
39
+ const sent = ref(false),
40
+ countdown = ref(60);
41
+
42
+ let formData = reactive({
43
+ code: '',
44
+ });
45
+
46
+ const send = () => {
47
+ sent.value = true;
48
+
49
+ props.onSend && props.onSend();
50
+
51
+ countdown.value = 60;
52
+ let timer = setInterval(() => {
53
+ countdown.value--;
54
+ if (countdown.value <= 0) {
55
+ clearInterval(timer);
56
+ sent.value = false;
57
+ }
58
+ }, 1000);
59
+ };
60
+
61
+ const onOk = () => {
62
+ emits('complete', { code: formData.code });
63
+ };
64
+
65
+ const props = defineProps<AppVerifyProps>();
66
+ </script>
67
+
68
+ <style lang="scss">
69
+ .app-verify {
70
+ padding: 10px 30px 20px;
71
+
72
+ h2 {
73
+ font-size: 16px;
74
+ font-weight: bold;
75
+ }
76
+
77
+ .caption {
78
+ font-size: 14px !important;
79
+ color: #666;
80
+ margin-bottom: 5px;
81
+ }
82
+
83
+ .number {
84
+ line-height: 21px;
85
+ }
86
+
87
+ .form .nut-cell-group__wrap {
88
+ display: flex;
89
+ align-items: center;
90
+ margin: 20px 0 !important;
91
+
92
+ .form-input {
93
+ height: 36px;
94
+ line-height: 36px;
95
+ border: none;
96
+ background: #f5f5f5;
97
+ border-radius: 5px;
98
+ flex: 1;
99
+ padding-left: 12px;
100
+ .input-text {
101
+ text-align: left !important;
102
+ }
103
+ }
104
+
105
+ .form-btn {
106
+ margin-left: 12px;
107
+ width: 90px;
108
+
109
+ .caption {
110
+ font-size: 10px !important;
111
+ color: #ccc;
112
+ margin-bottom: 0;
113
+ }
114
+ }
115
+ }
116
+
117
+ .buttons {
118
+ width: 100%;
119
+ justify-content: space-between;
120
+ margin-top: 10px;
121
+
122
+ .ns-button {
123
+ width: 104px;
124
+ border-radius: 30px;
125
+ --radius: 30px;
126
+ }
127
+
128
+ .cancel-btn {
129
+ border: 1px solid #969696 !important;
130
+ }
131
+ }
132
+
133
+ .nut-input {
134
+ background: transparent !important;
135
+ }
136
+ }
137
+ </style>
@@ -1,78 +1,78 @@
1
- <template>
2
- <DdNoticeBar v-if="showAlert" showClose :style="topStype" @close="showAlert = !showAlert"
3
- text="您当前使用的微信客户端版本较低,可能不支持全部功能或体验效果可能不佳,建议至应用商店或App Store升级至最新版本。" />
4
- </template>
5
-
6
- <script setup lang="ts">
7
- import { ref, onMounted, computed } from 'vue'
8
- import DdNoticeBar from '../../components/dd-notice-bar/index.vue'
9
- import { useSafeArea } from '../composables'
10
- import Taro, { getSystemInfoSync } from '@tarojs/taro'
11
- import { useHttp } from '../../balance/api'
12
- import debounce from 'lodash-es/debounce'
13
-
14
- const props = withDefaults(
15
- defineProps<{
16
- versions?: string
17
- }>(),
18
- {
19
- versions: '{}',
20
- }
21
- )
22
-
23
- const showAlert = ref(false)
24
- const safeArea = useSafeArea()
25
-
26
- const topStype = computed(() => {
27
- return `top: ${safeArea.nav + safeArea.status}px;`
28
- })
29
-
30
- const recommendVersions = ref()
31
- // 获取系统配置 - 小程序推荐版本
32
- const getPropertieByCode = debounce(async () => {
33
- if (props?.versions !== '{}') {
34
- recommendVersions.value = JSON.parse(props.versions)
35
-
36
- return
37
- }
38
-
39
- if (recommendVersions.value) return
40
-
41
- const $http = useHttp()
42
- $http
43
- .get('/cas/properties/getPropertie', {
44
- code: 'pcRecommendVersion',
45
- })
46
- .then((res: any) => {
47
- recommendVersions.value = JSON.parse(res.value || '{}')
48
- })
49
- }, 100)
50
-
51
- onMounted(async () => {
52
- await getPropertieByCode()
53
-
54
- const systemInfo = getSystemInfoSync()
55
- const version = systemInfo.SDKVersion
56
-
57
- // 版本号比较函数
58
- function compareVersion(v1, v2) {
59
- const v1Arr = v1.split('.').map(Number)
60
- const v2Arr = v2.split('.').map(Number)
61
-
62
- for (let i = 0; i < v1Arr.length || i < v2Arr.length; i++) {
63
- if ((v1Arr[i] || 0) > (v2Arr[i] || 0)) {
64
- return true
65
- } else if ((v1Arr[i] || 0) < (v2Arr[i] || 0)) {
66
- return false
67
- }
68
- }
69
- return false
70
- }
71
-
72
- if (!compareVersion(version, (recommendVersions.value || {}).Mini || '2.24.0')) {
73
- showAlert.value = true
74
- }
75
- })
76
- </script>
77
-
78
- <style lang="less"></style>
1
+ <template>
2
+ <DdNoticeBar v-if="showAlert" showClose :style="topStype" @close="showAlert = !showAlert"
3
+ text="您当前使用的微信客户端版本较低,可能不支持全部功能或体验效果可能不佳,建议至应用商店或App Store升级至最新版本。" />
4
+ </template>
5
+
6
+ <script setup lang="ts">
7
+ import { ref, onMounted, computed } from 'vue'
8
+ import DdNoticeBar from '../../components/dd-notice-bar/index.vue'
9
+ import { useSafeArea } from '../composables'
10
+ import Taro, { getSystemInfoSync } from '@tarojs/taro'
11
+ import { useHttp } from '../../balance/api'
12
+ import debounce from 'lodash-es/debounce'
13
+
14
+ const props = withDefaults(
15
+ defineProps<{
16
+ versions?: string
17
+ }>(),
18
+ {
19
+ versions: '{}',
20
+ }
21
+ )
22
+
23
+ const showAlert = ref(false)
24
+ const safeArea = useSafeArea()
25
+
26
+ const topStype = computed(() => {
27
+ return `top: ${safeArea.nav + safeArea.status}px;`
28
+ })
29
+
30
+ const recommendVersions = ref()
31
+ // 获取系统配置 - 小程序推荐版本
32
+ const getPropertieByCode = debounce(async () => {
33
+ if (props?.versions !== '{}') {
34
+ recommendVersions.value = JSON.parse(props.versions)
35
+
36
+ return
37
+ }
38
+
39
+ if (recommendVersions.value) return
40
+
41
+ const $http = useHttp()
42
+ $http
43
+ .get('/cas/properties/getPropertie', {
44
+ code: 'pcRecommendVersion',
45
+ })
46
+ .then((res: any) => {
47
+ recommendVersions.value = JSON.parse(res.value || '{}')
48
+ })
49
+ }, 100)
50
+
51
+ onMounted(async () => {
52
+ await getPropertieByCode()
53
+
54
+ const systemInfo = getSystemInfoSync()
55
+ const version = systemInfo.SDKVersion
56
+
57
+ // 版本号比较函数
58
+ function compareVersion(v1, v2) {
59
+ const v1Arr = v1.split('.').map(Number)
60
+ const v2Arr = v2.split('.').map(Number)
61
+
62
+ for (let i = 0; i < v1Arr.length || i < v2Arr.length; i++) {
63
+ if ((v1Arr[i] || 0) > (v2Arr[i] || 0)) {
64
+ return true
65
+ } else if ((v1Arr[i] || 0) < (v2Arr[i] || 0)) {
66
+ return false
67
+ }
68
+ }
69
+ return false
70
+ }
71
+
72
+ if (!compareVersion(version, (recommendVersions.value || {}).Mini || '2.24.0')) {
73
+ showAlert.value = true
74
+ }
75
+ })
76
+ </script>
77
+
78
+ <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,202 @@
1
+ <template>
2
+ <div class="ocr-bank" :class="[disabled ? 'disabled' : '']" v-track-click="'银行卡识别-点击'" @click="!customClick ? onUpload() : null">
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="取消" />
10
+ </template>
11
+
12
+ <script lang="ts" setup>
13
+ import Taro, { showToast, showLoading, hideLoading, chooseMedia, chooseMessageFile, uploadFile } from '@tarojs/taro'
14
+ import { NsIcon, useNutshell } from '@uxda/nutshell/taro'
15
+ import { useAppKitOptions } from '../../Appkit'
16
+ import { ref } from 'vue';
17
+ import { useHttp } from '../../balance/api'
18
+ import { compressImage, getCompressQuality } from '../composables/useUpload'
19
+
20
+ const appKitOptions = useAppKitOptions()
21
+ const $http = useHttp(),
22
+ $n = useNutshell()
23
+
24
+ const emits = defineEmits(['complete'])
25
+
26
+ type OcrProps = {
27
+ disabled?: boolean,
28
+ class?: string
29
+ uploadUrl?: string
30
+ customClick?: boolean
31
+ }
32
+ type FileType = {
33
+ "downloadUrl": string,
34
+ "fileId": string,
35
+ "fileName": string,
36
+ "fileSize": number,
37
+ "fileSuffix": string,
38
+ "fileType": string,
39
+ "originalUrl": string
40
+ }
41
+
42
+ const props = withDefaults(defineProps<OcrProps>(), {
43
+ disabled: false,
44
+ class: '',
45
+ uploadUrl: '/hkbase/file/uploadFile',
46
+ customClick: false
47
+ })
48
+
49
+ type BankCardType = {
50
+ bankCardNumber: string
51
+ bankCardType: string
52
+ bankName: string
53
+ }
54
+
55
+ async function onUploadFile(csRes: any) {
56
+ try {
57
+ let { path, size, tempFilePath } = csRes.tempFiles[0]
58
+ const compressImg: any = (await compressImage(path || tempFilePath, getCompressQuality(size))) || {}
59
+ const filePath = compressImg.tempFilePath || path
60
+
61
+ showLoading({ title: '银行卡识别中..', mask: true })
62
+
63
+ const session = appKitOptions.token()
64
+ const baseUrl = appKitOptions.baseUrl()
65
+ const upRes: any = await uploadFile({
66
+ url: baseUrl + props.uploadUrl,
67
+ filePath,
68
+ name: 'file',
69
+ formData: {
70
+ objectNo: `min${Date.now()}`,
71
+ appCode: appKitOptions.app(),
72
+ },
73
+ header: {
74
+ token: session || '',
75
+ },
76
+ })
77
+
78
+ const res = JSON.parse(upRes.data)
79
+ if (res.code === '200') {
80
+ await getBankCardInfo(res.result)
81
+ } else {
82
+ hideLoading()
83
+ showToast({
84
+ title: res.msg,
85
+ icon: 'error',
86
+ })
87
+ }
88
+ } catch (err) {
89
+ hideLoading()
90
+ console.log(err)
91
+ }
92
+ }
93
+
94
+ // 根据银行卡路径获取银行卡信息
95
+ async function getBankCardInfo(file: string | FileType) {
96
+ try {
97
+ const res: BankCardType = await $http.get('/hkbase/common/bankCard', {
98
+ fileUrl: typeof file === 'string' ? file : file.originalUrl,
99
+ })
100
+ hideLoading()
101
+
102
+ if (res && !res.bankCardNumber) {
103
+ $n.dialog({
104
+ title: '识别失败',
105
+ message: `您上传的图片可能不够清晰或与当前功能不符,请重新上传一张清晰、完整的图片。谢谢!`,
106
+ okText: '我知道了',
107
+ cancelText: '',
108
+ })
109
+ return
110
+ }
111
+
112
+ emits('complete', {
113
+ ...res,
114
+ fileUrl: typeof file === 'string' ? file : file.originalUrl,
115
+ fileKey: typeof file === 'string' ? file : file.fileId,
116
+ })
117
+ } catch (err) {
118
+ hideLoading()
119
+ }
120
+ }
121
+
122
+ // 上传图片操作面板
123
+ const activeSheetVisible = ref(false)
124
+ const actionSheetMenus = [
125
+ {
126
+ name: '拍摄',
127
+ type: 'camera',
128
+ },
129
+ {
130
+ name: '从相册选择',
131
+ type: 'album',
132
+ },
133
+ {
134
+ name: '从聊天会话选择',
135
+ type: 'message',
136
+ },
137
+ ]
138
+ if (Taro.getEnv() === 'WEB') {
139
+ actionSheetMenus.pop()
140
+ }
141
+
142
+ // 选择图像上传
143
+ async function chooseImages(item: any) {
144
+ if (['camera', 'album'].includes(item.type)) {
145
+ const csRes = await chooseMedia({
146
+ count: 1,
147
+ sourceType: [item.type], // "camera" | "album"
148
+ maxDuration: 60, // 使用duration属性判断是图片还是视频,图片没有该属性
149
+ })
150
+
151
+ onUploadFile(csRes)
152
+ } else {
153
+ const csRes = await chooseMessageFile({
154
+ count: 1,
155
+ type: 'image',
156
+ })
157
+
158
+ onUploadFile(csRes)
159
+ }
160
+ }
161
+
162
+ async function onUpload() {
163
+ if (props.disabled) return
164
+
165
+ if (Taro.getEnv() === 'WEB') {
166
+ const csRes = await chooseMedia({
167
+ count: 1,
168
+ sourceType: ['album'], // "camera" | "album"
169
+ maxDuration: 60, // 使用duration属性判断是图片还是视频,图片没有该属性
170
+ })
171
+
172
+ onUploadFile(csRes)
173
+ return
174
+ }
175
+
176
+ activeSheetVisible.value = true
177
+ }
178
+
179
+ defineExpose({
180
+ onUpload
181
+ })
182
+ </script>
183
+
184
+ <style lang="scss">
185
+ .ocr-bank {
186
+ width: 24px;
187
+ height: 24px;
188
+ display: inline-flex;
189
+ align-items: center;
190
+
191
+ .ns-icon {
192
+ width: 24px;
193
+ height: 24px;
194
+ }
195
+
196
+ &.disabled {
197
+ .ns-icon {
198
+ filter: brightness(1.5) grayscale(1);
199
+ }
200
+ }
201
+ }
202
+ </style>