@uxda/appkit 4.3.30 → 4.3.33

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 (141) hide show
  1. package/.cursor/skills/appkit-build-update-component-rules/SKILL.md +54 -54
  2. package/.cursor/skills/appkit-sync-component-rules/SKILL.md +60 -60
  3. package/.eslintrc.mjs +7 -7
  4. package/Appkit/347/273/204/344/273/266/344/275/277/347/224/250/350/247/204/345/210/231.md +2002 -2002
  5. package/PROJECT_DOCS.md +142 -142
  6. package/README.md +194 -194
  7. package/babel.config.js +12 -12
  8. package/dist/appkit.css +3 -3
  9. package/dist/assets/asset-3B_CoPto +1 -0
  10. package/dist/assets/asset-DcH8Kg-2 +1 -0
  11. package/dist/index.js +320 -83
  12. package/package.json +82 -82
  13. package/project.config.json +15 -15
  14. package/project.tt.json +13 -13
  15. package/rollup.config.mjs +81 -81
  16. package/src/Appkit.ts +72 -72
  17. package/src/balance/api/endpoints.ts +134 -133
  18. package/src/balance/api/index.ts +118 -118
  19. package/src/balance/components/AccountView.vue +834 -770
  20. package/src/balance/components/BalanceCard.vue +210 -210
  21. package/src/balance/components/BalanceReminder.vue +84 -84
  22. package/src/balance/components/ConsumptionFilter.vue +218 -218
  23. package/src/balance/components/ConsumptionRules.vue +68 -68
  24. package/src/balance/components/DateFilter.vue +259 -259
  25. package/src/balance/components/DateRange.vue +111 -111
  26. package/src/balance/components/ListFilter.vue +62 -62
  27. package/src/balance/components/ListFilterPicker.vue +191 -191
  28. package/src/balance/components/PromoterCard.vue +308 -308
  29. package/src/balance/components/SecondBalance.vue +77 -77
  30. package/src/balance/components/Tip.vue +45 -45
  31. package/src/balance/components/index.ts +8 -8
  32. package/src/balance/types.ts +99 -99
  33. package/src/components/bt-cropper/index.vue +730 -730
  34. package/src/components/bt-cropper/utils/calcCropper.js +42 -42
  35. package/src/components/bt-cropper/utils/calcImagePosition.js +23 -23
  36. package/src/components/bt-cropper/utils/calcImageSize.js +37 -37
  37. package/src/components/bt-cropper/utils/calcPointDistance.js +12 -12
  38. package/src/components/bt-cropper/utils/calcRightAndBottom.js +7 -7
  39. package/src/components/bt-cropper/utils/ratio.js +3 -3
  40. package/src/components/bt-cropper/utils/tools.js +25 -25
  41. package/src/components/dd-area/index.vue +225 -225
  42. package/src/components/dd-icon/doc.md +21 -21
  43. package/src/components/dd-icon/index.vue +23 -23
  44. package/src/components/dd-notice-bar/index.vue +78 -78
  45. package/src/components/dd-search/doc.md +34 -34
  46. package/src/components/dd-search/index.vue +168 -168
  47. package/src/components/dd-selector/index.vue +124 -124
  48. package/src/components/dd-skeleton/doc.md +19 -19
  49. package/src/components/dd-skeleton/index.vue +36 -36
  50. package/src/global.ts +6 -6
  51. package/src/index.ts +101 -101
  52. package/src/main.scss +1 -1
  53. package/src/notice/api/endpoints.ts +54 -54
  54. package/src/notice/api/index.ts +121 -121
  55. package/src/notice/components/NoticeBanner.vue +247 -247
  56. package/src/notice/components/NoticeEntry.vue +99 -99
  57. package/src/notice/components/NoticeList.vue +311 -311
  58. package/src/notice/components/NoticeList2.vue +401 -401
  59. package/src/notice/components/NoticePopup.vue +163 -163
  60. package/src/notice/components/index.ts +6 -6
  61. package/src/notice/components/useCommonList.ts +87 -87
  62. package/src/notice/components/useNotice.ts +35 -35
  63. package/src/notice/index.ts +1 -1
  64. package/src/notice/types.ts +25 -25
  65. package/src/payment/api/config.ts +7 -7
  66. package/src/payment/api/endpoints.ts +112 -112
  67. package/src/payment/api/index.ts +108 -108
  68. package/src/payment/components/AmountPicker.vue +56 -56
  69. package/src/payment/components/RechargeResult.vue +68 -68
  70. package/src/payment/components/RechargeView.vue +389 -389
  71. package/src/payment/components/RightsPicker.vue +105 -105
  72. package/src/payment/components/TradeView.vue +627 -616
  73. package/src/payment/components/UserAgreement.vue +234 -234
  74. package/src/payment/components/index.ts +22 -22
  75. package/src/payment/components/recharge-amount.spec.ts +3 -0
  76. package/src/payment/components/recharge-amount.ts +5 -1
  77. package/src/payment/index.ts +5 -5
  78. package/src/payment/services/index.ts +16 -16
  79. package/src/payment/services/invoke-recharge.ts +25 -25
  80. package/src/payment/services/request-payment.ts +136 -136
  81. package/src/payment/types.ts +34 -34
  82. package/src/register/components/SelfRegistration.vue +233 -233
  83. package/src/register/components/index.ts +2 -2
  84. package/src/scenarios/components/SharePoster.vue +364 -364
  85. package/src/scenarios/components/index.ts +2 -2
  86. package/src/scenarios/components/poster-paste.vue +93 -93
  87. package/src/scenarios/components/share-poster.md +273 -273
  88. package/src/shared/components/AppDrawer.vue +53 -53
  89. package/src/shared/components/AppVerify.vue +137 -137
  90. package/src/shared/components/DeviceVersion.vue +78 -78
  91. package/src/shared/components/EmptyView.vue +33 -33
  92. package/src/shared/components/OcrBank.vue +202 -202
  93. package/src/shared/components/OcrBusinessLicense.vue +120 -120
  94. package/src/shared/components/OcrIcon.vue +267 -267
  95. package/src/shared/components/OcrInvoice.vue +323 -323
  96. package/src/shared/components/OfficeDocx.vue +33 -33
  97. package/src/shared/components/OfficePdf.vue +35 -35
  98. package/src/shared/components/PageHeader.vue +84 -84
  99. package/src/shared/components/index.ts +12 -12
  100. package/src/shared/composables/index.ts +10 -10
  101. package/src/shared/composables/useAmount.ts +46 -46
  102. package/src/shared/composables/useCompress.ts +64 -64
  103. package/src/shared/composables/useCountdown.ts +46 -46
  104. package/src/shared/composables/useCrypto.ts +76 -76
  105. package/src/shared/composables/useDeviceEnv.ts +61 -61
  106. package/src/shared/composables/useDragBox.ts +97 -97
  107. package/src/shared/composables/useEncode.ts +43 -43
  108. package/src/shared/composables/useLogger.ts +149 -149
  109. package/src/shared/composables/useSafeArea.ts +46 -46
  110. package/src/shared/composables/useTabbar.ts +24 -24
  111. package/src/shared/composables/useUpload.ts +106 -106
  112. package/src/shared/composables/useValidator.ts +32 -32
  113. package/src/shared/composables/useWxAuth.ts +49 -49
  114. package/src/shared/http/Http.ts +149 -149
  115. package/src/shared/http/index.ts +1 -1
  116. package/src/shared/http/types.ts +163 -163
  117. package/src/shared/index.ts +9 -9
  118. package/src/shared/tracking/directives/index.ts +40 -40
  119. package/src/shared/tracking/examples/page-tracking-template.vue +27 -27
  120. package/src/shared/weixin/index.ts +9 -9
  121. package/src/shared/weixin/jssdk.ts +104 -104
  122. package/src/shared/weixin/payment.ts +38 -38
  123. package/src/styles/vars.scss +3 -3
  124. package/src/user/api/endpoints.ts +17 -17
  125. package/src/user/api/index.ts +123 -123
  126. package/src/user/components/LoginSetting.vue +114 -114
  127. package/src/user/components/UserAuth.vue +218 -218
  128. package/src/user/components/UserBinding.vue +277 -277
  129. package/src/user/components/UserBindingSuccess.vue +80 -80
  130. package/src/user/components/UserEntry.vue +139 -139
  131. package/src/user/components/UserFeedback.vue +428 -428
  132. package/src/user/components/UserFeedbackEntry.vue +175 -175
  133. package/src/user/components/UserHeadCrop.vue +65 -65
  134. package/src/user/components/UserInfo.vue +711 -711
  135. package/src/user/components/UserResourceEmpty.vue +75 -75
  136. package/src/user/components/index.ts +23 -23
  137. package/src/user/index.ts +1 -1
  138. package/src/utils/utils.ts +33 -33
  139. package/tsconfig.json +30 -30
  140. package/types/global.d.ts +23 -23
  141. package/types/vue.d.ts +10 -10
