@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,1523 +1,1523 @@
1
- # Appkit 组件使用规则
2
-
3
- 本文档详细说明 Appkit 中各组件的使用方法、属性、事件和注意事项。
4
-
5
- ## 目录
6
-
7
- ### 支付模块 (Payment)
8
- - [TradeView - 权益充值视图](#tradeview---权益充值视图)
9
- - [RechargeView - 云豆充值视图](#rechargeview---云豆充值视图)
10
- - [AmountPicker - 金额选择器](#amountpicker---金额选择器)
11
- - [RightsPicker - 权益选择器](#rightspicker---权益选择器)
12
- - [RechargeResult - 充值结果页](#rechargeresult---充值结果页)
13
- - [UserAgreement - 用户协议](#useragreement---用户协议)
14
-
15
- ### 余额模块 (Balance)
16
- - [AccountView - 账户总览](#accountview---账户总览)
17
- - [BalanceCard - 余额卡片](#balancecard---余额卡片)
18
- - [BalanceReminder - 余额提醒](#balancereminder---余额提醒)
19
-
20
- ### 消息通知模块 (Notice)
21
- - [NoticeBanner - 通知横幅](#noticebanner---通知横幅)
22
- - [NoticeList - 消息列表](#noticelist---消息列表)
23
- - [NoticeEntry - 消息入口](#noticeentry---消息入口)
24
- - [NoticePopup - 通知弹窗](#noticepopup---通知弹窗)
25
-
26
- ### 用户模块 (User)
27
- - [UserInfo - 用户信息](#userinfo---用户信息)
28
- - [UserAuth - 用户认证](#userauth---用户认证)
29
- - [UserBinding - 账号绑定](#userbinding---账号绑定)
30
-
31
- ### 注册模块 (Register)
32
- - [SelfRegistration - 自助注册](#selfregistration---自助注册)
33
-
34
- ### 业务场景 (Scenarios)
35
- - [SharePoster - 分享海报](#shareposter---分享海报)
36
-
37
- ### 通用基础组件 (Components)
38
- - [DdSearch - 搜索框](#ddsearch---搜索框)
39
- - [DdIcon - 图标组件](#ddicon---图标组件)
40
- - [DdSkeleton - 骨架屏](#ddskeleton---骨架屏)
41
- - [DdNoticeBar - 滚动通告栏](#ddnoticebar---滚动通告栏)
42
-
43
- ---
44
-
45
- ## TradeView - 权益充值视图
46
-
47
- **功能描述**: 提供权益充值金额选择、云豆支付和组合支付(云豆+微信)的完整支付流程。
48
-
49
- ### 导入方式
50
-
51
- ```typescript
52
- import { TradeView } from '@uxda/appkit/payment'
53
- // 或
54
- import TradeView from '@uxda/appkit/payment/components/TradeView.vue'
55
- ```
56
-
57
- ### Props
58
-
59
- | 属性名 | 类型 | 必填 | 默认值 | 说明 |
60
- |--------|------|------|--------|------|
61
- | `headerApp` | `string` | ✅ | - | header头中的appcode,一般情况下与app参数一致,当无应用权限时,此参数为空 |
62
- | `app` | `string` | ✅ | - | 应用标识,用于区分不同应用(如:'corporateStar'、'riskQueryMulti') |
63
- | `tenant` | `string` | ✅ | - | 租户ID |
64
- | `payFinishJumpUrl` | `string` | ❌ | `''` | H5支付完成后跳转地址 |
65
-
66
- ### Events
67
-
68
- | 事件名 | 参数类型 | 说明 |
69
- |--------|----------|------|
70
- | `complete` | `{ result: boolean \| any, type: string }` | 支付完成时触发<br/>- `result`: 支付结果<br/>- `type`: 支付类型('bean' | 'wePay' | 'combined')<br/> - `'bean'`: 纯云豆支付<br/> - `'wePay'`: 纯微信支付<br/> - `'combined'`: 组合支付(云豆+微信) |
71
- | `agree` | - | 用户点击协议链接时触发,可用于打开协议详情页 |
72
-
73
- ### Slots
74
-
75
- | 插槽名 | 说明 |
76
- |--------|------|
77
- | `banner` | 自定义横幅内容,通常用于展示促销信息或活动内容 |
78
-
79
- ### 使用示例
80
-
81
- ```vue
82
- <template>
83
- <trade-view
84
- header-app="loankitMp"
85
- app="corporateStar"
86
- tenant="1"
87
- pay-finish-jump-url="/pages/success/index"
88
- @complete="handlePayComplete"
89
- @agree="handleAgreeClick"
90
- >
91
- <template #banner>
92
- <div class="promotion-banner">
93
- <p>同样价格,看更多数据</p>
94
- <p>了解AI审批一启明星的全面升级版</p>
95
- </div>
96
- </template>
97
- </trade-view>
98
- </template>
99
-
100
- <script setup>
101
- import { TradeView } from '@uxda/appkit/payment'
102
-
103
- const handlePayComplete = ({ result, type }) => {
104
- console.log('支付完成', { result, type })
105
- if (result) {
106
- // 支付成功处理
107
- if (type === 'bean') {
108
- // 纯云豆支付成功
109
- } else if (type === 'wePay') {
110
- // 纯微信支付成功
111
- } else if (type === 'combined') {
112
- // 组合支付成功
113
- }
114
- }
115
- }
116
-
117
- const handleAgreeClick = () => {
118
- // 打开协议详情页
119
- Taro.navigateTo({
120
- url: '/pages/agreement/index'
121
- })
122
- }
123
- </script>
124
- ```
125
-
126
- ### 功能特性
127
-
128
- #### 1. 云豆支付模式
129
-
130
- - **纯云豆支付**: 当用户选择云豆支付且余额充足时,直接使用云豆完成支付
131
- - **组合支付**: 当用户选择云豆支付但余额不足时,自动启用组合支付模式
132
- - 先扣减全部云豆余额
133
- - 剩余金额通过微信支付完成
134
-
135
- #### 2. 余额不足提示
136
-
137
- 当启用组合支付时,组件会自动显示:
138
- - 余额不足警告:`"云豆余额不足,还需额外支付XX元"`
139
- - 风险提示:`"请在支付完成前确保元豆余额不被消耗,否则本次权益可能购买失败"`
140
-
141
- #### 3. 待支付金额计算
142
-
143
- - 纯云豆支付(余额充足): 显示 `¥0`
144
- - 组合支付(余额不足): 显示额外需要支付的金额
145
- - 纯微信支付: 显示全额
146
-
147
- #### 4. 协议确认
148
-
149
- - 纯云豆支付且余额充足: 不显示协议复选框(无需额外支付)
150
- - 组合支付或纯微信支付: 必须勾选协议才能继续
151
-
152
- ### 注意事项
153
-
154
- 1. **环境要求**
155
- - H5环境:必须在微信浏览器中打开
156
- - 小程序环境:需要配置微信登录权限
157
-
158
- 2. **数据获取**
159
- - 组件挂载后会自动调用接口获取:
160
- - 用户云豆余额
161
- - 权益套餐列表
162
- - 根据 `app` 参数自动选择对应的权益类型:
163
- - `'corporateStar'` → `'riskQueryCompany'`
164
- - 其他 → `'riskQueryMulti'`
165
-
166
- 3. **支付流程**
167
- - 纯云豆支付:点击购买 → 确认对话框 → 调用云豆支付接口
168
- - 组合支付:点击购买 → 确认对话框 → 关闭对话框 → 调用微信支付接口(后端自动处理云豆扣减)
169
- - 纯微信支付:点击购买 → 直接调用微信支付接口
170
-
171
- 4. **错误处理**
172
- - 组件内部已处理常见错误(网络错误、支付失败等)
173
- - 通过 `complete` 事件返回结果,由父组件决定后续操作
174
-
175
- ---
176
-
177
- ## RechargeView - 云豆充值视图
178
-
179
- **功能描述**: 提供云豆充值金额选择和微信支付功能。
180
-
181
- ### 导入方式
182
-
183
- ```typescript
184
- import { RechargeView } from '@uxda/appkit/payment'
185
- ```
186
-
187
- ### Props
188
-
189
- | 属性名 | 类型 | 必填 | 默认值 | 说明 |
190
- |--------|------|------|--------|------|
191
- | `app` | `string` | ✅ | - | 应用标识 |
192
- | `tenant` | `string` | ✅ | - | 租户ID |
193
- | `payFinishJumpUrl` | `string` | ❌ | `''` | H5支付完成后跳转地址 |
194
-
195
- ### Events
196
-
197
- | 事件名 | 参数类型 | 说明 |
198
- |--------|----------|------|
199
- | `complete` | `boolean \| any` | 支付完成时触发,返回支付结果 |
200
- | `agree` | - | 用户点击协议链接时触发 |
201
-
202
- ### 使用示例
203
-
204
- ```vue
205
- <template>
206
- <recharge-view
207
- app="loankitMp"
208
- tenant="1"
209
- pay-finish-jump-url="/pages/recharge-success/index"
210
- @complete="handleRechargeComplete"
211
- @agree="handleAgreeClick"
212
- />
213
- </template>
214
-
215
- <script setup>
216
- import { RechargeView } from '@uxda/appkit/payment'
217
-
218
- const handleRechargeComplete = (result) => {
219
- if (result) {
220
- console.log('充值成功')
221
- // 跳转到成功页或刷新余额
222
- }
223
- }
224
- </script>
225
- ```
226
-
227
- ### 注意事项
228
-
229
- 1. 组件会自动获取充值金额列表
230
- 2. 必须勾选协议才能进行支付
231
- 3. H5环境需要在微信浏览器中打开
232
-
233
- ---
234
-
235
- ## AmountPicker - 金额选择器
236
-
237
- **功能描述**: 用于云豆充值场景的金额选择网格组件。
238
-
239
- ### 导入方式
240
-
241
- ```typescript
242
- import { AmountPicker } from '@uxda/appkit/payment'
243
- ```
244
-
245
- ### Props
246
-
247
- | 属性名 | 类型 | 必填 | 默认值 | 说明 |
248
- |--------|------|------|--------|------|
249
- | `items` | `Amount[]` | ✅ | `[]` | 金额选项列表 |
250
- | `selected` | `number` | ❌ | `0` | 当前选中的索引 |
251
-
252
- ### 类型定义
253
-
254
- ```typescript
255
- type Amount = {
256
- token: number, // 云豆数量
257
- amount: number // 支付金额(元)
258
- }
259
- ```
260
-
261
- ### Events
262
-
263
- | 事件名 | 参数类型 | 说明 |
264
- |--------|----------|------|
265
- | `change` | `number` | 选择改变时触发,返回选中的索引 |
266
-
267
- ### 使用示例
268
-
269
- ```vue
270
- <template>
271
- <amount-picker
272
- :items="amountList"
273
- :selected="selectedIndex"
274
- @change="handleAmountChange"
275
- />
276
- </template>
277
-
278
- <script setup>
279
- import { ref } from 'vue'
280
- import { AmountPicker } from '@uxda/appkit/payment'
281
-
282
- const amountList = ref([
283
- { token: 100, amount: 100 },
284
- { token: 500, amount: 500 },
285
- { token: 1000, amount: 1000 }
286
- ])
287
-
288
- const selectedIndex = ref(0)
289
-
290
- const handleAmountChange = (index) => {
291
- selectedIndex.value = index
292
- console.log('选中金额:', amountList.value[index])
293
- }
294
- </script>
295
- ```
296
-
297
- ### 样式说明
298
-
299
- - 3列网格布局
300
- - 选中项有橙色渐变边框和背景
301
- - 显示云豆图标和金额
302
-
303
- ---
304
-
305
- ## RightsPicker - 权益选择器
306
-
307
- **功能描述**: 用于权益充值场景的权益套餐选择网格组件。
308
-
309
- ### 导入方式
310
-
311
- ```typescript
312
- import { RightsPicker, type Amount } from '@uxda/appkit/payment'
313
- ```
314
-
315
- ### Props
316
-
317
- | 属性名 | 类型 | 必填 | 默认值 | 说明 |
318
- |--------|------|------|--------|------|
319
- | `items` | `Amount[]` | ✅ | `[]` | 权益套餐列表 |
320
- | `selected` | `number` | ❌ | `0` | 当前选中的索引 |
321
-
322
- ### 类型定义
323
-
324
- ```typescript
325
- export type Amount = {
326
- id: string, // 套餐ID
327
- paymentAmount: number, // 支付金额(元)
328
- paymentDesc: string, // 套餐描述(标签文本)
329
- priceRightNum: number // 权益数量(笔数)
330
- }
331
- ```
332
-
333
- ### Events
334
-
335
- | 事件名 | 参数类型 | 说明 |
336
- |--------|----------|------|
337
- | `change` | `number` | 选择改变时触发,返回选中的索引 |
338
-
339
- ### 使用示例
340
-
341
- ```vue
342
- <template>
343
- <rights-picker
344
- :items="rightsList"
345
- :selected="selectedIndex"
346
- @change="handleRightsChange"
347
- />
348
- </template>
349
-
350
- <script setup>
351
- import { ref } from 'vue'
352
- import { RightsPicker, type Amount } from '@uxda/appkit/payment'
353
-
354
- const rightsList = ref<Amount[]>([
355
- {
356
- id: '1',
357
- paymentAmount: 100,
358
- paymentDesc: '推荐',
359
- priceRightNum: 10
360
- },
361
- {
362
- id: '2',
363
- paymentAmount: 500,
364
- paymentDesc: '热销',
365
- priceRightNum: 50
366
- }
367
- ])
368
-
369
- const selectedIndex = ref(0)
370
-
371
- const handleRightsChange = (index) => {
372
- selectedIndex.value = index
373
- }
374
- </script>
375
- ```
376
-
377
- ### 样式说明
378
-
379
- - 3列网格布局
380
- - 每个选项显示:
381
- - 标签(如"推荐"、"热销")
382
- - 权益数量(笔数)
383
- - 支付金额
384
- - 选中项有橙色渐变边框和背景
385
-
386
- ---
387
-
388
- ## RechargeResult - 充值结果页
389
-
390
- **功能描述**: 展示充值或购买成功/失败的结果页面。
391
-
392
- ### 导入方式
393
-
394
- ```typescript
395
- import { RechargeResult } from '@uxda/appkit/payment'
396
- ```
397
-
398
- ### Props
399
-
400
- | 属性名 | 类型 | 必填 | 默认值 | 说明 |
401
- |--------|------|------|--------|------|
402
- | `type` | `string` | ❌ | `'recharge'` | 结果类型<br/>- `'recharge'`: 充值<br/>- `'trade'`: 购买 |
403
- | `payMethod` | `string` | ❌ | `''` | 支付方式<br/>- `'bean'`: 云豆支付<br/>- `'wePay'`: 微信支付 |
404
-
405
- ### Events
406
-
407
- | 事件名 | 参数类型 | 说明 |
408
- |--------|----------|------|
409
- | `dismiss` | - | 点击返回按钮时触发 |
410
-
411
- ### 使用示例
412
-
413
- ```vue
414
- <template>
415
- <recharge-result
416
- type="trade"
417
- pay-method="combined"
418
- @dismiss="handleDismiss"
419
- />
420
- </template>
421
-
422
- <script setup>
423
- import { RechargeResult } from '@uxda/appkit/payment'
424
-
425
- const handleDismiss = () => {
426
- // 返回上一页或跳转到指定页面
427
- Taro.navigateBack()
428
- }
429
- </script>
430
- ```
431
-
432
- ### 显示内容
433
-
434
- 根据 `type` 和 `payMethod` 组合显示不同的文案:
435
-
436
- | type | payMethod | 标题 | 副标题 |
437
- |------|-----------|------|--------|
438
- | `recharge` | - | "充值成功" | "云豆将在1分钟之内到账" |
439
- | `recharge` | `bean` | "充值成功" | "权益已到账" |
440
- | `trade` | - | "购买成功" | "权益将在1分钟之内到账" |
441
- | `trade` | `bean` | "购买成功" | "权益已到账" |
442
-
443
- ---
444
-
445
- ## UserAgreement - 用户协议
446
-
447
- **功能描述**: 展示《大道云平台云豆充值服务协议》的完整内容。
448
-
449
- ### 导入方式
450
-
451
- ```typescript
452
- import { UserAgreement } from '@uxda/appkit/payment'
453
- ```
454
-
455
- ### Props
456
-
457
-
458
-
459
- ### Events
460
-
461
-
462
-
463
- ### 使用示例
464
-
465
- ```vue
466
- <template>
467
- <user-agreement />
468
- </template>
469
-
470
- <script setup>
471
- import { UserAgreement } from '@uxda/appkit/payment'
472
- </script>
473
- ```
474
-
475
- ### 使用场景
476
-
477
- 通常作为独立页面使用,当用户点击协议链接时跳转到此页面:
478
-
479
- ```vue
480
- <template>
481
- <view>
482
- <trade-view @agree="handleAgree" />
483
- </view>
484
- </template>
485
-
486
- <script setup>
487
- import Taro from '@tarojs/taro'
488
-
489
- const handleAgree = () => {
490
- Taro.navigateTo({
491
- url: '/pages/agreement/index'
492
- })
493
- }
494
- </script>
495
- ```
496
-
497
- ---
498
-
499
- ## 组合使用示例
500
-
501
- ### 完整的权益购买流程
502
-
503
- ```vue
504
- <template>
505
- <view class="trade-page">
506
- <!-- 权益选择与支付 -->
507
- <trade-view
508
- v-if="!showResult"
509
- header-app="loankitMp"
510
- app="corporateStar"
511
- tenant="1"
512
- @complete="handlePayComplete"
513
- @agree="showAgreement"
514
- >
515
- <template #banner>
516
- <div class="promotion-banner">
517
- <h3>同样价格,看更多数据</h3>
518
- <p>了解AI审批一启明星的全面升级版</p>
519
- </div>
520
- </template>
521
- </trade-view>
522
-
523
- <!-- 支付结果页 -->
524
- <recharge-result
525
- v-if="showResult"
526
- type="trade"
527
- :pay-method="payMethod"
528
- @dismiss="handleDismiss"
529
- />
530
- </view>
531
- </template>
532
-
533
- <script setup>
534
- import { ref } from 'vue'
535
- import { TradeView, RechargeResult } from '@uxda/appkit/payment'
536
- import Taro from '@tarojs/taro'
537
-
538
- const showResult = ref(false)
539
- const payMethod = ref('')
540
-
541
- const handlePayComplete = ({ result, type }) => {
542
- if (result) {
543
- payMethod.value = type === 'bean' ? 'bean' : 'wePay'
544
- showResult.value = true
545
- }
546
- }
547
-
548
- const showAgreement = () => {
549
- Taro.navigateTo({
550
- url: '/pages/agreement/index'
551
- })
552
- }
553
-
554
- const handleDismiss = () => {
555
- showResult.value = false
556
- // 可以刷新余额或返回上一页
557
- }
558
- </script>
559
- ```
560
-
561
- ---
562
-
563
- ## 常见问题
564
-
565
- ### Q1: 组合支付时,云豆余额如何扣减?
566
-
567
- A: 当用户选择云豆支付但余额不足时,系统会自动启用组合支付。在调用微信支付接口时,后端会自动:
568
- 1. 先扣减用户全部云豆余额
569
- 2. 计算剩余需要支付的金额
570
- 3. 发起微信支付请求(金额为剩余部分)
571
-
572
- ### Q2: 如何判断支付类型?
573
-
574
- A: 通过 `complete` 事件的 `type` 参数判断:
575
- - `'bean'`: 纯云豆支付
576
- - `'wePay'`: 纯微信支付
577
- - `'combined'`: 组合支付
578
-
579
- ### Q3: 协议复选框何时显示?
580
-
581
- A:
582
- - 纯云豆支付且余额充足:不显示(无需额外支付)
583
- - 组合支付:显示(需要微信支付)
584
- - 纯微信支付:显示(需要微信支付)
585
-
586
- ### Q4: H5环境支付失败怎么办?
587
-
588
- A: 确保:
589
- 1. 在微信浏览器中打开
590
- 2. 已正确配置 `payFinishJumpUrl`
591
- 3. 检查网络连接和接口权限
592
-
593
- ### Q5: 如何自定义横幅内容?
594
-
595
- A: 使用 `banner` 插槽:
596
-
597
- ```vue
598
- <trade-view>
599
- <template #banner>
600
- <div class="custom-banner">
601
- <!-- 自定义内容 -->
602
- </div>
603
- </template>
604
- </trade-view>
605
- ```
606
-
607
- ---
608
-
609
- ## 更新日志
610
-
611
- ### v1.1.0 (最新)
612
- - ✅ 新增组合支付功能(云豆+微信)
613
- - ✅ 新增余额不足警告提示
614
- - ✅ 优化待支付金额计算逻辑
615
- - ✅ 完善确认对话框显示内容
616
-
617
- ### v1.0.0
618
- - ✅ 基础支付功能
619
- - ✅ 云豆支付支持
620
- - ✅ 微信支付支持
621
-
622
- ---
623
-
624
- # 余额模块组件使用规则
625
-
626
- ## AccountView - 账户总览
627
-
628
- **功能描述**: 展示用户账户余额、权益信息及收支明细的完整账户页面。
629
-
630
- ### 导入方式
631
-
632
- ```typescript
633
- import { AccountView } from '@uxda/appkit/balance'
634
- ```
635
-
636
- ### Props
637
-
638
- | 属性名 | 类型 | 必填 | 默认值 | 说明 |
639
- |--------|------|------|--------|------|
640
- | `app` | `string` | ✅ | `''` | 应用标识 |
641
-
642
- ### Events
643
-
644
- | 事件名 | 参数类型 | 说明 |
645
- |--------|----------|------|
646
- | `recharge` | - | 点击充值按钮时触发 |
647
- | `trade` | `item: any` | 点击权益充值按钮时触发,返回权益项信息 |
648
-
649
- ### 使用示例
650
-
651
- ```vue
652
- <template>
653
- <account-view
654
- app="loankitMp"
655
- @recharge="handleRecharge"
656
- @trade="handleTrade"
657
- />
658
- </template>
659
-
660
- <script setup>
661
- import { AccountView } from '@uxda/appkit/balance'
662
-
663
- const handleRecharge = () => {
664
- // 跳转到充值页面
665
- Taro.navigateTo({
666
- url: '/pages/recharge/index'
667
- })
668
- }
669
-
670
- const handleTrade = (item) => {
671
- // 跳转到权益充值页面
672
- Taro.navigateTo({
673
- url: `/pages/trade/index?id=${item.id}`
674
- })
675
- }
676
- </script>
677
- ```
678
-
679
- ### 功能特性
680
-
681
- 1. **余额展示**: 显示云豆总余额
682
- 2. **权益展示**: 展示各类权益(企明星、AI审批、电子签约等)
683
- 3. **收支明细**: 支持查看收支明细,包含筛选和分页功能
684
- 4. **规则说明**: 支持查看消费规则说明
685
-
686
- ### 注意事项
687
-
688
- - 组件挂载后会自动获取余额和权益信息
689
- - 支持下拉刷新余额数据
690
- - 收支明细支持时间筛选和多条件筛选
691
-
692
- ---
693
-
694
- ## BalanceCard - 余额卡片
695
-
696
- **功能描述**: 用于在首页或个人中心展示余额的卡片组件。
697
-
698
- ### 导入方式
699
-
700
- ```typescript
701
- import { BalanceCard } from '@uxda/appkit/balance'
702
- ```
703
-
704
- ### Props
705
-
706
- | 属性名 | 类型 | 必填 | 默认值 | 说明 |
707
- |--------|------|------|--------|------|
708
- | `app` | `string` | ✅ | `''` | 应用标识 |
709
-
710
- ### Events
711
-
712
- | 事件名 | 参数类型 | 说明 |
713
- |--------|----------|------|
714
- | `drill` | - | 点击账户明细时触发 |
715
- | `recharge` | - | 点击充值按钮时触发 |
716
-
717
- ### 使用示例
718
-
719
- ```vue
720
- <template>
721
- <balance-card
722
- app="loankitMp"
723
- @drill="handleDrill"
724
- @recharge="handleRecharge"
725
- />
726
- </template>
727
-
728
- <script setup>
729
- import { BalanceCard } from '@uxda/appkit/balance'
730
-
731
- const handleDrill = () => {
732
- Taro.navigateTo({
733
- url: '/pages/account/index'
734
- })
735
- }
736
-
737
- const handleRecharge = () => {
738
- Taro.navigateTo({
739
- url: '/pages/recharge/index'
740
- })
741
- }
742
- </script>
743
- ```
744
-
745
- ### 暴露方法
746
-
747
- | 方法名 | 说明 |
748
- |--------|------|
749
- | `reload` | 重新加载余额数据 |
750
-
751
- ```vue
752
- <script setup>
753
- import { ref } from 'vue'
754
- import { BalanceCard } from '@uxda/appkit/balance'
755
-
756
- const balanceCardRef = ref()
757
-
758
- const refreshBalance = () => {
759
- balanceCardRef.value?.reload()
760
- }
761
- </script>
762
-
763
- <template>
764
- <balance-card ref="balanceCardRef" app="loankitMp" />
765
- </template>
766
- ```
767
-
768
- ---
769
-
770
- ## BalanceReminder - 余额提醒
771
-
772
- **功能描述**: 当余额不足时显示的提示弹窗组件。
773
-
774
- ### 导入方式
775
-
776
- ```typescript
777
- import { BalanceReminder } from '@uxda/appkit/balance'
778
- ```
779
-
780
- ### Props
781
-
782
- | 属性名 | 类型 | 必填 | 默认值 | 说明 |
783
- |--------|------|------|--------|------|
784
- | `modelValue` | `boolean` | ✅ | `false` | 控制弹窗显示/隐藏(v-model) |
785
- | `buttonText` | `string` | ❌ | `'去充值'` | 按钮文本 |
786
- | `tip` | `string` | ❌ | `'您的账户可用余额不足,请充值后再进行查询'` | 提示文本 |
787
-
788
- ### Events
789
-
790
- | 事件名 | 参数类型 | 说明 |
791
- |--------|----------|------|
792
- | `update:modelValue` | `boolean` | v-model 更新事件 |
793
- | `recharge` | - | 点击充值按钮时触发 |
794
-
795
- ### 使用示例
796
-
797
- ```vue
798
- <template>
799
- <balance-reminder
800
- v-model="showReminder"
801
- button-text="立即充值"
802
- tip="余额不足,请充值"
803
- @recharge="handleRecharge"
804
- />
805
- </template>
806
-
807
- <script setup>
808
- import { ref } from 'vue'
809
- import { BalanceReminder } from '@uxda/appkit/balance'
810
-
811
- const showReminder = ref(false)
812
-
813
- const handleRecharge = () => {
814
- showReminder.value = false
815
- Taro.navigateTo({
816
- url: '/pages/recharge/index'
817
- })
818
- }
819
- </script>
820
- ```
821
-
822
- ---
823
-
824
- # 消息通知模块组件使用规则
825
-
826
- ## NoticeBanner - 通知横幅
827
-
828
- **功能描述**: 页面顶部或嵌入式的通告栏,支持多条消息轮播和强制弹窗。
829
-
830
- ### 导入方式
831
-
832
- ```typescript
833
- import { NoticeBanner } from '@uxda/appkit/notice'
834
- ```
835
-
836
- ### Props
837
-
838
- | 属性名 | 类型 | 必填 | 默认值 | 说明 |
839
- |--------|------|------|--------|------|
840
- | `app` | `string` | ✅ | `''` | 应用标识 |
841
- | `bannerStyle` | `any` | ❌ | `''` | 横幅样式 |
842
- | `fixed` | `boolean` | ❌ | `false` | 是否固定定位 |
843
- | `device` | `string` | ❌ | `'MINI'` | 设备类型 |
844
-
845
- ### Events
846
-
847
- | 事件名 | 参数类型 | 说明 |
848
- |--------|----------|------|
849
- | `detail` | `item: any` | 点击详情时触发 |
850
- | `close` | - | 关闭横幅时触发 |
851
- | `view` | `link: string` | 查看附件时触发 |
852
- | `popup` | `hasPopup: boolean` | 弹窗状态变化时触发 |
853
- | `hasBanner` | `hasBanner: boolean` | 横幅状态变化时触发 |
854
-
855
- ### 使用示例
856
-
857
- ```vue
858
- <template>
859
- <notice-banner
860
- app="loankitMp"
861
- :fixed="true"
862
- @detail="handleDetail"
863
- @view="handleView"
864
- />
865
- </template>
866
-
867
- <script setup>
868
- import { NoticeBanner } from '@uxda/appkit/notice'
869
-
870
- const handleDetail = (item) => {
871
- // 跳转到消息详情页
872
- Taro.navigateTo({
873
- url: `/pages/notice/detail?id=${item.id}`
874
- })
875
- }
876
-
877
- const handleView = (link) => {
878
- // 打开附件链接
879
- Taro.navigateTo({
880
- url: `/pages/webview/index?url=${encodeURIComponent(link)}`
881
- })
882
- }
883
- </script>
884
- ```
885
-
886
- ### 功能特性
887
-
888
- 1. **消息轮播**: 多条横幅消息自动轮播(3秒间隔)
889
- 2. **手势控制**: 触摸时暂停轮播,离开后恢复
890
- 3. **强制弹窗**: 系统公告类型的消息会以弹窗形式强制显示
891
- 4. **自动获取**: 组件挂载后自动获取当前应用的消息
892
-
893
- ---
894
-
895
- ## NoticeList - 消息列表
896
-
897
- **功能描述**: 展示历史消息记录,支持搜索、筛选和分页。
898
-
899
- ### 导入方式
900
-
901
- ```typescript
902
- import { NoticeList } from '@uxda/appkit/notice'
903
- ```
904
-
905
- ### Props
906
-
907
- | 属性名 | 类型 | 必填 | 默认值 | 说明 |
908
- |--------|------|------|--------|------|
909
- | `app` | `string` | ✅ | `''` | 应用标识 |
910
- | `userId` | `string` | ✅ | `''` | 用户ID |
911
- | `showApp` | `boolean` | ❌ | `false` | 是否显示应用标签 |
912
- | `checkBeforeRead` | `Function` | ❌ | - | 读取前的检查函数,返回 false 则阻止读取 |
913
-
914
- ### Events
915
-
916
- | 事件名 | 参数类型 | 说明 |
917
- |--------|----------|------|
918
- | `view` | `link: string` | 查看附件时触发 |
919
-
920
- ### 使用示例
921
-
922
- ```vue
923
- <template>
924
- <notice-list
925
- app="loankitMp"
926
- :user-id="userId"
927
- :show-app="true"
928
- :check-before-read="checkRead"
929
- @view="handleView"
930
- />
931
- </template>
932
-
933
- <script setup>
934
- import { NoticeList } from '@uxda/appkit/notice'
935
-
936
- const userId = '123456'
937
-
938
- const checkRead = (notice, index) => {
939
- // 可以在这里添加读取前的逻辑检查
940
- return true
941
- }
942
-
943
- const handleView = (link) => {
944
- Taro.navigateTo({
945
- url: `/pages/webview/index?url=${encodeURIComponent(link)}`
946
- })
947
- }
948
- </script>
949
- ```
950
-
951
- ### 功能特性
952
-
953
- 1. **搜索功能**: 支持关键字搜索消息
954
- 2. **下拉刷新**: 支持下拉刷新消息列表
955
- 3. **上拉加载**: 自动分页加载更多消息
956
- 4. **已读标记**: 自动标记消息为已读
957
- 5. **时间显示**: 智能显示相对时间(如"5分钟前")或绝对时间
958
-
959
- ---
960
-
961
- ## NoticeEntry - 消息入口
962
-
963
- **功能描述**: 通常带红点或未读数的消息中心入口图标。
964
-
965
- ### 导入方式
966
-
967
- ```typescript
968
- import { NoticeEntry } from '@uxda/appkit/notice'
969
- ```
970
-
971
- ### Props
972
-
973
- 待补充(需要查看组件实现)
974
-
975
- ### Events
976
-
977
- 待补充
978
-
979
- ---
980
-
981
- ## NoticePopup - 通知弹窗
982
-
983
- **功能描述**: 强提醒类型的消息弹窗。
984
-
985
- ### 导入方式
986
-
987
- ```typescript
988
- import { NoticePopup } from '@uxda/appkit/notice'
989
- ```
990
-
991
- ### Props
992
-
993
- 待补充(需要查看组件实现)
994
-
995
- ### Events
996
-
997
- 待补充
998
-
999
- ---
1000
-
1001
- # 用户模块组件使用规则
1002
-
1003
- ## UserInfo - 用户信息
1004
-
1005
- **功能描述**: 展示用户头像、昵称、认证信息、企业/团队信息等完整用户资料页面。
1006
-
1007
- ### 导入方式
1008
-
1009
- ```typescript
1010
- import { UserInfo } from '@uxda/appkit/user'
1011
- ```
1012
-
1013
- ### Props
1014
-
1015
- | 属性名 | 类型 | 必填 | 默认值 | 说明 |
1016
- |--------|------|------|--------|------|
1017
- | `miniType` | `string` | ❌ | `'05'` | 小程序类型 |
1018
- | `app` | `string` | ❌ | `''` | 应用标识 |
1019
- | `userId` | `string` | ✅ | `''` | 用户ID |
1020
- | `hasQiyezuhu` | `number` | ❌ | `0` | 是否有企业租户 |
1021
- | `isPersonal` | `number` | ❌ | `0` | 是否个人用户 |
1022
-
1023
- ### Events
1024
-
1025
- | 事件名 | 参数类型 | 说明 |
1026
- |--------|----------|------|
1027
- | `avatar-success` | `avatar: string` | 头像上传成功时触发 |
1028
- | `logout` | - | 退出登录时触发 |
1029
- | `crop` | `filePath: string` | 需要裁剪头像时触发 |
1030
- | `binding` | `mobile: string` | 点击绑定手机号时触发 |
1031
- | `username-success` | - | 用户名修改成功时触发 |
1032
- | `auth` | `userId: string, verifyResult: number, mobile: string` | 点击认证信息时触发 |
1033
-
1034
- ### 使用示例
1035
-
1036
- ```vue
1037
- <template>
1038
- <user-info
1039
- :user-id="userId"
1040
- :has-qiyezuhu="1"
1041
- :is-personal="1"
1042
- @logout="handleLogout"
1043
- @binding="handleBinding"
1044
- @auth="handleAuth"
1045
- @crop="handleCrop"
1046
- />
1047
- </template>
1048
-
1049
- <script setup>
1050
- import { UserInfo } from '@uxda/appkit/user'
1051
- import Taro from '@tarojs/taro'
1052
-
1053
- const userId = '123456'
1054
-
1055
- const handleLogout = () => {
1056
- // 清除登录状态并跳转到登录页
1057
- Taro.reLaunch({
1058
- url: '/pages/login/index'
1059
- })
1060
- }
1061
-
1062
- const handleBinding = (mobile) => {
1063
- Taro.navigateTo({
1064
- url: `/pages/binding/index?mobile=${mobile}`
1065
- })
1066
- }
1067
-
1068
- const handleAuth = (userId, verifyResult, mobile) => {
1069
- Taro.navigateTo({
1070
- url: `/pages/auth/index?userId=${userId}&verifyResult=${verifyResult}&mobile=${mobile}`
1071
- })
1072
- }
1073
-
1074
- const handleCrop = (filePath) => {
1075
- // 跳转到头像裁剪页
1076
- Taro.navigateTo({
1077
- url: `/pages/crop/index?filePath=${filePath}`
1078
- })
1079
- }
1080
- </script>
1081
- ```
1082
-
1083
- ### 暴露方法
1084
-
1085
- | 方法名 | 说明 |
1086
- |--------|------|
1087
- | `updateImage` | 更新头像图片 |
1088
-
1089
- ---
1090
-
1091
- ## UserAuth - 用户认证
1092
-
1093
- **功能描述**: 处理用户身份认证的表单组件,支持OCR识别身份证。
1094
-
1095
- ### 导入方式
1096
-
1097
- ```typescript
1098
- import { UserAuth } from '@uxda/appkit/user'
1099
- ```
1100
-
1101
- ### Props
1102
-
1103
- | 属性名 | 类型 | 必填 | 默认值 | 说明 |
1104
- |--------|------|------|--------|------|
1105
- | `userId` | `string` | ✅ | `''` | 用户ID |
1106
- | `verifyResult` | `number` | ❌ | `-1` | 认证状态(-1: 未认证, 0: 已失效, 1: 已认证) |
1107
- | `mobile` | `string` | ❌ | `''` | 手机号码 |
1108
-
1109
- ### Events
1110
-
1111
- | 事件名 | 参数类型 | 说明 |
1112
- |--------|----------|------|
1113
- | `toAgreement` | - | 点击协议链接时触发 |
1114
-
1115
- ### 使用示例
1116
-
1117
- ```vue
1118
- <template>
1119
- <user-auth
1120
- :user-id="userId"
1121
- :verify-result="verifyResult"
1122
- :mobile="mobile"
1123
- @to-agreement="handleAgreement"
1124
- />
1125
- </template>
1126
-
1127
- <script setup>
1128
- import { UserAuth } from '@uxda/appkit/user'
1129
-
1130
- const userId = '123456'
1131
- const verifyResult = -1
1132
- const mobile = '13800138000'
1133
-
1134
- const handleAgreement = () => {
1135
- Taro.navigateTo({
1136
- url: '/pages/agreement/index'
1137
- })
1138
- }
1139
- </script>
1140
- ```
1141
-
1142
- ### 功能特性
1143
-
1144
- 1. **OCR识别**: 支持拍照识别身份证信息
1145
- 2. **表单验证**: 自动验证身份证号码格式
1146
- 3. **已认证状态**: 已认证用户显示只读模式
1147
-
1148
- ---
1149
-
1150
- ## UserBinding - 账号绑定
1151
-
1152
- **功能描述**: 换绑手机号的流程组件,包含身份认证和换绑两个步骤。
1153
-
1154
- ### 导入方式
1155
-
1156
- ```typescript
1157
- import { UserBinding } from '@uxda/appkit/user'
1158
- ```
1159
-
1160
- ### Props
1161
-
1162
- 无(通过路由参数传递 `mobile`)
1163
-
1164
- ### Events
1165
-
1166
- | 事件名 | 参数类型 | 说明 |
1167
- |--------|----------|------|
1168
- | `success` | `mobile: string` | 换绑成功时触发,返回新手机号 |
1169
-
1170
- ### 使用示例
1171
-
1172
- ```vue
1173
- <template>
1174
- <user-binding @success="handleSuccess" />
1175
- </template>
1176
-
1177
- <script setup>
1178
- import { UserBinding } from '@uxda/appkit/user'
1179
- import Taro from '@tarojs/taro'
1180
-
1181
- const handleSuccess = (mobile) => {
1182
- Taro.showToast({
1183
- title: `换绑成功:${mobile}`,
1184
- icon: 'success'
1185
- })
1186
- setTimeout(() => {
1187
- Taro.navigateBack()
1188
- }, 1500)
1189
- }
1190
- </script>
1191
- ```
1192
-
1193
- ### 路由参数
1194
-
1195
- | 参数名 | 类型 | 必填 | 说明 |
1196
- |--------|------|------|------|
1197
- | `mobile` | `string` | ✅ | 当前手机号 |
1198
-
1199
- ### 使用场景
1200
-
1201
- ```typescript
1202
- // 跳转到换绑页面
1203
- Taro.navigateTo({
1204
- url: `/pages/binding/index?mobile=${currentMobile}`
1205
- })
1206
- ```
1207
-
1208
- ---
1209
-
1210
- # 注册模块组件使用规则
1211
-
1212
- ## SelfRegistration - 自助注册
1213
-
1214
- **功能描述**: 引导新用户完成注册流程的组件,支持个人和公司两种使用场景。
1215
-
1216
- ### 导入方式
1217
-
1218
- ```typescript
1219
- import { SelfRegistration } from '@uxda/appkit/register'
1220
- ```
1221
-
1222
- ### Props
1223
-
1224
- | 属性名 | 类型 | 必填 | 默认值 | 说明 |
1225
- |--------|------|------|--------|------|
1226
- | `banner` | `string` | ❌ | `'https://cdn.ddjf.com/static/images/wx-yunservice/ai-form-bg2.png'` | 顶部横幅图片 |
1227
-
1228
- ### Events
1229
-
1230
- | 事件名 | 参数类型 | 说明 |
1231
- |--------|----------|------|
1232
- | `submit` | `params: object` | 提交注册信息时触发 |
1233
-
1234
- ### 使用示例
1235
-
1236
- ```vue
1237
- <template>
1238
- <self-registration
1239
- banner="/static/images/custom-banner.png"
1240
- @submit="handleSubmit"
1241
- />
1242
- </template>
1243
-
1244
- <script setup>
1245
- import { SelfRegistration } from '@uxda/appkit/register'
1246
-
1247
- const handleSubmit = (params) => {
1248
- console.log('注册信息:', params)
1249
- // {
1250
- // useCase: 'person' | 'company',
1251
- // customerName: string,
1252
- // idCardNo?: string, // 个人场景
1253
- // customerPosition?: string, // 公司场景
1254
- // companyName?: string, // 公司场景
1255
- // customerArea?: string // 公司场景
1256
- // }
1257
-
1258
- // 调用注册接口
1259
- // ...
1260
- }
1261
- </script>
1262
- ```
1263
-
1264
- ### 功能特性
1265
-
1266
- 1. **双场景支持**: 支持个人使用和公司使用两种场景
1267
- 2. **OCR识别**: 支持拍照识别身份证信息
1268
- 3. **表单验证**: 自动验证必填项和格式
1269
- 4. **地区选择**: 公司场景支持省市区选择
1270
-
1271
- ---
1272
-
1273
- # 业务场景组件使用规则
1274
-
1275
- ## SharePoster - 分享海报
1276
-
1277
- **功能描述**: 生成包含二维码和营销信息的图片,用于朋友圈分享。
1278
-
1279
- ### 导入方式
1280
-
1281
- ```typescript
1282
- import { SharePoster } from '@uxda/appkit/scenarios'
1283
- ```
1284
-
1285
- ### Props
1286
-
1287
- | 属性名 | 类型 | 必填 | 默认值 | 说明 |
1288
- |--------|------|------|--------|------|
1289
- | `posters` | `any[]` | ✅ | - | 海报列表 |
1290
- | `text` | `string` | ❌ | - | 底部提示文本 |
1291
-
1292
- ### Events
1293
-
1294
- | 事件名 | 参数类型 | 说明 |
1295
- |--------|----------|------|
1296
- | `share` | - | 点击确定分享时触发 |
1297
-
1298
- ### 使用示例
1299
-
1300
- ```vue
1301
- <template>
1302
- <share-poster
1303
- :posters="posterList"
1304
- text="长按保存图片,分享到朋友圈"
1305
- @share="handleShare"
1306
- />
1307
- </template>
1308
-
1309
- <script setup>
1310
- import { SharePoster } from '@uxda/appkit/scenarios'
1311
-
1312
- const posterList = [
1313
- // 海报配置对象
1314
- ]
1315
-
1316
- const handleShare = () => {
1317
- // 处理分享逻辑
1318
- }
1319
- </script>
1320
- ```
1321
-
1322
- ---
1323
-
1324
- # 通用基础组件使用规则
1325
-
1326
- ## DdSearch - 搜索框
1327
-
1328
- **功能描述**: 支持导航栏模式的搜索框,带有搜索回调和防抖功能。
1329
-
1330
- ### 导入方式
1331
-
1332
- ```typescript
1333
- import DdSearch from '@uxda/appkit/components/dd-search/index.vue'
1334
- ```
1335
-
1336
- ### Props
1337
-
1338
- | 属性名 | 类型 | 必填 | 默认值 | 说明 |
1339
- |--------|------|------|--------|------|
1340
- | `disabled` | `boolean` | ❌ | `false` | 是否禁用 |
1341
- | `placeholder` | `string` | ❌ | `'请输入'` | 输入框占位符 |
1342
- | `value` | `string` | ❌ | `''` | 绑定值 |
1343
- | `bordered` | `boolean` | ❌ | `true` | 是否显示底部边框 |
1344
- | `inNavbar` | `boolean` | ❌ | `false` | 是否在导航栏中 |
1345
- | `focus` | `boolean` | ❌ | `false` | 是否自动聚焦 |
1346
-
1347
- ### Events
1348
-
1349
- | 事件名 | 参数类型 | 说明 |
1350
- |--------|----------|------|
1351
- | `search` | `value: string` | 点击搜索时触发 |
1352
- | `focus` | `event: Event` | 输入框聚焦时触发 |
1353
-
1354
- ### 使用示例
1355
-
1356
- ```vue
1357
- <template>
1358
- <dd-search
1359
- :bordered="false"
1360
- :in-navbar="true"
1361
- :value="searchStr"
1362
- placeholder="输入客户姓名"
1363
- @search="onSearch"
1364
- @focus="onSearchFocus"
1365
- />
1366
- </template>
1367
-
1368
- <script setup>
1369
- import { ref } from 'vue'
1370
- import DdSearch from '@uxda/appkit/components/dd-search/index.vue'
1371
-
1372
- const searchStr = ref('')
1373
-
1374
- const onSearch = (value) => {
1375
- console.log('搜索:', value)
1376
- }
1377
-
1378
- const onSearchFocus = (event) => {
1379
- console.log('聚焦:', event)
1380
- }
1381
- </script>
1382
- ```
1383
-
1384
- ---
1385
-
1386
- ## DdIcon - 图标组件
1387
-
1388
- **功能描述**: 项目统一的图标封装,使用 iconfont 图标。
1389
-
1390
- ### 导入方式
1391
-
1392
- ```typescript
1393
- import DdIcon from '@uxda/appkit/components/dd-icon/index.vue'
1394
- ```
1395
-
1396
- ### Props
1397
-
1398
- | 属性名 | 类型 | 必填 | 默认值 | 说明 |
1399
- |--------|------|------|--------|------|
1400
- | `name` | `string` | ✅ | `''` | icon 名称 |
1401
- | `color` | `string` | ❌ | `inherit` | icon 颜色 |
1402
- | `size` | `string` | ❌ | `16px` | icon 字体大小 |
1403
- | `weight` | `string` | ❌ | `normal` | icon 字体字重 |
1404
-
1405
- ### 使用示例
1406
-
1407
- ```vue
1408
- <template>
1409
- <dd-icon name="icon-arrow" size="11px" color="#DFDFDF" />
1410
- </template>
1411
-
1412
- <script setup>
1413
- import DdIcon from '@uxda/appkit/components/dd-icon/index.vue'
1414
- </script>
1415
- ```
1416
-
1417
- ---
1418
-
1419
- ## DdSkeleton - 骨架屏
1420
-
1421
- **功能描述**: 数据加载过程中的占位显示,提升用户体验。
1422
-
1423
- ### 导入方式
1424
-
1425
- ```typescript
1426
- import DdSkeleton from '@uxda/appkit/components/dd-skeleton/index.vue'
1427
- ```
1428
-
1429
- ### Props
1430
-
1431
- 待补充(需要查看组件实现)
1432
-
1433
- ### 使用示例
1434
-
1435
- ```vue
1436
- <template>
1437
- <dd-skeleton v-if="loading" :row="3" />
1438
- <div v-else>
1439
- <!-- 实际内容 -->
1440
- </div>
1441
- </template>
1442
-
1443
- <script setup>
1444
- import { ref } from 'vue'
1445
- import DdSkeleton from '@uxda/appkit/components/dd-skeleton/index.vue'
1446
-
1447
- const loading = ref(true)
1448
- </script>
1449
- ```
1450
-
1451
- ---
1452
-
1453
- ## DdNoticeBar - 滚动通告栏
1454
-
1455
- **功能描述**: 用于显示简短的滚动消息。
1456
-
1457
- ### 导入方式
1458
-
1459
- ```typescript
1460
- import DdNoticeBar from '@uxda/appkit/components/dd-notice-bar/index.vue'
1461
- ```
1462
-
1463
- ### Props
1464
-
1465
- 待补充(需要查看组件实现)
1466
-
1467
- ### 使用示例
1468
-
1469
- ```vue
1470
- <template>
1471
- <dd-notice-bar :show-close="true" @close="handleClose">
1472
- 这是一条滚动通告消息
1473
- </dd-notice-bar>
1474
- </template>
1475
-
1476
- <script setup>
1477
- import DdNoticeBar from '@uxda/appkit/components/dd-notice-bar/index.vue'
1478
-
1479
- const handleClose = () => {
1480
- console.log('关闭通告')
1481
- }
1482
- </script>
1483
- ```
1484
-
1485
- ---
1486
-
1487
- ## 其他通用组件
1488
-
1489
- ### DdArea - 地区选择器
1490
-
1491
- 省市区三级联动选择组件。
1492
-
1493
- ### DdSelector - 通用选择器
1494
-
1495
- 下拉或弹窗式的单选/多选组件。
1496
-
1497
- ### BtCropper - 图片裁剪器
1498
-
1499
- 基于 canvas 的高性能图片裁剪工具。
1500
-
1501
- ---
1502
-
1503
- ## 更新日志
1504
-
1505
- ### v1.2.0
1506
- - ✅ 补全余额模块组件文档
1507
- - ✅ 补全消息通知模块组件文档
1508
- - ✅ 补全用户模块组件文档
1509
- - ✅ 补全注册模块组件文档
1510
- - ✅ 补全业务场景组件文档
1511
- - ✅ 补全通用基础组件文档
1512
-
1513
- ### v1.1.0
1514
- - ✅ 新增组合支付功能(云豆+微信)
1515
- - ✅ 新增余额不足警告提示
1516
- - ✅ 优化待支付金额计算逻辑
1517
- - ✅ 完善确认对话框显示内容
1518
-
1519
- ### v1.0.0
1520
- - ✅ 基础支付功能
1521
- - ✅ 云豆支付支持
1522
- - ✅ 微信支付支持
1523
-
1
+ # Appkit 组件使用规则
2
+
3
+ 本文档详细说明 Appkit 中各组件的使用方法、属性、事件和注意事项。
4
+
5
+ ## 目录
6
+
7
+ ### 支付模块 (Payment)
8
+ - [TradeView - 权益充值视图](#tradeview---权益充值视图)
9
+ - [RechargeView - 云豆充值视图](#rechargeview---云豆充值视图)
10
+ - [AmountPicker - 金额选择器](#amountpicker---金额选择器)
11
+ - [RightsPicker - 权益选择器](#rightspicker---权益选择器)
12
+ - [RechargeResult - 充值结果页](#rechargeresult---充值结果页)
13
+ - [UserAgreement - 用户协议](#useragreement---用户协议)
14
+
15
+ ### 余额模块 (Balance)
16
+ - [AccountView - 账户总览](#accountview---账户总览)
17
+ - [BalanceCard - 余额卡片](#balancecard---余额卡片)
18
+ - [BalanceReminder - 余额提醒](#balancereminder---余额提醒)
19
+
20
+ ### 消息通知模块 (Notice)
21
+ - [NoticeBanner - 通知横幅](#noticebanner---通知横幅)
22
+ - [NoticeList - 消息列表](#noticelist---消息列表)
23
+ - [NoticeEntry - 消息入口](#noticeentry---消息入口)
24
+ - [NoticePopup - 通知弹窗](#noticepopup---通知弹窗)
25
+
26
+ ### 用户模块 (User)
27
+ - [UserInfo - 用户信息](#userinfo---用户信息)
28
+ - [UserAuth - 用户认证](#userauth---用户认证)
29
+ - [UserBinding - 账号绑定](#userbinding---账号绑定)
30
+
31
+ ### 注册模块 (Register)
32
+ - [SelfRegistration - 自助注册](#selfregistration---自助注册)
33
+
34
+ ### 业务场景 (Scenarios)
35
+ - [SharePoster - 分享海报](#shareposter---分享海报)
36
+
37
+ ### 通用基础组件 (Components)
38
+ - [DdSearch - 搜索框](#ddsearch---搜索框)
39
+ - [DdIcon - 图标组件](#ddicon---图标组件)
40
+ - [DdSkeleton - 骨架屏](#ddskeleton---骨架屏)
41
+ - [DdNoticeBar - 滚动通告栏](#ddnoticebar---滚动通告栏)
42
+
43
+ ---
44
+
45
+ ## TradeView - 权益充值视图
46
+
47
+ **功能描述**: 提供权益充值金额选择、云豆支付和组合支付(云豆+微信)的完整支付流程。
48
+
49
+ ### 导入方式
50
+
51
+ ```typescript
52
+ import { TradeView } from '@uxda/appkit/payment'
53
+ // 或
54
+ import TradeView from '@uxda/appkit/payment/components/TradeView.vue'
55
+ ```
56
+
57
+ ### Props
58
+
59
+ | 属性名 | 类型 | 必填 | 默认值 | 说明 |
60
+ |--------|------|------|--------|------|
61
+ | `headerApp` | `string` | ✅ | - | header头中的appcode,一般情况下与app参数一致,当无应用权限时,此参数为空 |
62
+ | `app` | `string` | ✅ | - | 应用标识,用于区分不同应用(如:'corporateStar'、'riskQueryMulti') |
63
+ | `tenant` | `string` | ✅ | - | 租户ID |
64
+ | `payFinishJumpUrl` | `string` | ❌ | `''` | H5支付完成后跳转地址 |
65
+
66
+ ### Events
67
+
68
+ | 事件名 | 参数类型 | 说明 |
69
+ |--------|----------|------|
70
+ | `complete` | `{ result: boolean \| any, type: string }` | 支付完成时触发<br/>- `result`: 支付结果<br/>- `type`: 支付类型('bean' | 'wePay' | 'combined')<br/> - `'bean'`: 纯云豆支付<br/> - `'wePay'`: 纯微信支付<br/> - `'combined'`: 组合支付(云豆+微信) |
71
+ | `agree` | - | 用户点击协议链接时触发,可用于打开协议详情页 |
72
+
73
+ ### Slots
74
+
75
+ | 插槽名 | 说明 |
76
+ |--------|------|
77
+ | `banner` | 自定义横幅内容,通常用于展示促销信息或活动内容 |
78
+
79
+ ### 使用示例
80
+
81
+ ```vue
82
+ <template>
83
+ <trade-view
84
+ header-app="loankitMp"
85
+ app="corporateStar"
86
+ tenant="1"
87
+ pay-finish-jump-url="/pages/success/index"
88
+ @complete="handlePayComplete"
89
+ @agree="handleAgreeClick"
90
+ >
91
+ <template #banner>
92
+ <div class="promotion-banner">
93
+ <p>同样价格,看更多数据</p>
94
+ <p>了解AI审批一启明星的全面升级版</p>
95
+ </div>
96
+ </template>
97
+ </trade-view>
98
+ </template>
99
+
100
+ <script setup>
101
+ import { TradeView } from '@uxda/appkit/payment'
102
+
103
+ const handlePayComplete = ({ result, type }) => {
104
+ console.log('支付完成', { result, type })
105
+ if (result) {
106
+ // 支付成功处理
107
+ if (type === 'bean') {
108
+ // 纯云豆支付成功
109
+ } else if (type === 'wePay') {
110
+ // 纯微信支付成功
111
+ } else if (type === 'combined') {
112
+ // 组合支付成功
113
+ }
114
+ }
115
+ }
116
+
117
+ const handleAgreeClick = () => {
118
+ // 打开协议详情页
119
+ Taro.navigateTo({
120
+ url: '/pages/agreement/index'
121
+ })
122
+ }
123
+ </script>
124
+ ```
125
+
126
+ ### 功能特性
127
+
128
+ #### 1. 云豆支付模式
129
+
130
+ - **纯云豆支付**: 当用户选择云豆支付且余额充足时,直接使用云豆完成支付
131
+ - **组合支付**: 当用户选择云豆支付但余额不足时,自动启用组合支付模式
132
+ - 先扣减全部云豆余额
133
+ - 剩余金额通过微信支付完成
134
+
135
+ #### 2. 余额不足提示
136
+
137
+ 当启用组合支付时,组件会自动显示:
138
+ - 余额不足警告:`"云豆余额不足,还需额外支付XX元"`
139
+ - 风险提示:`"请在支付完成前确保元豆余额不被消耗,否则本次权益可能购买失败"`
140
+
141
+ #### 3. 待支付金额计算
142
+
143
+ - 纯云豆支付(余额充足): 显示 `¥0`
144
+ - 组合支付(余额不足): 显示额外需要支付的金额
145
+ - 纯微信支付: 显示全额
146
+
147
+ #### 4. 协议确认
148
+
149
+ - 纯云豆支付且余额充足: 不显示协议复选框(无需额外支付)
150
+ - 组合支付或纯微信支付: 必须勾选协议才能继续
151
+
152
+ ### 注意事项
153
+
154
+ 1. **环境要求**
155
+ - H5环境:必须在微信浏览器中打开
156
+ - 小程序环境:需要配置微信登录权限
157
+
158
+ 2. **数据获取**
159
+ - 组件挂载后会自动调用接口获取:
160
+ - 用户云豆余额
161
+ - 权益套餐列表
162
+ - 根据 `app` 参数自动选择对应的权益类型:
163
+ - `'corporateStar'` → `'riskQueryCompany'`
164
+ - 其他 → `'riskQueryMulti'`
165
+
166
+ 3. **支付流程**
167
+ - 纯云豆支付:点击购买 → 确认对话框 → 调用云豆支付接口
168
+ - 组合支付:点击购买 → 确认对话框 → 关闭对话框 → 调用微信支付接口(后端自动处理云豆扣减)
169
+ - 纯微信支付:点击购买 → 直接调用微信支付接口
170
+
171
+ 4. **错误处理**
172
+ - 组件内部已处理常见错误(网络错误、支付失败等)
173
+ - 通过 `complete` 事件返回结果,由父组件决定后续操作
174
+
175
+ ---
176
+
177
+ ## RechargeView - 云豆充值视图
178
+
179
+ **功能描述**: 提供云豆充值金额选择和微信支付功能。
180
+
181
+ ### 导入方式
182
+
183
+ ```typescript
184
+ import { RechargeView } from '@uxda/appkit/payment'
185
+ ```
186
+
187
+ ### Props
188
+
189
+ | 属性名 | 类型 | 必填 | 默认值 | 说明 |
190
+ |--------|------|------|--------|------|
191
+ | `app` | `string` | ✅ | - | 应用标识 |
192
+ | `tenant` | `string` | ✅ | - | 租户ID |
193
+ | `payFinishJumpUrl` | `string` | ❌ | `''` | H5支付完成后跳转地址 |
194
+
195
+ ### Events
196
+
197
+ | 事件名 | 参数类型 | 说明 |
198
+ |--------|----------|------|
199
+ | `complete` | `boolean \| any` | 支付完成时触发,返回支付结果 |
200
+ | `agree` | - | 用户点击协议链接时触发 |
201
+
202
+ ### 使用示例
203
+
204
+ ```vue
205
+ <template>
206
+ <recharge-view
207
+ app="loankitMp"
208
+ tenant="1"
209
+ pay-finish-jump-url="/pages/recharge-success/index"
210
+ @complete="handleRechargeComplete"
211
+ @agree="handleAgreeClick"
212
+ />
213
+ </template>
214
+
215
+ <script setup>
216
+ import { RechargeView } from '@uxda/appkit/payment'
217
+
218
+ const handleRechargeComplete = (result) => {
219
+ if (result) {
220
+ console.log('充值成功')
221
+ // 跳转到成功页或刷新余额
222
+ }
223
+ }
224
+ </script>
225
+ ```
226
+
227
+ ### 注意事项
228
+
229
+ 1. 组件会自动获取充值金额列表
230
+ 2. 必须勾选协议才能进行支付
231
+ 3. H5环境需要在微信浏览器中打开
232
+
233
+ ---
234
+
235
+ ## AmountPicker - 金额选择器
236
+
237
+ **功能描述**: 用于云豆充值场景的金额选择网格组件。
238
+
239
+ ### 导入方式
240
+
241
+ ```typescript
242
+ import { AmountPicker } from '@uxda/appkit/payment'
243
+ ```
244
+
245
+ ### Props
246
+
247
+ | 属性名 | 类型 | 必填 | 默认值 | 说明 |
248
+ |--------|------|------|--------|------|
249
+ | `items` | `Amount[]` | ✅ | `[]` | 金额选项列表 |
250
+ | `selected` | `number` | ❌ | `0` | 当前选中的索引 |
251
+
252
+ ### 类型定义
253
+
254
+ ```typescript
255
+ type Amount = {
256
+ token: number, // 云豆数量
257
+ amount: number // 支付金额(元)
258
+ }
259
+ ```
260
+
261
+ ### Events
262
+
263
+ | 事件名 | 参数类型 | 说明 |
264
+ |--------|----------|------|
265
+ | `change` | `number` | 选择改变时触发,返回选中的索引 |
266
+
267
+ ### 使用示例
268
+
269
+ ```vue
270
+ <template>
271
+ <amount-picker
272
+ :items="amountList"
273
+ :selected="selectedIndex"
274
+ @change="handleAmountChange"
275
+ />
276
+ </template>
277
+
278
+ <script setup>
279
+ import { ref } from 'vue'
280
+ import { AmountPicker } from '@uxda/appkit/payment'
281
+
282
+ const amountList = ref([
283
+ { token: 100, amount: 100 },
284
+ { token: 500, amount: 500 },
285
+ { token: 1000, amount: 1000 }
286
+ ])
287
+
288
+ const selectedIndex = ref(0)
289
+
290
+ const handleAmountChange = (index) => {
291
+ selectedIndex.value = index
292
+ console.log('选中金额:', amountList.value[index])
293
+ }
294
+ </script>
295
+ ```
296
+
297
+ ### 样式说明
298
+
299
+ - 3列网格布局
300
+ - 选中项有橙色渐变边框和背景
301
+ - 显示云豆图标和金额
302
+
303
+ ---
304
+
305
+ ## RightsPicker - 权益选择器
306
+
307
+ **功能描述**: 用于权益充值场景的权益套餐选择网格组件。
308
+
309
+ ### 导入方式
310
+
311
+ ```typescript
312
+ import { RightsPicker, type Amount } from '@uxda/appkit/payment'
313
+ ```
314
+
315
+ ### Props
316
+
317
+ | 属性名 | 类型 | 必填 | 默认值 | 说明 |
318
+ |--------|------|------|--------|------|
319
+ | `items` | `Amount[]` | ✅ | `[]` | 权益套餐列表 |
320
+ | `selected` | `number` | ❌ | `0` | 当前选中的索引 |
321
+
322
+ ### 类型定义
323
+
324
+ ```typescript
325
+ export type Amount = {
326
+ id: string, // 套餐ID
327
+ paymentAmount: number, // 支付金额(元)
328
+ paymentDesc: string, // 套餐描述(标签文本)
329
+ priceRightNum: number // 权益数量(笔数)
330
+ }
331
+ ```
332
+
333
+ ### Events
334
+
335
+ | 事件名 | 参数类型 | 说明 |
336
+ |--------|----------|------|
337
+ | `change` | `number` | 选择改变时触发,返回选中的索引 |
338
+
339
+ ### 使用示例
340
+
341
+ ```vue
342
+ <template>
343
+ <rights-picker
344
+ :items="rightsList"
345
+ :selected="selectedIndex"
346
+ @change="handleRightsChange"
347
+ />
348
+ </template>
349
+
350
+ <script setup>
351
+ import { ref } from 'vue'
352
+ import { RightsPicker, type Amount } from '@uxda/appkit/payment'
353
+
354
+ const rightsList = ref<Amount[]>([
355
+ {
356
+ id: '1',
357
+ paymentAmount: 100,
358
+ paymentDesc: '推荐',
359
+ priceRightNum: 10
360
+ },
361
+ {
362
+ id: '2',
363
+ paymentAmount: 500,
364
+ paymentDesc: '热销',
365
+ priceRightNum: 50
366
+ }
367
+ ])
368
+
369
+ const selectedIndex = ref(0)
370
+
371
+ const handleRightsChange = (index) => {
372
+ selectedIndex.value = index
373
+ }
374
+ </script>
375
+ ```
376
+
377
+ ### 样式说明
378
+
379
+ - 3列网格布局
380
+ - 每个选项显示:
381
+ - 标签(如"推荐"、"热销")
382
+ - 权益数量(笔数)
383
+ - 支付金额
384
+ - 选中项有橙色渐变边框和背景
385
+
386
+ ---
387
+
388
+ ## RechargeResult - 充值结果页
389
+
390
+ **功能描述**: 展示充值或购买成功/失败的结果页面。
391
+
392
+ ### 导入方式
393
+
394
+ ```typescript
395
+ import { RechargeResult } from '@uxda/appkit/payment'
396
+ ```
397
+
398
+ ### Props
399
+
400
+ | 属性名 | 类型 | 必填 | 默认值 | 说明 |
401
+ |--------|------|------|--------|------|
402
+ | `type` | `string` | ❌ | `'recharge'` | 结果类型<br/>- `'recharge'`: 充值<br/>- `'trade'`: 购买 |
403
+ | `payMethod` | `string` | ❌ | `''` | 支付方式<br/>- `'bean'`: 云豆支付<br/>- `'wePay'`: 微信支付 |
404
+
405
+ ### Events
406
+
407
+ | 事件名 | 参数类型 | 说明 |
408
+ |--------|----------|------|
409
+ | `dismiss` | - | 点击返回按钮时触发 |
410
+
411
+ ### 使用示例
412
+
413
+ ```vue
414
+ <template>
415
+ <recharge-result
416
+ type="trade"
417
+ pay-method="combined"
418
+ @dismiss="handleDismiss"
419
+ />
420
+ </template>
421
+
422
+ <script setup>
423
+ import { RechargeResult } from '@uxda/appkit/payment'
424
+
425
+ const handleDismiss = () => {
426
+ // 返回上一页或跳转到指定页面
427
+ Taro.navigateBack()
428
+ }
429
+ </script>
430
+ ```
431
+
432
+ ### 显示内容
433
+
434
+ 根据 `type` 和 `payMethod` 组合显示不同的文案:
435
+
436
+ | type | payMethod | 标题 | 副标题 |
437
+ |------|-----------|------|--------|
438
+ | `recharge` | - | "充值成功" | "云豆将在1分钟之内到账" |
439
+ | `recharge` | `bean` | "充值成功" | "权益已到账" |
440
+ | `trade` | - | "购买成功" | "权益将在1分钟之内到账" |
441
+ | `trade` | `bean` | "购买成功" | "权益已到账" |
442
+
443
+ ---
444
+
445
+ ## UserAgreement - 用户协议
446
+
447
+ **功能描述**: 展示《大道云平台云豆充值服务协议》的完整内容。
448
+
449
+ ### 导入方式
450
+
451
+ ```typescript
452
+ import { UserAgreement } from '@uxda/appkit/payment'
453
+ ```
454
+
455
+ ### Props
456
+
457
+
458
+
459
+ ### Events
460
+
461
+
462
+
463
+ ### 使用示例
464
+
465
+ ```vue
466
+ <template>
467
+ <user-agreement />
468
+ </template>
469
+
470
+ <script setup>
471
+ import { UserAgreement } from '@uxda/appkit/payment'
472
+ </script>
473
+ ```
474
+
475
+ ### 使用场景
476
+
477
+ 通常作为独立页面使用,当用户点击协议链接时跳转到此页面:
478
+
479
+ ```vue
480
+ <template>
481
+ <view>
482
+ <trade-view @agree="handleAgree" />
483
+ </view>
484
+ </template>
485
+
486
+ <script setup>
487
+ import Taro from '@tarojs/taro'
488
+
489
+ const handleAgree = () => {
490
+ Taro.navigateTo({
491
+ url: '/pages/agreement/index'
492
+ })
493
+ }
494
+ </script>
495
+ ```
496
+
497
+ ---
498
+
499
+ ## 组合使用示例
500
+
501
+ ### 完整的权益购买流程
502
+
503
+ ```vue
504
+ <template>
505
+ <view class="trade-page">
506
+ <!-- 权益选择与支付 -->
507
+ <trade-view
508
+ v-if="!showResult"
509
+ header-app="loankitMp"
510
+ app="corporateStar"
511
+ tenant="1"
512
+ @complete="handlePayComplete"
513
+ @agree="showAgreement"
514
+ >
515
+ <template #banner>
516
+ <div class="promotion-banner">
517
+ <h3>同样价格,看更多数据</h3>
518
+ <p>了解AI审批一启明星的全面升级版</p>
519
+ </div>
520
+ </template>
521
+ </trade-view>
522
+
523
+ <!-- 支付结果页 -->
524
+ <recharge-result
525
+ v-if="showResult"
526
+ type="trade"
527
+ :pay-method="payMethod"
528
+ @dismiss="handleDismiss"
529
+ />
530
+ </view>
531
+ </template>
532
+
533
+ <script setup>
534
+ import { ref } from 'vue'
535
+ import { TradeView, RechargeResult } from '@uxda/appkit/payment'
536
+ import Taro from '@tarojs/taro'
537
+
538
+ const showResult = ref(false)
539
+ const payMethod = ref('')
540
+
541
+ const handlePayComplete = ({ result, type }) => {
542
+ if (result) {
543
+ payMethod.value = type === 'bean' ? 'bean' : 'wePay'
544
+ showResult.value = true
545
+ }
546
+ }
547
+
548
+ const showAgreement = () => {
549
+ Taro.navigateTo({
550
+ url: '/pages/agreement/index'
551
+ })
552
+ }
553
+
554
+ const handleDismiss = () => {
555
+ showResult.value = false
556
+ // 可以刷新余额或返回上一页
557
+ }
558
+ </script>
559
+ ```
560
+
561
+ ---
562
+
563
+ ## 常见问题
564
+
565
+ ### Q1: 组合支付时,云豆余额如何扣减?
566
+
567
+ A: 当用户选择云豆支付但余额不足时,系统会自动启用组合支付。在调用微信支付接口时,后端会自动:
568
+ 1. 先扣减用户全部云豆余额
569
+ 2. 计算剩余需要支付的金额
570
+ 3. 发起微信支付请求(金额为剩余部分)
571
+
572
+ ### Q2: 如何判断支付类型?
573
+
574
+ A: 通过 `complete` 事件的 `type` 参数判断:
575
+ - `'bean'`: 纯云豆支付
576
+ - `'wePay'`: 纯微信支付
577
+ - `'combined'`: 组合支付
578
+
579
+ ### Q3: 协议复选框何时显示?
580
+
581
+ A:
582
+ - 纯云豆支付且余额充足:不显示(无需额外支付)
583
+ - 组合支付:显示(需要微信支付)
584
+ - 纯微信支付:显示(需要微信支付)
585
+
586
+ ### Q4: H5环境支付失败怎么办?
587
+
588
+ A: 确保:
589
+ 1. 在微信浏览器中打开
590
+ 2. 已正确配置 `payFinishJumpUrl`
591
+ 3. 检查网络连接和接口权限
592
+
593
+ ### Q5: 如何自定义横幅内容?
594
+
595
+ A: 使用 `banner` 插槽:
596
+
597
+ ```vue
598
+ <trade-view>
599
+ <template #banner>
600
+ <div class="custom-banner">
601
+ <!-- 自定义内容 -->
602
+ </div>
603
+ </template>
604
+ </trade-view>
605
+ ```
606
+
607
+ ---
608
+
609
+ ## 更新日志
610
+
611
+ ### v1.1.0 (最新)
612
+ - ✅ 新增组合支付功能(云豆+微信)
613
+ - ✅ 新增余额不足警告提示
614
+ - ✅ 优化待支付金额计算逻辑
615
+ - ✅ 完善确认对话框显示内容
616
+
617
+ ### v1.0.0
618
+ - ✅ 基础支付功能
619
+ - ✅ 云豆支付支持
620
+ - ✅ 微信支付支持
621
+
622
+ ---
623
+
624
+ # 余额模块组件使用规则
625
+
626
+ ## AccountView - 账户总览
627
+
628
+ **功能描述**: 展示用户账户余额、权益信息及收支明细的完整账户页面。
629
+
630
+ ### 导入方式
631
+
632
+ ```typescript
633
+ import { AccountView } from '@uxda/appkit/balance'
634
+ ```
635
+
636
+ ### Props
637
+
638
+ | 属性名 | 类型 | 必填 | 默认值 | 说明 |
639
+ |--------|------|------|--------|------|
640
+ | `app` | `string` | ✅ | `''` | 应用标识 |
641
+
642
+ ### Events
643
+
644
+ | 事件名 | 参数类型 | 说明 |
645
+ |--------|----------|------|
646
+ | `recharge` | - | 点击充值按钮时触发 |
647
+ | `trade` | `item: any` | 点击权益充值按钮时触发,返回权益项信息 |
648
+
649
+ ### 使用示例
650
+
651
+ ```vue
652
+ <template>
653
+ <account-view
654
+ app="loankitMp"
655
+ @recharge="handleRecharge"
656
+ @trade="handleTrade"
657
+ />
658
+ </template>
659
+
660
+ <script setup>
661
+ import { AccountView } from '@uxda/appkit/balance'
662
+
663
+ const handleRecharge = () => {
664
+ // 跳转到充值页面
665
+ Taro.navigateTo({
666
+ url: '/pages/recharge/index'
667
+ })
668
+ }
669
+
670
+ const handleTrade = (item) => {
671
+ // 跳转到权益充值页面
672
+ Taro.navigateTo({
673
+ url: `/pages/trade/index?id=${item.id}`
674
+ })
675
+ }
676
+ </script>
677
+ ```
678
+
679
+ ### 功能特性
680
+
681
+ 1. **余额展示**: 显示云豆总余额
682
+ 2. **权益展示**: 展示各类权益(企明星、AI审批、电子签约等)
683
+ 3. **收支明细**: 支持查看收支明细,包含筛选和分页功能
684
+ 4. **规则说明**: 支持查看消费规则说明
685
+
686
+ ### 注意事项
687
+
688
+ - 组件挂载后会自动获取余额和权益信息
689
+ - 支持下拉刷新余额数据
690
+ - 收支明细支持时间筛选和多条件筛选
691
+
692
+ ---
693
+
694
+ ## BalanceCard - 余额卡片
695
+
696
+ **功能描述**: 用于在首页或个人中心展示余额的卡片组件。
697
+
698
+ ### 导入方式
699
+
700
+ ```typescript
701
+ import { BalanceCard } from '@uxda/appkit/balance'
702
+ ```
703
+
704
+ ### Props
705
+
706
+ | 属性名 | 类型 | 必填 | 默认值 | 说明 |
707
+ |--------|------|------|--------|------|
708
+ | `app` | `string` | ✅ | `''` | 应用标识 |
709
+
710
+ ### Events
711
+
712
+ | 事件名 | 参数类型 | 说明 |
713
+ |--------|----------|------|
714
+ | `drill` | - | 点击账户明细时触发 |
715
+ | `recharge` | - | 点击充值按钮时触发 |
716
+
717
+ ### 使用示例
718
+
719
+ ```vue
720
+ <template>
721
+ <balance-card
722
+ app="loankitMp"
723
+ @drill="handleDrill"
724
+ @recharge="handleRecharge"
725
+ />
726
+ </template>
727
+
728
+ <script setup>
729
+ import { BalanceCard } from '@uxda/appkit/balance'
730
+
731
+ const handleDrill = () => {
732
+ Taro.navigateTo({
733
+ url: '/pages/account/index'
734
+ })
735
+ }
736
+
737
+ const handleRecharge = () => {
738
+ Taro.navigateTo({
739
+ url: '/pages/recharge/index'
740
+ })
741
+ }
742
+ </script>
743
+ ```
744
+
745
+ ### 暴露方法
746
+
747
+ | 方法名 | 说明 |
748
+ |--------|------|
749
+ | `reload` | 重新加载余额数据 |
750
+
751
+ ```vue
752
+ <script setup>
753
+ import { ref } from 'vue'
754
+ import { BalanceCard } from '@uxda/appkit/balance'
755
+
756
+ const balanceCardRef = ref()
757
+
758
+ const refreshBalance = () => {
759
+ balanceCardRef.value?.reload()
760
+ }
761
+ </script>
762
+
763
+ <template>
764
+ <balance-card ref="balanceCardRef" app="loankitMp" />
765
+ </template>
766
+ ```
767
+
768
+ ---
769
+
770
+ ## BalanceReminder - 余额提醒
771
+
772
+ **功能描述**: 当余额不足时显示的提示弹窗组件。
773
+
774
+ ### 导入方式
775
+
776
+ ```typescript
777
+ import { BalanceReminder } from '@uxda/appkit/balance'
778
+ ```
779
+
780
+ ### Props
781
+
782
+ | 属性名 | 类型 | 必填 | 默认值 | 说明 |
783
+ |--------|------|------|--------|------|
784
+ | `modelValue` | `boolean` | ✅ | `false` | 控制弹窗显示/隐藏(v-model) |
785
+ | `buttonText` | `string` | ❌ | `'去充值'` | 按钮文本 |
786
+ | `tip` | `string` | ❌ | `'您的账户可用余额不足,请充值后再进行查询'` | 提示文本 |
787
+
788
+ ### Events
789
+
790
+ | 事件名 | 参数类型 | 说明 |
791
+ |--------|----------|------|
792
+ | `update:modelValue` | `boolean` | v-model 更新事件 |
793
+ | `recharge` | - | 点击充值按钮时触发 |
794
+
795
+ ### 使用示例
796
+
797
+ ```vue
798
+ <template>
799
+ <balance-reminder
800
+ v-model="showReminder"
801
+ button-text="立即充值"
802
+ tip="余额不足,请充值"
803
+ @recharge="handleRecharge"
804
+ />
805
+ </template>
806
+
807
+ <script setup>
808
+ import { ref } from 'vue'
809
+ import { BalanceReminder } from '@uxda/appkit/balance'
810
+
811
+ const showReminder = ref(false)
812
+
813
+ const handleRecharge = () => {
814
+ showReminder.value = false
815
+ Taro.navigateTo({
816
+ url: '/pages/recharge/index'
817
+ })
818
+ }
819
+ </script>
820
+ ```
821
+
822
+ ---
823
+
824
+ # 消息通知模块组件使用规则
825
+
826
+ ## NoticeBanner - 通知横幅
827
+
828
+ **功能描述**: 页面顶部或嵌入式的通告栏,支持多条消息轮播和强制弹窗。
829
+
830
+ ### 导入方式
831
+
832
+ ```typescript
833
+ import { NoticeBanner } from '@uxda/appkit/notice'
834
+ ```
835
+
836
+ ### Props
837
+
838
+ | 属性名 | 类型 | 必填 | 默认值 | 说明 |
839
+ |--------|------|------|--------|------|
840
+ | `app` | `string` | ✅ | `''` | 应用标识 |
841
+ | `bannerStyle` | `any` | ❌ | `''` | 横幅样式 |
842
+ | `fixed` | `boolean` | ❌ | `false` | 是否固定定位 |
843
+ | `device` | `string` | ❌ | `'MINI'` | 设备类型 |
844
+
845
+ ### Events
846
+
847
+ | 事件名 | 参数类型 | 说明 |
848
+ |--------|----------|------|
849
+ | `detail` | `item: any` | 点击详情时触发 |
850
+ | `close` | - | 关闭横幅时触发 |
851
+ | `view` | `link: string` | 查看附件时触发 |
852
+ | `popup` | `hasPopup: boolean` | 弹窗状态变化时触发 |
853
+ | `hasBanner` | `hasBanner: boolean` | 横幅状态变化时触发 |
854
+
855
+ ### 使用示例
856
+
857
+ ```vue
858
+ <template>
859
+ <notice-banner
860
+ app="loankitMp"
861
+ :fixed="true"
862
+ @detail="handleDetail"
863
+ @view="handleView"
864
+ />
865
+ </template>
866
+
867
+ <script setup>
868
+ import { NoticeBanner } from '@uxda/appkit/notice'
869
+
870
+ const handleDetail = (item) => {
871
+ // 跳转到消息详情页
872
+ Taro.navigateTo({
873
+ url: `/pages/notice/detail?id=${item.id}`
874
+ })
875
+ }
876
+
877
+ const handleView = (link) => {
878
+ // 打开附件链接
879
+ Taro.navigateTo({
880
+ url: `/pages/webview/index?url=${encodeURIComponent(link)}`
881
+ })
882
+ }
883
+ </script>
884
+ ```
885
+
886
+ ### 功能特性
887
+
888
+ 1. **消息轮播**: 多条横幅消息自动轮播(3秒间隔)
889
+ 2. **手势控制**: 触摸时暂停轮播,离开后恢复
890
+ 3. **强制弹窗**: 系统公告类型的消息会以弹窗形式强制显示
891
+ 4. **自动获取**: 组件挂载后自动获取当前应用的消息
892
+
893
+ ---
894
+
895
+ ## NoticeList - 消息列表
896
+
897
+ **功能描述**: 展示历史消息记录,支持搜索、筛选和分页。
898
+
899
+ ### 导入方式
900
+
901
+ ```typescript
902
+ import { NoticeList } from '@uxda/appkit/notice'
903
+ ```
904
+
905
+ ### Props
906
+
907
+ | 属性名 | 类型 | 必填 | 默认值 | 说明 |
908
+ |--------|------|------|--------|------|
909
+ | `app` | `string` | ✅ | `''` | 应用标识 |
910
+ | `userId` | `string` | ✅ | `''` | 用户ID |
911
+ | `showApp` | `boolean` | ❌ | `false` | 是否显示应用标签 |
912
+ | `checkBeforeRead` | `Function` | ❌ | - | 读取前的检查函数,返回 false 则阻止读取 |
913
+
914
+ ### Events
915
+
916
+ | 事件名 | 参数类型 | 说明 |
917
+ |--------|----------|------|
918
+ | `view` | `link: string` | 查看附件时触发 |
919
+
920
+ ### 使用示例
921
+
922
+ ```vue
923
+ <template>
924
+ <notice-list
925
+ app="loankitMp"
926
+ :user-id="userId"
927
+ :show-app="true"
928
+ :check-before-read="checkRead"
929
+ @view="handleView"
930
+ />
931
+ </template>
932
+
933
+ <script setup>
934
+ import { NoticeList } from '@uxda/appkit/notice'
935
+
936
+ const userId = '123456'
937
+
938
+ const checkRead = (notice, index) => {
939
+ // 可以在这里添加读取前的逻辑检查
940
+ return true
941
+ }
942
+
943
+ const handleView = (link) => {
944
+ Taro.navigateTo({
945
+ url: `/pages/webview/index?url=${encodeURIComponent(link)}`
946
+ })
947
+ }
948
+ </script>
949
+ ```
950
+
951
+ ### 功能特性
952
+
953
+ 1. **搜索功能**: 支持关键字搜索消息
954
+ 2. **下拉刷新**: 支持下拉刷新消息列表
955
+ 3. **上拉加载**: 自动分页加载更多消息
956
+ 4. **已读标记**: 自动标记消息为已读
957
+ 5. **时间显示**: 智能显示相对时间(如"5分钟前")或绝对时间
958
+
959
+ ---
960
+
961
+ ## NoticeEntry - 消息入口
962
+
963
+ **功能描述**: 通常带红点或未读数的消息中心入口图标。
964
+
965
+ ### 导入方式
966
+
967
+ ```typescript
968
+ import { NoticeEntry } from '@uxda/appkit/notice'
969
+ ```
970
+
971
+ ### Props
972
+
973
+ 待补充(需要查看组件实现)
974
+
975
+ ### Events
976
+
977
+ 待补充
978
+
979
+ ---
980
+
981
+ ## NoticePopup - 通知弹窗
982
+
983
+ **功能描述**: 强提醒类型的消息弹窗。
984
+
985
+ ### 导入方式
986
+
987
+ ```typescript
988
+ import { NoticePopup } from '@uxda/appkit/notice'
989
+ ```
990
+
991
+ ### Props
992
+
993
+ 待补充(需要查看组件实现)
994
+
995
+ ### Events
996
+
997
+ 待补充
998
+
999
+ ---
1000
+
1001
+ # 用户模块组件使用规则
1002
+
1003
+ ## UserInfo - 用户信息
1004
+
1005
+ **功能描述**: 展示用户头像、昵称、认证信息、企业/团队信息等完整用户资料页面。
1006
+
1007
+ ### 导入方式
1008
+
1009
+ ```typescript
1010
+ import { UserInfo } from '@uxda/appkit/user'
1011
+ ```
1012
+
1013
+ ### Props
1014
+
1015
+ | 属性名 | 类型 | 必填 | 默认值 | 说明 |
1016
+ |--------|------|------|--------|------|
1017
+ | `miniType` | `string` | ❌ | `'05'` | 小程序类型 |
1018
+ | `app` | `string` | ❌ | `''` | 应用标识 |
1019
+ | `userId` | `string` | ✅ | `''` | 用户ID |
1020
+ | `hasQiyezuhu` | `number` | ❌ | `0` | 是否有企业租户 |
1021
+ | `isPersonal` | `number` | ❌ | `0` | 是否个人用户 |
1022
+
1023
+ ### Events
1024
+
1025
+ | 事件名 | 参数类型 | 说明 |
1026
+ |--------|----------|------|
1027
+ | `avatar-success` | `avatar: string` | 头像上传成功时触发 |
1028
+ | `logout` | - | 退出登录时触发 |
1029
+ | `crop` | `filePath: string` | 需要裁剪头像时触发 |
1030
+ | `binding` | `mobile: string` | 点击绑定手机号时触发 |
1031
+ | `username-success` | - | 用户名修改成功时触发 |
1032
+ | `auth` | `userId: string, verifyResult: number, mobile: string` | 点击认证信息时触发 |
1033
+
1034
+ ### 使用示例
1035
+
1036
+ ```vue
1037
+ <template>
1038
+ <user-info
1039
+ :user-id="userId"
1040
+ :has-qiyezuhu="1"
1041
+ :is-personal="1"
1042
+ @logout="handleLogout"
1043
+ @binding="handleBinding"
1044
+ @auth="handleAuth"
1045
+ @crop="handleCrop"
1046
+ />
1047
+ </template>
1048
+
1049
+ <script setup>
1050
+ import { UserInfo } from '@uxda/appkit/user'
1051
+ import Taro from '@tarojs/taro'
1052
+
1053
+ const userId = '123456'
1054
+
1055
+ const handleLogout = () => {
1056
+ // 清除登录状态并跳转到登录页
1057
+ Taro.reLaunch({
1058
+ url: '/pages/login/index'
1059
+ })
1060
+ }
1061
+
1062
+ const handleBinding = (mobile) => {
1063
+ Taro.navigateTo({
1064
+ url: `/pages/binding/index?mobile=${mobile}`
1065
+ })
1066
+ }
1067
+
1068
+ const handleAuth = (userId, verifyResult, mobile) => {
1069
+ Taro.navigateTo({
1070
+ url: `/pages/auth/index?userId=${userId}&verifyResult=${verifyResult}&mobile=${mobile}`
1071
+ })
1072
+ }
1073
+
1074
+ const handleCrop = (filePath) => {
1075
+ // 跳转到头像裁剪页
1076
+ Taro.navigateTo({
1077
+ url: `/pages/crop/index?filePath=${filePath}`
1078
+ })
1079
+ }
1080
+ </script>
1081
+ ```
1082
+
1083
+ ### 暴露方法
1084
+
1085
+ | 方法名 | 说明 |
1086
+ |--------|------|
1087
+ | `updateImage` | 更新头像图片 |
1088
+
1089
+ ---
1090
+
1091
+ ## UserAuth - 用户认证
1092
+
1093
+ **功能描述**: 处理用户身份认证的表单组件,支持OCR识别身份证。
1094
+
1095
+ ### 导入方式
1096
+
1097
+ ```typescript
1098
+ import { UserAuth } from '@uxda/appkit/user'
1099
+ ```
1100
+
1101
+ ### Props
1102
+
1103
+ | 属性名 | 类型 | 必填 | 默认值 | 说明 |
1104
+ |--------|------|------|--------|------|
1105
+ | `userId` | `string` | ✅ | `''` | 用户ID |
1106
+ | `verifyResult` | `number` | ❌ | `-1` | 认证状态(-1: 未认证, 0: 已失效, 1: 已认证) |
1107
+ | `mobile` | `string` | ❌ | `''` | 手机号码 |
1108
+
1109
+ ### Events
1110
+
1111
+ | 事件名 | 参数类型 | 说明 |
1112
+ |--------|----------|------|
1113
+ | `toAgreement` | - | 点击协议链接时触发 |
1114
+
1115
+ ### 使用示例
1116
+
1117
+ ```vue
1118
+ <template>
1119
+ <user-auth
1120
+ :user-id="userId"
1121
+ :verify-result="verifyResult"
1122
+ :mobile="mobile"
1123
+ @to-agreement="handleAgreement"
1124
+ />
1125
+ </template>
1126
+
1127
+ <script setup>
1128
+ import { UserAuth } from '@uxda/appkit/user'
1129
+
1130
+ const userId = '123456'
1131
+ const verifyResult = -1
1132
+ const mobile = '13800138000'
1133
+
1134
+ const handleAgreement = () => {
1135
+ Taro.navigateTo({
1136
+ url: '/pages/agreement/index'
1137
+ })
1138
+ }
1139
+ </script>
1140
+ ```
1141
+
1142
+ ### 功能特性
1143
+
1144
+ 1. **OCR识别**: 支持拍照识别身份证信息
1145
+ 2. **表单验证**: 自动验证身份证号码格式
1146
+ 3. **已认证状态**: 已认证用户显示只读模式
1147
+
1148
+ ---
1149
+
1150
+ ## UserBinding - 账号绑定
1151
+
1152
+ **功能描述**: 换绑手机号的流程组件,包含身份认证和换绑两个步骤。
1153
+
1154
+ ### 导入方式
1155
+
1156
+ ```typescript
1157
+ import { UserBinding } from '@uxda/appkit/user'
1158
+ ```
1159
+
1160
+ ### Props
1161
+
1162
+ 无(通过路由参数传递 `mobile`)
1163
+
1164
+ ### Events
1165
+
1166
+ | 事件名 | 参数类型 | 说明 |
1167
+ |--------|----------|------|
1168
+ | `success` | `mobile: string` | 换绑成功时触发,返回新手机号 |
1169
+
1170
+ ### 使用示例
1171
+
1172
+ ```vue
1173
+ <template>
1174
+ <user-binding @success="handleSuccess" />
1175
+ </template>
1176
+
1177
+ <script setup>
1178
+ import { UserBinding } from '@uxda/appkit/user'
1179
+ import Taro from '@tarojs/taro'
1180
+
1181
+ const handleSuccess = (mobile) => {
1182
+ Taro.showToast({
1183
+ title: `换绑成功:${mobile}`,
1184
+ icon: 'success'
1185
+ })
1186
+ setTimeout(() => {
1187
+ Taro.navigateBack()
1188
+ }, 1500)
1189
+ }
1190
+ </script>
1191
+ ```
1192
+
1193
+ ### 路由参数
1194
+
1195
+ | 参数名 | 类型 | 必填 | 说明 |
1196
+ |--------|------|------|------|
1197
+ | `mobile` | `string` | ✅ | 当前手机号 |
1198
+
1199
+ ### 使用场景
1200
+
1201
+ ```typescript
1202
+ // 跳转到换绑页面
1203
+ Taro.navigateTo({
1204
+ url: `/pages/binding/index?mobile=${currentMobile}`
1205
+ })
1206
+ ```
1207
+
1208
+ ---
1209
+
1210
+ # 注册模块组件使用规则
1211
+
1212
+ ## SelfRegistration - 自助注册
1213
+
1214
+ **功能描述**: 引导新用户完成注册流程的组件,支持个人和公司两种使用场景。
1215
+
1216
+ ### 导入方式
1217
+
1218
+ ```typescript
1219
+ import { SelfRegistration } from '@uxda/appkit/register'
1220
+ ```
1221
+
1222
+ ### Props
1223
+
1224
+ | 属性名 | 类型 | 必填 | 默认值 | 说明 |
1225
+ |--------|------|------|--------|------|
1226
+ | `banner` | `string` | ❌ | `'https://cdn.ddjf.com/static/images/wx-yunservice/ai-form-bg2.png'` | 顶部横幅图片 |
1227
+
1228
+ ### Events
1229
+
1230
+ | 事件名 | 参数类型 | 说明 |
1231
+ |--------|----------|------|
1232
+ | `submit` | `params: object` | 提交注册信息时触发 |
1233
+
1234
+ ### 使用示例
1235
+
1236
+ ```vue
1237
+ <template>
1238
+ <self-registration
1239
+ banner="/static/images/custom-banner.png"
1240
+ @submit="handleSubmit"
1241
+ />
1242
+ </template>
1243
+
1244
+ <script setup>
1245
+ import { SelfRegistration } from '@uxda/appkit/register'
1246
+
1247
+ const handleSubmit = (params) => {
1248
+ console.log('注册信息:', params)
1249
+ // {
1250
+ // useCase: 'person' | 'company',
1251
+ // customerName: string,
1252
+ // idCardNo?: string, // 个人场景
1253
+ // customerPosition?: string, // 公司场景
1254
+ // companyName?: string, // 公司场景
1255
+ // customerArea?: string // 公司场景
1256
+ // }
1257
+
1258
+ // 调用注册接口
1259
+ // ...
1260
+ }
1261
+ </script>
1262
+ ```
1263
+
1264
+ ### 功能特性
1265
+
1266
+ 1. **双场景支持**: 支持个人使用和公司使用两种场景
1267
+ 2. **OCR识别**: 支持拍照识别身份证信息
1268
+ 3. **表单验证**: 自动验证必填项和格式
1269
+ 4. **地区选择**: 公司场景支持省市区选择
1270
+
1271
+ ---
1272
+
1273
+ # 业务场景组件使用规则
1274
+
1275
+ ## SharePoster - 分享海报
1276
+
1277
+ **功能描述**: 生成包含二维码和营销信息的图片,用于朋友圈分享。
1278
+
1279
+ ### 导入方式
1280
+
1281
+ ```typescript
1282
+ import { SharePoster } from '@uxda/appkit/scenarios'
1283
+ ```
1284
+
1285
+ ### Props
1286
+
1287
+ | 属性名 | 类型 | 必填 | 默认值 | 说明 |
1288
+ |--------|------|------|--------|------|
1289
+ | `posters` | `any[]` | ✅ | - | 海报列表 |
1290
+ | `text` | `string` | ❌ | - | 底部提示文本 |
1291
+
1292
+ ### Events
1293
+
1294
+ | 事件名 | 参数类型 | 说明 |
1295
+ |--------|----------|------|
1296
+ | `share` | - | 点击确定分享时触发 |
1297
+
1298
+ ### 使用示例
1299
+
1300
+ ```vue
1301
+ <template>
1302
+ <share-poster
1303
+ :posters="posterList"
1304
+ text="长按保存图片,分享到朋友圈"
1305
+ @share="handleShare"
1306
+ />
1307
+ </template>
1308
+
1309
+ <script setup>
1310
+ import { SharePoster } from '@uxda/appkit/scenarios'
1311
+
1312
+ const posterList = [
1313
+ // 海报配置对象
1314
+ ]
1315
+
1316
+ const handleShare = () => {
1317
+ // 处理分享逻辑
1318
+ }
1319
+ </script>
1320
+ ```
1321
+
1322
+ ---
1323
+
1324
+ # 通用基础组件使用规则
1325
+
1326
+ ## DdSearch - 搜索框
1327
+
1328
+ **功能描述**: 支持导航栏模式的搜索框,带有搜索回调和防抖功能。
1329
+
1330
+ ### 导入方式
1331
+
1332
+ ```typescript
1333
+ import DdSearch from '@uxda/appkit/components/dd-search/index.vue'
1334
+ ```
1335
+
1336
+ ### Props
1337
+
1338
+ | 属性名 | 类型 | 必填 | 默认值 | 说明 |
1339
+ |--------|------|------|--------|------|
1340
+ | `disabled` | `boolean` | ❌ | `false` | 是否禁用 |
1341
+ | `placeholder` | `string` | ❌ | `'请输入'` | 输入框占位符 |
1342
+ | `value` | `string` | ❌ | `''` | 绑定值 |
1343
+ | `bordered` | `boolean` | ❌ | `true` | 是否显示底部边框 |
1344
+ | `inNavbar` | `boolean` | ❌ | `false` | 是否在导航栏中 |
1345
+ | `focus` | `boolean` | ❌ | `false` | 是否自动聚焦 |
1346
+
1347
+ ### Events
1348
+
1349
+ | 事件名 | 参数类型 | 说明 |
1350
+ |--------|----------|------|
1351
+ | `search` | `value: string` | 点击搜索时触发 |
1352
+ | `focus` | `event: Event` | 输入框聚焦时触发 |
1353
+
1354
+ ### 使用示例
1355
+
1356
+ ```vue
1357
+ <template>
1358
+ <dd-search
1359
+ :bordered="false"
1360
+ :in-navbar="true"
1361
+ :value="searchStr"
1362
+ placeholder="输入客户姓名"
1363
+ @search="onSearch"
1364
+ @focus="onSearchFocus"
1365
+ />
1366
+ </template>
1367
+
1368
+ <script setup>
1369
+ import { ref } from 'vue'
1370
+ import DdSearch from '@uxda/appkit/components/dd-search/index.vue'
1371
+
1372
+ const searchStr = ref('')
1373
+
1374
+ const onSearch = (value) => {
1375
+ console.log('搜索:', value)
1376
+ }
1377
+
1378
+ const onSearchFocus = (event) => {
1379
+ console.log('聚焦:', event)
1380
+ }
1381
+ </script>
1382
+ ```
1383
+
1384
+ ---
1385
+
1386
+ ## DdIcon - 图标组件
1387
+
1388
+ **功能描述**: 项目统一的图标封装,使用 iconfont 图标。
1389
+
1390
+ ### 导入方式
1391
+
1392
+ ```typescript
1393
+ import DdIcon from '@uxda/appkit/components/dd-icon/index.vue'
1394
+ ```
1395
+
1396
+ ### Props
1397
+
1398
+ | 属性名 | 类型 | 必填 | 默认值 | 说明 |
1399
+ |--------|------|------|--------|------|
1400
+ | `name` | `string` | ✅ | `''` | icon 名称 |
1401
+ | `color` | `string` | ❌ | `inherit` | icon 颜色 |
1402
+ | `size` | `string` | ❌ | `16px` | icon 字体大小 |
1403
+ | `weight` | `string` | ❌ | `normal` | icon 字体字重 |
1404
+
1405
+ ### 使用示例
1406
+
1407
+ ```vue
1408
+ <template>
1409
+ <dd-icon name="icon-arrow" size="11px" color="#DFDFDF" />
1410
+ </template>
1411
+
1412
+ <script setup>
1413
+ import DdIcon from '@uxda/appkit/components/dd-icon/index.vue'
1414
+ </script>
1415
+ ```
1416
+
1417
+ ---
1418
+
1419
+ ## DdSkeleton - 骨架屏
1420
+
1421
+ **功能描述**: 数据加载过程中的占位显示,提升用户体验。
1422
+
1423
+ ### 导入方式
1424
+
1425
+ ```typescript
1426
+ import DdSkeleton from '@uxda/appkit/components/dd-skeleton/index.vue'
1427
+ ```
1428
+
1429
+ ### Props
1430
+
1431
+ 待补充(需要查看组件实现)
1432
+
1433
+ ### 使用示例
1434
+
1435
+ ```vue
1436
+ <template>
1437
+ <dd-skeleton v-if="loading" :row="3" />
1438
+ <div v-else>
1439
+ <!-- 实际内容 -->
1440
+ </div>
1441
+ </template>
1442
+
1443
+ <script setup>
1444
+ import { ref } from 'vue'
1445
+ import DdSkeleton from '@uxda/appkit/components/dd-skeleton/index.vue'
1446
+
1447
+ const loading = ref(true)
1448
+ </script>
1449
+ ```
1450
+
1451
+ ---
1452
+
1453
+ ## DdNoticeBar - 滚动通告栏
1454
+
1455
+ **功能描述**: 用于显示简短的滚动消息。
1456
+
1457
+ ### 导入方式
1458
+
1459
+ ```typescript
1460
+ import DdNoticeBar from '@uxda/appkit/components/dd-notice-bar/index.vue'
1461
+ ```
1462
+
1463
+ ### Props
1464
+
1465
+ 待补充(需要查看组件实现)
1466
+
1467
+ ### 使用示例
1468
+
1469
+ ```vue
1470
+ <template>
1471
+ <dd-notice-bar :show-close="true" @close="handleClose">
1472
+ 这是一条滚动通告消息
1473
+ </dd-notice-bar>
1474
+ </template>
1475
+
1476
+ <script setup>
1477
+ import DdNoticeBar from '@uxda/appkit/components/dd-notice-bar/index.vue'
1478
+
1479
+ const handleClose = () => {
1480
+ console.log('关闭通告')
1481
+ }
1482
+ </script>
1483
+ ```
1484
+
1485
+ ---
1486
+
1487
+ ## 其他通用组件
1488
+
1489
+ ### DdArea - 地区选择器
1490
+
1491
+ 省市区三级联动选择组件。
1492
+
1493
+ ### DdSelector - 通用选择器
1494
+
1495
+ 下拉或弹窗式的单选/多选组件。
1496
+
1497
+ ### BtCropper - 图片裁剪器
1498
+
1499
+ 基于 canvas 的高性能图片裁剪工具。
1500
+
1501
+ ---
1502
+
1503
+ ## 更新日志
1504
+
1505
+ ### v1.2.0
1506
+ - ✅ 补全余额模块组件文档
1507
+ - ✅ 补全消息通知模块组件文档
1508
+ - ✅ 补全用户模块组件文档
1509
+ - ✅ 补全注册模块组件文档
1510
+ - ✅ 补全业务场景组件文档
1511
+ - ✅ 补全通用基础组件文档
1512
+
1513
+ ### v1.1.0
1514
+ - ✅ 新增组合支付功能(云豆+微信)
1515
+ - ✅ 新增余额不足警告提示
1516
+ - ✅ 优化待支付金额计算逻辑
1517
+ - ✅ 完善确认对话框显示内容
1518
+
1519
+ ### v1.0.0
1520
+ - ✅ 基础支付功能
1521
+ - ✅ 云豆支付支持
1522
+ - ✅ 微信支付支持
1523
+