@peng_kai/kit 0.1.15 → 0.1.17

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 (45) hide show
  1. package/admin/components/filter/src/FilterDrawer.vue +153 -153
  2. package/admin/components/filter/src/FilterParam.vue +78 -78
  3. package/admin/components/scroll-nav/index.ts +1 -1
  4. package/admin/components/scroll-nav/src/ScrollNav.vue +59 -59
  5. package/admin/components/text/index.ts +13 -13
  6. package/admin/components/text/src/Amount.vue +121 -121
  7. package/admin/components/text/src/Datetime.vue +48 -48
  8. package/admin/components/text/src/Duration.vue +26 -26
  9. package/admin/components/text/src/Hash.vue +51 -51
  10. package/admin/components/text/src/createTagGetter.ts +13 -13
  11. package/admin/hooks/useMenu.ts +128 -128
  12. package/admin/hooks/usePage.ts +141 -141
  13. package/admin/hooks/usePageTab.ts +35 -35
  14. package/admin/layout/large/Breadcrumb.vue +69 -69
  15. package/admin/layout/large/Content.vue +24 -24
  16. package/admin/layout/large/Menu.vue +69 -69
  17. package/admin/layout/large/PageTab.vue +71 -71
  18. package/admin/permission/index.ts +4 -4
  19. package/admin/permission/routerGuard.ts +43 -43
  20. package/admin/permission/usePermission.ts +52 -52
  21. package/admin/permission/vuePlugin.ts +30 -30
  22. package/admin/route-guards/index.ts +3 -3
  23. package/admin/route-guards/pageProgress.ts +27 -27
  24. package/admin/route-guards/pageTitle.ts +19 -19
  25. package/admin/scripts/deploy.ts +67 -0
  26. package/admin/styles/globalCover.scss +54 -54
  27. package/antd/components/InputNumberRange.vue +59 -59
  28. package/antd/directives/formLabelAlign.ts +36 -36
  29. package/antd/hooks/useAntdDrawer.ts +73 -73
  30. package/antd/hooks/useAntdTable.ts +115 -115
  31. package/package.json +58 -55
  32. package/request/helpers.ts +49 -49
  33. package/request/interceptors/checkCode.ts +3 -3
  34. package/request/interceptors/returnResultType.ts +2 -2
  35. package/request/interceptors/toLogin.ts +26 -26
  36. package/request/type.d.ts +92 -92
  37. package/stylelint.config.cjs +7 -7
  38. package/tsconfig.json +50 -50
  39. package/utils/blockchain.ts +57 -0
  40. package/utils/index.ts +12 -82
  41. package/utils/object.ts +17 -0
  42. package/utils/string.ts +28 -0
  43. package/vue/components/infinite-query/index.ts +1 -1
  44. package/vue/components/infinite-query/src/InfiniteQuery.vue +205 -205
  45. package/vue/components/infinite-query/src/useCreateTrigger.ts +39 -39
