@uxda/appkit 1.2.8 → 1.2.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/.eslintrc.mjs +7 -7
  2. package/README.md +187 -187
  3. package/babel.config.js +12 -12
  4. package/dist/appkit.css +289 -71
  5. package/dist/index.js +862 -341
  6. package/dist/styles.css +1 -0
  7. package/package.json +78 -78
  8. package/project.config.json +15 -15
  9. package/project.tt.json +13 -13
  10. package/rollup.config.mjs +54 -54
  11. package/src/Appkit.ts +65 -65
  12. package/src/balance/api/endpoints.ts +125 -122
  13. package/src/balance/api/index.ts +82 -82
  14. package/src/balance/components/AccountView.vue +754 -649
  15. package/src/balance/components/BalanceCard.vue +209 -209
  16. package/src/balance/components/BalanceReminder.vue +83 -83
  17. package/src/balance/components/ConsumptionFilter.vue +218 -218
  18. package/src/balance/components/ConsumptionRules.vue +68 -68
  19. package/src/balance/components/DateFilter.vue +235 -235
  20. package/src/balance/components/SecondBalance.vue +71 -71
  21. package/src/balance/components/Tip.vue +46 -0
  22. package/src/balance/components/index.ts +9 -9
  23. package/src/balance/types.ts +90 -88
  24. package/src/components/dd-area/index.vue +222 -222
  25. package/src/components/dd-icon/doc.md +21 -21
  26. package/src/components/dd-icon/index.vue +23 -23
  27. package/src/components/dd-selector/index.vue +124 -124
  28. package/src/components/ocr-id/index.vue +110 -110
  29. package/src/components/ocr-id/types.d.ts +12 -12
  30. package/src/global.ts +6 -6
  31. package/src/index.ts +88 -86
  32. package/src/main.scss +1 -1
  33. package/src/payment/api/config.ts +7 -7
  34. package/src/payment/api/endpoints.ts +103 -78
  35. package/src/payment/api/index.ts +71 -71
  36. package/src/payment/components/AmountPicker.vue +93 -93
  37. package/src/payment/components/RechargeResult.vue +66 -54
  38. package/src/payment/components/RechargeView.vue +154 -154
  39. package/src/payment/components/RightsPicker.vue +106 -0
  40. package/src/payment/components/TradeView.vue +298 -0
  41. package/src/payment/components/UserAgreement.vue +141 -141
  42. package/src/payment/components/index.ts +22 -19
  43. package/src/payment/index.ts +5 -5
  44. package/src/payment/services/index.ts +16 -16
  45. package/src/payment/services/invoke-recharge.ts +25 -25
  46. package/src/payment/services/request-payment.ts +58 -31
  47. package/src/payment/types.ts +28 -23
  48. package/src/register/components/SelfRegistration.vue +227 -227
  49. package/src/register/components/index.ts +2 -2
  50. package/src/shared/components/AppDrawer.vue +58 -58
  51. package/src/shared/components/EmptyView.vue +33 -33
  52. package/src/shared/components/PageHeader.vue +79 -79
  53. package/src/shared/components/index.ts +6 -6
  54. package/src/shared/composables/index.ts +2 -2
  55. package/src/shared/composables/useSafeArea.ts +43 -43
  56. package/src/shared/composables/useTabbar.ts +24 -24
  57. package/src/shared/http/Http.ts +126 -126
  58. package/src/shared/http/index.ts +1 -1
  59. package/src/shared/http/types.ts +157 -157
  60. package/src/shared/index.ts +3 -3
  61. package/src/shared/weixin/payment.ts +38 -38
  62. package/src/styles/fonts.scss +2 -2
  63. package/src/styles/vars.scss +3 -3
  64. package/tsconfig.json +30 -30
  65. package/types/global.d.ts +21 -21
  66. package/types/vue.d.ts +10 -10
