@peng_kai/kit 0.0.14 → 0.0.16
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/.vscode/settings.json +41 -0
- package/admin/components/filter/index.ts +5 -0
- package/admin/{filter → components/filter/src}/FilterDrawer.vue +99 -96
- package/admin/{filter → components/filter/src}/FilterParam.vue +76 -76
- package/admin/{filter → components/filter/src}/FilterReset.vue +7 -4
- package/admin/{filter → components/filter/src}/useFilterParams.ts +9 -9
- package/admin/{filter → components/filter/src}/useFilterQuery.ts +11 -11
- package/admin/components/scroll-nav/index.ts +1 -1
- package/admin/components/scroll-nav/src/ScrollNav.vue +59 -59
- package/admin/components/text/index.ts +13 -13
- package/admin/components/text/src/Amount.vue +117 -114
- package/admin/components/text/src/Datetime.vue +44 -44
- package/admin/components/text/src/Duration.vue +26 -26
- package/admin/components/text/src/Hash.vue +42 -40
- package/admin/components/text/src/createTagGetter.ts +13 -13
- package/admin/defines/index.ts +4 -5
- package/admin/defines/page/definePage.ts +12 -0
- package/admin/defines/page/index.ts +1 -0
- package/admin/defines/route/defineRoute.ts +14 -0
- package/admin/defines/route/getRoutes.ts +84 -0
- package/admin/defines/route/helpers.ts +49 -0
- package/admin/defines/route/index.ts +73 -0
- package/admin/defines/route-guard/defineRouteGuard.ts +18 -0
- package/admin/defines/route-guard/getRouteGuards.ts +40 -0
- package/admin/defines/route-guard/index.ts +2 -0
- package/admin/defines/startup/defineStartup.ts +11 -0
- package/admin/defines/startup/getStartups.ts +30 -0
- package/admin/defines/startup/index.ts +2 -0
- package/admin/hooks/index.ts +5 -6
- package/admin/hooks/useMenu.ts +128 -128
- package/admin/hooks/usePage.ts +141 -139
- package/admin/hooks/usePageTab.ts +35 -35
- package/admin/layout/large/Breadcrumb.vue +69 -70
- package/admin/layout/large/Content.vue +24 -24
- package/admin/layout/large/Menu.vue +69 -68
- package/admin/layout/large/PageTab.vue +71 -71
- package/admin/layout/large/index.ts +4 -4
- package/admin/permission/index.ts +4 -0
- package/admin/permission/routerGuard.ts +43 -0
- package/admin/permission/usePermission.ts +52 -0
- package/admin/permission/vuePlugin.ts +30 -0
- package/admin/route-guards/index.ts +2 -0
- package/admin/route-guards/pageProgress.ts +16 -0
- package/admin/route-guards/pageTitle.ts +24 -0
- package/admin/styles/globalCover.scss +43 -43
- package/admin/types/assist.ts +10 -0
- package/admin/unocss/index.ts +1 -1
- package/antd/components/InputNumberRange.vue +53 -47
- package/antd/directives/formLabelAlign.ts +36 -31
- package/antd/hooks/createAntdModal.ts +29 -29
- package/antd/hooks/useAntdDrawer.ts +73 -73
- package/antd/hooks/useAntdForm.helpers.ts +18 -18
- package/antd/hooks/useAntdForm.ts +38 -37
- package/antd/hooks/useAntdModal.ts +25 -25
- package/antd/hooks/useAntdTable.ts +70 -70
- package/antd/hooks/useAntdTheme.ts +86 -0
- package/antd/index.ts +8 -7
- package/eslint.config.js +50 -0
- package/kitDependencies.ts +21 -7
- package/package.json +46 -40
- package/pnpm-lock.yaml +2689 -0
- package/request/helpers.ts +49 -32
- package/request/index.ts +2 -2
- package/request/interceptors/checkCode.ts +8 -8
- package/request/interceptors/filterEmptyValue.ts +9 -9
- package/request/interceptors/formatPaging.ts +12 -12
- package/request/interceptors/index.ts +7 -6
- package/request/interceptors/popupMessage.ts +35 -35
- package/request/interceptors/returnResultType.ts +19 -19
- package/request/interceptors/toLogin.ts +13 -0
- package/request/interceptors/unitizeAxiosError.ts +7 -7
- package/request/queryClient.ts +42 -0
- package/request/request.ts +21 -21
- package/request/type.d.ts +89 -89
- package/tsconfig.json +47 -18
- package/utils/index.ts +67 -29
- package/vue/components/index.ts +1 -0
- package/{components → vue/components}/infinite-query/index.ts +1 -1
- package/{components → vue/components}/infinite-query/src/InfiniteQuery.vue +147 -147
- package/{components → vue/components}/infinite-query/src/useCreateTrigger.ts +35 -35
- package/vue/hooks/useComponentRef.ts +12 -12
- package/vue/hooks/useIsMounted.ts +4 -4
- package/vue/hooks/useTeleportTarget.ts +7 -7
- package/vue/index.ts +4 -3
- package/admin/defines/definePage.ts +0 -14
- package/admin/defines/defineRoute.helpers.ts +0 -30
- package/admin/defines/defineRoute.ts +0 -161
- package/admin/defines/defineRouteGuard.ts +0 -56
- package/admin/defines/defineStartup.ts +0 -41
- package/admin/filter/index.ts +0 -5
- package/admin/hooks/usePermission.ts +0 -5
package/request/type.d.ts
CHANGED
|
@@ -1,89 +1,89 @@
|
|
|
1
|
-
declare namespace Api {
|
|
2
|
-
type Request = ((reqData: any, options?: Options) => Promise<any>) & { id: string }
|
|
3
|
-
// type RequestPagination = (reqData: Partial<PageParam>, options?: Options) => Promise<PaginationData<any>>;
|
|
4
|
-
interface PageParam {
|
|
5
|
-
page: number
|
|
6
|
-
page_size: number
|
|
7
|
-
}
|
|
8
|
-
interface PageInfo {
|
|
9
|
-
has_more: boolean
|
|
10
|
-
page: number
|
|
11
|
-
page_size: number
|
|
12
|
-
total: number
|
|
13
|
-
}
|
|
14
|
-
interface PageData<T = any> {
|
|
15
|
-
list: T[] | null
|
|
16
|
-
pagination: PaginationInfo
|
|
17
|
-
[k in string]: any
|
|
18
|
-
}
|
|
19
|
-
interface Result<T = any | PageData<any>> {
|
|
20
|
-
code: number
|
|
21
|
-
msg: string
|
|
22
|
-
data: T
|
|
23
|
-
}
|
|
24
|
-
type GetParam<A extends Request> = A extends (reqData: infer R) => any ? R : any
|
|
25
|
-
type GetData<A extends Request> = ReturnType<A> extends Promise<infer D> ? D : any
|
|
26
|
-
type GetDataItem<A extends Request> = NonNullable<GetData<A>> extends { list: infer L }
|
|
27
|
-
? NonNullable<L> extends Array<infer I>
|
|
28
|
-
? I
|
|
29
|
-
: any
|
|
30
|
-
: any
|
|
31
|
-
type GetDataField<R> = R extends { data: infer D } ? (D extends { list: any
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* 将api返回的分页数据转换成前端使用的分页数据格式,将分页数据格式统一
|
|
35
|
-
*
|
|
36
|
-
* ```
|
|
37
|
-
* {
|
|
38
|
-
* code: number,
|
|
39
|
-
* msg: string,
|
|
40
|
-
* data: {
|
|
41
|
-
* list: [],
|
|
42
|
-
* pagination: {},
|
|
43
|
-
* ...
|
|
44
|
-
* }
|
|
45
|
-
* }
|
|
46
|
-
* ```
|
|
47
|
-
*/
|
|
48
|
-
type TransformPageResult<R> = R extends { pagination: infer P
|
|
49
|
-
? D extends Record<string, any>
|
|
50
|
-
? D extends { list: any }
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
: {
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
: R
|
|
65
|
-
: R
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
// 测试用例 ----------------------------
|
|
69
|
-
// type DDD1 = Api.TransformPageResult<{
|
|
70
|
-
// code: number
|
|
71
|
-
// msg: string
|
|
72
|
-
// data: {
|
|
73
|
-
// name: string
|
|
74
|
-
// }[]
|
|
75
|
-
// pagination: {
|
|
76
|
-
// page: number
|
|
77
|
-
// }
|
|
78
|
-
// }>
|
|
79
|
-
// type DDD2 = Api.TransformPageResult<{
|
|
80
|
-
// code: number
|
|
81
|
-
// msg: string
|
|
82
|
-
// data: {
|
|
83
|
-
// list: { name: string }[]
|
|
84
|
-
// total: {}
|
|
85
|
-
// }
|
|
86
|
-
// pagination: {
|
|
87
|
-
// page: number
|
|
88
|
-
// }
|
|
89
|
-
// }>
|
|
1
|
+
declare namespace Api {
|
|
2
|
+
type Request = ((reqData: any, options?: Options) => Promise<any>) & { id: string };
|
|
3
|
+
// type RequestPagination = (reqData: Partial<PageParam>, options?: Options) => Promise<PaginationData<any>>;
|
|
4
|
+
interface PageParam {
|
|
5
|
+
page: number
|
|
6
|
+
page_size: number
|
|
7
|
+
}
|
|
8
|
+
interface PageInfo {
|
|
9
|
+
has_more: boolean
|
|
10
|
+
page: number
|
|
11
|
+
page_size: number
|
|
12
|
+
total: number
|
|
13
|
+
}
|
|
14
|
+
interface PageData<T = any> {
|
|
15
|
+
list: T[] | null
|
|
16
|
+
pagination: PaginationInfo
|
|
17
|
+
[k in string]: any
|
|
18
|
+
}
|
|
19
|
+
interface Result<T = any | PageData<any>> {
|
|
20
|
+
code: number
|
|
21
|
+
msg: string
|
|
22
|
+
data: T
|
|
23
|
+
}
|
|
24
|
+
type GetParam<A extends Request> = A extends (reqData: infer R) => any ? R : any;
|
|
25
|
+
type GetData<A extends Request> = ReturnType<A> extends Promise<infer D> ? D : any;
|
|
26
|
+
type GetDataItem<A extends Request> = NonNullable<GetData<A>> extends { list: infer L }
|
|
27
|
+
? NonNullable<L> extends Array<infer I>
|
|
28
|
+
? I
|
|
29
|
+
: any
|
|
30
|
+
: any;
|
|
31
|
+
type GetDataField<R> = R extends { data: infer D } ? (D extends { list: any, pagination: any } ? D : D) : any;
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* 将api返回的分页数据转换成前端使用的分页数据格式,将分页数据格式统一
|
|
35
|
+
*
|
|
36
|
+
* ```
|
|
37
|
+
* {
|
|
38
|
+
* code: number,
|
|
39
|
+
* msg: string,
|
|
40
|
+
* data: {
|
|
41
|
+
* list: [],
|
|
42
|
+
* pagination: {},
|
|
43
|
+
* ...
|
|
44
|
+
* }
|
|
45
|
+
* }
|
|
46
|
+
* ```
|
|
47
|
+
*/
|
|
48
|
+
type TransformPageResult<R> = R extends { pagination: infer P, data: infer D }
|
|
49
|
+
? D extends Record<string, any>
|
|
50
|
+
? D extends { list: any }
|
|
51
|
+
? {
|
|
52
|
+
[Rk in Exclude<keyof R, 'data' | 'pagination'>]: R[Rk];
|
|
53
|
+
} & {
|
|
54
|
+
data: D & { pagination: P }
|
|
55
|
+
}
|
|
56
|
+
: {
|
|
57
|
+
[Rk in Exclude<keyof R, 'data' | 'pagination'>]: R[Rk];
|
|
58
|
+
} & {
|
|
59
|
+
data: {
|
|
60
|
+
list: D
|
|
61
|
+
pagination: P
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
: R
|
|
65
|
+
: R;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// 测试用例 ----------------------------
|
|
69
|
+
// type DDD1 = Api.TransformPageResult<{
|
|
70
|
+
// code: number
|
|
71
|
+
// msg: string
|
|
72
|
+
// data: {
|
|
73
|
+
// name: string
|
|
74
|
+
// }[]
|
|
75
|
+
// pagination: {
|
|
76
|
+
// page: number
|
|
77
|
+
// }
|
|
78
|
+
// }>
|
|
79
|
+
// type DDD2 = Api.TransformPageResult<{
|
|
80
|
+
// code: number
|
|
81
|
+
// msg: string
|
|
82
|
+
// data: {
|
|
83
|
+
// list: { name: string }[]
|
|
84
|
+
// total: {}
|
|
85
|
+
// }
|
|
86
|
+
// pagination: {
|
|
87
|
+
// page: number
|
|
88
|
+
// }
|
|
89
|
+
// }>
|
package/tsconfig.json
CHANGED
|
@@ -1,18 +1,47 @@
|
|
|
1
|
-
{
|
|
2
|
-
"compilerOptions": {
|
|
3
|
-
"target": "
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
"
|
|
13
|
-
"
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
"
|
|
17
|
-
|
|
18
|
-
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2020",
|
|
4
|
+
"jsx": "preserve",
|
|
5
|
+
"jsxFactory": "h",
|
|
6
|
+
"jsxFragmentFactory": "Fragment",
|
|
7
|
+
"lib": [
|
|
8
|
+
"ESNext",
|
|
9
|
+
"DOM",
|
|
10
|
+
"DOM.Iterable"
|
|
11
|
+
],
|
|
12
|
+
"useDefineForClassFields": true,
|
|
13
|
+
"module": "ESNext",
|
|
14
|
+
|
|
15
|
+
/* Bundler mode */
|
|
16
|
+
"moduleResolution": "bundler",
|
|
17
|
+
"resolveJsonModule": true,
|
|
18
|
+
"allowImportingTsExtensions": true,
|
|
19
|
+
|
|
20
|
+
/* Linting */
|
|
21
|
+
"strict": true,
|
|
22
|
+
"noFallthroughCasesInSwitch": true,
|
|
23
|
+
"noUnusedLocals": true,
|
|
24
|
+
"noUnusedParameters": true,
|
|
25
|
+
"noEmit": true,
|
|
26
|
+
"isolatedModules": true,
|
|
27
|
+
"skipLibCheck": true
|
|
28
|
+
},
|
|
29
|
+
"include": [
|
|
30
|
+
"admin/**/*.ts",
|
|
31
|
+
"admin/**/*.d.ts",
|
|
32
|
+
"admin/**/*.tsx",
|
|
33
|
+
"admin/**/*.vue",
|
|
34
|
+
"antd/**/*.ts",
|
|
35
|
+
"antd/**/*.d.ts",
|
|
36
|
+
"antd/**/*.tsx",
|
|
37
|
+
"antd/**/*.vue",
|
|
38
|
+
"request/**/*.ts",
|
|
39
|
+
"request/**/*.d.ts",
|
|
40
|
+
"utils/**/*.ts",
|
|
41
|
+
"utils/**/*.d.ts",
|
|
42
|
+
"vue/**/*.ts",
|
|
43
|
+
"vue/**/*.d.ts",
|
|
44
|
+
"vue/**/*.tsx",
|
|
45
|
+
"vue/**/*.vue"
|
|
46
|
+
]
|
|
47
|
+
}
|
package/utils/index.ts
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
export const ENV = {
|
|
2
2
|
get isDev() {
|
|
3
|
-
return (import.meta as any).env.DEV
|
|
3
|
+
return (import.meta as any).env.DEV;
|
|
4
4
|
},
|
|
5
5
|
get isProd() {
|
|
6
|
-
return (import.meta as any).env.PROD
|
|
6
|
+
return (import.meta as any).env.PROD;
|
|
7
7
|
},
|
|
8
8
|
get isStaging() {
|
|
9
|
-
return (import.meta as any).env.MODE === 'staging'
|
|
9
|
+
return (import.meta as any).env.MODE === 'staging';
|
|
10
10
|
},
|
|
11
11
|
get isTest() {
|
|
12
|
-
return this.isDev || this.isStaging
|
|
12
|
+
return this.isDev || this.isStaging;
|
|
13
13
|
},
|
|
14
|
-
}
|
|
14
|
+
};
|
|
15
15
|
|
|
16
16
|
/**
|
|
17
17
|
* 睡眠
|
|
@@ -19,8 +19,15 @@ export const ENV = {
|
|
|
19
19
|
*/
|
|
20
20
|
export function sleep(dur: number) {
|
|
21
21
|
return new Promise((resolve) => {
|
|
22
|
-
setTimeout(resolve, dur)
|
|
23
|
-
})
|
|
22
|
+
setTimeout(resolve, dur);
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* 是否有授权 Token
|
|
28
|
+
*/
|
|
29
|
+
export function hasToken() {
|
|
30
|
+
return document.cookie.includes('has_token=1');
|
|
24
31
|
}
|
|
25
32
|
|
|
26
33
|
/**
|
|
@@ -31,17 +38,16 @@ export function sleep(dur: number) {
|
|
|
31
38
|
*/
|
|
32
39
|
export function desensitize(str: string | undefined | null, startChars = 4, endChars?: number) {
|
|
33
40
|
if (!str)
|
|
34
|
-
return ''
|
|
41
|
+
return '';
|
|
35
42
|
|
|
36
|
-
|
|
37
|
-
endChars ??= startChars
|
|
43
|
+
endChars ??= startChars;
|
|
38
44
|
|
|
39
45
|
if (startChars + endChars >= str.length)
|
|
40
|
-
return str
|
|
46
|
+
return str;
|
|
41
47
|
|
|
42
|
-
const truncatedStr = `${str.substring(0, startChars)}...${str.substring(str.length - endChars)}
|
|
48
|
+
const truncatedStr = `${str.substring(0, startChars)}...${str.substring(str.length - endChars)}`;
|
|
43
49
|
|
|
44
|
-
return truncatedStr
|
|
50
|
+
return truncatedStr;
|
|
45
51
|
}
|
|
46
52
|
|
|
47
53
|
/**
|
|
@@ -51,23 +57,37 @@ export function desensitize(str: string | undefined | null, startChars = 4, endC
|
|
|
51
57
|
* @param type 哈希类型
|
|
52
58
|
*/
|
|
53
59
|
export function getScanBrowser(chain: string, hash: string, type: 'transaction' | 'address' = 'transaction') {
|
|
54
|
-
|
|
55
|
-
const evmType = type === 'transaction' ? 'tx' : type
|
|
60
|
+
type TypeMap = Partial<Record<typeof type, string>>;
|
|
56
61
|
|
|
57
|
-
const
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
62
|
+
const _chain = chain.toUpperCase();
|
|
63
|
+
const evmType = () => type === 'transaction' ? 'tx' : type;
|
|
64
|
+
const urlFn = {
|
|
65
|
+
TRON: () => `https://tronscan.org/#/${type}/${hash}`,
|
|
66
|
+
ETH: () => `https://etherscan.io/${evmType()}/${hash}`,
|
|
67
|
+
ETHEREUM: () => `https://etherscan.io/${evmType()}/${hash}`,
|
|
68
|
+
BSC: () => `https://bscscan.com/${evmType()}/${hash}`,
|
|
69
|
+
BINANCE: () => `https://bscscan.com/${evmType()}/${hash}`,
|
|
70
|
+
BASE: () => `https://basescan.org/${evmType()}/${hash}`,
|
|
71
|
+
HECO: () => `https://hecoscan.io/#/${evmType}/${hash}`,
|
|
72
|
+
POLYGON: () => `https://polygonscan.com/${evmType()}/${hash}`,
|
|
73
|
+
OKEXCHAIN: () => `https://www.okx.com/cn/explorer/oktc/${evmType()}/${hash}`,
|
|
74
|
+
OPBNB: () => `https://opbnbscan.com/${evmType()}/${hash}`,
|
|
75
|
+
APOTS: () => {
|
|
76
|
+
const _type = (<TypeMap>{ transaction: 'txn', address: 'account' })[type] ?? type;
|
|
77
|
+
return `https://explorer.aptoslabs.com/${_type}/${hash}`;
|
|
78
|
+
},
|
|
79
|
+
ARBITRUM: () => `https://arbiscan.io/${evmType()}/${hash}`,
|
|
80
|
+
AVALANCHE: () => `https://subnets.avax.network/c-chain/${evmType()}/${hash}`,
|
|
81
|
+
FANTOM: () => `https://ftmscan.com/${evmType()}/${hash}`,
|
|
82
|
+
OPTIMISM: () => `https://optimistic.etherscan.io/${evmType()}/${hash}`,
|
|
83
|
+
SUI: () => {
|
|
84
|
+
const _type = (<TypeMap>{ transaction: 'txblock' })[type] ?? type;
|
|
85
|
+
return `https://suiexplorer.com/${_type}/${hash}`;
|
|
86
|
+
},
|
|
87
|
+
ZKSYNC: () => `https://explorer.zksync.io/${evmType()}/${hash}`,
|
|
88
|
+
}[_chain] ?? (() => '');
|
|
69
89
|
|
|
70
|
-
return
|
|
90
|
+
return urlFn();
|
|
71
91
|
}
|
|
72
92
|
|
|
73
93
|
/**
|
|
@@ -75,5 +95,23 @@ export function getScanBrowser(chain: string, hash: string, type: 'transaction'
|
|
|
75
95
|
* @param link 链接
|
|
76
96
|
*/
|
|
77
97
|
export function getTelegramBrowser(link: string) {
|
|
78
|
-
return `https://t.me/${link}
|
|
98
|
+
return `https://t.me/${link}`;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* 删除当前页面 URL 中的指定查询参数
|
|
103
|
+
* @param key 查询参数的 Key
|
|
104
|
+
*/
|
|
105
|
+
export function removeUrlSearchParam(key: string) {
|
|
106
|
+
const url = new URL(window.location.href);
|
|
107
|
+
url.searchParams.delete(key);
|
|
108
|
+
window.history.replaceState({}, '', url);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
export function createSelfKeyProxy<T extends object>() {
|
|
112
|
+
return new Proxy({} as T, {
|
|
113
|
+
get(_, p) {
|
|
114
|
+
return p;
|
|
115
|
+
},
|
|
116
|
+
});
|
|
79
117
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { InfiniteQuery } from './infinite-query';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export { default as InfiniteQuery } from './src/InfiniteQuery.vue'
|
|
1
|
+
export { default as InfiniteQuery } from './src/InfiniteQuery.vue';
|