@uxda/appkit 4.3.6 → 4.3.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.mjs +7 -7
- package/COMPONENT_USAGE.md +1523 -1523
- package/PROJECT_DOCS.md +142 -142
- package/README.md +187 -187
- package/babel.config.js +12 -12
- package/dist/appkit.css +15 -63
- package/dist/assets/asset-DcH8Kg-2 +1 -0
- package/dist/index.js +259 -806
- package/package.json +79 -79
- package/project.config.json +15 -15
- package/project.tt.json +13 -13
- package/rollup.config.mjs +78 -78
- package/src/Appkit.ts +72 -72
- package/src/balance/api/endpoints.ts +133 -133
- package/src/balance/api/index.ts +118 -118
- package/src/balance/components/AccountView.vue +770 -770
- package/src/balance/components/BalanceCard.vue +210 -210
- package/src/balance/components/BalanceReminder.vue +84 -84
- package/src/balance/components/ConsumptionFilter.vue +218 -218
- package/src/balance/components/ConsumptionRules.vue +68 -68
- package/src/balance/components/DateFilter.vue +259 -259
- package/src/balance/components/DateRange.vue +111 -111
- package/src/balance/components/ListFilter.vue +62 -62
- package/src/balance/components/ListFilterPicker.vue +191 -191
- package/src/balance/components/PromoterCard.vue +307 -308
- package/src/balance/components/SecondBalance.vue +77 -77
- package/src/balance/components/Tip.vue +45 -45
- package/src/balance/components/index.ts +8 -8
- package/src/balance/types.ts +99 -99
- package/src/components/bt-cropper/index.vue +730 -730
- package/src/components/bt-cropper/utils/calcCropper.js +42 -42
- package/src/components/bt-cropper/utils/calcImagePosition.js +23 -23
- package/src/components/bt-cropper/utils/calcImageSize.js +37 -37
- package/src/components/bt-cropper/utils/calcPointDistance.js +12 -12
- package/src/components/bt-cropper/utils/calcRightAndBottom.js +7 -7
- package/src/components/bt-cropper/utils/ratio.js +3 -3
- package/src/components/bt-cropper/utils/tools.js +25 -25
- package/src/components/dd-area/index.vue +225 -225
- package/src/components/dd-icon/doc.md +21 -21
- package/src/components/dd-icon/index.vue +23 -23
- package/src/components/dd-notice-bar/index.vue +78 -78
- package/src/components/dd-search/doc.md +34 -34
- package/src/components/dd-search/index.vue +168 -168
- package/src/components/dd-selector/index.vue +124 -124
- package/src/components/dd-skeleton/doc.md +19 -19
- package/src/components/dd-skeleton/index.vue +36 -36
- package/src/global.ts +6 -6
- package/src/index.ts +101 -101
- package/src/main.scss +1 -1
- package/src/notice/api/endpoints.ts +54 -54
- package/src/notice/api/index.ts +121 -121
- package/src/notice/components/NoticeBanner.vue +247 -247
- package/src/notice/components/NoticeEntry.vue +99 -99
- package/src/notice/components/NoticeList.vue +311 -311
- package/src/notice/components/NoticeList2.vue +400 -399
- package/src/notice/components/NoticePopup.vue +163 -163
- package/src/notice/components/index.ts +6 -6
- package/src/notice/components/useCommonList.ts +86 -87
- package/src/notice/components/useNotice.ts +35 -35
- package/src/notice/index.ts +1 -1
- package/src/notice/types.ts +25 -25
- package/src/payment/api/config.ts +7 -7
- package/src/payment/api/endpoints.ts +96 -98
- package/src/payment/api/index.ts +107 -108
- package/src/payment/components/AmountPicker.vue +90 -90
- package/src/payment/components/RechargeResult.vue +69 -68
- package/src/payment/components/RechargeView.vue +191 -191
- package/src/payment/components/RightsPicker.vue +105 -105
- package/src/payment/components/TradeView.vue +363 -571
- package/src/payment/components/UserAgreement.vue +234 -234
- package/src/payment/components/index.ts +22 -22
- package/src/payment/index.ts +5 -5
- package/src/payment/services/index.ts +16 -16
- package/src/payment/services/invoke-recharge.ts +25 -25
- package/src/payment/services/request-payment.ts +130 -132
- package/src/payment/types.ts +33 -34
- package/src/register/components/SelfRegistration.vue +233 -233
- package/src/register/components/index.ts +2 -2
- package/src/scenarios/components/SharePoster.vue +364 -364
- package/src/scenarios/components/index.ts +2 -2
- package/src/scenarios/components/poster-paste.vue +93 -93
- package/src/scenarios/components/share-poster.md +273 -273
- package/src/shared/components/AppDrawer.vue +53 -53
- package/src/shared/components/AppVerify.vue +128 -137
- package/src/shared/components/DeviceVersion.vue +78 -78
- package/src/shared/components/EmptyView.vue +33 -33
- package/src/shared/components/OcrBusinessLicense.vue +137 -120
- package/src/shared/components/OcrIcon.vue +229 -267
- package/src/shared/components/PageHeader.vue +84 -84
- package/src/shared/components/index.ts +8 -10
- package/src/shared/composables/index.ts +9 -10
- package/src/shared/composables/useAmount.ts +46 -46
- package/src/shared/composables/useCountdown.ts +46 -46
- package/src/shared/composables/useCrypto.ts +76 -76
- package/src/shared/composables/useDeviceEnv.ts +26 -26
- package/src/shared/composables/useDragBox.ts +97 -97
- package/src/shared/composables/useEncode.ts +43 -43
- package/src/shared/composables/useLogger.ts +144 -144
- package/src/shared/composables/useSafeArea.ts +46 -46
- package/src/shared/composables/useTabbar.ts +24 -24
- package/src/shared/composables/useUpload.ts +61 -106
- package/src/shared/composables/useValidator.ts +32 -32
- package/src/shared/composables/useWxAuth.ts +48 -48
- package/src/shared/http/Http.ts +148 -149
- package/src/shared/http/index.ts +1 -1
- package/src/shared/http/types.ts +163 -163
- package/src/shared/index.ts +9 -9
- package/src/shared/tracking/directives/index.ts +40 -40
- package/src/shared/tracking/examples/page-tracking-template.vue +27 -27
- package/src/shared/tracking/tracking-sdk.ts +1 -0
- package/src/shared/weixin/index.ts +9 -9
- package/src/shared/weixin/jssdk.ts +103 -104
- package/src/shared/weixin/payment.ts +38 -38
- package/src/styles/vars.scss +3 -3
- package/src/user/api/endpoints.ts +17 -17
- package/src/user/api/index.ts +123 -123
- package/src/user/components/LoginSetting.vue +114 -114
- package/src/user/components/UserAuth.vue +218 -218
- package/src/user/components/UserBinding.vue +277 -277
- package/src/user/components/UserBindingSuccess.vue +80 -80
- package/src/user/components/UserEntry.vue +139 -139
- package/src/user/components/UserFeedback.vue +427 -428
- package/src/user/components/UserFeedbackEntry.vue +175 -175
- package/src/user/components/UserHeadCrop.vue +65 -65
- package/src/user/components/UserInfo.vue +709 -711
- package/src/user/components/UserResourceEmpty.vue +75 -75
- package/src/user/components/index.ts +23 -23
- package/src/user/index.ts +1 -1
- package/src/utils/utils.ts +33 -33
- package/tsconfig.json +30 -30
- package/types/global.d.ts +22 -24
- package/types/vue.d.ts +10 -10
- package/src/shared/components/OcrBank.vue +0 -202
- package/src/shared/components/OcrInvoice.vue +0 -218
- package/src/shared/composables/useCompress.ts +0 -64
|
@@ -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,106 +1,61 @@
|
|
|
1
|
-
import Taro from
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
img.onerror = () => {
|
|
63
|
-
reject(new Error("图片加载失败"));
|
|
64
|
-
};
|
|
65
|
-
|
|
66
|
-
img.src = src;
|
|
67
|
-
});
|
|
68
|
-
};
|
|
69
|
-
|
|
70
|
-
// 压缩图片
|
|
71
|
-
export async function compressImage(src: string, quality = 80) {
|
|
72
|
-
if (Taro.getEnv() === "WEB") {
|
|
73
|
-
try {
|
|
74
|
-
const compressedUrl = await compressImageWithCanvas(src, quality);
|
|
75
|
-
// 返回格式与小程序端一致,包含 tempFilePath 属性
|
|
76
|
-
return { tempFilePath: compressedUrl };
|
|
77
|
-
} catch (error) {
|
|
78
|
-
console.error("图片压缩失败:", error);
|
|
79
|
-
// 压缩失败时返回原图
|
|
80
|
-
return { tempFilePath: src };
|
|
81
|
-
}
|
|
82
|
-
} else {
|
|
83
|
-
return new Promise((resolve, reject) => {
|
|
84
|
-
Taro.compressImage({
|
|
85
|
-
src: src,
|
|
86
|
-
quality: quality,
|
|
87
|
-
success: (res) => {
|
|
88
|
-
resolve(res);
|
|
89
|
-
},
|
|
90
|
-
fail: (res) => {
|
|
91
|
-
reject(res);
|
|
92
|
-
},
|
|
93
|
-
});
|
|
94
|
-
});
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
// 获取压缩质量
|
|
99
|
-
export function getCompressQuality(size: number) {
|
|
100
|
-
let quality = 100;
|
|
101
|
-
const curSize = size / (1024 * 1024);
|
|
102
|
-
if (curSize > 6) {
|
|
103
|
-
quality = quality - ((curSize - 6) / curSize) * 100;
|
|
104
|
-
}
|
|
105
|
-
return quality;
|
|
106
|
-
}
|
|
1
|
+
import Taro, { uploadFile } from '@tarojs/taro'
|
|
2
|
+
import { Media } from '@uxda/nutshell/taro'
|
|
3
|
+
import { useAppKitOptions } from '../../Appkit'
|
|
4
|
+
|
|
5
|
+
export type UploadConfig = {
|
|
6
|
+
baseUrl: string
|
|
7
|
+
name?: string
|
|
8
|
+
headers?: Record<string, string>
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
const mappings: { [x: string]: keyof Media } = {
|
|
12
|
+
downloadUrl: 'thrumb',
|
|
13
|
+
fileId: 'id',
|
|
14
|
+
fileName: 'name',
|
|
15
|
+
fileSize: 'size',
|
|
16
|
+
fileSuffix: 'ext',
|
|
17
|
+
fileType: 'type',
|
|
18
|
+
originalUrl: 'url',
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const transformFields = (row: any) => {
|
|
22
|
+
return Object.fromEntries(Object.entries(row).map(([k, v]) => [mappings[k] || k, v]))
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
type UploadFunction = (url: string, file: Media) => Promise<Media>
|
|
26
|
+
|
|
27
|
+
export const useUpload = (config: UploadConfig) => {
|
|
28
|
+
const appkitOptions = useAppKitOptions()
|
|
29
|
+
|
|
30
|
+
const upload: UploadFunction = (url: string, file: Media) => {
|
|
31
|
+
return new Promise<Media>((resolve, reject) => {
|
|
32
|
+
uploadFile({
|
|
33
|
+
url: config.baseUrl + url,
|
|
34
|
+
filePath: file.path!,
|
|
35
|
+
name: 'file',
|
|
36
|
+
formData: {
|
|
37
|
+
objectNo: `min${Date.now()}`,
|
|
38
|
+
},
|
|
39
|
+
header: {
|
|
40
|
+
...config.headers,
|
|
41
|
+
token: appkitOptions.tempToken() || appkitOptions.token(),
|
|
42
|
+
},
|
|
43
|
+
success: (rsp: any) => {
|
|
44
|
+
const { data } = rsp
|
|
45
|
+
try {
|
|
46
|
+
const response = JSON.parse(data)
|
|
47
|
+
console.log('===response', response)
|
|
48
|
+
resolve(transformFields(response.result))
|
|
49
|
+
} catch (e) {
|
|
50
|
+
reject({
|
|
51
|
+
message: '文件上传异常',
|
|
52
|
+
})
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
})
|
|
56
|
+
})
|
|
57
|
+
}
|
|
58
|
+
return {
|
|
59
|
+
upload,
|
|
60
|
+
}
|
|
61
|
+
}
|
|
@@ -1,32 +1,32 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 通用表单校验器
|
|
3
|
-
*/
|
|
4
|
-
import isMobilePhone from 'validator/es/lib/isMobilePhone'
|
|
5
|
-
import isIdentityCard from 'validator/es/lib/isIdentityCard'
|
|
6
|
-
|
|
7
|
-
export function useValidator() {
|
|
8
|
-
// 身份证号码校验
|
|
9
|
-
function certNoValidator(value: string) {
|
|
10
|
-
if (!value) {
|
|
11
|
-
return '请输入身份证号'
|
|
12
|
-
} else if (!isIdentityCard(value, 'zh-CN')) {
|
|
13
|
-
return '请输入正确的身份证号码'
|
|
14
|
-
}
|
|
15
|
-
return false
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
// 电话号码校验
|
|
19
|
-
function phoneValidator(value: string) {
|
|
20
|
-
if (!value) {
|
|
21
|
-
return '请输入手机号码'
|
|
22
|
-
} else if (!isMobilePhone(value, 'zh-CN')) {
|
|
23
|
-
return '请输入正确的手机号'
|
|
24
|
-
}
|
|
25
|
-
return false
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
return {
|
|
29
|
-
certNoValidator,
|
|
30
|
-
phoneValidator,
|
|
31
|
-
}
|
|
32
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* 通用表单校验器
|
|
3
|
+
*/
|
|
4
|
+
import isMobilePhone from 'validator/es/lib/isMobilePhone'
|
|
5
|
+
import isIdentityCard from 'validator/es/lib/isIdentityCard'
|
|
6
|
+
|
|
7
|
+
export function useValidator() {
|
|
8
|
+
// 身份证号码校验
|
|
9
|
+
function certNoValidator(value: string) {
|
|
10
|
+
if (!value) {
|
|
11
|
+
return '请输入身份证号'
|
|
12
|
+
} else if (!isIdentityCard(value, 'zh-CN')) {
|
|
13
|
+
return '请输入正确的身份证号码'
|
|
14
|
+
}
|
|
15
|
+
return false
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
// 电话号码校验
|
|
19
|
+
function phoneValidator(value: string) {
|
|
20
|
+
if (!value) {
|
|
21
|
+
return '请输入手机号码'
|
|
22
|
+
} else if (!isMobilePhone(value, 'zh-CN')) {
|
|
23
|
+
return '请输入正确的手机号'
|
|
24
|
+
}
|
|
25
|
+
return false
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
return {
|
|
29
|
+
certNoValidator,
|
|
30
|
+
phoneValidator,
|
|
31
|
+
}
|
|
32
|
+
}
|
|
@@ -1,48 +1,48 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @description: H5微信授权相关
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import { useHttp } from '../../payment/api'
|
|
6
|
-
|
|
7
|
-
export function useWxAuth() {
|
|
8
|
-
/**
|
|
9
|
-
* 跳转微信授权页面,授权完成后,返回授权码code与state
|
|
10
|
-
* @param source 设备码
|
|
11
|
-
* @param redirectUri 重定向地址
|
|
12
|
-
*/
|
|
13
|
-
function toWxAuth(source, redirectUri) {
|
|
14
|
-
const $http = useHttp()
|
|
15
|
-
$http
|
|
16
|
-
.get('/cas/auth/render/', {
|
|
17
|
-
source,
|
|
18
|
-
redirectUri,
|
|
19
|
-
})
|
|
20
|
-
.then((res: any) => {
|
|
21
|
-
location.replace(res)
|
|
22
|
-
})
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* 授权回调后,登录cas获取用户信息
|
|
27
|
-
* @param source
|
|
28
|
-
* @param state
|
|
29
|
-
*/
|
|
30
|
-
async function toCallbackLogin({ code, state, source }, cb) {
|
|
31
|
-
const $http = useHttp()
|
|
32
|
-
const res = await $http.post(
|
|
33
|
-
`/cas/auth/callbackLogin/${source}`,
|
|
34
|
-
{ code, state, source },
|
|
35
|
-
{
|
|
36
|
-
'Content-Type': 'application/x-www-form-urlencoded',
|
|
37
|
-
}
|
|
38
|
-
)
|
|
39
|
-
if (res) {
|
|
40
|
-
cb && cb(res)
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
return {
|
|
45
|
-
toWxAuth,
|
|
46
|
-
toCallbackLogin,
|
|
47
|
-
}
|
|
48
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* @description: H5微信授权相关
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { useHttp } from '../../payment/api'
|
|
6
|
+
|
|
7
|
+
export function useWxAuth() {
|
|
8
|
+
/**
|
|
9
|
+
* 跳转微信授权页面,授权完成后,返回授权码code与state
|
|
10
|
+
* @param source 设备码
|
|
11
|
+
* @param redirectUri 重定向地址
|
|
12
|
+
*/
|
|
13
|
+
function toWxAuth(source, redirectUri) {
|
|
14
|
+
const $http = useHttp()
|
|
15
|
+
$http
|
|
16
|
+
.get('/cas/auth/render/', {
|
|
17
|
+
source,
|
|
18
|
+
redirectUri,
|
|
19
|
+
})
|
|
20
|
+
.then((res: any) => {
|
|
21
|
+
location.replace(res)
|
|
22
|
+
})
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* 授权回调后,登录cas获取用户信息
|
|
27
|
+
* @param source
|
|
28
|
+
* @param state
|
|
29
|
+
*/
|
|
30
|
+
async function toCallbackLogin({ code, state, source }, cb) {
|
|
31
|
+
const $http = useHttp()
|
|
32
|
+
const res = await $http.post(
|
|
33
|
+
`/cas/auth/callbackLogin/${source}`,
|
|
34
|
+
{ code, state, source },
|
|
35
|
+
{
|
|
36
|
+
'Content-Type': 'application/x-www-form-urlencoded',
|
|
37
|
+
}
|
|
38
|
+
)
|
|
39
|
+
if (res) {
|
|
40
|
+
cb && cb(res)
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
return {
|
|
45
|
+
toWxAuth,
|
|
46
|
+
toCallbackLogin,
|
|
47
|
+
}
|
|
48
|
+
}
|
package/src/shared/http/Http.ts
CHANGED
|
@@ -1,149 +1,148 @@
|
|
|
1
|
-
import {
|
|
2
|
-
HttpInstance,
|
|
3
|
-
HttpClientConfig,
|
|
4
|
-
HttpMethod,
|
|
5
|
-
HttpRequestConfig,
|
|
6
|
-
RequestData,
|
|
7
|
-
ResponseData,
|
|
8
|
-
ResponseRaw,
|
|
9
|
-
Paging,
|
|
10
|
-
HttpTranslate,
|
|
11
|
-
RequestHeaders,
|
|
12
|
-
} from './types'
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* Useage:
|
|
16
|
-
* const $http = createHttp({
|
|
17
|
-
*
|
|
18
|
-
* })
|
|
19
|
-
* $http.get('/url').then(data => {
|
|
20
|
-
*
|
|
21
|
-
* })
|
|
22
|
-
*/
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* 统一请求过程
|
|
26
|
-
* @param config
|
|
27
|
-
* @returns
|
|
28
|
-
*/
|
|
29
|
-
const request: HttpInstance['request'] = <T>(config: HttpRequestConfig) => {
|
|
30
|
-
const c = {
|
|
31
|
-
...clientConfig,
|
|
32
|
-
...config,
|
|
33
|
-
headers: {
|
|
34
|
-
...clientConfig?.headers,
|
|
35
|
-
...config?.headers,
|
|
36
|
-
},
|
|
37
|
-
}
|
|
38
|
-
return new Promise<T>((resolve, reject) => {
|
|
39
|
-
const data =
|
|
40
|
-
config.data && clientConfig.translates && clientConfig.translates[c.url]
|
|
41
|
-
? (clientConfig.translates[c.url] as HttpTranslate)(c.data || {})
|
|
42
|
-
: c.data
|
|
43
|
-
// console.log(`[][][][][]HTTP.${c.method}, ${c.baseUrl}${c.url}`, data)
|
|
44
|
-
|
|
45
|
-
clientConfig.vendor &&
|
|
46
|
-
clientConfig.vendor
|
|
47
|
-
.request({
|
|
48
|
-
url: `${c.baseUrl}${c.url}`,
|
|
49
|
-
data,
|
|
50
|
-
headers: c.headers,
|
|
51
|
-
method: c.method,
|
|
52
|
-
})
|
|
53
|
-
.then((raw: ResponseRaw) => {
|
|
54
|
-
// 按顺序执行拦截器
|
|
55
|
-
for (const interc of c.interceptors || []) {
|
|
56
|
-
const r = interc(raw)
|
|
57
|
-
if (r) {
|
|
58
|
-
// 某拦截器命中时
|
|
59
|
-
// 按拦截结果 决定是否继续执行
|
|
60
|
-
reject('===INTERCEPTED===' + raw.status)
|
|
61
|
-
return false
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
if (raw.data !== void 0) {
|
|
65
|
-
// 当用户配置含有 transforms 时, 使用用户提供的 transform
|
|
66
|
-
// 先 endpoints transform
|
|
67
|
-
// 再组装分页数据
|
|
68
|
-
const response =
|
|
69
|
-
clientConfig.transforms && clientConfig.transforms[c.url]
|
|
70
|
-
? ((clientConfig.transforms[c.url] as HttpTranslate)(raw.data) as T)
|
|
71
|
-
: (raw.data as T)
|
|
72
|
-
// 前端要求分页
|
|
73
|
-
// 在 endpoints transform 之前格式化分页数据
|
|
74
|
-
// 并拼装回原 raw 数据
|
|
75
|
-
const paging =
|
|
76
|
-
config.data && config.data.page
|
|
77
|
-
? (clientConfig.paging as Paging).transform(raw.data)
|
|
78
|
-
: void 0
|
|
79
|
-
|
|
80
|
-
resolve(
|
|
81
|
-
paging
|
|
82
|
-
? ({
|
|
83
|
-
paging,
|
|
84
|
-
data: response,
|
|
85
|
-
} as T)
|
|
86
|
-
: response
|
|
87
|
-
)
|
|
88
|
-
} else {
|
|
89
|
-
resolve(raw as any)
|
|
90
|
-
}
|
|
91
|
-
})
|
|
92
|
-
.catch((e: any) => {
|
|
93
|
-
console.log('request.catch===', e)
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
*
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
*
|
|
135
|
-
* @
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
...
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
}
|
|
1
|
+
import {
|
|
2
|
+
HttpInstance,
|
|
3
|
+
HttpClientConfig,
|
|
4
|
+
HttpMethod,
|
|
5
|
+
HttpRequestConfig,
|
|
6
|
+
RequestData,
|
|
7
|
+
ResponseData,
|
|
8
|
+
ResponseRaw,
|
|
9
|
+
Paging,
|
|
10
|
+
HttpTranslate,
|
|
11
|
+
RequestHeaders,
|
|
12
|
+
} from './types'
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Useage:
|
|
16
|
+
* const $http = createHttp({
|
|
17
|
+
*
|
|
18
|
+
* })
|
|
19
|
+
* $http.get('/url').then(data => {
|
|
20
|
+
*
|
|
21
|
+
* })
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* 统一请求过程
|
|
26
|
+
* @param config
|
|
27
|
+
* @returns
|
|
28
|
+
*/
|
|
29
|
+
const request: HttpInstance['request'] = <T>(config: HttpRequestConfig) => {
|
|
30
|
+
const c = {
|
|
31
|
+
...clientConfig,
|
|
32
|
+
...config,
|
|
33
|
+
headers: {
|
|
34
|
+
...clientConfig?.headers,
|
|
35
|
+
...config?.headers,
|
|
36
|
+
},
|
|
37
|
+
}
|
|
38
|
+
return new Promise<T>((resolve, reject) => {
|
|
39
|
+
const data =
|
|
40
|
+
config.data && clientConfig.translates && clientConfig.translates[c.url]
|
|
41
|
+
? (clientConfig.translates[c.url] as HttpTranslate)(c.data || {})
|
|
42
|
+
: c.data
|
|
43
|
+
// console.log(`[][][][][]HTTP.${c.method}, ${c.baseUrl}${c.url}`, data)
|
|
44
|
+
|
|
45
|
+
clientConfig.vendor &&
|
|
46
|
+
clientConfig.vendor
|
|
47
|
+
.request({
|
|
48
|
+
url: `${c.baseUrl}${c.url}`,
|
|
49
|
+
data,
|
|
50
|
+
headers: c.headers,
|
|
51
|
+
method: c.method,
|
|
52
|
+
})
|
|
53
|
+
.then((raw: ResponseRaw) => {
|
|
54
|
+
// 按顺序执行拦截器
|
|
55
|
+
for (const interc of c.interceptors || []) {
|
|
56
|
+
const r = interc(raw)
|
|
57
|
+
if (r) {
|
|
58
|
+
// 某拦截器命中时
|
|
59
|
+
// 按拦截结果 决定是否继续执行
|
|
60
|
+
reject('===INTERCEPTED===' + raw.status)
|
|
61
|
+
return false
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
if (raw.data !== void 0) {
|
|
65
|
+
// 当用户配置含有 transforms 时, 使用用户提供的 transform
|
|
66
|
+
// 先 endpoints transform
|
|
67
|
+
// 再组装分页数据
|
|
68
|
+
const response =
|
|
69
|
+
clientConfig.transforms && clientConfig.transforms[c.url]
|
|
70
|
+
? ((clientConfig.transforms[c.url] as HttpTranslate)(raw.data) as T)
|
|
71
|
+
: (raw.data as T)
|
|
72
|
+
// 前端要求分页
|
|
73
|
+
// 在 endpoints transform 之前格式化分页数据
|
|
74
|
+
// 并拼装回原 raw 数据
|
|
75
|
+
const paging =
|
|
76
|
+
config.data && config.data.page
|
|
77
|
+
? (clientConfig.paging as Paging).transform(raw.data)
|
|
78
|
+
: void 0
|
|
79
|
+
|
|
80
|
+
resolve(
|
|
81
|
+
paging
|
|
82
|
+
? ({
|
|
83
|
+
paging,
|
|
84
|
+
data: response,
|
|
85
|
+
} as T)
|
|
86
|
+
: response
|
|
87
|
+
)
|
|
88
|
+
} else {
|
|
89
|
+
resolve(raw as any)
|
|
90
|
+
}
|
|
91
|
+
})
|
|
92
|
+
.catch((e: any) => {
|
|
93
|
+
console.log('request.catch===', e)
|
|
94
|
+
})
|
|
95
|
+
})
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
const get: HttpInstance['get'] = <T = ResponseData>(url: string, data?: RequestData) => {
|
|
99
|
+
return request<T>({
|
|
100
|
+
url,
|
|
101
|
+
data,
|
|
102
|
+
method: HttpMethod.get,
|
|
103
|
+
})
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
const post: HttpInstance['post'] = <T = ResponseData>(
|
|
107
|
+
url: string,
|
|
108
|
+
data: RequestData,
|
|
109
|
+
headers?: RequestHeaders
|
|
110
|
+
) => {
|
|
111
|
+
return request<T>({
|
|
112
|
+
url,
|
|
113
|
+
data,
|
|
114
|
+
method: HttpMethod.post,
|
|
115
|
+
headers,
|
|
116
|
+
})
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* 场景配置
|
|
121
|
+
* 本地后台团队统一返回值外层
|
|
122
|
+
*/
|
|
123
|
+
const defaultClientConfig: HttpClientConfig = {
|
|
124
|
+
baseUrl: '/',
|
|
125
|
+
interceptors: [(raw) => raw.status == 401],
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
let clientConfig = {
|
|
129
|
+
...defaultClientConfig,
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* 写入配置并返回 HTTP instance
|
|
134
|
+
* @param config
|
|
135
|
+
* @returns
|
|
136
|
+
*/
|
|
137
|
+
export function createHttp(config: HttpClientConfig): HttpInstance {
|
|
138
|
+
clientConfig = {
|
|
139
|
+
...defaultClientConfig,
|
|
140
|
+
...config,
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
return {
|
|
144
|
+
request,
|
|
145
|
+
get,
|
|
146
|
+
post,
|
|
147
|
+
}
|
|
148
|
+
}
|
package/src/shared/http/index.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export * from './Http'
|
|
1
|
+
export * from './Http'
|
|
2
2
|
export type * from './types'
|