package/request/type.d.ts CHANGED
@@ -1,92 +1,92 @@
1
- declare namespace Api {
2
- type Request = ((reqData: any, options?: Options) => Promise<any>) & {
3
- id: string
4
- setDefaultConfig: (config: Partial<import('axios').AxiosRequestConfig>) => Request
5
- };
6
- // type RequestPagination = (reqData: Partial<PageParam>, options?: Options) => Promise<PaginationData<any>>;
7
- interface PageParam {
8
- page: number
9
- page_size: number
10
- }
11
- interface PageInfo {
12
- has_more: boolean
13
- page: number
14
- page_size: number
15
- total: number
16
- }
17
- interface PageData<T = any> {
18
- list: T[] | null
19
- pagination: PaginationInfo
20
- [k in string]: any
21
- }
22
- interface Result<T = any | PageData<any>> {
23
- code: number
24
- msg: string
25
- data: T
26
- }
27
- type GetParam<A extends Request> = A extends (reqData: infer R) => any ? R : any;
28
- type GetData<A extends Request> = ReturnType<A> extends Promise<infer D> ? D : any;
29
- type GetDataItem<A extends Request> = NonNullable<GetData<A>> extends { list: infer L }
30
- ? NonNullable<L> extends Array<infer I>
31
- ? I
32
- : any
33
- : any;
34
- type GetDataField<R> = R extends { data: infer D } ? (D extends { list: any, pagination: any } ? D : D) : any;
35
-
36
- /**
37
- * 将api返回的分页数据转换成前端使用的分页数据格式,将分页数据格式统一
38
- *
39
- * ```
40
- * {
41
- * code: number,
42
- * msg: string,
43
- * data: {
44
- * list: [],
45
- * pagination: {},
46
- * ...
47
- * }
48
- * }
49
- * ```
50
- */
51
- type TransformPageResult<R> = R extends { pagination: infer P, data: infer D }
52
- ? D extends Record<string, any>
53
- ? D extends { list: any }
54
- ? {
55
- [Rk in Exclude<keyof R, 'data' | 'pagination'>]: R[Rk];
56
- } & {
57
- data: D & { pagination: P }
58
- }
59
- : {
60
- [Rk in Exclude<keyof R, 'data' | 'pagination'>]: R[Rk];
61
- } & {
62
- data: {
63
- list: D
64
- pagination: P
65
- }
66
- }
67
- : R
68
- : R;
69
- }
70
-
71
- // 测试用例 ----------------------------
72
- // type DDD1 = Api.TransformPageResult<{
73
- // code: number
74
- // msg: string
75
- // data: {
76
- // name: string
77
- // }[]
78
- // pagination: {
79
- // page: number
80
- // }
81
- // }>
82
- // type DDD2 = Api.TransformPageResult<{
83
- // code: number
84
- // msg: string
85
- // data: {
86
- // list: { name: string }[]
87
- // total: {}
88
- // }
89
- // pagination: {
90
- // page: number
91
- // }
92
- // }>
1
+ declare namespace Api {
2
+ type Request = ((reqData: any, options?: Options) => Promise<any>) & {
3
+ id: string
4
+ setDefaultConfig: (config: Partial<import('axios').AxiosRequestConfig>) => Request
5
+ };
6
+ // type RequestPagination = (reqData: Partial<PageParam>, options?: Options) => Promise<PaginationData<any>>;
7
+ interface PageParam {
8
+ page: number
9
+ page_size: number
10
+ }
11
+ interface PageInfo {
12
+ has_more: boolean
13
+ page: number
14
+ page_size: number
15
+ total: number
16
+ }
17
+ interface PageData<T = any> {
18
+ list: T[] | null
19
+ pagination: PaginationInfo
20
+ [k in string]: any
21
+ }
22
+ interface Result<T = any | PageData<any>> {
23
+ code: number
24
+ msg: string
25
+ data: T
26
+ }
27
+ type GetParam<A extends Request> = A extends (reqData: infer R) => any ? R : any;
28
+ type GetData<A extends Request> = ReturnType<A> extends Promise<infer D> ? D : any;
29
+ type GetDataItem<A extends Request> = NonNullable<GetData<A>> extends { list: infer L }
30
+ ? NonNullable<L> extends Array<infer I>
31
+ ? I
32
+ : any
33
+ : any;
34
+ type GetDataField<R> = R extends { data: infer D } ? (D extends { list: any, pagination: any } ? D : D) : any;
35
+
36
+ /**
37
+ * 将api返回的分页数据转换成前端使用的分页数据格式,将分页数据格式统一
38
+ *
39
+ * ```
40
+ * {
41
+ * code: number,
42
+ * msg: string,
43
+ * data: {
44
+ * list: [],
45
+ * pagination: {},
46
+ * ...
47
+ * }
48
+ * }
49
+ * ```
50
+ */
51
+ type TransformPageResult<R> = R extends { pagination: infer P, data: infer D }
52
+ ? D extends Record<string, any>
53
+ ? D extends { list: any }
54
+ ? {
55
+ [Rk in Exclude<keyof R, 'data' | 'pagination'>]: R[Rk];
56
+ } & {
57
+ data: D & { pagination: P }
58
+ }
59
+ : {
60
+ [Rk in Exclude<keyof R, 'data' | 'pagination'>]: R[Rk];
61
+ } & {
62
+ data: {
63
+ list: D
64
+ pagination: P
65
+ }
66
+ }
67
+ : R
68
+ : R;
69
+ }
70
+
71
+ // 测试用例 ----------------------------
72
+ // type DDD1 = Api.TransformPageResult<{
73
+ // code: number
74
+ // msg: string
75
+ // data: {
76
+ // name: string
77
+ // }[]
78
+ // pagination: {
79
+ // page: number
80
+ // }
81
+ // }>
82
+ // type DDD2 = Api.TransformPageResult<{
83
+ // code: number
84
+ // msg: string
85
+ // data: {
86
+ // list: { name: string }[]
87
+ // total: {}
88
+ // }
89
+ // pagination: {
90
+ // page: number
91
+ // }
92
+ // }>
@@ -1,7 +1,7 @@
1
- module.exports = {
2
- // root: true,
3
- extends: ['@peng_kai/lint/vue/stylelint_v2'],
4
- rules: {
5
- 'custom-property-pattern': '(antd-([a-z][a-zA-Z0-9]+)*)|(([a-z][a-z0-9]*)(-[a-z0-9]+)*)',
6
- },
7
- };
1
+ module.exports = {
2
+ // root: true,
3
+ extends: ['@peng_kai/lint/vue/stylelint_v2'],
4
+ rules: {
5
+ 'custom-property-pattern': '(antd-([a-z][a-zA-Z0-9]+)*)|(([a-z][a-z0-9]*)(-[a-z0-9]+)*)',
6
+ },
7
+ };
package/tsconfig.json CHANGED
@@ -1,50 +1,50 @@
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
- "noImplicitAny": false,
24
- "noUnusedLocals": true,
25
- "noUnusedParameters": true,
26
- "noEmit": true,
27
- "allowSyntheticDefaultImports": true,
28
- "esModuleInterop": true,
29
- "isolatedModules": true,
30
- "skipLibCheck": true
31
- },
32
- "include": [
33
- "admin/**/*.ts",
34
- "admin/**/*.d.ts",
35
- "admin/**/*.tsx",
36
- "admin/**/*.vue",
37
- "antd/**/*.ts",
38
- "antd/**/*.d.ts",
39
- "antd/**/*.tsx",
40
- "antd/**/*.vue",
41
- "request/**/*.ts",
42
- "request/**/*.d.ts",
43
- "utils/**/*.ts",
44
- "utils/**/*.d.ts",
45
- "vue/**/*.ts",
46
- "vue/**/*.d.ts",
47
- "vue/**/*.tsx",
48
- "vue/**/*.vue"
49
- ]
50
- }
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
+ "noImplicitAny": false,
24
+ "noUnusedLocals": true,
25
+ "noUnusedParameters": true,
26
+ "noEmit": true,
27
+ "allowSyntheticDefaultImports": true,
28
+ "esModuleInterop": true,
29
+ "isolatedModules": true,
30
+ "skipLibCheck": true
31
+ },
32
+ "include": [
33
+ "admin/**/*.ts",
34
+ "admin/**/*.d.ts",
35
+ "admin/**/*.tsx",
36
+ "admin/**/*.vue",
37
+ "antd/**/*.ts",
38
+ "antd/**/*.d.ts",
39
+ "antd/**/*.tsx",
40
+ "antd/**/*.vue",
41
+ "request/**/*.ts",
42
+ "request/**/*.d.ts",
43
+ "utils/**/*.ts",
44
+ "utils/**/*.d.ts",
45
+ "vue/**/*.ts",
46
+ "vue/**/*.d.ts",
47
+ "vue/**/*.tsx",
48
+ "vue/**/*.vue"
49
+ ]
50
+ }
@@ -0,0 +1,57 @@
1
+ /**
2
+ * 获取对应链的浏览器地址
3
+ * @param chain 链名
4
+ * @param hash 哈希
5
+ * @param type 哈希类型
6
+ */
7
+ export function getScanBrowser(chain: string, hash: string, type: 'transaction' | 'address' = 'transaction') {
8
+ type TypeMap = Partial<Record<typeof type, string>>;
9
+
10
+ const _chain = chain.toUpperCase();
11
+ const evmType = () => type === 'transaction' ? 'tx' : type;
12
+ const urlFn = {
13
+ 'TRON': () => `https://tronscan.org/#/${type}/${hash}`,
14
+ 'ETH': () => `https://etherscan.io/${evmType()}/${hash}`,
15
+ 'ETHEREUM': () => `https://etherscan.io/${evmType()}/${hash}`,
16
+ 'BSC': () => `https://bscscan.com/${evmType()}/${hash}`,
17
+ 'BINANCE': () => `https://bscscan.com/${evmType()}/${hash}`,
18
+ 'BNB CHAIN': () => `https://bscscan.com/${evmType()}/${hash}`,
19
+ 'BASE': () => `https://basescan.org/${evmType()}/${hash}`,
20
+ 'HECO': () => `https://hecoscan.io/#/${evmType}/${hash}`,
21
+ 'POLYGON': () => `https://polygonscan.com/${evmType()}/${hash}`,
22
+ 'OKEXCHAIN': () => `https://www.okx.com/cn/explorer/oktc/${evmType()}/${hash}`,
23
+ 'OPBNB': () => `https://opbnbscan.com/${evmType()}/${hash}`,
24
+ 'APTOS': () => {
25
+ const _type = (<TypeMap>{ transaction: 'txn', address: 'account' })[type] ?? type;
26
+ return `https://explorer.aptoslabs.com/${_type}/${hash}`;
27
+ },
28
+ 'ARBITRUM': () => `https://arbiscan.io/${evmType()}/${hash}`,
29
+ 'AVALANCHE': () => `https://subnets.avax.network/c-chain/${evmType()}/${hash}`,
30
+ 'FANTOM': () => `https://ftmscan.com/${evmType()}/${hash}`,
31
+ 'OPTIMISM': () => `https://optimistic.etherscan.io/${evmType()}/${hash}`,
32
+ 'SUI': () => {
33
+ const _type = (<TypeMap>{ transaction: 'txblock' })[type] ?? type;
34
+ return `https://suiexplorer.com/${_type}/${hash}`;
35
+ },
36
+ 'ZKSYNC': () => `https://explorer.zksync.io/${evmType()}/${hash}`,
37
+ 'SOLANA': () => {
38
+ const _type = (<TypeMap>{ address: 'account', transaction: 'tx' })[type] ?? type;
39
+ return `https://solscan.io/${_type}/${hash}`;
40
+ },
41
+ 'DOGE': () => `https://dogechain.info/${evmType()}/${hash}`,
42
+ 'BTC': () => `https://mempool.space/${evmType()}/${hash}`,
43
+ }[_chain] ?? (() => '');
44
+
45
+ return urlFn();
46
+ }
47
+
48
+ /**
49
+ * 在新标签页打开对应链的浏览器地址
50
+ * @param chain 链名
51
+ * @param hash 哈希
52
+ * @param type 哈希类型
53
+ */
54
+ export function openScanBrowser(...args: Parameters<typeof getScanBrowser>) {
55
+ const url = getScanBrowser(...args);
56
+ url && window.open(url, '_blank');
57
+ }
package/utils/index.ts CHANGED
@@ -1,3 +1,7 @@
1
+ export { desensitize, randomString } from './string';
2
+ export { getScanBrowser, openScanBrowser } from './blockchain';
3
+ export { override } from './object';
4
+
1
5
  export const ENV = {
2
6
  get isDev() {
3
7
  return (import.meta as any).env.DEV;
@@ -11,6 +15,9 @@ export const ENV = {
11
15
  get isTest() {
12
16
  return this.isDev || this.isStaging;
13
17
  },
18
+ get isSSR() {
19
+ return typeof window === 'undefined';
20
+ },
14
21
  };
15
22
 
16
23
  /**
@@ -21,99 +28,22 @@ export function sleep(dur: number) {
21
28
  return new Promise(resolve => setTimeout(resolve, dur));
22
29
  }
23
30
 
24
- /**
25
- * 是否有授权 Token
26
- */
31
+ /** 是否有授权 Token */
27
32
  export function hasToken() {
28
33
  return document.cookie.includes('has_token=1');
29
34
  }
30
35
 
36
+ /** 是否在 SSR 环境 */
31
37
  export function isSSR() {
32
38
  return typeof window === 'undefined';
33
39
  }
34
40
 
35
- /**
36
- * 字符串脱敏,省略中间字符串
37
- * @param str 字符串
38
- * @param startChars 开头显示字符数量
39
- * @param endChars 结尾显示字符数量
40
- */
41
- export function desensitize(str: string | undefined | null, startChars = 4, endChars?: number) {
42
- if (!str)
43
- return '';
44
-
45
- endChars ??= startChars;
46
-
47
- if (startChars + endChars >= str.length)
48
- return str;
49
-
50
- const truncatedStr = `${str.substring(0, startChars)}...${str.substring(str.length - endChars)}`;
51
-
52
- return truncatedStr;
53
- }
54
-
55
- /**
56
- * 生成指定长度的随机字符串
57
- * @param length 要生成的随机字符串的长度
58
- */
59
- export function randomString(length: number) {
60
- const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
61
- return Array.from({ length }, () => characters[Math.floor(Math.random() * characters.length)]).join('');
62
- }
63
-
64
- /**
65
- * 对应链的浏览器地址
66
- * @param chain 链名
67
- * @param hash 哈希
68
- * @param type 哈希类型
69
- */
70
- export function getScanBrowser(chain: string, hash: string, type: 'transaction' | 'address' = 'transaction') {
71
- type TypeMap = Partial<Record<typeof type, string>>;
72
-
73
- const _chain = chain.toUpperCase();
74
- const evmType = () => type === 'transaction' ? 'tx' : type;
75
- const urlFn = {
76
- 'TRON': () => `https://tronscan.org/#/${type}/${hash}`,
77
- 'ETH': () => `https://etherscan.io/${evmType()}/${hash}`,
78
- 'ETHEREUM': () => `https://etherscan.io/${evmType()}/${hash}`,
79
- 'BSC': () => `https://bscscan.com/${evmType()}/${hash}`,
80
- 'BINANCE': () => `https://bscscan.com/${evmType()}/${hash}`,
81
- 'BNB CHAIN': () => `https://bscscan.com/${evmType()}/${hash}`,
82
- 'BASE': () => `https://basescan.org/${evmType()}/${hash}`,
83
- 'HECO': () => `https://hecoscan.io/#/${evmType}/${hash}`,
84
- 'POLYGON': () => `https://polygonscan.com/${evmType()}/${hash}`,
85
- 'OKEXCHAIN': () => `https://www.okx.com/cn/explorer/oktc/${evmType()}/${hash}`,
86
- 'OPBNB': () => `https://opbnbscan.com/${evmType()}/${hash}`,
87
- 'APTOS': () => {
88
- const _type = (<TypeMap>{ transaction: 'txn', address: 'account' })[type] ?? type;
89
- return `https://explorer.aptoslabs.com/${_type}/${hash}`;
90
- },
91
- 'ARBITRUM': () => `https://arbiscan.io/${evmType()}/${hash}`,
92
- 'AVALANCHE': () => `https://subnets.avax.network/c-chain/${evmType()}/${hash}`,
93
- 'FANTOM': () => `https://ftmscan.com/${evmType()}/${hash}`,
94
- 'OPTIMISM': () => `https://optimistic.etherscan.io/${evmType()}/${hash}`,
95
- 'SUI': () => {
96
- const _type = (<TypeMap>{ transaction: 'txblock' })[type] ?? type;
97
- return `https://suiexplorer.com/${_type}/${hash}`;
98
- },
99
- 'ZKSYNC': () => `https://explorer.zksync.io/${evmType()}/${hash}`,
100
- 'SOLANA': () => {
101
- const _type = (<TypeMap>{ address: 'account', transaction: 'tx' })[type] ?? type;
102
- return `https://solscan.io/${_type}/${hash}`;
103
- },
104
- 'DOGE': () => `https://dogechain.info/${evmType()}/${hash}`,
105
- 'BTC': () => `https://mempool.space/${evmType()}/${hash}`,
106
- }[_chain] ?? (() => '');
107
-
108
- return urlFn();
109
- }
110
-
111
41
  /**
112
42
  * Telegram连接
113
- * @param link 链接
43
+ * @param id 链接
114
44
  */
115
- export function getTelegramBrowser(link: string) {
116
- return `https://t.me/${link}`;
45
+ export function getTelegramBrowser(id: string) {
46
+ return `https://t.me/${id}`;
117
47
  }
118
48
 
119
49
  /**
@@ -0,0 +1,17 @@
1
+ import assign from 'lodash-es/assign';
2
+ import pick from 'lodash-es/pick';
3
+ import keys from 'lodash-es/keys';
4
+
5
+ /**
6
+ * 用一个或多个源对象的属性覆盖目标对象的属性,只会覆盖 `target` 中存在的属性,不会新增新属性
7
+ * @param target - 要覆盖的目标对象。
8
+ * @param sources - 包含要覆盖的属性的源对象。
9
+ * @returns 带有覆盖属性的目标对象。
10
+ */
11
+ export function override<T extends Record<PropertyKey, any>>(
12
+ target: T,
13
+ ...sources: Partial<Record<keyof T, any> & Record<PropertyKey, any>>[]
14
+ ) {
15
+ const source = assign({}, ...sources);
16
+ return assign(target, pick(source, keys(target)));
17
+ }
@@ -0,0 +1,28 @@
1
+ /**
2
+ * 字符串脱敏,省略中间字符串
3
+ * @param str 字符串
4
+ * @param startChars 开头显示字符数量
5
+ * @param endChars 结尾显示字符数量
6
+ */
7
+ export function desensitize(str: string | undefined | null, startChars = 4, endChars?: number) {
8
+ if (!str)
9
+ return '';
10
+
11
+ endChars ??= startChars;
12
+
13
+ if (startChars + endChars >= str.length)
14
+ return str;
15
+
16
+ const truncatedStr = `${str.substring(0, startChars)}...${str.substring(str.length - endChars)}`;
17
+
18
+ return truncatedStr;
19
+ }
20
+
21
+ /**
22
+ * 生成指定长度的随机字符串
23
+ * @param length 要生成的随机字符串的长度
24
+ */
25
+ export function randomString(length: number) {
26
+ const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
27
+ return Array.from({ length }, () => characters[Math.floor(Math.random() * characters.length)]).join('');
28
+ }
@@ -1 +1 @@
1
- export { default as InfiniteQuery } from './src/InfiniteQuery.vue';
1
+ export { default as InfiniteQuery } from './src/InfiniteQuery.vue';