@@ -1,80 +1,80 @@
1
- <template>
2
- <div :class="[
3
- 'page-header',
4
- `color-mode-${colorMode}`
5
- ]" :style="cssVars">
6
- <h1 class="page-title" v-if="title">{{ title }}</h1>
7
- <view class="back-button" @click="onBackButtonClick"></view>
8
- <slot></slot>
9
- </div>
10
- </template>
11
-
12
- <script lang="ts" setup>
13
- import { useSafeArea } from '../composables'
14
-
15
-
16
- const safeArea = useSafeArea()
17
-
18
- const cssVars = {
19
- '--top': `${safeArea.status}px`,
20
- '--height': `${safeArea.nav}px`
21
- }
22
-
23
- export type PageHeaderColorMode = 'light' | 'dark'
24
-
25
- export interface PageHeaderProps {
26
- title?: string,
27
- colorMode?: PageHeaderColorMode
28
- }
29
-
30
- const emit = defineEmits<{
31
- (event: 'close'): void
32
- }>()
33
-
34
- withDefaults(
35
- defineProps<PageHeaderProps>(), {
36
- title: '',
37
- colorMode: 'light'
38
- }
39
- )
40
-
41
- const onBackButtonClick = () => {
42
- emit('close')
43
- }
44
- </script>
45
-
46
- <style lang="scss">
47
- .page-header {
48
- display: flex;
49
- position: relative;
50
- align-items: center;
51
- padding-top: var(--top);
52
- min-height: var(--height);
53
- .page-title {
54
- position: absolute;
55
- font-size: 18px;
56
- height: var(--height);
57
- line-height: var(--height);
58
- top: var(--top);
59
- width: 100%;
60
- text-align: center;
61
- }
62
- .back-button {
63
- position: absolute;
64
- top: var(--top);
65
- left: 10px;
66
- width: var(--height);
67
- height: var(--height);
68
- background-image: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDIiIGhlaWdodD0iNDIiIHZpZXdCb3g9IjAgMCA0MiA0MiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggb3BhY2l0eT0iMC4wMSIgZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0wLjk5OTg3OCA0MUw0MC45OTk5IDQxTDQwLjk5OTkgMUwwLjk5OTg3OCAxTDAuOTk5ODc4IDQxWiIgZmlsbD0iI0Q4RDhEOCIgc3Ryb2tlPSJibGFjayIgc3Ryb2tlLW9wYWNpdHk9IjAuMDEiLz4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xMi45OTMzIDE4Ljk0NzdDMTEuODYzMyAyMC4wMTQ1IDExLjgxMiAyMS43OTU0IDEyLjg3ODggMjIuOTI1NUwyNy45MTA1IDM3LjEzNDVDMjguNjkyNSAzNy44NzM0IDI5LjkyNTUgMzcuODM4NCAzMC42NjQ0IDM3LjA1NjRDMzEuMzY4MSAzNi4zMTE2IDMxLjM2OTkgMzUuMTU3OSAzMC42OTI5IDM0LjQxMTRMMTYuNTAxMiAyMC45OTM5TDMwLjU4NTcgNy42OTc4NUMzMS4zMzA4IDYuOTk0NDkgMzEuMjk4MiA1LjcyNzk1IDMwLjY2NDkgNC45NDQwMkMyOS45NjE2IDQuMTk4OTUgMjguODA5OCA0LjEzMTI5IDI4LjAyNTkgNC43NjQ1MkwxMi45OTMzIDE4Ljk0NzdaIiBmaWxsPSJibGFjayIgc3Ryb2tlPSJibGFjayIgc3Ryb2tlLW9wYWNpdHk9IjAuMDEiLz4KPC9zdmc+Cg==");
69
- background-size: 50%;
70
- background-repeat: no-repeat;
71
- background-position: center center;
72
- }
73
- &.color-mode-dark {
74
- color: var(--text-color-dark-mode, #fff);
75
- .back-button {
76
- background-image: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDIiIGhlaWdodD0iNDIiIHZpZXdCb3g9IjAgMCA0MiA0MiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggb3BhY2l0eT0iMC4wMSIgZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0wLjk5OTg0NyA0MUw0MC45OTk4IDQxTDQwLjk5OTggMUwwLjk5OTg0NyAxTDAuOTk5ODQ3IDQxWiIgZmlsbD0iI0Q4RDhEOCIgc3Ryb2tlPSJibGFjayIgc3Ryb2tlLW9wYWNpdHk9IjAuMDEiLz4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xMi45OTM0IDE4Ljk0NzVDMTEuODYzNCAyMC4wMTQzIDExLjgxMjEgMjEuNzk1MiAxMi44Nzg5IDIyLjkyNTJMMjcuOTEwNiAzNy4xMzQzQzI4LjY5MjcgMzcuODczMSAyOS45MjU2IDM3LjgzODIgMzAuNjY0NSAzNy4wNTYyQzMxLjM2ODIgMzYuMzExNCAzMS4zNyAzNS4xNTc2IDMwLjY5MyAzNC40MTExTDE2LjUwMTMgMjAuOTkzNkwzMC41ODU4IDcuNjk3NjFDMzEuMzMwOSA2Ljk5NDI0IDMxLjI5ODMgNS43Mjc3MSAzMC42NjUxIDQuOTQzNzdDMjkuOTYxNyA0LjE5ODcxIDI4LjgwOTkgNC4xMzEwNCAyOC4wMjYgNC43NjQyN0wxMi45OTM0IDE4Ljk0NzVaIiBmaWxsPSJ3aGl0ZSIgc3Ryb2tlPSJibGFjayIgc3Ryb2tlLW9wYWNpdHk9IjAuMDEiLz4KPC9zdmc+Cg==");
77
- }
78
- }
79
- }
1
+ <template>
2
+ <div :class="[
3
+ 'page-header',
4
+ `color-mode-${colorMode}`
5
+ ]" :style="cssVars">
6
+ <h1 class="page-title" v-if="title">{{ title }}</h1>
7
+ <view class="back-button" @click="onBackButtonClick"></view>
8
+ <slot></slot>
9
+ </div>
10
+ </template>
11
+
12
+ <script lang="ts" setup>
13
+ import { useSafeArea } from '../composables'
14
+
15
+
16
+ const safeArea = useSafeArea()
17
+
18
+ const cssVars = {
19
+ '--top': `${safeArea.status}px`,
20
+ '--height': `${safeArea.nav}px`
21
+ }
22
+
23
+ export type PageHeaderColorMode = 'light' | 'dark'
24
+
25
+ export interface PageHeaderProps {
26
+ title?: string,
27
+ colorMode?: PageHeaderColorMode
28
+ }
29
+
30
+ const emit = defineEmits<{
31
+ (event: 'close'): void
32
+ }>()
33
+
34
+ withDefaults(
35
+ defineProps<PageHeaderProps>(), {
36
+ title: '',
37
+ colorMode: 'light'
38
+ }
39
+ )
40
+
41
+ const onBackButtonClick = () => {
42
+ emit('close')
43
+ }
44
+ </script>
45
+
46
+ <style lang="scss">
47
+ .page-header {
48
+ display: flex;
49
+ position: relative;
50
+ align-items: center;
51
+ padding-top: var(--top);
52
+ min-height: var(--height);
53
+ .page-title {
54
+ position: absolute;
55
+ font-size: 18px;
56
+ height: var(--height);
57
+ line-height: var(--height);
58
+ top: var(--top);
59
+ width: 100%;
60
+ text-align: center;
61
+ }
62
+ .back-button {
63
+ position: absolute;
64
+ top: var(--top);
65
+ left: 10px;
66
+ width: var(--height);
67
+ height: var(--height);
68
+ background-image: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDIiIGhlaWdodD0iNDIiIHZpZXdCb3g9IjAgMCA0MiA0MiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggb3BhY2l0eT0iMC4wMSIgZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0wLjk5OTg3OCA0MUw0MC45OTk5IDQxTDQwLjk5OTkgMUwwLjk5OTg3OCAxTDAuOTk5ODc4IDQxWiIgZmlsbD0iI0Q4RDhEOCIgc3Ryb2tlPSJibGFjayIgc3Ryb2tlLW9wYWNpdHk9IjAuMDEiLz4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xMi45OTMzIDE4Ljk0NzdDMTEuODYzMyAyMC4wMTQ1IDExLjgxMiAyMS43OTU0IDEyLjg3ODggMjIuOTI1NUwyNy45MTA1IDM3LjEzNDVDMjguNjkyNSAzNy44NzM0IDI5LjkyNTUgMzcuODM4NCAzMC42NjQ0IDM3LjA1NjRDMzEuMzY4MSAzNi4zMTE2IDMxLjM2OTkgMzUuMTU3OSAzMC42OTI5IDM0LjQxMTRMMTYuNTAxMiAyMC45OTM5TDMwLjU4NTcgNy42OTc4NUMzMS4zMzA4IDYuOTk0NDkgMzEuMjk4MiA1LjcyNzk1IDMwLjY2NDkgNC45NDQwMkMyOS45NjE2IDQuMTk4OTUgMjguODA5OCA0LjEzMTI5IDI4LjAyNTkgNC43NjQ1MkwxMi45OTMzIDE4Ljk0NzdaIiBmaWxsPSJibGFjayIgc3Ryb2tlPSJibGFjayIgc3Ryb2tlLW9wYWNpdHk9IjAuMDEiLz4KPC9zdmc+Cg==");
69
+ background-size: 50%;
70
+ background-repeat: no-repeat;
71
+ background-position: center center;
72
+ }
73
+ &.color-mode-dark {
74
+ color: var(--text-color-dark-mode, #fff);
75
+ .back-button {
76
+ background-image: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDIiIGhlaWdodD0iNDIiIHZpZXdCb3g9IjAgMCA0MiA0MiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggb3BhY2l0eT0iMC4wMSIgZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0wLjk5OTg0NyA0MUw0MC45OTk4IDQxTDQwLjk5OTggMUwwLjk5OTg0NyAxTDAuOTk5ODQ3IDQxWiIgZmlsbD0iI0Q4RDhEOCIgc3Ryb2tlPSJibGFjayIgc3Ryb2tlLW9wYWNpdHk9IjAuMDEiLz4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xMi45OTM0IDE4Ljk0NzVDMTEuODYzNCAyMC4wMTQzIDExLjgxMjEgMjEuNzk1MiAxMi44Nzg5IDIyLjkyNTJMMjcuOTEwNiAzNy4xMzQzQzI4LjY5MjcgMzcuODczMSAyOS45MjU2IDM3LjgzODIgMzAuNjY0NSAzNy4wNTYyQzMxLjM2ODIgMzYuMzExNCAzMS4zNyAzNS4xNTc2IDMwLjY5MyAzNC40MTExTDE2LjUwMTMgMjAuOTkzNkwzMC41ODU4IDcuNjk3NjFDMzEuMzMwOSA2Ljk5NDI0IDMxLjI5ODMgNS43Mjc3MSAzMC42NjUxIDQuOTQzNzdDMjkuOTYxNyA0LjE5ODcxIDI4LjgwOTkgNC4xMzEwNCAyOC4wMjYgNC43NjQyN0wxMi45OTM0IDE4Ljk0NzVaIiBmaWxsPSJ3aGl0ZSIgc3Ryb2tlPSJibGFjayIgc3Ryb2tlLW9wYWNpdHk9IjAuMDEiLz4KPC9zdmc+Cg==");
77
+ }
78
+ }
79
+ }
80
80
  </style>
@@ -1,7 +1,7 @@
1
- import AppDrawer from './AppDrawer.vue'
2
- import PageHeader from './PageHeader.vue'
3
-
4
- export {
5
- AppDrawer,
6
- PageHeader
1
+ import AppDrawer from './AppDrawer.vue'
2
+ import PageHeader from './PageHeader.vue'
3
+
4
+ export {
5
+ AppDrawer,
6
+ PageHeader
7
7
  }
@@ -1,2 +1,2 @@
1
- export * from './useSafeArea'
2
- export * from './useTabbar'
1
+ export * from './useSafeArea'
2
+ export * from './useTabbar'
@@ -1,44 +1,44 @@
1
- import Taro from '@tarojs/taro'
2
- /**
3
- * 屏幕安全区域
4
- */
5
- export type SafeArea = {
6
- /**
7
- * 状态条高度
8
- */
9
- status: number,
10
- /**
11
- * 导航条区域(胶囊)
12
- */
13
- nav: number,
14
- /**
15
- * 屏幕底部范围
16
- */
17
- bottom: number
18
- }
19
-
20
- /**
21
- * 获取屏幕安全区域
22
- * 从系统 API 获取
23
- * @returns
24
- */
25
- export function useSafeArea (): SafeArea {
26
- const systemInfo = Taro.getSystemInfoSync(),
27
- capsule = Taro.getMenuButtonBoundingClientRect()
28
- /**
29
- * 状态条高度
30
- */
31
- const status = systemInfo.statusBarHeight || 0,
32
- /**
33
- * 据说是胶囊上下间距
34
- */
35
- gap = capsule.top - status,
36
- nav = capsule.height + gap * 2,
37
- safeAreaBottom = systemInfo.safeArea?.bottom || 0,
38
- bottom = systemInfo.screenHeight - safeAreaBottom
39
- return {
40
- status,
41
- nav,
42
- bottom
43
- }
1
+ import Taro from '@tarojs/taro'
2
+ /**
3
+ * 屏幕安全区域
4
+ */
5
+ export type SafeArea = {
6
+ /**
7
+ * 状态条高度
8
+ */
9
+ status: number,
10
+ /**
11
+ * 导航条区域(胶囊)
12
+ */
13
+ nav: number,
14
+ /**
15
+ * 屏幕底部范围
16
+ */
17
+ bottom: number
18
+ }
19
+
20
+ /**
21
+ * 获取屏幕安全区域
22
+ * 从系统 API 获取
23
+ * @returns
24
+ */
25
+ export function useSafeArea (): SafeArea {
26
+ const systemInfo = Taro.getSystemInfoSync(),
27
+ capsule = Taro.getMenuButtonBoundingClientRect()
28
+ /**
29
+ * 状态条高度
30
+ */
31
+ const status = systemInfo.statusBarHeight || 0,
32
+ /**
33
+ * 据说是胶囊上下间距
34
+ */
35
+ gap = capsule.top - status,
36
+ nav = capsule.height + gap * 2,
37
+ safeAreaBottom = systemInfo.safeArea?.bottom || 0,
38
+ bottom = systemInfo.screenHeight - safeAreaBottom
39
+ return {
40
+ status,
41
+ nav,
42
+ bottom
43
+ }
44
44
  }
@@ -1,24 +1,24 @@
1
- import { ref } from 'vue'
2
-
3
- const tab = ref<string>(''),
4
- changeCallback = ref<(value: string) => void>(
5
- (value: string) => {
6
- console.log('ORIGINAL changeCallback===', value)
7
- }
8
- )
9
-
10
- const setTab = (value: string) => {
11
- tab.value = value
12
- changeCallback.value(value)
13
- }
14
-
15
- const onTabChange = (callback: (value: string) => void) => {
16
- changeCallback.value = callback
17
- }
18
-
19
- export function useTabbar () {
20
- return {
21
- onTabChange,
22
- setTab
23
- }
24
- }
1
+ import { ref } from 'vue'
2
+
3
+ const tab = ref<string>(''),
4
+ changeCallback = ref<(value: string) => void>(
5
+ (value: string) => {
6
+ console.log('ORIGINAL changeCallback===', value)
7
+ }
8
+ )
9
+
10
+ const setTab = (value: string) => {
11
+ tab.value = value
12
+ changeCallback.value(value)
13
+ }
14
+
15
+ const onTabChange = (callback: (value: string) => void) => {
16
+ changeCallback.value = callback
17
+ }
18
+
19
+ export function useTabbar () {
20
+ return {
21
+ onTabChange,
22
+ setTab
23
+ }
24
+ }
@@ -1,126 +1,126 @@
1
- import { HttpInstance, HttpClientConfig,
2
- HttpMethod, HttpRequestConfig,
3
- RequestData, ResponseData,
4
- ResponseRaw } from './types'
5
- /**
6
- * Useage:
7
- * const $http = createHttp({
8
- *
9
- * })
10
- * $http.get('/url').then(data => {
11
- *
12
- * })
13
- */
14
-
15
- /**
16
- * 统一请求过程
17
- * @param config
18
- * @returns
19
- */
20
- const request: HttpInstance['request'] = <T>(config: HttpRequestConfig) => {
21
- const c = {
22
- ...clientConfig,
23
- ...config,
24
- }
25
- return new Promise<T>((resolve, reject) => {
26
- const data = config.data
27
- && clientConfig.translates
28
- && clientConfig.translates[c.url]
29
- ? clientConfig.translates[c.url]?.(c.data || {})
30
- : c.data
31
- console.log(`[][][][][]HTTP.${c.method}, ${c.baseUrl}${c.url}`, data)
32
- clientConfig.vendor?.request({
33
- url: `${c.baseUrl}${c.url}`,
34
- data,
35
- headers: c.headers,
36
- method: c.method,
37
- }).then((raw: ResponseRaw) => {
38
- // 按顺序执行拦截器
39
- for (const interc of c.interceptors || []) {
40
- const r = interc(raw)
41
- if (r) {
42
- // 某拦截器命中时
43
- // 按拦截结果 决定是否继续执行
44
- reject('===INTERCEPTED===' + raw.status)
45
- return false
46
- }
47
- }
48
- if (raw.data) {
49
- // 当用户配置含有 transforms 时, 使用用户提供的 transform
50
- // 先 endpoints transform
51
- // 再组装分页数据
52
- const response = clientConfig.transforms
53
- && clientConfig.transforms[c.url]
54
- ? clientConfig.transforms[c.url]?.(raw.data) as T
55
- : data as T
56
- // 前端要求分页
57
- // 在 endpoints transform 之前格式化分页数据
58
- // 并拼装回原 raw 数据
59
- const paging = config.data?.page
60
- ? clientConfig.paging?.transform(raw.data)
61
- : void 0
62
- resolve(
63
- paging
64
- ? {
65
- ...paging,
66
- data: response
67
- } as T
68
- : response
69
- )
70
- } else {
71
- reject(`未知错误`)
72
- }
73
- }).catch((e: any) => {
74
- console.log('request.catch===', e)
75
- })
76
- })
77
- }
78
-
79
- const get: HttpInstance['get'] = <T = ResponseData>(url: string, data?: RequestData) => {
80
- return request<T>({
81
- url,
82
- data,
83
- method: HttpMethod.get
84
- })
85
- }
86
-
87
- const post: HttpInstance['post'] = <T = ResponseData>(url: string, data: RequestData) => {
88
- return request<T>({
89
- url,
90
- data,
91
- method: HttpMethod.post
92
- })
93
- }
94
-
95
- /**
96
- * 场景配置
97
- * 本地后台团队统一返回值外层
98
- */
99
- const defaultClientConfig: HttpClientConfig = {
100
- baseUrl: '/',
101
- interceptors: [
102
- (raw) => raw.status == 401,
103
- ]
104
- }
105
-
106
- let clientConfig = {
107
- ...defaultClientConfig
108
- }
109
-
110
- /**
111
- * 写入配置并返回 HTTP instance
112
- * @param config
113
- * @returns
114
- */
115
- export function createHttp (config: HttpClientConfig): HttpInstance {
116
- clientConfig = {
117
- ...defaultClientConfig,
118
- ...config
119
- }
120
-
121
- return {
122
- request,
123
- get,
124
- post
125
- }
126
- }
1
+ import { HttpInstance, HttpClientConfig,
2
+ HttpMethod, HttpRequestConfig,
3
+ RequestData, ResponseData,
4
+ ResponseRaw } from './types'
5
+ /**
6
+ * Useage:
7
+ * const $http = createHttp({
8
+ *
9
+ * })
10
+ * $http.get('/url').then(data => {
11
+ *
12
+ * })
13
+ */
14
+
15
+ /**
16
+ * 统一请求过程
17
+ * @param config
18
+ * @returns
19
+ */
20
+ const request: HttpInstance['request'] = <T>(config: HttpRequestConfig) => {
21
+ const c = {
22
+ ...clientConfig,
23
+ ...config,
24
+ }
25
+ return new Promise<T>((resolve, reject) => {
26
+ const data = config.data
27
+ && clientConfig.translates
28
+ && clientConfig.translates[c.url]
29
+ ? clientConfig.translates[c.url]?.(c.data || {})
30
+ : c.data
31
+ console.log(`[][][][][]HTTP.${c.method}, ${c.baseUrl}${c.url}`, data)
32
+ clientConfig.vendor?.request({
33
+ url: `${c.baseUrl}${c.url}`,
34
+ data,
35
+ headers: c.headers,
36
+ method: c.method,
37
+ }).then((raw: ResponseRaw) => {
38
+ // 按顺序执行拦截器
39
+ for (const interc of c.interceptors || []) {
40
+ const r = interc(raw)
41
+ if (r) {
42
+ // 某拦截器命中时
43
+ // 按拦截结果 决定是否继续执行
44
+ reject('===INTERCEPTED===' + raw.status)
45
+ return false
46
+ }
47
+ }
48
+ if (raw.data) {
49
+ // 当用户配置含有 transforms 时, 使用用户提供的 transform
50
+ // 先 endpoints transform
51
+ // 再组装分页数据
52
+ const response = clientConfig.transforms
53
+ && clientConfig.transforms[c.url]
54
+ ? clientConfig.transforms[c.url]?.(raw.data) as T
55
+ : raw.data as T
56
+ // 前端要求分页
57
+ // 在 endpoints transform 之前格式化分页数据
58
+ // 并拼装回原 raw 数据
59
+ const paging = config.data?.page
60
+ ? clientConfig.paging?.transform(raw.data)
61
+ : void 0
62
+ resolve(
63
+ paging
64
+ ? {
65
+ ...paging,
66
+ data: response
67
+ } as T
68
+ : response
69
+ )
70
+ } else {
71
+ resolve(raw as any)
72
+ }
73
+ }).catch((e: any) => {
74
+ console.log('request.catch===', e)
75
+ })
76
+ })
77
+ }
78
+
79
+ const get: HttpInstance['get'] = <T = ResponseData>(url: string, data?: RequestData) => {
80
+ return request<T>({
81
+ url,
82
+ data,
83
+ method: HttpMethod.get
84
+ })
85
+ }
86
+
87
+ const post: HttpInstance['post'] = <T = ResponseData>(url: string, data: RequestData) => {
88
+ return request<T>({
89
+ url,
90
+ data,
91
+ method: HttpMethod.post
92
+ })
93
+ }
94
+
95
+ /**
96
+ * 场景配置
97
+ * 本地后台团队统一返回值外层
98
+ */
99
+ const defaultClientConfig: HttpClientConfig = {
100
+ baseUrl: '/',
101
+ interceptors: [
102
+ (raw) => raw.status == 401
103
+ ]
104
+ }
105
+
106
+ let clientConfig = {
107
+ ...defaultClientConfig
108
+ }
109
+
110
+ /**
111
+ * 写入配置并返回 HTTP instance
112
+ * @param config
113
+ * @returns
114
+ */
115
+ export function createHttp (config: HttpClientConfig): HttpInstance {
116
+ clientConfig = {
117
+ ...defaultClientConfig,
118
+ ...config
119
+ }
120
+
121
+ return {
122
+ request,
123
+ get,
124
+ post
125
+ }
126
+ }
@@ -1,2 +1,2 @@
1
- export * from './Http'
1
+ export * from './Http'
2
2
  export type * from './types'