@@ -1,2002 +1,2002 @@
1
- # Appkit 组件使用规则
2
-
3
- 本文档详细说明 Appkit 中各组件的使用方法、属性、事件和注意事项。
4
-
5
- ## 目录
6
-
7
- ### 支付模块 (Payment)
8
- - [TradeView - 权益充值视图](#tradeview---权益充值视图)
9
- - [RechargeView - 云豆充值视图](#rechargeview---云豆充值视图)
10
- - [AmountPicker - 金额选择器](#amountpicker---金额选择器)
11
- - [RechargeResult - 充值结果页](#rechargeresult---充值结果页)
12
- - [UserAgreement - 用户协议](#useragreement---用户协议)
13
-
14
- ### 余额模块 (Balance)
15
- - [AccountView - 账户总览](#accountview---账户总览)
16
- - [BalanceCard - 余额卡片](#balancecard---余额卡片)
17
- - [BalanceReminder - 余额提醒](#balancereminder---余额提醒)
18
- - [DateRange - 日期范围](#daterange---日期范围)
19
- - [ListFilter - 列表筛选](#listfilter---列表筛选)
20
- - [PromoterCard - 推广员卡片](#promotercard---推广员卡片)
21
-
22
- ### 消息通知模块 (Notice)
23
- - [NoticeBanner - 通知横幅](#noticebanner---通知横幅)
24
- - [NoticeList - 消息列表](#noticelist---消息列表)
25
- - [NoticeList2 - 消息列表(二代)](#noticelist2---消息列表二代)
26
- - [NoticeEntry - 消息入口](#noticeentry---消息入口)
27
-
28
- ### 用户模块 (User)
29
- - [UserEntry - 用户入口](#userentry---用户入口)
30
- - [UserInfo - 用户信息](#userinfo---用户信息)
31
- - [UserAuth - 用户认证](#userauth---用户认证)
32
- - [UserBinding - 账号绑定](#userbinding---账号绑定)
33
- - [UserBindingSuccess - 绑定成功](#userbindingsuccess---绑定成功)
34
- - [UserHeadCrop - 头像裁剪](#userheadcrop---头像裁剪)
35
- - [UserFeedback - 用户反馈](#userfeedback---用户反馈)
36
- - [UserFeedbackEntry - 反馈入口](#userfeedbackentry---反馈入口)
37
- - [LoginSetting - 登录设置](#loginsetting---登录设置)
38
- - [UserResourceEmpty - 资源空状态](#userresourceempty---资源空状态)
39
-
40
- ### 注册模块 (Register)
41
- - [SelfRegistration - 自助注册](#selfregistration---自助注册)
42
-
43
- ### 业务场景 (Scenarios)
44
- - [SharePoster - 分享海报](#shareposter---分享海报)
45
-
46
- ### 共享模块 (Shared)
47
- - [AppDrawer - 抽屉](#appdrawer---抽屉)
48
- - [PageHeader - 页面头部](#pageheader---页面头部)
49
- - [DeviceVersion - 设备版本](#deviceversion---设备版本)
50
- - [AppVerify - 应用验证](#appverify---应用验证)
51
- - [OcrIcon - OCR 入口](#ocricon---ocr-入口)
52
- - [OcrBank - 银行卡 OCR](#ocrbank---银行卡-ocr)
53
- - [OcrBusinessLicense - 营业执照 OCR](#ocrbusinesslicense---营业执照-ocr)
54
- - [OcrInvoice - 发票 OCR](#ocrinvoice---发票-ocr)
55
- - [OfficePdf - PDF 预览](#officepdf---pdf-预览)
56
- - [OfficeDocx - Word 文档预览](#officedocx---word-文档预览)
57
-
58
- ### 通用基础组件 (Components)
59
- - [DdSearch - 搜索框](#ddsearch---搜索框)
60
- - [DdIcon - 图标组件](#ddicon---图标组件)
61
- - [DdSkeleton - 骨架屏](#ddskeleton---骨架屏)
62
- - [DdNoticeBar - 滚动通告栏](#ddnoticebar---滚动通告栏)
63
-
64
- ---
65
-
66
- ## TradeView - 权益充值视图
67
-
68
- **功能描述**: 提供权益充值金额选择、云豆支付和组合支付(云豆+微信)的完整支付流程。
69
-
70
- ### 导入方式
71
-
72
- ```typescript
73
- import { TradeView } from '@uxda/appkit/payment'
74
- // 或
75
- import TradeView from '@uxda/appkit/payment/components/TradeView.vue'
76
- ```
77
-
78
- ### Props
79
-
80
- | 属性名 | 类型 | 必填 | 默认值 | 说明 |
81
- |--------|------|------|--------|------|
82
- | `headerApp` | `string` | ✅ | - | header头中的appcode,一般情况下与app参数一致,当无应用权限时,此参数为空 |
83
- | `app` | `string` | ✅ | - | 应用标识,用于区分不同应用(如:'corporateStar'、'riskQueryMulti') |
84
- | `tenant` | `string` | ✅ | - | 租户ID |
85
- | `payFinishJumpUrl` | `string` | ❌ | `''` | H5支付完成后跳转地址 |
86
-
87
- ### Events
88
-
89
- | 事件名 | 参数类型 | 说明 |
90
- |--------|----------|------|
91
- | `complete` | `{ result: boolean \| any, type: string }` | 支付完成时触发<br/>- `result`: 支付结果<br/>- `type`: 支付类型('bean' | 'wePay' | 'combined')<br/> - `'bean'`: 纯云豆支付<br/> - `'wePay'`: 纯微信支付<br/> - `'combined'`: 组合支付(云豆+微信) |
92
- | `agree` | - | 用户点击协议链接时触发,可用于打开协议详情页 |
93
-
94
- ### Slots
95
-
96
- | 插槽名 | 说明 |
97
- |--------|------|
98
- | `banner` | 自定义横幅内容,通常用于展示促销信息或活动内容 |
99
-
100
- ### 使用示例
101
-
102
- ```vue
103
- <template>
104
- <trade-view
105
- header-app="loankitMp"
106
- app="corporateStar"
107
- tenant="1"
108
- pay-finish-jump-url="/pages/success/index"
109
- @complete="handlePayComplete"
110
- @agree="handleAgreeClick"
111
- >
112
- <template #banner>
113
- <div class="promotion-banner">
114
- <p>同样价格,看更多数据</p>
115
- <p>了解AI审批一启明星的全面升级版</p>
116
- </div>
117
- </template>
118
- </trade-view>
119
- </template>
120
-
121
- <script setup>
122
- import { TradeView } from '@uxda/appkit/payment'
123
-
124
- const handlePayComplete = ({ result, type }) => {
125
- console.log('支付完成', { result, type })
126
- if (result) {
127
- // 支付成功处理
128
- if (type === 'bean') {
129
- // 纯云豆支付成功
130
- } else if (type === 'wePay') {
131
- // 纯微信支付成功
132
- } else if (type === 'combined') {
133
- // 组合支付成功
134
- }
135
- }
136
- }
137
-
138
- const handleAgreeClick = () => {
139
- // 打开协议详情页
140
- Taro.navigateTo({
141
- url: '/pages/agreement/index'
142
- })
143
- }
144
- </script>
145
- ```
146
-
147
- ### 功能特性
148
-
149
- #### 1. 云豆支付模式
150
-
151
- - **纯云豆支付**: 当用户选择云豆支付且余额充足时,直接使用云豆完成支付
152
- - **组合支付**: 当用户选择云豆支付但余额不足时,自动启用组合支付模式
153
- - 先扣减全部云豆余额
154
- - 剩余金额通过微信支付完成
155
-
156
- #### 2. 余额不足提示
157
-
158
- 当启用组合支付时,组件会自动显示:
159
- - 余额不足警告:`"云豆余额不足,还需额外支付XX元"`
160
- - 风险提示:`"请在支付完成前确保元豆余额不被消耗,否则本次权益可能购买失败"`
161
-
162
- #### 3. 待支付金额计算
163
-
164
- - 纯云豆支付(余额充足): 显示 `¥0`
165
- - 组合支付(余额不足): 显示额外需要支付的金额
166
- - 纯微信支付: 显示全额
167
-
168
- #### 4. 协议确认
169
-
170
- - 纯云豆支付且余额充足: 不显示协议复选框(无需额外支付)
171
- - 组合支付或纯微信支付: 必须勾选协议才能继续
172
-
173
- ### 注意事项
174
-
175
- 1. **环境要求**
176
- <!-- - H5环境:必须在微信浏览器中打开 -->
177
- - 小程序环境:需要配置微信登录权限
178
-
179
- 2. **数据获取**
180
- - 组件挂载后会自动调用接口获取:
181
- - 用户云豆余额
182
- - 权益套餐列表
183
- - 根据 `app` 参数自动选择对应的权益类型:
184
- - `'corporateStar'` → `'riskQueryCompany'`
185
- - 其他 → `'riskQueryMulti'`
186
-
187
- 3. **支付流程**
188
- - 纯云豆支付:点击购买 → 确认对话框 → 调用云豆支付接口
189
- - 组合支付:点击购买 → 确认对话框 → 关闭对话框 → 调用微信支付接口(后端自动处理云豆扣减)
190
- - 纯微信支付:点击购买 → 直接调用微信支付接口
191
-
192
- 4. **错误处理**
193
- - 组件内部已处理常见错误(网络错误、支付失败等)
194
- - 通过 `complete` 事件返回结果,由父组件决定后续操作
195
-
196
- ---
197
-
198
- ## RechargeView - 云豆充值视图
199
-
200
- **功能描述**: 提供云豆充值金额选择和微信支付功能。
201
-
202
- ### 导入方式
203
-
204
- ```typescript
205
- import { RechargeView } from '@uxda/appkit/payment'
206
- ```
207
-
208
- ### Props
209
-
210
- | 属性名 | 类型 | 必填 | 默认值 | 说明 |
211
- |--------|------|------|--------|------|
212
- | `app` | `string` | ✅ | - | 应用标识 |
213
- | `tenant` | `string` | ✅ | - | 租户ID |
214
- | `payFinishJumpUrl` | `string` | ❌ | `''` | H5支付完成后跳转地址 |
215
-
216
- ### Events
217
-
218
- | 事件名 | 参数类型 | 说明 |
219
- |--------|----------|------|
220
- | `complete` | `boolean \| any` | 支付完成时触发,返回支付结果 |
221
- | `agree` | - | 用户点击协议链接时触发 |
222
-
223
- ### 使用示例
224
-
225
- ```vue
226
- <template>
227
- <recharge-view
228
- app="loankitMp"
229
- tenant="1"
230
- pay-finish-jump-url="/pages/recharge-success/index"
231
- @complete="handleRechargeComplete"
232
- @agree="handleAgreeClick"
233
- />
234
- </template>
235
-
236
- <script setup>
237
- import { RechargeView } from '@uxda/appkit/payment'
238
-
239
- const handleRechargeComplete = (result) => {
240
- if (result) {
241
- console.log('充值成功')
242
- // 跳转到成功页或刷新余额
243
- }
244
- }
245
- </script>
246
- ```
247
-
248
- ### 注意事项
249
-
250
- 1. 组件会自动获取充值金额列表
251
- 2. 必须勾选协议才能进行支付
252
- <!-- 3. H5环境需要在微信浏览器中打开 -->
253
-
254
- ---
255
-
256
- ## AmountPicker - 金额选择器
257
-
258
- **功能描述**: 用于云豆充值场景的金额选择网格组件。
259
-
260
- ### 导入方式
261
-
262
- ```typescript
263
- import { AmountPicker } from '@uxda/appkit/payment'
264
- ```
265
-
266
- ### Props
267
-
268
- | 属性名 | 类型 | 必填 | 默认值 | 说明 |
269
- |--------|------|------|--------|------|
270
- | `items` | `Amount[]` | ✅ | `[]` | 金额选项列表 |
271
- | `selected` | `number` | ❌ | `0` | 当前选中的索引 |
272
-
273
- ### 类型定义
274
-
275
- ```typescript
276
- type Amount = {
277
- token: number, // 云豆数量
278
- amount: number // 支付金额(元)
279
- }
280
- ```
281
-
282
- ### Events
283
-
284
- | 事件名 | 参数类型 | 说明 |
285
- |--------|----------|------|
286
- | `change` | `number` | 选择改变时触发,返回选中的索引 |
287
-
288
- ### 使用示例
289
-
290
- ```vue
291
- <template>
292
- <amount-picker
293
- :items="amountList"
294
- :selected="selectedIndex"
295
- @change="handleAmountChange"
296
- />
297
- </template>
298
-
299
- <script setup>
300
- import { ref } from 'vue'
301
- import { AmountPicker } from '@uxda/appkit/payment'
302
-
303
- const amountList = ref([
304
- { token: 100, amount: 100 },
305
- { token: 500, amount: 500 },
306
- { token: 1000, amount: 1000 }
307
- ])
308
-
309
- const selectedIndex = ref(0)
310
-
311
- const handleAmountChange = (index) => {
312
- selectedIndex.value = index
313
- console.log('选中金额:', amountList.value[index])
314
- }
315
- </script>
316
- ```
317
-
318
- ### 样式说明
319
-
320
- - 3列网格布局
321
- - 选中项有橙色渐变边框和背景
322
- - 显示云豆图标和金额
323
-
324
- ---
325
-
326
- ## RightsPicker - 权益选择器
327
-
328
- **说明**: 本组件为内部组件,未从 `@uxda/appkit/payment` 直接导出,仅在 TradeView 等内部使用。
329
-
330
- **功能描述**: 用于权益充值场景的权益套餐选择网格组件。
331
-
332
- ### 导入方式
333
-
334
- ```typescript
335
- import { RightsPicker, type Amount } from '@uxda/appkit/payment'
336
- ```
337
-
338
- ### Props
339
-
340
- | 属性名 | 类型 | 必填 | 默认值 | 说明 |
341
- |--------|------|------|--------|------|
342
- | `items` | `Amount[]` | ✅ | `[]` | 权益套餐列表 |
343
- | `selected` | `number` | ❌ | `0` | 当前选中的索引 |
344
-
345
- ### 类型定义
346
-
347
- ```typescript
348
- export type Amount = {
349
- id: string, // 套餐ID
350
- paymentAmount: number, // 支付金额(元)
351
- paymentDesc: string, // 套餐描述(标签文本)
352
- priceRightNum: number // 权益数量(笔数)
353
- }
354
- ```
355
-
356
- ### Events
357
-
358
- | 事件名 | 参数类型 | 说明 |
359
- |--------|----------|------|
360
- | `change` | `number` | 选择改变时触发,返回选中的索引 |
361
-
362
- ### 使用示例
363
-
364
- ```vue
365
- <template>
366
- <rights-picker
367
- :items="rightsList"
368
- :selected="selectedIndex"
369
- @change="handleRightsChange"
370
- />
371
- </template>
372
-
373
- <script setup>
374
- import { ref } from 'vue'
375
- import { RightsPicker, type Amount } from '@uxda/appkit/payment'
376
-
377
- const rightsList = ref<Amount[]>([
378
- {
379
- id: '1',
380
- paymentAmount: 100,
381
- paymentDesc: '推荐',
382
- priceRightNum: 10
383
- },
384
- {
385
- id: '2',
386
- paymentAmount: 500,
387
- paymentDesc: '热销',
388
- priceRightNum: 50
389
- }
390
- ])
391
-
392
- const selectedIndex = ref(0)
393
-
394
- const handleRightsChange = (index) => {
395
- selectedIndex.value = index
396
- }
397
- </script>
398
- ```
399
-
400
- ### 样式说明
401
-
402
- - 3列网格布局
403
- - 每个选项显示:
404
- - 标签(如"推荐"、"热销")
405
- - 权益数量(笔数)
406
- - 支付金额
407
- - 选中项有橙色渐变边框和背景
408
-
409
- ---
410
-
411
- ## RechargeResult - 充值结果页
412
-
413
- **功能描述**: 展示充值或购买成功/失败的结果页面。
414
-
415
- ### 导入方式
416
-
417
- ```typescript
418
- import { RechargeResult } from '@uxda/appkit/payment'
419
- ```
420
-
421
- ### Props
422
-
423
- | 属性名 | 类型 | 必填 | 默认值 | 说明 |
424
- |--------|------|------|--------|------|
425
- | `type` | `string` | ❌ | `'recharge'` | 结果类型<br/>- `'recharge'`: 充值<br/>- `'trade'`: 购买 |
426
- | `payMethod` | `string` | ❌ | `''` | 支付方式<br/>- `'bean'`: 云豆支付<br/>- `'wePay'`: 微信支付 |
427
-
428
- ### Events
429
-
430
- | 事件名 | 参数类型 | 说明 |
431
- |--------|----------|------|
432
- | `dismiss` | - | 点击返回按钮时触发 |
433
-
434
- ### 使用示例
435
-
436
- ```vue
437
- <template>
438
- <recharge-result
439
- type="trade"
440
- pay-method="combined"
441
- @dismiss="handleDismiss"
442
- />
443
- </template>
444
-
445
- <script setup>
446
- import { RechargeResult } from '@uxda/appkit/payment'
447
-
448
- const handleDismiss = () => {
449
- // 返回上一页或跳转到指定页面
450
- Taro.navigateBack()
451
- }
452
- </script>
453
- ```
454
-
455
- ### 显示内容
456
-
457
- 根据 `type` 和 `payMethod` 组合显示不同的文案:
458
-
459
- | type | payMethod | 标题 | 副标题 |
460
- |------|-----------|------|--------|
461
- | `recharge` | - | "充值成功" | "云豆将在1分钟之内到账" |
462
- | `recharge` | `bean` | "充值成功" | "权益已到账" |
463
- | `trade` | - | "购买成功" | "权益将在1分钟之内到账" |
464
- | `trade` | `bean` | "购买成功" | "权益已到账" |
465
-
466
- ---
467
-
468
- ## UserAgreement - 用户协议
469
-
470
- **功能描述**: 展示《大道云平台云豆充值服务协议》的完整内容。
471
-
472
- ### 导入方式
473
-
474
- ```typescript
475
- import { UserAgreement } from '@uxda/appkit/payment'
476
- ```
477
-
478
- ### Props
479
-
480
- 无
481
-
482
- ### Events
483
-
484
- 无
485
-
486
- ### 使用示例
487
-
488
- ```vue
489
- <template>
490
- <user-agreement />
491
- </template>
492
-
493
- <script setup>
494
- import { UserAgreement } from '@uxda/appkit/payment'
495
- </script>
496
- ```
497
-
498
- ### 使用场景
499
-
500
- 通常作为独立页面使用,当用户点击协议链接时跳转到此页面:
501
-
502
- ```vue
503
- <template>
504
- <view>
505
- <trade-view @agree="handleAgree" />
506
- </view>
507
- </template>
508
-
509
- <script setup>
510
- import Taro from '@tarojs/taro'
511
-
512
- const handleAgree = () => {
513
- Taro.navigateTo({
514
- url: '/pages/agreement/index'
515
- })
516
- }
517
- </script>
518
- ```
519
-
520
- ---
521
-
522
- ## 组合使用示例
523
-
524
- ### 完整的权益购买流程
525
-
526
- ```vue
527
- <template>
528
- <view class="trade-page">
529
- <!-- 权益选择与支付 -->
530
- <trade-view
531
- v-if="!showResult"
532
- header-app="loankitMp"
533
- app="corporateStar"
534
- tenant="1"
535
- @complete="handlePayComplete"
536
- @agree="showAgreement"
537
- >
538
- <template #banner>
539
- <div class="promotion-banner">
540
- <h3>同样价格,看更多数据</h3>
541
- <p>了解AI审批一启明星的全面升级版</p>
542
- </div>
543
- </template>
544
- </trade-view>
545
-
546
- <!-- 支付结果页 -->
547
- <recharge-result
548
- v-if="showResult"
549
- type="trade"
550
- :pay-method="payMethod"
551
- @dismiss="handleDismiss"
552
- />
553
- </view>
554
- </template>
555
-
556
- <script setup>
557
- import { ref } from 'vue'
558
- import { TradeView, RechargeResult } from '@uxda/appkit/payment'
559
- import Taro from '@tarojs/taro'
560
-
561
- const showResult = ref(false)
562
- const payMethod = ref('')
563
-
564
- const handlePayComplete = ({ result, type }) => {
565
- if (result) {
566
- payMethod.value = type === 'bean' ? 'bean' : 'wePay'
567
- showResult.value = true
568
- }
569
- }
570
-
571
- const showAgreement = () => {
572
- Taro.navigateTo({
573
- url: '/pages/agreement/index'
574
- })
575
- }
576
-
577
- const handleDismiss = () => {
578
- showResult.value = false
579
- // 可以刷新余额或返回上一页
580
- }
581
- </script>
582
- ```
583
-
584
- ---
585
-
586
- ## 常见问题
587
-
588
- ### Q1: 组合支付时,云豆余额如何扣减?
589
-
590
- A: 当用户选择云豆支付但余额不足时,系统会自动启用组合支付。在调用微信支付接口时,后端会自动:
591
- 1. 先扣减用户全部云豆余额
592
- 2. 计算剩余需要支付的金额
593
- 3. 发起微信支付请求(金额为剩余部分)
594
-
595
- ### Q2: 如何判断支付类型?
596
-
597
- A: 通过 `complete` 事件的 `type` 参数判断:
598
- - `'bean'`: 纯云豆支付
599
- - `'wePay'`: 纯微信支付
600
- - `'combined'`: 组合支付
601
-
602
- ### Q3: 协议复选框何时显示?
603
-
604
- A:
605
- - 纯云豆支付且余额充足:不显示(无需额外支付)
606
- - 组合支付:显示(需要微信支付)
607
- - 纯微信支付:显示(需要微信支付)
608
-
609
- ### Q4: H5环境支付失败怎么办?
610
-
611
- A: 确保:
612
- <!-- 1. 在微信浏览器中打开 -->
613
- 2. 已正确配置 `payFinishJumpUrl`
614
- 3. 检查网络连接和接口权限
615
-
616
- ### Q5: 如何自定义横幅内容?
617
-
618
- A: 使用 `banner` 插槽:
619
-
620
- ```vue
621
- <trade-view>
622
- <template #banner>
623
- <div class="custom-banner">
624
- <!-- 自定义内容 -->
625
- </div>
626
- </template>
627
- </trade-view>
628
- ```
629
-
630
- ---
631
-
632
- ## 更新日志
633
-
634
- ### v1.1.0 (最新)
635
- - ✅ 新增组合支付功能(云豆+微信)
636
- - ✅ 新增余额不足警告提示
637
- - ✅ 优化待支付金额计算逻辑
638
- - ✅ 完善确认对话框显示内容
639
-
640
- ### v1.0.0
641
- - ✅ 基础支付功能
642
- - ✅ 云豆支付支持
643
- - ✅ 微信支付支持
644
-
645
- ---
646
-
647
- # 余额模块组件使用规则
648
-
649
- ## AccountView - 账户总览
650
-
651
- **功能描述**: 展示用户账户余额、权益信息及收支明细的完整账户页面。
652
-
653
- ### 导入方式
654
-
655
- ```typescript
656
- import { AccountView } from '@uxda/appkit/balance'
657
- ```
658
-
659
- ### Props
660
-
661
- | 属性名 | 类型 | 必填 | 默认值 | 说明 |
662
- |--------|------|------|--------|------|
663
- | `app` | `string` | ✅ | `''` | 应用标识 |
664
-
665
- ### Events
666
-
667
- | 事件名 | 参数类型 | 说明 |
668
- |--------|----------|------|
669
- | `recharge` | - | 点击充值按钮时触发 |
670
- | `trade` | `item: any` | 点击权益充值按钮时触发,返回权益项信息 |
671
-
672
- ### 使用示例
673
-
674
- ```vue
675
- <template>
676
- <account-view
677
- app="loankitMp"
678
- @recharge="handleRecharge"
679
- @trade="handleTrade"
680
- />
681
- </template>
682
-
683
- <script setup>
684
- import { AccountView } from '@uxda/appkit/balance'
685
-
686
- const handleRecharge = () => {
687
- // 跳转到充值页面
688
- Taro.navigateTo({
689
- url: '/pages/recharge/index'
690
- })
691
- }
692
-
693
- const handleTrade = (item) => {
694
- // 跳转到权益充值页面
695
- Taro.navigateTo({
696
- url: `/pages/trade/index?id=${item.id}`
697
- })
698
- }
699
- </script>
700
- ```
701
-
702
- ### 功能特性
703
-
704
- 1. **余额展示**: 显示云豆总余额
705
- 2. **权益展示**: 展示各类权益(企明星、AI审批、电子签约等)
706
- 3. **收支明细**: 支持查看收支明细,包含筛选和分页功能
707
- 4. **规则说明**: 支持查看消费规则说明
708
-
709
- ### 注意事项
710
-
711
- - 组件挂载后会自动获取余额和权益信息
712
- - 支持下拉刷新余额数据
713
- - 收支明细支持时间筛选和多条件筛选
714
-
715
- ---
716
-
717
- ## BalanceCard - 余额卡片
718
-
719
- **功能描述**: 用于在首页或个人中心展示余额的卡片组件。
720
-
721
- ### 导入方式
722
-
723
- ```typescript
724
- import { BalanceCard } from '@uxda/appkit/balance'
725
- ```
726
-
727
- ### Props
728
-
729
- | 属性名 | 类型 | 必填 | 默认值 | 说明 |
730
- |--------|------|------|--------|------|
731
- | `app` | `string` | ✅ | `''` | 应用标识 |
732
-
733
- ### Events
734
-
735
- | 事件名 | 参数类型 | 说明 |
736
- |--------|----------|------|
737
- | `drill` | - | 点击账户明细时触发 |
738
- | `recharge` | - | 点击充值按钮时触发 |
739
-
740
- ### 使用示例
741
-
742
- ```vue
743
- <template>
744
- <balance-card
745
- app="loankitMp"
746
- @drill="handleDrill"
747
- @recharge="handleRecharge"
748
- />
749
- </template>
750
-
751
- <script setup>
752
- import { BalanceCard } from '@uxda/appkit/balance'
753
-
754
- const handleDrill = () => {
755
- Taro.navigateTo({
756
- url: '/pages/account/index'
757
- })
758
- }
759
-
760
- const handleRecharge = () => {
761
- Taro.navigateTo({
762
- url: '/pages/recharge/index'
763
- })
764
- }
765
- </script>
766
- ```
767
-
768
- ### 暴露方法
769
-
770
- | 方法名 | 说明 |
771
- |--------|------|
772
- | `reload` | 重新加载余额数据 |
773
-
774
- ```vue
775
- <script setup>
776
- import { ref } from 'vue'
777
- import { BalanceCard } from '@uxda/appkit/balance'
778
-
779
- const balanceCardRef = ref()
780
-
781
- const refreshBalance = () => {
782
- balanceCardRef.value?.reload()
783
- }
784
- </script>
785
-
786
- <template>
787
- <balance-card ref="balanceCardRef" app="loankitMp" />
788
- </template>
789
- ```
790
-
791
- ---
792
-
793
- ## BalanceReminder - 余额提醒
794
-
795
- **功能描述**: 当余额不足时显示的提示弹窗组件。
796
-
797
- ### 导入方式
798
-
799
- ```typescript
800
- import { BalanceReminder } from '@uxda/appkit/balance'
801
- ```
802
-
803
- ### Props
804
-
805
- | 属性名 | 类型 | 必填 | 默认值 | 说明 |
806
- |--------|------|------|--------|------|
807
- | `modelValue` | `boolean` | ✅ | `false` | 控制弹窗显示/隐藏(v-model) |
808
- | `buttonText` | `string` | ❌ | `'去充值'` | 按钮文本 |
809
- | `tip` | `string` | ❌ | `'您的账户可用余额不足,请充值后再进行查询'` | 提示文本 |
810
-
811
- ### Events
812
-
813
- | 事件名 | 参数类型 | 说明 |
814
- |--------|----------|------|
815
- | `update:modelValue` | `boolean` | v-model 更新事件 |
816
- | `recharge` | - | 点击充值按钮时触发 |
817
-
818
- ### 使用示例
819
-
820
- ```vue
821
- <template>
822
- <balance-reminder
823
- v-model="showReminder"
824
- button-text="立即充值"
825
- tip="余额不足,请充值"
826
- @recharge="handleRecharge"
827
- />
828
- </template>
829
-
830
- <script setup>
831
- import { ref } from 'vue'
832
- import { BalanceReminder } from '@uxda/appkit/balance'
833
-
834
- const showReminder = ref(false)
835
-
836
- const handleRecharge = () => {
837
- showReminder.value = false
838
- Taro.navigateTo({
839
- url: '/pages/recharge/index'
840
- })
841
- }
842
- </script>
843
- ```
844
-
845
- ---
846
-
847
- ## DateRange - 日期范围
848
-
849
- **功能描述**: 底部弹窗形式的日期范围选择器,支持 v-model 绑定 `{ from, to }`(日期字符串 YYYY-MM-DD),点击区域打开日期筛选面板,选择完成后更新模型并触发 `complete`。
850
-
851
- ### 导入方式
852
-
853
- ```typescript
854
- import { DateRange } from '@uxda/appkit/balance'
855
- ```
856
-
857
- ### Props
858
-
859
- | 属性名 | 类型 | 必填 | 默认值 | 说明 |
860
- |--------|------|------|--------|------|
861
- | `modelValue` | `DateRangeModel` | ❌ | `{ from, to }`(最近一个月) | v-model 绑定的日期范围<br/>`DateRangeModel = { from: string, to: string }` |
862
-
863
- ### Events
864
-
865
- | 事件名 | 参数类型 | 说明 |
866
- |--------|----------|------|
867
- | `complete` | `DateRangeModel` | 用户确认选择后触发,参数为当前选中的 `{ from, to }` |
868
- | `reset` | - | 用户点击重置时触发 |
869
-
870
- ### Slots
871
-
872
- 无。
873
-
874
- ---
875
-
876
- ## ListFilter - 列表筛选
877
-
878
- **功能描述**: 点击「筛选」打开底部筛选面板(ListFilterPicker),选择后通过 v-model 回写筛选结果,用于列表页的筛选入口。
879
-
880
- ### 导入方式
881
-
882
- ```typescript
883
- import { ListFilter } from '@uxda/appkit/balance'
884
- ```
885
-
886
- ### Props
887
-
888
- | 属性名 | 类型 | 必填 | 默认值 | 说明 |
889
- |--------|------|------|--------|------|
890
- | `modelValue` | `ListFilterValue` | ❌ | `{ type: '' }` | v-model 绑定的筛选值<br/>`ListFilterValue = { type: string }` |
891
-
892
- ### Events
893
-
894
- | 事件名 | 参数类型 | 说明 |
895
- |--------|----------|------|
896
- | `update:modelValue` | `ListFilterValue` | 用户在筛选面板完成选择时触发,用于 v-model 同步 |
897
- | `change` | - | 筛选变更时触发(与类型定义一致,可按需使用) |
898
-
899
- ### Slots
900
-
901
- 无。
902
-
903
- ---
904
-
905
- ## PromoterCard - 推广员卡片
906
-
907
- **功能描述**: 展示推广员可提现余额、产品销售收益、分销返佣收益等信息的卡片;在「企业」场景且为管理员时支持个人/企业 Tab 切换,并支持点击跳转余额/收益/返佣页。
908
-
909
- ### 导入方式
910
-
911
- ```typescript
912
- import { PromoterCard } from '@uxda/appkit/balance'
913
- ```
914
-
915
- ### Props
916
-
917
- | 属性名 | 类型 | 必填 | 默认值 | 说明 |
918
- |--------|------|------|--------|------|
919
- | `useCase` | `string` | ❌ | `''` | 使用场景,如 `'company'` 时与 `isAdmin` 配合显示 Tab |
920
- | `applyRecord` | `any` | ❌ | `{}` | 申请/准入记录,含 `distributorFlag`、`accessCheckStatus` 等,用于控制可提现、下级分销商、收益等区块显示 |
921
- | `isAdmin` | `boolean` | ❌ | `false` | 是否管理员,企业场景下为 true 时显示个人/企业 Tab |
922
- | `显示下级分销商` | `boolean` | ❌ | `false` | 为 true 时展示下级分销商数量,否则展示产品销售收益 |
923
-
924
- ### Events
925
-
926
- | 事件名 | 参数类型 | 说明 |
927
- |--------|----------|------|
928
- | `blance` | `tab: string` | 点击可提现余额区域时触发 |
929
- | `profits` | `tab: string` | 点击产品销售收益时触发 |
930
- | `rebate` | `tab: string` | 点击分销返佣收益时触发 |
931
- | `tab` | `tab: string` | 个人/企业 Tab 切换时触发 |
932
-
933
- ### Slots
934
-
935
- | 插槽名 | 说明 |
936
- |--------|------|
937
- | `tab-btn` | 在 Tab 区域右侧预留的自定义按钮区域 |
938
-
939
- ---
940
-
941
- # 消息通知模块组件使用规则
942
-
943
- ## NoticeBanner - 通知横幅
944
-
945
- **功能描述**: 页面顶部或嵌入式的通告栏,支持多条消息轮播和强制弹窗。
946
-
947
- ### 导入方式
948
-
949
- ```typescript
950
- import { NoticeBanner } from '@uxda/appkit/notice'
951
- ```
952
-
953
- ### Props
954
-
955
- | 属性名 | 类型 | 必填 | 默认值 | 说明 |
956
- |--------|------|------|--------|------|
957
- | `app` | `string` | ✅ | `''` | 应用标识 |
958
- | `bannerStyle` | `any` | ❌ | `''` | 横幅样式 |
959
- | `fixed` | `boolean` | ❌ | `false` | 是否固定定位 |
960
- | `device` | `string` | ❌ | `'MINI'` | 设备类型 |
961
-
962
- ### Events
963
-
964
- | 事件名 | 参数类型 | 说明 |
965
- |--------|----------|------|
966
- | `detail` | `item: any` | 点击详情时触发 |
967
- | `close` | - | 关闭横幅时触发 |
968
- | `view` | `link: string` | 查看附件时触发 |
969
- | `popup` | `hasPopup: boolean` | 弹窗状态变化时触发 |
970
- | `hasBanner` | `hasBanner: boolean` | 横幅状态变化时触发 |
971
-
972
- ### 使用示例
973
-
974
- ```vue
975
- <template>
976
- <notice-banner
977
- app="loankitMp"
978
- :fixed="true"
979
- @detail="handleDetail"
980
- @view="handleView"
981
- />
982
- </template>
983
-
984
- <script setup>
985
- import { NoticeBanner } from '@uxda/appkit/notice'
986
-
987
- const handleDetail = (item) => {
988
- // 跳转到消息详情页
989
- Taro.navigateTo({
990
- url: `/pages/notice/detail?id=${item.id}`
991
- })
992
- }
993
-
994
- const handleView = (link) => {
995
- // 打开附件链接
996
- Taro.navigateTo({
997
- url: `/pages/webview/index?url=${encodeURIComponent(link)}`
998
- })
999
- }
1000
- </script>
1001
- ```
1002
-
1003
- ### 功能特性
1004
-
1005
- 1. **消息轮播**: 多条横幅消息自动轮播(3秒间隔)
1006
- 2. **手势控制**: 触摸时暂停轮播,离开后恢复
1007
- 3. **强制弹窗**: 系统公告类型的消息会以弹窗形式强制显示
1008
- 4. **自动获取**: 组件挂载后自动获取当前应用的消息
1009
-
1010
- ---
1011
-
1012
- ## NoticeList - 消息列表
1013
-
1014
- **功能描述**: 展示历史消息记录,支持搜索、筛选和分页。
1015
-
1016
- ### 导入方式
1017
-
1018
- ```typescript
1019
- import { NoticeList } from '@uxda/appkit/notice'
1020
- ```
1021
-
1022
- ### Props
1023
-
1024
- | 属性名 | 类型 | 必填 | 默认值 | 说明 |
1025
- |--------|------|------|--------|------|
1026
- | `app` | `string` | ✅ | `''` | 应用标识 |
1027
- | `userId` | `string` | ✅ | `''` | 用户ID |
1028
- | `showApp` | `boolean` | ❌ | `false` | 是否显示应用标签 |
1029
- | `checkBeforeRead` | `Function` | ❌ | - | 读取前的检查函数,返回 false 则阻止读取 |
1030
-
1031
- ### Events
1032
-
1033
- | 事件名 | 参数类型 | 说明 |
1034
- |--------|----------|------|
1035
- | `view` | `link: string` | 查看附件时触发 |
1036
-
1037
- ### 使用示例
1038
-
1039
- ```vue
1040
- <template>
1041
- <notice-list
1042
- app="loankitMp"
1043
- :user-id="userId"
1044
- :show-app="true"
1045
- :check-before-read="checkRead"
1046
- @view="handleView"
1047
- />
1048
- </template>
1049
-
1050
- <script setup>
1051
- import { NoticeList } from '@uxda/appkit/notice'
1052
-
1053
- const userId = '123456'
1054
-
1055
- const checkRead = (notice, index) => {
1056
- // 可以在这里添加读取前的逻辑检查
1057
- return true
1058
- }
1059
-
1060
- const handleView = (link) => {
1061
- Taro.navigateTo({
1062
- url: `/pages/webview/index?url=${encodeURIComponent(link)}`
1063
- })
1064
- }
1065
- </script>
1066
- ```
1067
-
1068
- ### 功能特性
1069
-
1070
- 1. **搜索功能**: 支持关键字搜索消息
1071
- 2. **下拉刷新**: 支持下拉刷新消息列表
1072
- 3. **上拉加载**: 自动分页加载更多消息
1073
- 4. **已读标记**: 自动标记消息为已读
1074
- 5. **时间显示**: 智能显示相对时间(如"5分钟前")或绝对时间
1075
-
1076
- ---
1077
-
1078
-
1079
- ---
1080
-
1081
- ## NoticeEntry - 消息入口
1082
-
1083
- **功能描述**: 通常带红点或未读数的消息中心入口图标;挂载后根据 `app`、`userId` 请求未读数量并显示红点。
1084
-
1085
- ### 导入方式
1086
-
1087
- ```typescript
1088
- import { NoticeEntry } from '@uxda/appkit/notice'
1089
- ```
1090
-
1091
- ### Props
1092
-
1093
- | 属性名 | 类型 | 必填 | 默认值 | 说明 |
1094
- |--------|------|------|--------|------|
1095
- | `app` | `string` | ❌ | `''` | 应用标识(必填时传入,否则会 toast 提示缺少 appcode) |
1096
- | `userId` | `string` | ❌ | `''` | 用户ID,用于请求未读数量 |
1097
-
1098
- ### Events
1099
-
1100
- 无(组件仅做展示与红点状态,点击跳转由页面容器或路由处理)。
1101
-
1102
- ---
1103
-
1104
- ## NoticePopup - 通知弹窗
1105
-
1106
- **说明**: 当前未从 `@uxda/appkit/notice` 导出,文档保留供参考。
1107
-
1108
- **功能描述**: 强提醒类型的消息弹窗,展示系统公告内容,支持「我知道了」关闭与「点击查看附件」跳转。
1109
-
1110
- ### 导入方式
1111
-
1112
- ```typescript
1113
- import { NoticePopup } from '@uxda/appkit/notice'
1114
- ```
1115
-
1116
- ### Props
1117
-
1118
- | 属性名 | 类型 | 必填 | 默认值 | 说明 |
1119
- |--------|------|------|--------|------|
1120
- | `message` | `any` | ❌ | `{}` | 消息对象,需含 `context`、`id`、`jumpUrl` 或 `link` 等字段 |
1121
- | `device` | `string` | ❌ | `'MINI'` | 设备类型,用于已读上报接口 |
1122
-
1123
- ### Events
1124
-
1125
- | 事件名 | 参数类型 | 说明 |
1126
- |--------|----------|------|
1127
- | `close` | - | 用户点击「我知道了」或关闭弹窗时触发 |
1128
- | `view` | `string` | 用户点击「点击查看附件」时触发,参数为 `message.jumpUrl` 或 `message.link` |
1129
-
1130
- ---
1131
-
1132
- ## NoticeList2 - 消息列表(二代)
1133
-
1134
- **功能描述**: 消息列表二代页面组件,支持全部/业务消息/系统公告/未读 Tab、下拉刷新、上拉分页、全部已读,点击列表项触发 `itemClick` 并标记已读。
1135
-
1136
- ### 导入方式
1137
-
1138
- ```typescript
1139
- import { NoticeList2 } from '@uxda/appkit/notice'
1140
- ```
1141
-
1142
- ### Props
1143
-
1144
- | 属性名 | 类型 | 必填 | 默认值 | 说明 |
1145
- |--------|------|------|--------|------|
1146
- | `deviceType` | `string` | ❌ | `'2'` | 设备类型,用于列表与已读接口 |
1147
- | `userId` | `string` | ❌ | `''` | 用户ID |
1148
- | `app` | `string` | ❌ | `''` | 应用标识,必填时传入否则列表为空 |
1149
-
1150
- ### Events
1151
-
1152
- | 事件名 | 参数类型 | 说明 |
1153
- |--------|----------|------|
1154
- | `itemClick` | `item: any` | 点击某条消息时触发,参数为该条消息对象 |
1155
-
1156
- ### Slots
1157
-
1158
- 无(Tab 标题使用组件内部模板,如需自定义可参考源码 `#titles`)。
1159
-
1160
- ---
1161
-
1162
- # 用户模块组件使用规则
1163
-
1164
- ## UserEntry - 用户入口
1165
-
1166
- **功能描述**: 用户中心入口区块,展示头像、昵称/手机号(脱敏);未登录时显示「请登录」并可触发 `login`,登录后点击触发 `jump` 跳转个人资料等。
1167
-
1168
- ### 导入方式
1169
-
1170
- ```typescript
1171
- import { UserEntry } from '@uxda/appkit/user'
1172
- ```
1173
-
1174
- ### Props
1175
-
1176
- | 属性名 | 类型 | 必填 | 默认值 | 说明 |
1177
- |--------|------|------|--------|------|
1178
- | `avatar` | `string` | ❌ | `''` | 用户头像 URL |
1179
- | `mobile` | `string` | ❌ | `''` | 手机号(展示时会脱敏) |
1180
- | `name` | `string` | ❌ | `''` | 用户昵称或名称 |
1181
-
1182
- ### Events
1183
-
1184
- | 事件名 | 参数类型 | 说明 |
1185
- |--------|----------|------|
1186
- | `jump` | - | 已登录用户点击头像/名称/手机号时触发,用于跳转个人资料等页 |
1187
- | `login` | - | 未登录用户点击「请登录」时触发,用于跳转登录页 |
1188
-
1189
- ### Slots
1190
-
1191
- 无。
1192
-
1193
- ---
1194
-
1195
- ## UserInfo - 用户信息
1196
-
1197
- **功能描述**: 展示用户头像、昵称、认证信息、企业/团队信息等完整用户资料页面。
1198
-
1199
- ### 导入方式
1200
-
1201
- ```typescript
1202
- import { UserInfo } from '@uxda/appkit/user'
1203
- ```
1204
-
1205
- ### Props
1206
-
1207
- | 属性名 | 类型 | 必填 | 默认值 | 说明 |
1208
- |--------|------|------|--------|------|
1209
- | `miniType` | `string` | ❌ | `'05'` | 小程序类型 |
1210
- | `app` | `string` | ❌ | `''` | 应用标识 |
1211
- | `userId` | `string` | ✅ | `''` | 用户ID |
1212
- | `hasQiyezuhu` | `number` | ❌ | `0` | 是否有企业租户 |
1213
- | `isPersonal` | `number` | ❌ | `0` | 是否个人用户 |
1214
-
1215
- ### Events
1216
-
1217
- | 事件名 | 参数类型 | 说明 |
1218
- |--------|----------|------|
1219
- | `avatar-success` | `avatar: string` | 头像上传成功时触发 |
1220
- | `logout` | - | 退出登录时触发 |
1221
- | `crop` | `filePath: string` | 需要裁剪头像时触发 |
1222
- | `binding` | `mobile: string` | 点击绑定手机号时触发 |
1223
- | `username-success` | - | 用户名修改成功时触发 |
1224
- | `auth` | `userId: string, verifyResult: number, mobile: string` | 点击认证信息时触发 |
1225
-
1226
- ### 使用示例
1227
-
1228
- ```vue
1229
- <template>
1230
- <user-info
1231
- :user-id="userId"
1232
- :has-qiyezuhu="1"
1233
- :is-personal="1"
1234
- @logout="handleLogout"
1235
- @binding="handleBinding"
1236
- @auth="handleAuth"
1237
- @crop="handleCrop"
1238
- />
1239
- </template>
1240
-
1241
- <script setup>
1242
- import { UserInfo } from '@uxda/appkit/user'
1243
- import Taro from '@tarojs/taro'
1244
-
1245
- const userId = '123456'
1246
-
1247
- const handleLogout = () => {
1248
- // 清除登录状态并跳转到登录页
1249
- Taro.reLaunch({
1250
- url: '/pages/login/index'
1251
- })
1252
- }
1253
-
1254
- const handleBinding = (mobile) => {
1255
- Taro.navigateTo({
1256
- url: `/pages/binding/index?mobile=${mobile}`
1257
- })
1258
- }
1259
-
1260
- const handleAuth = (userId, verifyResult, mobile) => {
1261
- Taro.navigateTo({
1262
- url: `/pages/auth/index?userId=${userId}&verifyResult=${verifyResult}&mobile=${mobile}`
1263
- })
1264
- }
1265
-
1266
- const handleCrop = (filePath) => {
1267
- // 跳转到头像裁剪页
1268
- Taro.navigateTo({
1269
- url: `/pages/crop/index?filePath=${filePath}`
1270
- })
1271
- }
1272
- </script>
1273
- ```
1274
-
1275
- ### 暴露方法
1276
-
1277
- | 方法名 | 说明 |
1278
- |--------|------|
1279
- | `updateImage` | 更新头像图片 |
1280
-
1281
- ---
1282
-
1283
- ## UserAuth - 用户认证
1284
-
1285
- **功能描述**: 处理用户身份认证的表单组件,支持OCR识别身份证。
1286
-
1287
- ### 导入方式
1288
-
1289
- ```typescript
1290
- import { UserAuth } from '@uxda/appkit/user'
1291
- ```
1292
-
1293
- ### Props
1294
-
1295
- | 属性名 | 类型 | 必填 | 默认值 | 说明 |
1296
- |--------|------|------|--------|------|
1297
- | `userId` | `string` | ✅ | `''` | 用户ID |
1298
- | `verifyResult` | `number` | ❌ | `-1` | 认证状态(-1: 未认证, 0: 已失效, 1: 已认证) |
1299
- | `mobile` | `string` | ❌ | `''` | 手机号码 |
1300
-
1301
- ### Events
1302
-
1303
- | 事件名 | 参数类型 | 说明 |
1304
- |--------|----------|------|
1305
- | `toAgreement` | - | 点击协议链接时触发 |
1306
-
1307
- ### 使用示例
1308
-
1309
- ```vue
1310
- <template>
1311
- <user-auth
1312
- :user-id="userId"
1313
- :verify-result="verifyResult"
1314
- :mobile="mobile"
1315
- @to-agreement="handleAgreement"
1316
- />
1317
- </template>
1318
-
1319
- <script setup>
1320
- import { UserAuth } from '@uxda/appkit/user'
1321
-
1322
- const userId = '123456'
1323
- const verifyResult = -1
1324
- const mobile = '13800138000'
1325
-
1326
- const handleAgreement = () => {
1327
- Taro.navigateTo({
1328
- url: '/pages/agreement/index'
1329
- })
1330
- }
1331
- </script>
1332
- ```
1333
-
1334
- ### 功能特性
1335
-
1336
- 1. **OCR识别**: 支持拍照识别身份证信息
1337
- 2. **表单验证**: 自动验证身份证号码格式
1338
- 3. **已认证状态**: 已认证用户显示只读模式
1339
-
1340
- ---
1341
-
1342
- ## UserBinding - 账号绑定
1343
-
1344
- **功能描述**: 换绑手机号的流程组件,包含身份认证和换绑两个步骤。
1345
-
1346
- ### 导入方式
1347
-
1348
- ```typescript
1349
- import { UserBinding } from '@uxda/appkit/user'
1350
- ```
1351
-
1352
- ### Props
1353
-
1354
- 无(通过路由参数传递 `mobile`)
1355
-
1356
- ### Events
1357
-
1358
- | 事件名 | 参数类型 | 说明 |
1359
- |--------|----------|------|
1360
- | `success` | `mobile: string` | 换绑成功时触发,返回新手机号 |
1361
-
1362
- ### 使用示例
1363
-
1364
- ```vue
1365
- <template>
1366
- <user-binding @success="handleSuccess" />
1367
- </template>
1368
-
1369
- <script setup>
1370
- import { UserBinding } from '@uxda/appkit/user'
1371
- import Taro from '@tarojs/taro'
1372
-
1373
- const handleSuccess = (mobile) => {
1374
- Taro.showToast({
1375
- title: `换绑成功:${mobile}`,
1376
- icon: 'success'
1377
- })
1378
- setTimeout(() => {
1379
- Taro.navigateBack()
1380
- }, 1500)
1381
- }
1382
- </script>
1383
- ```
1384
-
1385
- ### 路由参数
1386
-
1387
- | 参数名 | 类型 | 必填 | 说明 |
1388
- |--------|------|------|------|
1389
- | `mobile` | `string` | ✅ | 当前手机号 |
1390
-
1391
- ### 使用场景
1392
-
1393
- ```typescript
1394
- // 跳转到换绑页面
1395
- Taro.navigateTo({
1396
- url: `/pages/binding/index?mobile=${currentMobile}`
1397
- })
1398
- ```
1399
-
1400
- ---
1401
-
1402
- # 注册模块组件使用规则
1403
-
1404
- ## SelfRegistration - 自助注册
1405
-
1406
- **功能描述**: 引导新用户完成注册流程的组件,支持个人和公司两种使用场景。
1407
-
1408
- ### 导入方式
1409
-
1410
- ```typescript
1411
- import { SelfRegistration } from '@uxda/appkit/register'
1412
- ```
1413
-
1414
- ### Props
1415
-
1416
- | 属性名 | 类型 | 必填 | 默认值 | 说明 |
1417
- |--------|------|------|--------|------|
1418
- | `banner` | `string` | ❌ | `'https://cdn.ddjf.com/static/images/wx-yunservice/ai-form-bg2.png'` | 顶部横幅图片 |
1419
-
1420
- ### Events
1421
-
1422
- | 事件名 | 参数类型 | 说明 |
1423
- |--------|----------|------|
1424
- | `submit` | `params: object` | 提交注册信息时触发 |
1425
-
1426
- ### 使用示例
1427
-
1428
- ```vue
1429
- <template>
1430
- <self-registration
1431
- banner="/static/images/custom-banner.png"
1432
- @submit="handleSubmit"
1433
- />
1434
- </template>
1435
-
1436
- <script setup>
1437
- import { SelfRegistration } from '@uxda/appkit/register'
1438
-
1439
- const handleSubmit = (params) => {
1440
- console.log('注册信息:', params)
1441
- // {
1442
- // useCase: 'person' | 'company',
1443
- // customerName: string,
1444
- // idCardNo?: string, // 个人场景
1445
- // customerPosition?: string, // 公司场景
1446
- // companyName?: string, // 公司场景
1447
- // customerArea?: string // 公司场景
1448
- // }
1449
-
1450
- // 调用注册接口
1451
- // ...
1452
- }
1453
- </script>
1454
- ```
1455
-
1456
- ### 功能特性
1457
-
1458
- 1. **双场景支持**: 支持个人使用和公司使用两种场景
1459
- 2. **OCR识别**: 支持拍照识别身份证信息
1460
- 3. **表单验证**: 自动验证必填项和格式
1461
- 4. **地区选择**: 公司场景支持省市区选择
1462
-
1463
- ---
1464
-
1465
- # 业务场景组件使用规则
1466
-
1467
- ## SharePoster - 分享海报
1468
-
1469
- **功能描述**: 生成包含二维码和营销信息的图片,用于朋友圈分享。
1470
-
1471
- ### 导入方式
1472
-
1473
- ```typescript
1474
- import { SharePoster } from '@uxda/appkit/scenarios'
1475
- ```
1476
-
1477
- ### Props
1478
-
1479
- | 属性名 | 类型 | 必填 | 默认值 | 说明 |
1480
- |--------|------|------|--------|------|
1481
- | `posters` | `any[]` | ✅ | - | 海报列表 |
1482
- | `text` | `string` | ❌ | - | 底部提示文本 |
1483
-
1484
- ### Events
1485
-
1486
- | 事件名 | 参数类型 | 说明 |
1487
- |--------|----------|------|
1488
- | `share` | - | 点击确定分享时触发 |
1489
-
1490
- ### 使用示例
1491
-
1492
- ```vue
1493
- <template>
1494
- <share-poster
1495
- :posters="posterList"
1496
- text="长按保存图片,分享到朋友圈"
1497
- @share="handleShare"
1498
- />
1499
- </template>
1500
-
1501
- <script setup>
1502
- import { SharePoster } from '@uxda/appkit/scenarios'
1503
-
1504
- const posterList = [
1505
- // 海报配置对象
1506
- ]
1507
-
1508
- const handleShare = () => {
1509
- // 处理分享逻辑
1510
- }
1511
- </script>
1512
- ```
1513
-
1514
- ---
1515
-
1516
- # 共享模块组件使用规则
1517
-
1518
- ## AppDrawer - 抽屉
1519
-
1520
- **功能描述**: 从侧边滑出的抽屉面板,用于展示附加内容或操作菜单。
1521
-
1522
- ### 导入方式
1523
-
1524
- ```typescript
1525
- import { AppDrawer } from '@uxda/appkit'
1526
- // 或
1527
- import { AppDrawer } from '@uxda/appkit/shared'
1528
- ```
1529
-
1530
- ### Props
1531
-
1532
- 待补充(需查看组件实现)
1533
-
1534
- ### Events
1535
-
1536
- 待补充
1537
-
1538
- ### Slots
1539
-
1540
- 待补充
1541
-
1542
- ---
1543
-
1544
- ## PageHeader - 页面头部
1545
-
1546
- **功能描述**: 页面通用头部组件,支持标题、返回按钮等。
1547
-
1548
- ### 导入方式
1549
-
1550
- ```typescript
1551
- import { PageHeader } from '@uxda/appkit'
1552
- // 或
1553
- import { PageHeader } from '@uxda/appkit/shared'
1554
- ```
1555
-
1556
- ### Props
1557
-
1558
- 待补充(需查看组件实现)
1559
-
1560
- ### Events
1561
-
1562
- 待补充
1563
-
1564
- ### Slots
1565
-
1566
- 待补充
1567
-
1568
- ---
1569
-
1570
- ## DeviceVersion - 设备版本
1571
-
1572
- **功能描述**: 展示或检测设备/应用版本信息。
1573
-
1574
- ### 导入方式
1575
-
1576
- ```typescript
1577
- import { DeviceVersion } from '@uxda/appkit'
1578
- // 或
1579
- import { DeviceVersion } from '@uxda/appkit/shared'
1580
- ```
1581
-
1582
- ### Props
1583
-
1584
- 待补充(需查看组件实现)
1585
-
1586
- ### Events
1587
-
1588
- 待补充
1589
-
1590
- ### Slots
1591
-
1592
- 待补充
1593
-
1594
- ---
1595
-
1596
- ## AppVerify - 应用验证
1597
-
1598
- **功能描述**: 应用身份或环境验证相关能力。
1599
-
1600
- ### 导入方式
1601
-
1602
- ```typescript
1603
- import { AppVerify } from '@uxda/appkit'
1604
- // 或
1605
- import { AppVerify } from '@uxda/appkit/shared'
1606
- ```
1607
-
1608
- ### Props
1609
-
1610
- 待补充(需查看组件实现)
1611
-
1612
- ### Events
1613
-
1614
- 待补充
1615
-
1616
- ### Slots
1617
-
1618
- 待补充
1619
-
1620
- ---
1621
-
1622
- ## OcrIcon - OCR 入口
1623
-
1624
- **功能描述**: OCR 识别功能的入口图标/按钮,用于唤起拍照识别等。
1625
-
1626
- ### 导入方式
1627
-
1628
- ```typescript
1629
- import { OcrIcon } from '@uxda/appkit'
1630
- // 或
1631
- import { OcrIcon } from '@uxda/appkit/shared'
1632
- ```
1633
-
1634
- ### Props
1635
-
1636
- 待补充(需查看组件实现)
1637
-
1638
- ### Events
1639
-
1640
- 待补充
1641
-
1642
- ### Slots
1643
-
1644
- 待补充
1645
-
1646
- ---
1647
-
1648
- ## OcrBank - 银行卡 OCR
1649
-
1650
- **功能描述**: 银行卡拍照识别组件,用于自动识别卡号等信息。
1651
-
1652
- ### 导入方式
1653
-
1654
- ```typescript
1655
- import { OcrBank } from '@uxda/appkit'
1656
- // 或
1657
- import { OcrBank } from '@uxda/appkit/shared'
1658
- ```
1659
-
1660
- ### Props
1661
-
1662
- 待补充(需查看组件实现)
1663
-
1664
- ### Events
1665
-
1666
- 待补充
1667
-
1668
- ### Slots
1669
-
1670
- 待补充
1671
-
1672
- ---
1673
-
1674
- ## OcrBusinessLicense - 营业执照 OCR
1675
-
1676
- **功能描述**: 营业执照拍照识别组件,用于自动识别企业信息。
1677
-
1678
- ### 导入方式
1679
-
1680
- ```typescript
1681
- import { OcrBusinessLicense } from '@uxda/appkit'
1682
- // 或
1683
- import { OcrBusinessLicense } from '@uxda/appkit/shared'
1684
- ```
1685
-
1686
- ### Props
1687
-
1688
- 待补充(需查看组件实现)
1689
-
1690
- ### Events
1691
-
1692
- 待补充
1693
-
1694
- ### Slots
1695
-
1696
- 待补充
1697
-
1698
- ---
1699
-
1700
- ## OcrInvoice - 发票 OCR
1701
-
1702
- **功能描述**: 发票拍照识别组件,用于自动识别发票信息。
1703
-
1704
- ### 导入方式
1705
-
1706
- ```typescript
1707
- import { OcrInvoice } from '@uxda/appkit'
1708
- // 或
1709
- import { OcrInvoice } from '@uxda/appkit/shared'
1710
- ```
1711
-
1712
- ### Props
1713
-
1714
- 待补充(需查看组件实现)
1715
-
1716
- ### Events
1717
-
1718
- 待补充
1719
-
1720
- ### Slots
1721
-
1722
- 待补充
1723
-
1724
- ---
1725
-
1726
- ## OfficePdf - PDF 预览
1727
-
1728
- **功能描述**: 基于 @vue-office/pdf 的 PDF 在线预览组件,用于在小程序/H5 中展示 PDF 文件。
1729
-
1730
- ### 导入方式
1731
-
1732
- ```typescript
1733
- import { OfficePdf } from '@uxda/appkit'
1734
- // 或
1735
- import { OfficePdf } from '@uxda/appkit/shared'
1736
- ```
1737
-
1738
- ### Props
1739
-
1740
- | 属性名 | 类型 | 必填 | 默认值 | 说明 |
1741
- |--------|------|------|--------|------|
1742
- | `src` | `string` | ✅ | - | PDF 文件地址(URL) |
1743
-
1744
- ### Events
1745
-
1746
- 组件内部使用 @vue-office/pdf 的 `rendered`、`error`,如需对外暴露可在组件内通过 `defineEmits` 透传。
1747
-
1748
- ### Slots
1749
-
1750
- 无。
1751
-
1752
- ---
1753
-
1754
- ## OfficeDocx - Word 文档预览
1755
-
1756
- **功能描述**: 基于 @vue-office/docx 的 Word 文档在线预览组件,用于在小程序/H5 中展示 .docx 文件。
1757
-
1758
- ### 导入方式
1759
-
1760
- ```typescript
1761
- import { OfficeDocx } from '@uxda/appkit'
1762
- // 或
1763
- import { OfficeDocx } from '@uxda/appkit/shared'
1764
- ```
1765
-
1766
- ### Props
1767
-
1768
- | 属性名 | 类型 | 必填 | 默认值 | 说明 |
1769
- |--------|------|------|--------|------|
1770
- | `src` | `string` | ✅ | - | Word 文档地址(URL) |
1771
-
1772
- ### Events
1773
-
1774
- 组件内部使用 @vue-office/docx 的 `rendered`、`error`,如需对外暴露可在组件内通过 `defineEmits` 透传。
1775
-
1776
- ### Slots
1777
-
1778
- 无。
1779
-
1780
- ---
1781
-
1782
- # 通用基础组件使用规则
1783
-
1784
- ## DdSearch - 搜索框
1785
-
1786
- **功能描述**: 支持导航栏模式的搜索框,带有搜索回调和防抖功能。
1787
-
1788
- ### 导入方式
1789
-
1790
- ```typescript
1791
- import DdSearch from '@uxda/appkit/components/dd-search/index.vue'
1792
- ```
1793
-
1794
- ### Props
1795
-
1796
- | 属性名 | 类型 | 必填 | 默认值 | 说明 |
1797
- |--------|------|------|--------|------|
1798
- | `disabled` | `boolean` | ❌ | `false` | 是否禁用 |
1799
- | `placeholder` | `string` | ❌ | `'请输入'` | 输入框占位符 |
1800
- | `value` | `string` | ❌ | `''` | 绑定值 |
1801
- | `bordered` | `boolean` | ❌ | `true` | 是否显示底部边框 |
1802
- | `inNavbar` | `boolean` | ❌ | `false` | 是否在导航栏中 |
1803
- | `focus` | `boolean` | ❌ | `false` | 是否自动聚焦 |
1804
-
1805
- ### Events
1806
-
1807
- | 事件名 | 参数类型 | 说明 |
1808
- |--------|----------|------|
1809
- | `search` | `value: string` | 点击搜索时触发 |
1810
- | `focus` | `event: Event` | 输入框聚焦时触发 |
1811
-
1812
- ### 使用示例
1813
-
1814
- ```vue
1815
- <template>
1816
- <dd-search
1817
- :bordered="false"
1818
- :in-navbar="true"
1819
- :value="searchStr"
1820
- placeholder="输入客户姓名"
1821
- @search="onSearch"
1822
- @focus="onSearchFocus"
1823
- />
1824
- </template>
1825
-
1826
- <script setup>
1827
- import { ref } from 'vue'
1828
- import DdSearch from '@uxda/appkit/components/dd-search/index.vue'
1829
-
1830
- const searchStr = ref('')
1831
-
1832
- const onSearch = (value) => {
1833
- console.log('搜索:', value)
1834
- }
1835
-
1836
- const onSearchFocus = (event) => {
1837
- console.log('聚焦:', event)
1838
- }
1839
- </script>
1840
- ```
1841
-
1842
- ---
1843
-
1844
- ## DdIcon - 图标组件
1845
-
1846
- **功能描述**: 项目统一的图标封装,使用 iconfont 图标。
1847
-
1848
- ### 导入方式
1849
-
1850
- ```typescript
1851
- import DdIcon from '@uxda/appkit/components/dd-icon/index.vue'
1852
- ```
1853
-
1854
- ### Props
1855
-
1856
- | 属性名 | 类型 | 必填 | 默认值 | 说明 |
1857
- |--------|------|------|--------|------|
1858
- | `name` | `string` | ✅ | `''` | icon 名称 |
1859
- | `color` | `string` | ❌ | `inherit` | icon 颜色 |
1860
- | `size` | `string` | ❌ | `16px` | icon 字体大小 |
1861
- | `weight` | `string` | ❌ | `normal` | icon 字体字重 |
1862
-
1863
- ### 使用示例
1864
-
1865
- ```vue
1866
- <template>
1867
- <dd-icon name="icon-arrow" size="11px" color="#DFDFDF" />
1868
- </template>
1869
-
1870
- <script setup>
1871
- import DdIcon from '@uxda/appkit/components/dd-icon/index.vue'
1872
- </script>
1873
- ```
1874
-
1875
- ---
1876
-
1877
- ## DdSkeleton - 骨架屏
1878
-
1879
- **功能描述**: 数据加载过程中的占位显示,基于 NutUI Skeleton,支持多行与长短行配置,提升用户体验。
1880
-
1881
- ### 导入方式
1882
-
1883
- ```typescript
1884
- import DdSkeleton from '@uxda/appkit/components/dd-skeleton/index.vue'
1885
- ```
1886
-
1887
- ### Props
1888
-
1889
- | 属性名 | 类型 | 必填 | 默认值 | 说明 |
1890
- |--------|------|------|--------|------|
1891
- | `row` | `number` | ❌ | `3` | 骨架行数(每组一行短+一行长) |
1892
- | `shortRow` | `string` | ❌ | `'2'` | 短行骨架的 row 配置(NutUI Skeleton) |
1893
- | `longRow` | `string` | ❌ | `'4'` | 长行骨架的 row 配置(NutUI Skeleton) |
1894
-
1895
- ### 使用示例
1896
-
1897
- ```vue
1898
- <template>
1899
- <dd-skeleton v-if="loading" :row="3" />
1900
- <div v-else>
1901
- <!-- 实际内容 -->
1902
- </div>
1903
- </template>
1904
-
1905
- <script setup>
1906
- import { ref } from 'vue'
1907
- import DdSkeleton from '@uxda/appkit/components/dd-skeleton/index.vue'
1908
-
1909
- const loading = ref(true)
1910
- </script>
1911
- ```
1912
-
1913
- ---
1914
-
1915
- ## DdNoticeBar - 滚动通告栏
1916
-
1917
- **功能描述**: 用于显示简短的滚动消息。
1918
-
1919
- ### 导入方式
1920
-
1921
- ```typescript
1922
- import DdNoticeBar from '@uxda/appkit/components/dd-notice-bar/index.vue'
1923
- ```
1924
-
1925
- ### Props
1926
-
1927
- | 属性名 | 类型 | 必填 | 默认值 | 说明 |
1928
- |--------|------|------|--------|------|
1929
- | `text` | `string` | ❌ | - | 通告文案;与默认插槽二选一 |
1930
- | `style` | `object \| string` | ❌ | - | 根节点样式 |
1931
- | `showClose` | `boolean` | ❌ | - | 是否显示关闭按钮;为 true 时样式变为「已关闭」风格(黄底) |
1932
-
1933
- ### Events
1934
-
1935
- | 事件名 | 参数类型 | 说明 |
1936
- |--------|----------|------|
1937
- | `close` | - | 点击关闭按钮时触发 |
1938
- | `txtClick` | - | 点击通告文本时触发 |
1939
-
1940
- ### Slots
1941
-
1942
- | 插槽名 | 说明 |
1943
- |--------|------|
1944
- | 默认 | 自定义通告内容,与 `text` 二选一使用 |
1945
-
1946
- ### 使用示例
1947
-
1948
- ```vue
1949
- <template>
1950
- <dd-notice-bar :show-close="true" @close="handleClose">
1951
- 这是一条滚动通告消息
1952
- </dd-notice-bar>
1953
- </template>
1954
-
1955
- <script setup>
1956
- import DdNoticeBar from '@uxda/appkit/components/dd-notice-bar/index.vue'
1957
-
1958
- const handleClose = () => {
1959
- console.log('关闭通告')
1960
- }
1961
- </script>
1962
- ```
1963
-
1964
- ---
1965
-
1966
- ## 其他通用组件
1967
-
1968
- ### DdArea - 地区选择器
1969
-
1970
- 省市区三级联动选择组件。
1971
-
1972
- ### DdSelector - 通用选择器
1973
-
1974
- 下拉或弹窗式的单选/多选组件。
1975
-
1976
- ### BtCropper - 图片裁剪器
1977
-
1978
- 基于 canvas 的高性能图片裁剪工具。
1979
-
1980
- ---
1981
-
1982
- ## 更新日志
1983
-
1984
- ### v1.2.0
1985
- - ✅ 补全余额模块组件文档
1986
- - ✅ 补全消息通知模块组件文档
1987
- - ✅ 补全用户模块组件文档
1988
- - ✅ 补全注册模块组件文档
1989
- - ✅ 补全业务场景组件文档
1990
- - ✅ 补全通用基础组件文档
1991
-
1992
- ### v1.1.0
1993
- - ✅ 新增组合支付功能(云豆+微信)
1994
- - ✅ 新增余额不足警告提示
1995
- - ✅ 优化待支付金额计算逻辑
1996
- - ✅ 完善确认对话框显示内容
1997
-
1998
- ### v1.0.0
1999
- - ✅ 基础支付功能
2000
- - ✅ 云豆支付支持
2001
- - ✅ 微信支付支持
2002
-
1
+ # Appkit 组件使用规则
2
+
3
+ 本文档详细说明 Appkit 中各组件的使用方法、属性、事件和注意事项。
4
+
5
+ ## 目录
6
+
7
+ ### 支付模块 (Payment)
8
+ - [TradeView - 权益充值视图](#tradeview---权益充值视图)
9
+ - [RechargeView - 云豆充值视图](#rechargeview---云豆充值视图)
10
+ - [AmountPicker - 金额选择器](#amountpicker---金额选择器)
11
+ - [RechargeResult - 充值结果页](#rechargeresult---充值结果页)
12
+ - [UserAgreement - 用户协议](#useragreement---用户协议)
13
+
14
+ ### 余额模块 (Balance)
15
+ - [AccountView - 账户总览](#accountview---账户总览)
16
+ - [BalanceCard - 余额卡片](#balancecard---余额卡片)
17
+ - [BalanceReminder - 余额提醒](#balancereminder---余额提醒)
18
+ - [DateRange - 日期范围](#daterange---日期范围)
19
+ - [ListFilter - 列表筛选](#listfilter---列表筛选)
20
+ - [PromoterCard - 推广员卡片](#promotercard---推广员卡片)
21
+
22
+ ### 消息通知模块 (Notice)
23
+ - [NoticeBanner - 通知横幅](#noticebanner---通知横幅)
24
+ - [NoticeList - 消息列表](#noticelist---消息列表)
25
+ - [NoticeList2 - 消息列表(二代)](#noticelist2---消息列表二代)
26
+ - [NoticeEntry - 消息入口](#noticeentry---消息入口)
27
+
28
+ ### 用户模块 (User)
29
+ - [UserEntry - 用户入口](#userentry---用户入口)
30
+ - [UserInfo - 用户信息](#userinfo---用户信息)
31
+ - [UserAuth - 用户认证](#userauth---用户认证)
32
+ - [UserBinding - 账号绑定](#userbinding---账号绑定)
33
+ - [UserBindingSuccess - 绑定成功](#userbindingsuccess---绑定成功)
34
+ - [UserHeadCrop - 头像裁剪](#userheadcrop---头像裁剪)
35
+ - [UserFeedback - 用户反馈](#userfeedback---用户反馈)
36
+ - [UserFeedbackEntry - 反馈入口](#userfeedbackentry---反馈入口)
37
+ - [LoginSetting - 登录设置](#loginsetting---登录设置)
38
+ - [UserResourceEmpty - 资源空状态](#userresourceempty---资源空状态)
39
+
40
+ ### 注册模块 (Register)
41
+ - [SelfRegistration - 自助注册](#selfregistration---自助注册)
42
+
43
+ ### 业务场景 (Scenarios)
44
+ - [SharePoster - 分享海报](#shareposter---分享海报)
45
+
46
+ ### 共享模块 (Shared)
47
+ - [AppDrawer - 抽屉](#appdrawer---抽屉)
48
+ - [PageHeader - 页面头部](#pageheader---页面头部)
49
+ - [DeviceVersion - 设备版本](#deviceversion---设备版本)
50
+ - [AppVerify - 应用验证](#appverify---应用验证)
51
+ - [OcrIcon - OCR 入口](#ocricon---ocr-入口)
52
+ - [OcrBank - 银行卡 OCR](#ocrbank---银行卡-ocr)
53
+ - [OcrBusinessLicense - 营业执照 OCR](#ocrbusinesslicense---营业执照-ocr)
54
+ - [OcrInvoice - 发票 OCR](#ocrinvoice---发票-ocr)
55
+ - [OfficePdf - PDF 预览](#officepdf---pdf-预览)
56
+ - [OfficeDocx - Word 文档预览](#officedocx---word-文档预览)
57
+
58
+ ### 通用基础组件 (Components)
59
+ - [DdSearch - 搜索框](#ddsearch---搜索框)
60
+ - [DdIcon - 图标组件](#ddicon---图标组件)
61
+ - [DdSkeleton - 骨架屏](#ddskeleton---骨架屏)
62
+ - [DdNoticeBar - 滚动通告栏](#ddnoticebar---滚动通告栏)
63
+
64
+ ---
65
+
66
+ ## TradeView - 权益充值视图
67
+
68
+ **功能描述**: 提供权益充值金额选择、云豆支付和组合支付(云豆+微信)的完整支付流程。
69
+
70
+ ### 导入方式
71
+
72
+ ```typescript
73
+ import { TradeView } from '@uxda/appkit/payment'
74
+ // 或
75
+ import TradeView from '@uxda/appkit/payment/components/TradeView.vue'
76
+ ```
77
+
78
+ ### Props
79
+
80
+ | 属性名 | 类型 | 必填 | 默认值 | 说明 |
81
+ |--------|------|------|--------|------|
82
+ | `headerApp` | `string` | ✅ | - | header头中的appcode,一般情况下与app参数一致,当无应用权限时,此参数为空 |
83
+ | `app` | `string` | ✅ | - | 应用标识,用于区分不同应用(如:'corporateStar'、'riskQueryMulti') |
84
+ | `tenant` | `string` | ✅ | - | 租户ID |
85
+ | `payFinishJumpUrl` | `string` | ❌ | `''` | H5支付完成后跳转地址 |
86
+
87
+ ### Events
88
+
89
+ | 事件名 | 参数类型 | 说明 |
90
+ |--------|----------|------|
91
+ | `complete` | `{ result: boolean \| any, type: string }` | 支付完成时触发<br/>- `result`: 支付结果<br/>- `type`: 支付类型('bean' | 'wePay' | 'combined')<br/> - `'bean'`: 纯云豆支付<br/> - `'wePay'`: 纯微信支付<br/> - `'combined'`: 组合支付(云豆+微信) |
92
+ | `agree` | - | 用户点击协议链接时触发,可用于打开协议详情页 |
93
+
94
+ ### Slots
95
+
96
+ | 插槽名 | 说明 |
97
+ |--------|------|
98
+ | `banner` | 自定义横幅内容,通常用于展示促销信息或活动内容 |
99
+
100
+ ### 使用示例
101
+
102
+ ```vue
103
+ <template>
104
+ <trade-view
105
+ header-app="loankitMp"
106
+ app="corporateStar"
107
+ tenant="1"
108
+ pay-finish-jump-url="/pages/success/index"
109
+ @complete="handlePayComplete"
110
+ @agree="handleAgreeClick"
111
+ >
112
+ <template #banner>
113
+ <div class="promotion-banner">
114
+ <p>同样价格,看更多数据</p>
115
+ <p>了解AI审批一启明星的全面升级版</p>
116
+ </div>
117
+ </template>
118
+ </trade-view>
119
+ </template>
120
+
121
+ <script setup>
122
+ import { TradeView } from '@uxda/appkit/payment'
123
+
124
+ const handlePayComplete = ({ result, type }) => {
125
+ console.log('支付完成', { result, type })
126
+ if (result) {
127
+ // 支付成功处理
128
+ if (type === 'bean') {
129
+ // 纯云豆支付成功
130
+ } else if (type === 'wePay') {
131
+ // 纯微信支付成功
132
+ } else if (type === 'combined') {
133
+ // 组合支付成功
134
+ }
135
+ }
136
+ }
137
+
138
+ const handleAgreeClick = () => {
139
+ // 打开协议详情页
140
+ Taro.navigateTo({
141
+ url: '/pages/agreement/index'
142
+ })
143
+ }
144
+ </script>
145
+ ```
146
+
147
+ ### 功能特性
148
+
149
+ #### 1. 云豆支付模式
150
+
151
+ - **纯云豆支付**: 当用户选择云豆支付且余额充足时,直接使用云豆完成支付
152
+ - **组合支付**: 当用户选择云豆支付但余额不足时,自动启用组合支付模式
153
+ - 先扣减全部云豆余额
154
+ - 剩余金额通过微信支付完成
155
+
156
+ #### 2. 余额不足提示
157
+
158
+ 当启用组合支付时,组件会自动显示:
159
+ - 余额不足警告:`"云豆余额不足,还需额外支付XX元"`
160
+ - 风险提示:`"请在支付完成前确保元豆余额不被消耗,否则本次权益可能购买失败"`
161
+
162
+ #### 3. 待支付金额计算
163
+
164
+ - 纯云豆支付(余额充足): 显示 `¥0`
165
+ - 组合支付(余额不足): 显示额外需要支付的金额
166
+ - 纯微信支付: 显示全额
167
+
168
+ #### 4. 协议确认
169
+
170
+ - 纯云豆支付且余额充足: 不显示协议复选框(无需额外支付)
171
+ - 组合支付或纯微信支付: 必须勾选协议才能继续
172
+
173
+ ### 注意事项
174
+
175
+ 1. **环境要求**
176
+ <!-- - H5环境:必须在微信浏览器中打开 -->
177
+ - 小程序环境:需要配置微信登录权限
178
+
179
+ 2. **数据获取**
180
+ - 组件挂载后会自动调用接口获取:
181
+ - 用户云豆余额
182
+ - 权益套餐列表
183
+ - 根据 `app` 参数自动选择对应的权益类型:
184
+ - `'corporateStar'` → `'riskQueryCompany'`
185
+ - 其他 → `'riskQueryMulti'`
186
+
187
+ 3. **支付流程**
188
+ - 纯云豆支付:点击购买 → 确认对话框 → 调用云豆支付接口
189
+ - 组合支付:点击购买 → 确认对话框 → 关闭对话框 → 调用微信支付接口(后端自动处理云豆扣减)
190
+ - 纯微信支付:点击购买 → 直接调用微信支付接口
191
+
192
+ 4. **错误处理**
193
+ - 组件内部已处理常见错误(网络错误、支付失败等)
194
+ - 通过 `complete` 事件返回结果,由父组件决定后续操作
195
+
196
+ ---
197
+
198
+ ## RechargeView - 云豆充值视图
199
+
200
+ **功能描述**: 提供云豆充值金额选择和微信支付功能。
201
+
202
+ ### 导入方式
203
+
204
+ ```typescript
205
+ import { RechargeView } from '@uxda/appkit/payment'
206
+ ```
207
+
208
+ ### Props
209
+
210
+ | 属性名 | 类型 | 必填 | 默认值 | 说明 |
211
+ |--------|------|------|--------|------|
212
+ | `app` | `string` | ✅ | - | 应用标识 |
213
+ | `tenant` | `string` | ✅ | - | 租户ID |
214
+ | `payFinishJumpUrl` | `string` | ❌ | `''` | H5支付完成后跳转地址 |
215
+
216
+ ### Events
217
+
218
+ | 事件名 | 参数类型 | 说明 |
219
+ |--------|----------|------|
220
+ | `complete` | `boolean \| any` | 支付完成时触发,返回支付结果 |
221
+ | `agree` | - | 用户点击协议链接时触发 |
222
+
223
+ ### 使用示例
224
+
225
+ ```vue
226
+ <template>
227
+ <recharge-view
228
+ app="loankitMp"
229
+ tenant="1"
230
+ pay-finish-jump-url="/pages/recharge-success/index"
231
+ @complete="handleRechargeComplete"
232
+ @agree="handleAgreeClick"
233
+ />
234
+ </template>
235
+
236
+ <script setup>
237
+ import { RechargeView } from '@uxda/appkit/payment'
238
+
239
+ const handleRechargeComplete = (result) => {
240
+ if (result) {
241
+ console.log('充值成功')
242
+ // 跳转到成功页或刷新余额
243
+ }
244
+ }
245
+ </script>
246
+ ```
247
+
248
+ ### 注意事项
249
+
250
+ 1. 组件会自动获取充值金额列表
251
+ 2. 必须勾选协议才能进行支付
252
+ <!-- 3. H5环境需要在微信浏览器中打开 -->
253
+
254
+ ---
255
+
256
+ ## AmountPicker - 金额选择器
257
+
258
+ **功能描述**: 用于云豆充值场景的金额选择网格组件。
259
+
260
+ ### 导入方式
261
+
262
+ ```typescript
263
+ import { AmountPicker } from '@uxda/appkit/payment'
264
+ ```
265
+
266
+ ### Props
267
+
268
+ | 属性名 | 类型 | 必填 | 默认值 | 说明 |
269
+ |--------|------|------|--------|------|
270
+ | `items` | `Amount[]` | ✅ | `[]` | 金额选项列表 |
271
+ | `selected` | `number` | ❌ | `0` | 当前选中的索引 |
272
+
273
+ ### 类型定义
274
+
275
+ ```typescript
276
+ type Amount = {
277
+ token: number, // 云豆数量
278
+ amount: number // 支付金额(元)
279
+ }
280
+ ```
281
+
282
+ ### Events
283
+
284
+ | 事件名 | 参数类型 | 说明 |
285
+ |--------|----------|------|
286
+ | `change` | `number` | 选择改变时触发,返回选中的索引 |
287
+
288
+ ### 使用示例
289
+
290
+ ```vue
291
+ <template>
292
+ <amount-picker
293
+ :items="amountList"
294
+ :selected="selectedIndex"
295
+ @change="handleAmountChange"
296
+ />
297
+ </template>
298
+
299
+ <script setup>
300
+ import { ref } from 'vue'
301
+ import { AmountPicker } from '@uxda/appkit/payment'
302
+
303
+ const amountList = ref([
304
+ { token: 100, amount: 100 },
305
+ { token: 500, amount: 500 },
306
+ { token: 1000, amount: 1000 }
307
+ ])
308
+
309
+ const selectedIndex = ref(0)
310
+
311
+ const handleAmountChange = (index) => {
312
+ selectedIndex.value = index
313
+ console.log('选中金额:', amountList.value[index])
314
+ }
315
+ </script>
316
+ ```
317
+
318
+ ### 样式说明
319
+
320
+ - 3列网格布局
321
+ - 选中项有橙色渐变边框和背景
322
+ - 显示云豆图标和金额
323
+
324
+ ---
325
+
326
+ ## RightsPicker - 权益选择器
327
+
328
+ **说明**: 本组件为内部组件,未从 `@uxda/appkit/payment` 直接导出,仅在 TradeView 等内部使用。
329
+
330
+ **功能描述**: 用于权益充值场景的权益套餐选择网格组件。
331
+
332
+ ### 导入方式
333
+
334
+ ```typescript
335
+ import { RightsPicker, type Amount } from '@uxda/appkit/payment'
336
+ ```
337
+
338
+ ### Props
339
+
340
+ | 属性名 | 类型 | 必填 | 默认值 | 说明 |
341
+ |--------|------|------|--------|------|
342
+ | `items` | `Amount[]` | ✅ | `[]` | 权益套餐列表 |
343
+ | `selected` | `number` | ❌ | `0` | 当前选中的索引 |
344
+
345
+ ### 类型定义
346
+
347
+ ```typescript
348
+ export type Amount = {
349
+ id: string, // 套餐ID
350
+ paymentAmount: number, // 支付金额(元)
351
+ paymentDesc: string, // 套餐描述(标签文本)
352
+ priceRightNum: number // 权益数量(笔数)
353
+ }
354
+ ```
355
+
356
+ ### Events
357
+
358
+ | 事件名 | 参数类型 | 说明 |
359
+ |--------|----------|------|
360
+ | `change` | `number` | 选择改变时触发,返回选中的索引 |
361
+
362
+ ### 使用示例
363
+
364
+ ```vue
365
+ <template>
366
+ <rights-picker
367
+ :items="rightsList"
368
+ :selected="selectedIndex"
369
+ @change="handleRightsChange"
370
+ />
371
+ </template>
372
+
373
+ <script setup>
374
+ import { ref } from 'vue'
375
+ import { RightsPicker, type Amount } from '@uxda/appkit/payment'
376
+
377
+ const rightsList = ref<Amount[]>([
378
+ {
379
+ id: '1',
380
+ paymentAmount: 100,
381
+ paymentDesc: '推荐',
382
+ priceRightNum: 10
383
+ },
384
+ {
385
+ id: '2',
386
+ paymentAmount: 500,
387
+ paymentDesc: '热销',
388
+ priceRightNum: 50
389
+ }
390
+ ])
391
+
392
+ const selectedIndex = ref(0)
393
+
394
+ const handleRightsChange = (index) => {
395
+ selectedIndex.value = index
396
+ }
397
+ </script>
398
+ ```
399
+
400
+ ### 样式说明
401
+
402
+ - 3列网格布局
403
+ - 每个选项显示:
404
+ - 标签(如"推荐"、"热销")
405
+ - 权益数量(笔数)
406
+ - 支付金额
407
+ - 选中项有橙色渐变边框和背景
408
+
409
+ ---
410
+
411
+ ## RechargeResult - 充值结果页
412
+
413
+ **功能描述**: 展示充值或购买成功/失败的结果页面。
414
+
415
+ ### 导入方式
416
+
417
+ ```typescript
418
+ import { RechargeResult } from '@uxda/appkit/payment'
419
+ ```
420
+
421
+ ### Props
422
+
423
+ | 属性名 | 类型 | 必填 | 默认值 | 说明 |
424
+ |--------|------|------|--------|------|
425
+ | `type` | `string` | ❌ | `'recharge'` | 结果类型<br/>- `'recharge'`: 充值<br/>- `'trade'`: 购买 |
426
+ | `payMethod` | `string` | ❌ | `''` | 支付方式<br/>- `'bean'`: 云豆支付<br/>- `'wePay'`: 微信支付 |
427
+
428
+ ### Events
429
+
430
+ | 事件名 | 参数类型 | 说明 |
431
+ |--------|----------|------|
432
+ | `dismiss` | - | 点击返回按钮时触发 |
433
+
434
+ ### 使用示例
435
+
436
+ ```vue
437
+ <template>
438
+ <recharge-result
439
+ type="trade"
440
+ pay-method="combined"
441
+ @dismiss="handleDismiss"
442
+ />
443
+ </template>
444
+
445
+ <script setup>
446
+ import { RechargeResult } from '@uxda/appkit/payment'
447
+
448
+ const handleDismiss = () => {
449
+ // 返回上一页或跳转到指定页面
450
+ Taro.navigateBack()
451
+ }
452
+ </script>
453
+ ```
454
+
455
+ ### 显示内容
456
+
457
+ 根据 `type` 和 `payMethod` 组合显示不同的文案:
458
+
459
+ | type | payMethod | 标题 | 副标题 |
460
+ |------|-----------|------|--------|
461
+ | `recharge` | - | "充值成功" | "云豆将在1分钟之内到账" |
462
+ | `recharge` | `bean` | "充值成功" | "权益已到账" |
463
+ | `trade` | - | "购买成功" | "权益将在1分钟之内到账" |
464
+ | `trade` | `bean` | "购买成功" | "权益已到账" |
465
+
466
+ ---
467
+
468
+ ## UserAgreement - 用户协议
469
+
470
+ **功能描述**: 展示《大道云平台云豆充值服务协议》的完整内容。
471
+
472
+ ### 导入方式
473
+
474
+ ```typescript
475
+ import { UserAgreement } from '@uxda/appkit/payment'
476
+ ```
477
+
478
+ ### Props
479
+
480
+ 无
481
+
482
+ ### Events
483
+
484
+ 无
485
+
486
+ ### 使用示例
487
+
488
+ ```vue
489
+ <template>
490
+ <user-agreement />
491
+ </template>
492
+
493
+ <script setup>
494
+ import { UserAgreement } from '@uxda/appkit/payment'
495
+ </script>
496
+ ```
497
+
498
+ ### 使用场景
499
+
500
+ 通常作为独立页面使用,当用户点击协议链接时跳转到此页面:
501
+
502
+ ```vue
503
+ <template>
504
+ <view>
505
+ <trade-view @agree="handleAgree" />
506
+ </view>
507
+ </template>
508
+
509
+ <script setup>
510
+ import Taro from '@tarojs/taro'
511
+
512
+ const handleAgree = () => {
513
+ Taro.navigateTo({
514
+ url: '/pages/agreement/index'
515
+ })
516
+ }
517
+ </script>
518
+ ```
519
+
520
+ ---
521
+
522
+ ## 组合使用示例
523
+
524
+ ### 完整的权益购买流程
525
+
526
+ ```vue
527
+ <template>
528
+ <view class="trade-page">
529
+ <!-- 权益选择与支付 -->
530
+ <trade-view
531
+ v-if="!showResult"
532
+ header-app="loankitMp"
533
+ app="corporateStar"
534
+ tenant="1"
535
+ @complete="handlePayComplete"
536
+ @agree="showAgreement"
537
+ >
538
+ <template #banner>
539
+ <div class="promotion-banner">
540
+ <h3>同样价格,看更多数据</h3>
541
+ <p>了解AI审批一启明星的全面升级版</p>
542
+ </div>
543
+ </template>
544
+ </trade-view>
545
+
546
+ <!-- 支付结果页 -->
547
+ <recharge-result
548
+ v-if="showResult"
549
+ type="trade"
550
+ :pay-method="payMethod"
551
+ @dismiss="handleDismiss"
552
+ />
553
+ </view>
554
+ </template>
555
+
556
+ <script setup>
557
+ import { ref } from 'vue'
558
+ import { TradeView, RechargeResult } from '@uxda/appkit/payment'
559
+ import Taro from '@tarojs/taro'
560
+
561
+ const showResult = ref(false)
562
+ const payMethod = ref('')
563
+
564
+ const handlePayComplete = ({ result, type }) => {
565
+ if (result) {
566
+ payMethod.value = type === 'bean' ? 'bean' : 'wePay'
567
+ showResult.value = true
568
+ }
569
+ }
570
+
571
+ const showAgreement = () => {
572
+ Taro.navigateTo({
573
+ url: '/pages/agreement/index'
574
+ })
575
+ }
576
+
577
+ const handleDismiss = () => {
578
+ showResult.value = false
579
+ // 可以刷新余额或返回上一页
580
+ }
581
+ </script>
582
+ ```
583
+
584
+ ---
585
+
586
+ ## 常见问题
587
+
588
+ ### Q1: 组合支付时,云豆余额如何扣减?
589
+
590
+ A: 当用户选择云豆支付但余额不足时,系统会自动启用组合支付。在调用微信支付接口时,后端会自动:
591
+ 1. 先扣减用户全部云豆余额
592
+ 2. 计算剩余需要支付的金额
593
+ 3. 发起微信支付请求(金额为剩余部分)
594
+
595
+ ### Q2: 如何判断支付类型?
596
+
597
+ A: 通过 `complete` 事件的 `type` 参数判断:
598
+ - `'bean'`: 纯云豆支付
599
+ - `'wePay'`: 纯微信支付
600
+ - `'combined'`: 组合支付
601
+
602
+ ### Q3: 协议复选框何时显示?
603
+
604
+ A:
605
+ - 纯云豆支付且余额充足:不显示(无需额外支付)
606
+ - 组合支付:显示(需要微信支付)
607
+ - 纯微信支付:显示(需要微信支付)
608
+
609
+ ### Q4: H5环境支付失败怎么办?
610
+
611
+ A: 确保:
612
+ <!-- 1. 在微信浏览器中打开 -->
613
+ 2. 已正确配置 `payFinishJumpUrl`
614
+ 3. 检查网络连接和接口权限
615
+
616
+ ### Q5: 如何自定义横幅内容?
617
+
618
+ A: 使用 `banner` 插槽:
619
+
620
+ ```vue
621
+ <trade-view>
622
+ <template #banner>
623
+ <div class="custom-banner">
624
+ <!-- 自定义内容 -->
625
+ </div>
626
+ </template>
627
+ </trade-view>
628
+ ```
629
+
630
+ ---
631
+
632
+ ## 更新日志
633
+
634
+ ### v1.1.0 (最新)
635
+ - ✅ 新增组合支付功能(云豆+微信)
636
+ - ✅ 新增余额不足警告提示
637
+ - ✅ 优化待支付金额计算逻辑
638
+ - ✅ 完善确认对话框显示内容
639
+
640
+ ### v1.0.0
641
+ - ✅ 基础支付功能
642
+ - ✅ 云豆支付支持
643
+ - ✅ 微信支付支持
644
+
645
+ ---
646
+
647
+ # 余额模块组件使用规则
648
+
649
+ ## AccountView - 账户总览
650
+
651
+ **功能描述**: 展示用户账户余额、权益信息及收支明细的完整账户页面。
652
+
653
+ ### 导入方式
654
+
655
+ ```typescript
656
+ import { AccountView } from '@uxda/appkit/balance'
657
+ ```
658
+
659
+ ### Props
660
+
661
+ | 属性名 | 类型 | 必填 | 默认值 | 说明 |
662
+ |--------|------|------|--------|------|
663
+ | `app` | `string` | ✅ | `''` | 应用标识 |
664
+
665
+ ### Events
666
+
667
+ | 事件名 | 参数类型 | 说明 |
668
+ |--------|----------|------|
669
+ | `recharge` | - | 点击充值按钮时触发 |
670
+ | `trade` | `item: any` | 点击权益充值按钮时触发,返回权益项信息 |
671
+
672
+ ### 使用示例
673
+
674
+ ```vue
675
+ <template>
676
+ <account-view
677
+ app="loankitMp"
678
+ @recharge="handleRecharge"
679
+ @trade="handleTrade"
680
+ />
681
+ </template>
682
+
683
+ <script setup>
684
+ import { AccountView } from '@uxda/appkit/balance'
685
+
686
+ const handleRecharge = () => {
687
+ // 跳转到充值页面
688
+ Taro.navigateTo({
689
+ url: '/pages/recharge/index'
690
+ })
691
+ }
692
+
693
+ const handleTrade = (item) => {
694
+ // 跳转到权益充值页面
695
+ Taro.navigateTo({
696
+ url: `/pages/trade/index?id=${item.id}`
697
+ })
698
+ }
699
+ </script>
700
+ ```
701
+
702
+ ### 功能特性
703
+
704
+ 1. **余额展示**: 显示云豆总余额
705
+ 2. **权益展示**: 展示各类权益(企明星、AI审批、电子签约等)
706
+ 3. **收支明细**: 支持查看收支明细,包含筛选和分页功能
707
+ 4. **规则说明**: 支持查看消费规则说明
708
+
709
+ ### 注意事项
710
+
711
+ - 组件挂载后会自动获取余额和权益信息
712
+ - 支持下拉刷新余额数据
713
+ - 收支明细支持时间筛选和多条件筛选
714
+
715
+ ---
716
+
717
+ ## BalanceCard - 余额卡片
718
+
719
+ **功能描述**: 用于在首页或个人中心展示余额的卡片组件。
720
+
721
+ ### 导入方式
722
+
723
+ ```typescript
724
+ import { BalanceCard } from '@uxda/appkit/balance'
725
+ ```
726
+
727
+ ### Props
728
+
729
+ | 属性名 | 类型 | 必填 | 默认值 | 说明 |
730
+ |--------|------|------|--------|------|
731
+ | `app` | `string` | ✅ | `''` | 应用标识 |
732
+
733
+ ### Events
734
+
735
+ | 事件名 | 参数类型 | 说明 |
736
+ |--------|----------|------|
737
+ | `drill` | - | 点击账户明细时触发 |
738
+ | `recharge` | - | 点击充值按钮时触发 |
739
+
740
+ ### 使用示例
741
+
742
+ ```vue
743
+ <template>
744
+ <balance-card
745
+ app="loankitMp"
746
+ @drill="handleDrill"
747
+ @recharge="handleRecharge"
748
+ />
749
+ </template>
750
+
751
+ <script setup>
752
+ import { BalanceCard } from '@uxda/appkit/balance'
753
+
754
+ const handleDrill = () => {
755
+ Taro.navigateTo({
756
+ url: '/pages/account/index'
757
+ })
758
+ }
759
+
760
+ const handleRecharge = () => {
761
+ Taro.navigateTo({
762
+ url: '/pages/recharge/index'
763
+ })
764
+ }
765
+ </script>
766
+ ```
767
+
768
+ ### 暴露方法
769
+
770
+ | 方法名 | 说明 |
771
+ |--------|------|
772
+ | `reload` | 重新加载余额数据 |
773
+
774
+ ```vue
775
+ <script setup>
776
+ import { ref } from 'vue'
777
+ import { BalanceCard } from '@uxda/appkit/balance'
778
+
779
+ const balanceCardRef = ref()
780
+
781
+ const refreshBalance = () => {
782
+ balanceCardRef.value?.reload()
783
+ }
784
+ </script>
785
+
786
+ <template>
787
+ <balance-card ref="balanceCardRef" app="loankitMp" />
788
+ </template>
789
+ ```
790
+
791
+ ---
792
+
793
+ ## BalanceReminder - 余额提醒
794
+
795
+ **功能描述**: 当余额不足时显示的提示弹窗组件。
796
+
797
+ ### 导入方式
798
+
799
+ ```typescript
800
+ import { BalanceReminder } from '@uxda/appkit/balance'
801
+ ```
802
+
803
+ ### Props
804
+
805
+ | 属性名 | 类型 | 必填 | 默认值 | 说明 |
806
+ |--------|------|------|--------|------|
807
+ | `modelValue` | `boolean` | ✅ | `false` | 控制弹窗显示/隐藏(v-model) |
808
+ | `buttonText` | `string` | ❌ | `'去充值'` | 按钮文本 |
809
+ | `tip` | `string` | ❌ | `'您的账户可用余额不足,请充值后再进行查询'` | 提示文本 |
810
+
811
+ ### Events
812
+
813
+ | 事件名 | 参数类型 | 说明 |
814
+ |--------|----------|------|
815
+ | `update:modelValue` | `boolean` | v-model 更新事件 |
816
+ | `recharge` | - | 点击充值按钮时触发 |
817
+
818
+ ### 使用示例
819
+
820
+ ```vue
821
+ <template>
822
+ <balance-reminder
823
+ v-model="showReminder"
824
+ button-text="立即充值"
825
+ tip="余额不足,请充值"
826
+ @recharge="handleRecharge"
827
+ />
828
+ </template>
829
+
830
+ <script setup>
831
+ import { ref } from 'vue'
832
+ import { BalanceReminder } from '@uxda/appkit/balance'
833
+
834
+ const showReminder = ref(false)
835
+
836
+ const handleRecharge = () => {
837
+ showReminder.value = false
838
+ Taro.navigateTo({
839
+ url: '/pages/recharge/index'
840
+ })
841
+ }
842
+ </script>
843
+ ```
844
+
845
+ ---
846
+
847
+ ## DateRange - 日期范围
848
+
849
+ **功能描述**: 底部弹窗形式的日期范围选择器,支持 v-model 绑定 `{ from, to }`(日期字符串 YYYY-MM-DD),点击区域打开日期筛选面板,选择完成后更新模型并触发 `complete`。
850
+
851
+ ### 导入方式
852
+
853
+ ```typescript
854
+ import { DateRange } from '@uxda/appkit/balance'
855
+ ```
856
+
857
+ ### Props
858
+
859
+ | 属性名 | 类型 | 必填 | 默认值 | 说明 |
860
+ |--------|------|------|--------|------|
861
+ | `modelValue` | `DateRangeModel` | ❌ | `{ from, to }`(最近一个月) | v-model 绑定的日期范围<br/>`DateRangeModel = { from: string, to: string }` |
862
+
863
+ ### Events
864
+
865
+ | 事件名 | 参数类型 | 说明 |
866
+ |--------|----------|------|
867
+ | `complete` | `DateRangeModel` | 用户确认选择后触发,参数为当前选中的 `{ from, to }` |
868
+ | `reset` | - | 用户点击重置时触发 |
869
+
870
+ ### Slots
871
+
872
+ 无。
873
+
874
+ ---
875
+
876
+ ## ListFilter - 列表筛选
877
+
878
+ **功能描述**: 点击「筛选」打开底部筛选面板(ListFilterPicker),选择后通过 v-model 回写筛选结果,用于列表页的筛选入口。
879
+
880
+ ### 导入方式
881
+
882
+ ```typescript
883
+ import { ListFilter } from '@uxda/appkit/balance'
884
+ ```
885
+
886
+ ### Props
887
+
888
+ | 属性名 | 类型 | 必填 | 默认值 | 说明 |
889
+ |--------|------|------|--------|------|
890
+ | `modelValue` | `ListFilterValue` | ❌ | `{ type: '' }` | v-model 绑定的筛选值<br/>`ListFilterValue = { type: string }` |
891
+
892
+ ### Events
893
+
894
+ | 事件名 | 参数类型 | 说明 |
895
+ |--------|----------|------|
896
+ | `update:modelValue` | `ListFilterValue` | 用户在筛选面板完成选择时触发,用于 v-model 同步 |
897
+ | `change` | - | 筛选变更时触发(与类型定义一致,可按需使用) |
898
+
899
+ ### Slots
900
+
901
+ 无。
902
+
903
+ ---
904
+
905
+ ## PromoterCard - 推广员卡片
906
+
907
+ **功能描述**: 展示推广员可提现余额、产品销售收益、分销返佣收益等信息的卡片;在「企业」场景且为管理员时支持个人/企业 Tab 切换,并支持点击跳转余额/收益/返佣页。
908
+
909
+ ### 导入方式
910
+
911
+ ```typescript
912
+ import { PromoterCard } from '@uxda/appkit/balance'
913
+ ```
914
+
915
+ ### Props
916
+
917
+ | 属性名 | 类型 | 必填 | 默认值 | 说明 |
918
+ |--------|------|------|--------|------|
919
+ | `useCase` | `string` | ❌ | `''` | 使用场景,如 `'company'` 时与 `isAdmin` 配合显示 Tab |
920
+ | `applyRecord` | `any` | ❌ | `{}` | 申请/准入记录,含 `distributorFlag`、`accessCheckStatus` 等,用于控制可提现、下级分销商、收益等区块显示 |
921
+ | `isAdmin` | `boolean` | ❌ | `false` | 是否管理员,企业场景下为 true 时显示个人/企业 Tab |
922
+ | `显示下级分销商` | `boolean` | ❌ | `false` | 为 true 时展示下级分销商数量,否则展示产品销售收益 |
923
+
924
+ ### Events
925
+
926
+ | 事件名 | 参数类型 | 说明 |
927
+ |--------|----------|------|
928
+ | `blance` | `tab: string` | 点击可提现余额区域时触发 |
929
+ | `profits` | `tab: string` | 点击产品销售收益时触发 |
930
+ | `rebate` | `tab: string` | 点击分销返佣收益时触发 |
931
+ | `tab` | `tab: string` | 个人/企业 Tab 切换时触发 |
932
+
933
+ ### Slots
934
+
935
+ | 插槽名 | 说明 |
936
+ |--------|------|
937
+ | `tab-btn` | 在 Tab 区域右侧预留的自定义按钮区域 |
938
+
939
+ ---
940
+
941
+ # 消息通知模块组件使用规则
942
+
943
+ ## NoticeBanner - 通知横幅
944
+
945
+ **功能描述**: 页面顶部或嵌入式的通告栏,支持多条消息轮播和强制弹窗。
946
+
947
+ ### 导入方式
948
+
949
+ ```typescript
950
+ import { NoticeBanner } from '@uxda/appkit/notice'
951
+ ```
952
+
953
+ ### Props
954
+
955
+ | 属性名 | 类型 | 必填 | 默认值 | 说明 |
956
+ |--------|------|------|--------|------|
957
+ | `app` | `string` | ✅ | `''` | 应用标识 |
958
+ | `bannerStyle` | `any` | ❌ | `''` | 横幅样式 |
959
+ | `fixed` | `boolean` | ❌ | `false` | 是否固定定位 |
960
+ | `device` | `string` | ❌ | `'MINI'` | 设备类型 |
961
+
962
+ ### Events
963
+
964
+ | 事件名 | 参数类型 | 说明 |
965
+ |--------|----------|------|
966
+ | `detail` | `item: any` | 点击详情时触发 |
967
+ | `close` | - | 关闭横幅时触发 |
968
+ | `view` | `link: string` | 查看附件时触发 |
969
+ | `popup` | `hasPopup: boolean` | 弹窗状态变化时触发 |
970
+ | `hasBanner` | `hasBanner: boolean` | 横幅状态变化时触发 |
971
+
972
+ ### 使用示例
973
+
974
+ ```vue
975
+ <template>
976
+ <notice-banner
977
+ app="loankitMp"
978
+ :fixed="true"
979
+ @detail="handleDetail"
980
+ @view="handleView"
981
+ />
982
+ </template>
983
+
984
+ <script setup>
985
+ import { NoticeBanner } from '@uxda/appkit/notice'
986
+
987
+ const handleDetail = (item) => {
988
+ // 跳转到消息详情页
989
+ Taro.navigateTo({
990
+ url: `/pages/notice/detail?id=${item.id}`
991
+ })
992
+ }
993
+
994
+ const handleView = (link) => {
995
+ // 打开附件链接
996
+ Taro.navigateTo({
997
+ url: `/pages/webview/index?url=${encodeURIComponent(link)}`
998
+ })
999
+ }
1000
+ </script>
1001
+ ```
1002
+
1003
+ ### 功能特性
1004
+
1005
+ 1. **消息轮播**: 多条横幅消息自动轮播(3秒间隔)
1006
+ 2. **手势控制**: 触摸时暂停轮播,离开后恢复
1007
+ 3. **强制弹窗**: 系统公告类型的消息会以弹窗形式强制显示
1008
+ 4. **自动获取**: 组件挂载后自动获取当前应用的消息
1009
+
1010
+ ---
1011
+
1012
+ ## NoticeList - 消息列表
1013
+
1014
+ **功能描述**: 展示历史消息记录,支持搜索、筛选和分页。
1015
+
1016
+ ### 导入方式
1017
+
1018
+ ```typescript
1019
+ import { NoticeList } from '@uxda/appkit/notice'
1020
+ ```
1021
+
1022
+ ### Props
1023
+
1024
+ | 属性名 | 类型 | 必填 | 默认值 | 说明 |
1025
+ |--------|------|------|--------|------|
1026
+ | `app` | `string` | ✅ | `''` | 应用标识 |
1027
+ | `userId` | `string` | ✅ | `''` | 用户ID |
1028
+ | `showApp` | `boolean` | ❌ | `false` | 是否显示应用标签 |
1029
+ | `checkBeforeRead` | `Function` | ❌ | - | 读取前的检查函数,返回 false 则阻止读取 |
1030
+
1031
+ ### Events
1032
+
1033
+ | 事件名 | 参数类型 | 说明 |
1034
+ |--------|----------|------|
1035
+ | `view` | `link: string` | 查看附件时触发 |
1036
+
1037
+ ### 使用示例
1038
+
1039
+ ```vue
1040
+ <template>
1041
+ <notice-list
1042
+ app="loankitMp"
1043
+ :user-id="userId"
1044
+ :show-app="true"
1045
+ :check-before-read="checkRead"
1046
+ @view="handleView"
1047
+ />
1048
+ </template>
1049
+
1050
+ <script setup>
1051
+ import { NoticeList } from '@uxda/appkit/notice'
1052
+
1053
+ const userId = '123456'
1054
+
1055
+ const checkRead = (notice, index) => {
1056
+ // 可以在这里添加读取前的逻辑检查
1057
+ return true
1058
+ }
1059
+
1060
+ const handleView = (link) => {
1061
+ Taro.navigateTo({
1062
+ url: `/pages/webview/index?url=${encodeURIComponent(link)}`
1063
+ })
1064
+ }
1065
+ </script>
1066
+ ```
1067
+
1068
+ ### 功能特性
1069
+
1070
+ 1. **搜索功能**: 支持关键字搜索消息
1071
+ 2. **下拉刷新**: 支持下拉刷新消息列表
1072
+ 3. **上拉加载**: 自动分页加载更多消息
1073
+ 4. **已读标记**: 自动标记消息为已读
1074
+ 5. **时间显示**: 智能显示相对时间(如"5分钟前")或绝对时间
1075
+
1076
+ ---
1077
+
1078
+
1079
+ ---
1080
+
1081
+ ## NoticeEntry - 消息入口
1082
+
1083
+ **功能描述**: 通常带红点或未读数的消息中心入口图标;挂载后根据 `app`、`userId` 请求未读数量并显示红点。
1084
+
1085
+ ### 导入方式
1086
+
1087
+ ```typescript
1088
+ import { NoticeEntry } from '@uxda/appkit/notice'
1089
+ ```
1090
+
1091
+ ### Props
1092
+
1093
+ | 属性名 | 类型 | 必填 | 默认值 | 说明 |
1094
+ |--------|------|------|--------|------|
1095
+ | `app` | `string` | ❌ | `''` | 应用标识(必填时传入,否则会 toast 提示缺少 appcode) |
1096
+ | `userId` | `string` | ❌ | `''` | 用户ID,用于请求未读数量 |
1097
+
1098
+ ### Events
1099
+
1100
+ 无(组件仅做展示与红点状态,点击跳转由页面容器或路由处理)。
1101
+
1102
+ ---
1103
+
1104
+ ## NoticePopup - 通知弹窗
1105
+
1106
+ **说明**: 当前未从 `@uxda/appkit/notice` 导出,文档保留供参考。
1107
+
1108
+ **功能描述**: 强提醒类型的消息弹窗,展示系统公告内容,支持「我知道了」关闭与「点击查看附件」跳转。
1109
+
1110
+ ### 导入方式
1111
+
1112
+ ```typescript
1113
+ import { NoticePopup } from '@uxda/appkit/notice'
1114
+ ```
1115
+
1116
+ ### Props
1117
+
1118
+ | 属性名 | 类型 | 必填 | 默认值 | 说明 |
1119
+ |--------|------|------|--------|------|
1120
+ | `message` | `any` | ❌ | `{}` | 消息对象,需含 `context`、`id`、`jumpUrl` 或 `link` 等字段 |
1121
+ | `device` | `string` | ❌ | `'MINI'` | 设备类型,用于已读上报接口 |
1122
+
1123
+ ### Events
1124
+
1125
+ | 事件名 | 参数类型 | 说明 |
1126
+ |--------|----------|------|
1127
+ | `close` | - | 用户点击「我知道了」或关闭弹窗时触发 |
1128
+ | `view` | `string` | 用户点击「点击查看附件」时触发,参数为 `message.jumpUrl` 或 `message.link` |
1129
+
1130
+ ---
1131
+
1132
+ ## NoticeList2 - 消息列表(二代)
1133
+
1134
+ **功能描述**: 消息列表二代页面组件,支持全部/业务消息/系统公告/未读 Tab、下拉刷新、上拉分页、全部已读,点击列表项触发 `itemClick` 并标记已读。
1135
+
1136
+ ### 导入方式
1137
+
1138
+ ```typescript
1139
+ import { NoticeList2 } from '@uxda/appkit/notice'
1140
+ ```
1141
+
1142
+ ### Props
1143
+
1144
+ | 属性名 | 类型 | 必填 | 默认值 | 说明 |
1145
+ |--------|------|------|--------|------|
1146
+ | `deviceType` | `string` | ❌ | `'2'` | 设备类型,用于列表与已读接口 |
1147
+ | `userId` | `string` | ❌ | `''` | 用户ID |
1148
+ | `app` | `string` | ❌ | `''` | 应用标识,必填时传入否则列表为空 |
1149
+
1150
+ ### Events
1151
+
1152
+ | 事件名 | 参数类型 | 说明 |
1153
+ |--------|----------|------|
1154
+ | `itemClick` | `item: any` | 点击某条消息时触发,参数为该条消息对象 |
1155
+
1156
+ ### Slots
1157
+
1158
+ 无(Tab 标题使用组件内部模板,如需自定义可参考源码 `#titles`)。
1159
+
1160
+ ---
1161
+
1162
+ # 用户模块组件使用规则
1163
+
1164
+ ## UserEntry - 用户入口
1165
+
1166
+ **功能描述**: 用户中心入口区块,展示头像、昵称/手机号(脱敏);未登录时显示「请登录」并可触发 `login`,登录后点击触发 `jump` 跳转个人资料等。
1167
+
1168
+ ### 导入方式
1169
+
1170
+ ```typescript
1171
+ import { UserEntry } from '@uxda/appkit/user'
1172
+ ```
1173
+
1174
+ ### Props
1175
+
1176
+ | 属性名 | 类型 | 必填 | 默认值 | 说明 |
1177
+ |--------|------|------|--------|------|
1178
+ | `avatar` | `string` | ❌ | `''` | 用户头像 URL |
1179
+ | `mobile` | `string` | ❌ | `''` | 手机号(展示时会脱敏) |
1180
+ | `name` | `string` | ❌ | `''` | 用户昵称或名称 |
1181
+
1182
+ ### Events
1183
+
1184
+ | 事件名 | 参数类型 | 说明 |
1185
+ |--------|----------|------|
1186
+ | `jump` | - | 已登录用户点击头像/名称/手机号时触发,用于跳转个人资料等页 |
1187
+ | `login` | - | 未登录用户点击「请登录」时触发,用于跳转登录页 |
1188
+
1189
+ ### Slots
1190
+
1191
+ 无。
1192
+
1193
+ ---
1194
+
1195
+ ## UserInfo - 用户信息
1196
+
1197
+ **功能描述**: 展示用户头像、昵称、认证信息、企业/团队信息等完整用户资料页面。
1198
+
1199
+ ### 导入方式
1200
+
1201
+ ```typescript
1202
+ import { UserInfo } from '@uxda/appkit/user'
1203
+ ```
1204
+
1205
+ ### Props
1206
+
1207
+ | 属性名 | 类型 | 必填 | 默认值 | 说明 |
1208
+ |--------|------|------|--------|------|
1209
+ | `miniType` | `string` | ❌ | `'05'` | 小程序类型 |
1210
+ | `app` | `string` | ❌ | `''` | 应用标识 |
1211
+ | `userId` | `string` | ✅ | `''` | 用户ID |
1212
+ | `hasQiyezuhu` | `number` | ❌ | `0` | 是否有企业租户 |
1213
+ | `isPersonal` | `number` | ❌ | `0` | 是否个人用户 |
1214
+
1215
+ ### Events
1216
+
1217
+ | 事件名 | 参数类型 | 说明 |
1218
+ |--------|----------|------|
1219
+ | `avatar-success` | `avatar: string` | 头像上传成功时触发 |
1220
+ | `logout` | - | 退出登录时触发 |
1221
+ | `crop` | `filePath: string` | 需要裁剪头像时触发 |
1222
+ | `binding` | `mobile: string` | 点击绑定手机号时触发 |
1223
+ | `username-success` | - | 用户名修改成功时触发 |
1224
+ | `auth` | `userId: string, verifyResult: number, mobile: string` | 点击认证信息时触发 |
1225
+
1226
+ ### 使用示例
1227
+
1228
+ ```vue
1229
+ <template>
1230
+ <user-info
1231
+ :user-id="userId"
1232
+ :has-qiyezuhu="1"
1233
+ :is-personal="1"
1234
+ @logout="handleLogout"
1235
+ @binding="handleBinding"
1236
+ @auth="handleAuth"
1237
+ @crop="handleCrop"
1238
+ />
1239
+ </template>
1240
+
1241
+ <script setup>
1242
+ import { UserInfo } from '@uxda/appkit/user'
1243
+ import Taro from '@tarojs/taro'
1244
+
1245
+ const userId = '123456'
1246
+
1247
+ const handleLogout = () => {
1248
+ // 清除登录状态并跳转到登录页
1249
+ Taro.reLaunch({
1250
+ url: '/pages/login/index'
1251
+ })
1252
+ }
1253
+
1254
+ const handleBinding = (mobile) => {
1255
+ Taro.navigateTo({
1256
+ url: `/pages/binding/index?mobile=${mobile}`
1257
+ })
1258
+ }
1259
+
1260
+ const handleAuth = (userId, verifyResult, mobile) => {
1261
+ Taro.navigateTo({
1262
+ url: `/pages/auth/index?userId=${userId}&verifyResult=${verifyResult}&mobile=${mobile}`
1263
+ })
1264
+ }
1265
+
1266
+ const handleCrop = (filePath) => {
1267
+ // 跳转到头像裁剪页
1268
+ Taro.navigateTo({
1269
+ url: `/pages/crop/index?filePath=${filePath}`
1270
+ })
1271
+ }
1272
+ </script>
1273
+ ```
1274
+
1275
+ ### 暴露方法
1276
+
1277
+ | 方法名 | 说明 |
1278
+ |--------|------|
1279
+ | `updateImage` | 更新头像图片 |
1280
+
1281
+ ---
1282
+
1283
+ ## UserAuth - 用户认证
1284
+
1285
+ **功能描述**: 处理用户身份认证的表单组件,支持OCR识别身份证。
1286
+
1287
+ ### 导入方式
1288
+
1289
+ ```typescript
1290
+ import { UserAuth } from '@uxda/appkit/user'
1291
+ ```
1292
+
1293
+ ### Props
1294
+
1295
+ | 属性名 | 类型 | 必填 | 默认值 | 说明 |
1296
+ |--------|------|------|--------|------|
1297
+ | `userId` | `string` | ✅ | `''` | 用户ID |
1298
+ | `verifyResult` | `number` | ❌ | `-1` | 认证状态(-1: 未认证, 0: 已失效, 1: 已认证) |
1299
+ | `mobile` | `string` | ❌ | `''` | 手机号码 |
1300
+
1301
+ ### Events
1302
+
1303
+ | 事件名 | 参数类型 | 说明 |
1304
+ |--------|----------|------|
1305
+ | `toAgreement` | - | 点击协议链接时触发 |
1306
+
1307
+ ### 使用示例
1308
+
1309
+ ```vue
1310
+ <template>
1311
+ <user-auth
1312
+ :user-id="userId"
1313
+ :verify-result="verifyResult"
1314
+ :mobile="mobile"
1315
+ @to-agreement="handleAgreement"
1316
+ />
1317
+ </template>
1318
+
1319
+ <script setup>
1320
+ import { UserAuth } from '@uxda/appkit/user'
1321
+
1322
+ const userId = '123456'
1323
+ const verifyResult = -1
1324
+ const mobile = '13800138000'
1325
+
1326
+ const handleAgreement = () => {
1327
+ Taro.navigateTo({
1328
+ url: '/pages/agreement/index'
1329
+ })
1330
+ }
1331
+ </script>
1332
+ ```
1333
+
1334
+ ### 功能特性
1335
+
1336
+ 1. **OCR识别**: 支持拍照识别身份证信息
1337
+ 2. **表单验证**: 自动验证身份证号码格式
1338
+ 3. **已认证状态**: 已认证用户显示只读模式
1339
+
1340
+ ---
1341
+
1342
+ ## UserBinding - 账号绑定
1343
+
1344
+ **功能描述**: 换绑手机号的流程组件,包含身份认证和换绑两个步骤。
1345
+
1346
+ ### 导入方式
1347
+
1348
+ ```typescript
1349
+ import { UserBinding } from '@uxda/appkit/user'
1350
+ ```
1351
+
1352
+ ### Props
1353
+
1354
+ 无(通过路由参数传递 `mobile`)
1355
+
1356
+ ### Events
1357
+
1358
+ | 事件名 | 参数类型 | 说明 |
1359
+ |--------|----------|------|
1360
+ | `success` | `mobile: string` | 换绑成功时触发,返回新手机号 |
1361
+
1362
+ ### 使用示例
1363
+
1364
+ ```vue
1365
+ <template>
1366
+ <user-binding @success="handleSuccess" />
1367
+ </template>
1368
+
1369
+ <script setup>
1370
+ import { UserBinding } from '@uxda/appkit/user'
1371
+ import Taro from '@tarojs/taro'
1372
+
1373
+ const handleSuccess = (mobile) => {
1374
+ Taro.showToast({
1375
+ title: `换绑成功:${mobile}`,
1376
+ icon: 'success'
1377
+ })
1378
+ setTimeout(() => {
1379
+ Taro.navigateBack()
1380
+ }, 1500)
1381
+ }
1382
+ </script>
1383
+ ```
1384
+
1385
+ ### 路由参数
1386
+
1387
+ | 参数名 | 类型 | 必填 | 说明 |
1388
+ |--------|------|------|------|
1389
+ | `mobile` | `string` | ✅ | 当前手机号 |
1390
+
1391
+ ### 使用场景
1392
+
1393
+ ```typescript
1394
+ // 跳转到换绑页面
1395
+ Taro.navigateTo({
1396
+ url: `/pages/binding/index?mobile=${currentMobile}`
1397
+ })
1398
+ ```
1399
+
1400
+ ---
1401
+
1402
+ # 注册模块组件使用规则
1403
+
1404
+ ## SelfRegistration - 自助注册
1405
+
1406
+ **功能描述**: 引导新用户完成注册流程的组件,支持个人和公司两种使用场景。
1407
+
1408
+ ### 导入方式
1409
+
1410
+ ```typescript
1411
+ import { SelfRegistration } from '@uxda/appkit/register'
1412
+ ```
1413
+
1414
+ ### Props
1415
+
1416
+ | 属性名 | 类型 | 必填 | 默认值 | 说明 |
1417
+ |--------|------|------|--------|------|
1418
+ | `banner` | `string` | ❌ | `'https://cdn.ddjf.com/static/images/wx-yunservice/ai-form-bg2.png'` | 顶部横幅图片 |
1419
+
1420
+ ### Events
1421
+
1422
+ | 事件名 | 参数类型 | 说明 |
1423
+ |--------|----------|------|
1424
+ | `submit` | `params: object` | 提交注册信息时触发 |
1425
+
1426
+ ### 使用示例
1427
+
1428
+ ```vue
1429
+ <template>
1430
+ <self-registration
1431
+ banner="/static/images/custom-banner.png"
1432
+ @submit="handleSubmit"
1433
+ />
1434
+ </template>
1435
+
1436
+ <script setup>
1437
+ import { SelfRegistration } from '@uxda/appkit/register'
1438
+
1439
+ const handleSubmit = (params) => {
1440
+ console.log('注册信息:', params)
1441
+ // {
1442
+ // useCase: 'person' | 'company',
1443
+ // customerName: string,
1444
+ // idCardNo?: string, // 个人场景
1445
+ // customerPosition?: string, // 公司场景
1446
+ // companyName?: string, // 公司场景
1447
+ // customerArea?: string // 公司场景
1448
+ // }
1449
+
1450
+ // 调用注册接口
1451
+ // ...
1452
+ }
1453
+ </script>
1454
+ ```
1455
+
1456
+ ### 功能特性
1457
+
1458
+ 1. **双场景支持**: 支持个人使用和公司使用两种场景
1459
+ 2. **OCR识别**: 支持拍照识别身份证信息
1460
+ 3. **表单验证**: 自动验证必填项和格式
1461
+ 4. **地区选择**: 公司场景支持省市区选择
1462
+
1463
+ ---
1464
+
1465
+ # 业务场景组件使用规则
1466
+
1467
+ ## SharePoster - 分享海报
1468
+
1469
+ **功能描述**: 生成包含二维码和营销信息的图片,用于朋友圈分享。
1470
+
1471
+ ### 导入方式
1472
+
1473
+ ```typescript
1474
+ import { SharePoster } from '@uxda/appkit/scenarios'
1475
+ ```
1476
+
1477
+ ### Props
1478
+
1479
+ | 属性名 | 类型 | 必填 | 默认值 | 说明 |
1480
+ |--------|------|------|--------|------|
1481
+ | `posters` | `any[]` | ✅ | - | 海报列表 |
1482
+ | `text` | `string` | ❌ | - | 底部提示文本 |
1483
+
1484
+ ### Events
1485
+
1486
+ | 事件名 | 参数类型 | 说明 |
1487
+ |--------|----------|------|
1488
+ | `share` | - | 点击确定分享时触发 |
1489
+
1490
+ ### 使用示例
1491
+
1492
+ ```vue
1493
+ <template>
1494
+ <share-poster
1495
+ :posters="posterList"
1496
+ text="长按保存图片,分享到朋友圈"
1497
+ @share="handleShare"
1498
+ />
1499
+ </template>
1500
+
1501
+ <script setup>
1502
+ import { SharePoster } from '@uxda/appkit/scenarios'
1503
+
1504
+ const posterList = [
1505
+ // 海报配置对象
1506
+ ]
1507
+
1508
+ const handleShare = () => {
1509
+ // 处理分享逻辑
1510
+ }
1511
+ </script>
1512
+ ```
1513
+
1514
+ ---
1515
+
1516
+ # 共享模块组件使用规则
1517
+
1518
+ ## AppDrawer - 抽屉
1519
+
1520
+ **功能描述**: 从侧边滑出的抽屉面板,用于展示附加内容或操作菜单。
1521
+
1522
+ ### 导入方式
1523
+
1524
+ ```typescript
1525
+ import { AppDrawer } from '@uxda/appkit'
1526
+ // 或
1527
+ import { AppDrawer } from '@uxda/appkit/shared'
1528
+ ```
1529
+
1530
+ ### Props
1531
+
1532
+ 待补充(需查看组件实现)
1533
+
1534
+ ### Events
1535
+
1536
+ 待补充
1537
+
1538
+ ### Slots
1539
+
1540
+ 待补充
1541
+
1542
+ ---
1543
+
1544
+ ## PageHeader - 页面头部
1545
+
1546
+ **功能描述**: 页面通用头部组件,支持标题、返回按钮等。
1547
+
1548
+ ### 导入方式
1549
+
1550
+ ```typescript
1551
+ import { PageHeader } from '@uxda/appkit'
1552
+ // 或
1553
+ import { PageHeader } from '@uxda/appkit/shared'
1554
+ ```
1555
+
1556
+ ### Props
1557
+
1558
+ 待补充(需查看组件实现)
1559
+
1560
+ ### Events
1561
+
1562
+ 待补充
1563
+
1564
+ ### Slots
1565
+
1566
+ 待补充
1567
+
1568
+ ---
1569
+
1570
+ ## DeviceVersion - 设备版本
1571
+
1572
+ **功能描述**: 展示或检测设备/应用版本信息。
1573
+
1574
+ ### 导入方式
1575
+
1576
+ ```typescript
1577
+ import { DeviceVersion } from '@uxda/appkit'
1578
+ // 或
1579
+ import { DeviceVersion } from '@uxda/appkit/shared'
1580
+ ```
1581
+
1582
+ ### Props
1583
+
1584
+ 待补充(需查看组件实现)
1585
+
1586
+ ### Events
1587
+
1588
+ 待补充
1589
+
1590
+ ### Slots
1591
+
1592
+ 待补充
1593
+
1594
+ ---
1595
+
1596
+ ## AppVerify - 应用验证
1597
+
1598
+ **功能描述**: 应用身份或环境验证相关能力。
1599
+
1600
+ ### 导入方式
1601
+
1602
+ ```typescript
1603
+ import { AppVerify } from '@uxda/appkit'
1604
+ // 或
1605
+ import { AppVerify } from '@uxda/appkit/shared'
1606
+ ```
1607
+
1608
+ ### Props
1609
+
1610
+ 待补充(需查看组件实现)
1611
+
1612
+ ### Events
1613
+
1614
+ 待补充
1615
+
1616
+ ### Slots
1617
+
1618
+ 待补充
1619
+
1620
+ ---
1621
+
1622
+ ## OcrIcon - OCR 入口
1623
+
1624
+ **功能描述**: OCR 识别功能的入口图标/按钮,用于唤起拍照识别等。
1625
+
1626
+ ### 导入方式
1627
+
1628
+ ```typescript
1629
+ import { OcrIcon } from '@uxda/appkit'
1630
+ // 或
1631
+ import { OcrIcon } from '@uxda/appkit/shared'
1632
+ ```
1633
+
1634
+ ### Props
1635
+
1636
+ 待补充(需查看组件实现)
1637
+
1638
+ ### Events
1639
+
1640
+ 待补充
1641
+
1642
+ ### Slots
1643
+
1644
+ 待补充
1645
+
1646
+ ---
1647
+
1648
+ ## OcrBank - 银行卡 OCR
1649
+
1650
+ **功能描述**: 银行卡拍照识别组件,用于自动识别卡号等信息。
1651
+
1652
+ ### 导入方式
1653
+
1654
+ ```typescript
1655
+ import { OcrBank } from '@uxda/appkit'
1656
+ // 或
1657
+ import { OcrBank } from '@uxda/appkit/shared'
1658
+ ```
1659
+
1660
+ ### Props
1661
+
1662
+ 待补充(需查看组件实现)
1663
+
1664
+ ### Events
1665
+
1666
+ 待补充
1667
+
1668
+ ### Slots
1669
+
1670
+ 待补充
1671
+
1672
+ ---
1673
+
1674
+ ## OcrBusinessLicense - 营业执照 OCR
1675
+
1676
+ **功能描述**: 营业执照拍照识别组件,用于自动识别企业信息。
1677
+
1678
+ ### 导入方式
1679
+
1680
+ ```typescript
1681
+ import { OcrBusinessLicense } from '@uxda/appkit'
1682
+ // 或
1683
+ import { OcrBusinessLicense } from '@uxda/appkit/shared'
1684
+ ```
1685
+
1686
+ ### Props
1687
+
1688
+ 待补充(需查看组件实现)
1689
+
1690
+ ### Events
1691
+
1692
+ 待补充
1693
+
1694
+ ### Slots
1695
+
1696
+ 待补充
1697
+
1698
+ ---
1699
+
1700
+ ## OcrInvoice - 发票 OCR
1701
+
1702
+ **功能描述**: 发票拍照识别组件,用于自动识别发票信息。
1703
+
1704
+ ### 导入方式
1705
+
1706
+ ```typescript
1707
+ import { OcrInvoice } from '@uxda/appkit'
1708
+ // 或
1709
+ import { OcrInvoice } from '@uxda/appkit/shared'
1710
+ ```
1711
+
1712
+ ### Props
1713
+
1714
+ 待补充(需查看组件实现)
1715
+
1716
+ ### Events
1717
+
1718
+ 待补充
1719
+
1720
+ ### Slots
1721
+
1722
+ 待补充
1723
+
1724
+ ---
1725
+
1726
+ ## OfficePdf - PDF 预览
1727
+
1728
+ **功能描述**: 基于 @vue-office/pdf 的 PDF 在线预览组件,用于在小程序/H5 中展示 PDF 文件。
1729
+
1730
+ ### 导入方式
1731
+
1732
+ ```typescript
1733
+ import { OfficePdf } from '@uxda/appkit'
1734
+ // 或
1735
+ import { OfficePdf } from '@uxda/appkit/shared'
1736
+ ```
1737
+
1738
+ ### Props
1739
+
1740
+ | 属性名 | 类型 | 必填 | 默认值 | 说明 |
1741
+ |--------|------|------|--------|------|
1742
+ | `src` | `string` | ✅ | - | PDF 文件地址(URL) |
1743
+
1744
+ ### Events
1745
+
1746
+ 组件内部使用 @vue-office/pdf 的 `rendered`、`error`,如需对外暴露可在组件内通过 `defineEmits` 透传。
1747
+
1748
+ ### Slots
1749
+
1750
+ 无。
1751
+
1752
+ ---
1753
+
1754
+ ## OfficeDocx - Word 文档预览
1755
+
1756
+ **功能描述**: 基于 @vue-office/docx 的 Word 文档在线预览组件,用于在小程序/H5 中展示 .docx 文件。
1757
+
1758
+ ### 导入方式
1759
+
1760
+ ```typescript
1761
+ import { OfficeDocx } from '@uxda/appkit'
1762
+ // 或
1763
+ import { OfficeDocx } from '@uxda/appkit/shared'
1764
+ ```
1765
+
1766
+ ### Props
1767
+
1768
+ | 属性名 | 类型 | 必填 | 默认值 | 说明 |
1769
+ |--------|------|------|--------|------|
1770
+ | `src` | `string` | ✅ | - | Word 文档地址(URL) |
1771
+
1772
+ ### Events
1773
+
1774
+ 组件内部使用 @vue-office/docx 的 `rendered`、`error`,如需对外暴露可在组件内通过 `defineEmits` 透传。
1775
+
1776
+ ### Slots
1777
+
1778
+ 无。
1779
+
1780
+ ---
1781
+
1782
+ # 通用基础组件使用规则
1783
+
1784
+ ## DdSearch - 搜索框
1785
+
1786
+ **功能描述**: 支持导航栏模式的搜索框,带有搜索回调和防抖功能。
1787
+
1788
+ ### 导入方式
1789
+
1790
+ ```typescript
1791
+ import DdSearch from '@uxda/appkit/components/dd-search/index.vue'
1792
+ ```
1793
+
1794
+ ### Props
1795
+
1796
+ | 属性名 | 类型 | 必填 | 默认值 | 说明 |
1797
+ |--------|------|------|--------|------|
1798
+ | `disabled` | `boolean` | ❌ | `false` | 是否禁用 |
1799
+ | `placeholder` | `string` | ❌ | `'请输入'` | 输入框占位符 |
1800
+ | `value` | `string` | ❌ | `''` | 绑定值 |
1801
+ | `bordered` | `boolean` | ❌ | `true` | 是否显示底部边框 |
1802
+ | `inNavbar` | `boolean` | ❌ | `false` | 是否在导航栏中 |
1803
+ | `focus` | `boolean` | ❌ | `false` | 是否自动聚焦 |
1804
+
1805
+ ### Events
1806
+
1807
+ | 事件名 | 参数类型 | 说明 |
1808
+ |--------|----------|------|
1809
+ | `search` | `value: string` | 点击搜索时触发 |
1810
+ | `focus` | `event: Event` | 输入框聚焦时触发 |
1811
+
1812
+ ### 使用示例
1813
+
1814
+ ```vue
1815
+ <template>
1816
+ <dd-search
1817
+ :bordered="false"
1818
+ :in-navbar="true"
1819
+ :value="searchStr"
1820
+ placeholder="输入客户姓名"
1821
+ @search="onSearch"
1822
+ @focus="onSearchFocus"
1823
+ />
1824
+ </template>
1825
+
1826
+ <script setup>
1827
+ import { ref } from 'vue'
1828
+ import DdSearch from '@uxda/appkit/components/dd-search/index.vue'
1829
+
1830
+ const searchStr = ref('')
1831
+
1832
+ const onSearch = (value) => {
1833
+ console.log('搜索:', value)
1834
+ }
1835
+
1836
+ const onSearchFocus = (event) => {
1837
+ console.log('聚焦:', event)
1838
+ }
1839
+ </script>
1840
+ ```
1841
+
1842
+ ---
1843
+
1844
+ ## DdIcon - 图标组件
1845
+
1846
+ **功能描述**: 项目统一的图标封装,使用 iconfont 图标。
1847
+
1848
+ ### 导入方式
1849
+
1850
+ ```typescript
1851
+ import DdIcon from '@uxda/appkit/components/dd-icon/index.vue'
1852
+ ```
1853
+
1854
+ ### Props
1855
+
1856
+ | 属性名 | 类型 | 必填 | 默认值 | 说明 |
1857
+ |--------|------|------|--------|------|
1858
+ | `name` | `string` | ✅ | `''` | icon 名称 |
1859
+ | `color` | `string` | ❌ | `inherit` | icon 颜色 |
1860
+ | `size` | `string` | ❌ | `16px` | icon 字体大小 |
1861
+ | `weight` | `string` | ❌ | `normal` | icon 字体字重 |
1862
+
1863
+ ### 使用示例
1864
+
1865
+ ```vue
1866
+ <template>
1867
+ <dd-icon name="icon-arrow" size="11px" color="#DFDFDF" />
1868
+ </template>
1869
+
1870
+ <script setup>
1871
+ import DdIcon from '@uxda/appkit/components/dd-icon/index.vue'
1872
+ </script>
1873
+ ```
1874
+
1875
+ ---
1876
+
1877
+ ## DdSkeleton - 骨架屏
1878
+
1879
+ **功能描述**: 数据加载过程中的占位显示,基于 NutUI Skeleton,支持多行与长短行配置,提升用户体验。
1880
+
1881
+ ### 导入方式
1882
+
1883
+ ```typescript
1884
+ import DdSkeleton from '@uxda/appkit/components/dd-skeleton/index.vue'
1885
+ ```
1886
+
1887
+ ### Props
1888
+
1889
+ | 属性名 | 类型 | 必填 | 默认值 | 说明 |
1890
+ |--------|------|------|--------|------|
1891
+ | `row` | `number` | ❌ | `3` | 骨架行数(每组一行短+一行长) |
1892
+ | `shortRow` | `string` | ❌ | `'2'` | 短行骨架的 row 配置(NutUI Skeleton) |
1893
+ | `longRow` | `string` | ❌ | `'4'` | 长行骨架的 row 配置(NutUI Skeleton) |
1894
+
1895
+ ### 使用示例
1896
+
1897
+ ```vue
1898
+ <template>
1899
+ <dd-skeleton v-if="loading" :row="3" />
1900
+ <div v-else>
1901
+ <!-- 实际内容 -->
1902
+ </div>
1903
+ </template>
1904
+
1905
+ <script setup>
1906
+ import { ref } from 'vue'
1907
+ import DdSkeleton from '@uxda/appkit/components/dd-skeleton/index.vue'
1908
+
1909
+ const loading = ref(true)
1910
+ </script>
1911
+ ```
1912
+
1913
+ ---
1914
+
1915
+ ## DdNoticeBar - 滚动通告栏
1916
+
1917
+ **功能描述**: 用于显示简短的滚动消息。
1918
+
1919
+ ### 导入方式
1920
+
1921
+ ```typescript
1922
+ import DdNoticeBar from '@uxda/appkit/components/dd-notice-bar/index.vue'
1923
+ ```
1924
+
1925
+ ### Props
1926
+
1927
+ | 属性名 | 类型 | 必填 | 默认值 | 说明 |
1928
+ |--------|------|------|--------|------|
1929
+ | `text` | `string` | ❌ | - | 通告文案;与默认插槽二选一 |
1930
+ | `style` | `object \| string` | ❌ | - | 根节点样式 |
1931
+ | `showClose` | `boolean` | ❌ | - | 是否显示关闭按钮;为 true 时样式变为「已关闭」风格(黄底) |
1932
+
1933
+ ### Events
1934
+
1935
+ | 事件名 | 参数类型 | 说明 |
1936
+ |--------|----------|------|
1937
+ | `close` | - | 点击关闭按钮时触发 |
1938
+ | `txtClick` | - | 点击通告文本时触发 |
1939
+
1940
+ ### Slots
1941
+
1942
+ | 插槽名 | 说明 |
1943
+ |--------|------|
1944
+ | 默认 | 自定义通告内容,与 `text` 二选一使用 |
1945
+
1946
+ ### 使用示例
1947
+
1948
+ ```vue
1949
+ <template>
1950
+ <dd-notice-bar :show-close="true" @close="handleClose">
1951
+ 这是一条滚动通告消息
1952
+ </dd-notice-bar>
1953
+ </template>
1954
+
1955
+ <script setup>
1956
+ import DdNoticeBar from '@uxda/appkit/components/dd-notice-bar/index.vue'
1957
+
1958
+ const handleClose = () => {
1959
+ console.log('关闭通告')
1960
+ }
1961
+ </script>
1962
+ ```
1963
+
1964
+ ---
1965
+
1966
+ ## 其他通用组件
1967
+
1968
+ ### DdArea - 地区选择器
1969
+
1970
+ 省市区三级联动选择组件。
1971
+
1972
+ ### DdSelector - 通用选择器
1973
+
1974
+ 下拉或弹窗式的单选/多选组件。
1975
+
1976
+ ### BtCropper - 图片裁剪器
1977
+
1978
+ 基于 canvas 的高性能图片裁剪工具。
1979
+
1980
+ ---
1981
+
1982
+ ## 更新日志
1983
+
1984
+ ### v1.2.0
1985
+ - ✅ 补全余额模块组件文档
1986
+ - ✅ 补全消息通知模块组件文档
1987
+ - ✅ 补全用户模块组件文档
1988
+ - ✅ 补全注册模块组件文档
1989
+ - ✅ 补全业务场景组件文档
1990
+ - ✅ 补全通用基础组件文档
1991
+
1992
+ ### v1.1.0
1993
+ - ✅ 新增组合支付功能(云豆+微信)
1994
+ - ✅ 新增余额不足警告提示
1995
+ - ✅ 优化待支付金额计算逻辑
1996
+ - ✅ 完善确认对话框显示内容
1997
+
1998
+ ### v1.0.0
1999
+ - ✅ 基础支付功能
2000
+ - ✅ 云豆支付支持
2001
+ - ✅ 微信支付支持
2002
+