@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.
Files changed (91) hide show
  1. package/.vscode/settings.json +41 -0
  2. package/admin/components/filter/index.ts +5 -0
  3. package/admin/{filter → components/filter/src}/FilterDrawer.vue +99 -96
  4. package/admin/{filter → components/filter/src}/FilterParam.vue +76 -76
  5. package/admin/{filter → components/filter/src}/FilterReset.vue +7 -4
  6. package/admin/{filter → components/filter/src}/useFilterParams.ts +9 -9
  7. package/admin/{filter → components/filter/src}/useFilterQuery.ts +11 -11
  8. package/admin/components/scroll-nav/index.ts +1 -1
  9. package/admin/components/scroll-nav/src/ScrollNav.vue +59 -59
  10. package/admin/components/text/index.ts +13 -13
  11. package/admin/components/text/src/Amount.vue +117 -114
  12. package/admin/components/text/src/Datetime.vue +44 -44
  13. package/admin/components/text/src/Duration.vue +26 -26
  14. package/admin/components/text/src/Hash.vue +42 -40
  15. package/admin/components/text/src/createTagGetter.ts +13 -13
  16. package/admin/defines/index.ts +4 -5
  17. package/admin/defines/page/definePage.ts +12 -0
  18. package/admin/defines/page/index.ts +1 -0
  19. package/admin/defines/route/defineRoute.ts +14 -0
  20. package/admin/defines/route/getRoutes.ts +84 -0
  21. package/admin/defines/route/helpers.ts +49 -0
  22. package/admin/defines/route/index.ts +73 -0
  23. package/admin/defines/route-guard/defineRouteGuard.ts +18 -0
  24. package/admin/defines/route-guard/getRouteGuards.ts +40 -0
  25. package/admin/defines/route-guard/index.ts +2 -0
  26. package/admin/defines/startup/defineStartup.ts +11 -0
  27. package/admin/defines/startup/getStartups.ts +30 -0
  28. package/admin/defines/startup/index.ts +2 -0
  29. package/admin/hooks/index.ts +5 -6
  30. package/admin/hooks/useMenu.ts +128 -128
  31. package/admin/hooks/usePage.ts +141 -139
  32. package/admin/hooks/usePageTab.ts +35 -35
  33. package/admin/layout/large/Breadcrumb.vue +69 -70
  34. package/admin/layout/large/Content.vue +24 -24
  35. package/admin/layout/large/Menu.vue +69 -68
  36. package/admin/layout/large/PageTab.vue +71 -71
  37. package/admin/layout/large/index.ts +4 -4
  38. package/admin/permission/index.ts +4 -0
  39. package/admin/permission/routerGuard.ts +43 -0
  40. package/admin/permission/usePermission.ts +52 -0
  41. package/admin/permission/vuePlugin.ts +30 -0
  42. package/admin/route-guards/index.ts +2 -0
  43. package/admin/route-guards/pageProgress.ts +16 -0
  44. package/admin/route-guards/pageTitle.ts +24 -0
  45. package/admin/styles/globalCover.scss +43 -43
  46. package/admin/types/assist.ts +10 -0
  47. package/admin/unocss/index.ts +1 -1
  48. package/antd/components/InputNumberRange.vue +53 -47
  49. package/antd/directives/formLabelAlign.ts +36 -31
  50. package/antd/hooks/createAntdModal.ts +29 -29
  51. package/antd/hooks/useAntdDrawer.ts +73 -73
  52. package/antd/hooks/useAntdForm.helpers.ts +18 -18
  53. package/antd/hooks/useAntdForm.ts +38 -37
  54. package/antd/hooks/useAntdModal.ts +25 -25
  55. package/antd/hooks/useAntdTable.ts +70 -70
  56. package/antd/hooks/useAntdTheme.ts +86 -0
  57. package/antd/index.ts +8 -7
  58. package/eslint.config.js +50 -0
  59. package/kitDependencies.ts +21 -7
  60. package/package.json +46 -40
  61. package/pnpm-lock.yaml +2689 -0
  62. package/request/helpers.ts +49 -32
  63. package/request/index.ts +2 -2
  64. package/request/interceptors/checkCode.ts +8 -8
  65. package/request/interceptors/filterEmptyValue.ts +9 -9
  66. package/request/interceptors/formatPaging.ts +12 -12
  67. package/request/interceptors/index.ts +7 -6
  68. package/request/interceptors/popupMessage.ts +35 -35
  69. package/request/interceptors/returnResultType.ts +19 -19
  70. package/request/interceptors/toLogin.ts +13 -0
  71. package/request/interceptors/unitizeAxiosError.ts +7 -7
  72. package/request/queryClient.ts +42 -0
  73. package/request/request.ts +21 -21
  74. package/request/type.d.ts +89 -89
  75. package/tsconfig.json +47 -18
  76. package/utils/index.ts +67 -29
  77. package/vue/components/index.ts +1 -0
  78. package/{components → vue/components}/infinite-query/index.ts +1 -1
  79. package/{components → vue/components}/infinite-query/src/InfiniteQuery.vue +147 -147
  80. package/{components → vue/components}/infinite-query/src/useCreateTrigger.ts +35 -35
  81. package/vue/hooks/useComponentRef.ts +12 -12
  82. package/vue/hooks/useIsMounted.ts +4 -4
  83. package/vue/hooks/useTeleportTarget.ts +7 -7
  84. package/vue/index.ts +4 -3
  85. package/admin/defines/definePage.ts +0 -14
  86. package/admin/defines/defineRoute.helpers.ts +0 -30
  87. package/admin/defines/defineRoute.ts +0 -161
  88. package/admin/defines/defineRouteGuard.ts +0 -56
  89. package/admin/defines/defineStartup.ts +0 -41
  90. package/admin/filter/index.ts +0 -5
  91. package/admin/hooks/usePermission.ts +0 -5
@@ -1,32 +1,49 @@
1
- export { isTimeout, ApiCode, ApiError }
2
-
3
- enum ApiCode {
4
- NORMAL = 0, // 正常
5
- UNKNOWN = -1, // 未知错误
6
- TIMEOUT = -2, // 请求超时
7
- }
8
-
9
- function isTimeout(error: any) {
10
- return error?.message?.toLowerCase().includes('timeout')
11
- }
12
-
13
- class ApiError<TResp = any> extends Error {
14
- public static is<ErrorResp = any>(error: any): error is ApiError<ErrorResp> {
15
- return !!error?.isApiError
16
- }
17
-
18
- /**
19
- * 将HTTP status和Api code统一到一个code里
20
- */
21
- public code: number
22
- public msg: string
23
- public data: TResp
24
- public isApiError = true
25
-
26
- public constructor(info: { code: number; msg: string; data: TResp }) {
27
- super(info.msg)
28
- this.code = info.code
29
- this.msg = info.msg
30
- this.data = info.data
31
- }
32
- }
1
+ import type { AxiosInstance } from 'axios';
2
+
3
+ export { isTimeout, getServices, ApiCode, ApiError };
4
+
5
+ enum ApiCode {
6
+ NORMAL = 0, // 正常
7
+ UNKNOWN = -1, // 未知错误
8
+ TIMEOUT = -2, // 请求超时
9
+ }
10
+
11
+ function getServices() {
12
+ const serversModule = getServices.modules;
13
+ const servers: Record<string, { server: AxiosInstance } | undefined> = {};
14
+
15
+ for (const [key, module] of Object.entries(serversModule)) {
16
+ const name = key.match(/\/([0-9a-zA-Z]+)\.ts$/)?.[1];
17
+
18
+ if (name)
19
+ servers[`${name}.api`] = module as any;
20
+ }
21
+
22
+ return servers;
23
+ }
24
+ getServices.modules = {} as any;
25
+
26
+ function isTimeout(error: any) {
27
+ return error?.message?.toLowerCase().includes('timeout');
28
+ }
29
+
30
+ class ApiError<TResp = any> extends Error {
31
+ public static is<ErrorResp = any>(error: any): error is ApiError<ErrorResp> {
32
+ return !!error?.isApiError;
33
+ }
34
+
35
+ /**
36
+ * 将HTTP status和Api code统一到一个code里
37
+ */
38
+ public code: number;
39
+ public msg: string;
40
+ public data: TResp;
41
+ public isApiError = true;
42
+
43
+ public constructor(info: { code: number, msg: string, data: TResp }) {
44
+ super(info.msg);
45
+ this.code = info.code;
46
+ this.msg = info.msg;
47
+ this.data = info.data;
48
+ }
49
+ }
package/request/index.ts CHANGED
@@ -1,4 +1,4 @@
1
1
  /// <reference path="./type.d.ts" />
2
2
 
3
- export { createRequest } from './request'
4
- export { ApiCode, ApiError } from './helpers'
3
+ export { createRequest } from './request';
4
+ export { ApiCode, ApiError, getServices } from './helpers';
@@ -1,6 +1,6 @@
1
- import axios from "axios";
2
- import type { AxiosInterceptorManager } from "axios";
3
- import { ApiCode} from "../helpers";
1
+ import axios from 'axios';
2
+ import type { AxiosInterceptorManager } from 'axios';
3
+ import { ApiCode } from '../helpers';
4
4
 
5
5
  /**
6
6
  * 【响应拦截器】检查 API 的 code 字段
@@ -19,10 +19,10 @@ export function checkCode(): Parameters<AxiosInterceptorManager<any>['use']> {
19
19
  resp.config,
20
20
  resp.request,
21
21
  resp,
22
- )
22
+ );
23
23
  }
24
-
25
- return resp
26
- }
27
- ]
24
+
25
+ return resp;
26
+ },
27
+ ];
28
28
  }
@@ -1,5 +1,5 @@
1
- import type { AxiosInterceptorManager } from "axios";
2
- import pickBy from 'lodash-es/pickBy'
1
+ import type { AxiosInterceptorManager } from 'axios';
2
+ import pickBy from 'lodash-es/pickBy';
3
3
 
4
4
  /**
5
5
  * 【请求拦截器】过滤空值,如:null、undefined、''、NaN
@@ -8,10 +8,10 @@ export function filterEmptyValue(): Parameters<AxiosInterceptorManager<any>['use
8
8
  return [
9
9
  (req) => {
10
10
  req.params = pickBy(req.params, (v) => {
11
- return v !== null && v !== undefined && v !== '' && !Number.isNaN(v)
12
- })
13
-
14
- return req
15
- }
16
- ]
17
- }
11
+ return v !== null && v !== undefined && v !== '' && !Number.isNaN(v);
12
+ });
13
+
14
+ return req;
15
+ },
16
+ ];
17
+ }
@@ -1,4 +1,4 @@
1
- import type { AxiosInterceptorManager } from "axios";
1
+ import type { AxiosInterceptorManager } from 'axios';
2
2
 
3
3
  /**
4
4
  * 【响应拦截器】格式化分页数据
@@ -6,21 +6,21 @@ import type { AxiosInterceptorManager } from "axios";
6
6
  export function formatPaging(): Parameters<AxiosInterceptorManager<any>['use']> {
7
7
  return [
8
8
  (resp) => {
9
- const result = resp?.data
10
-
9
+ const result = resp?.data;
10
+
11
11
  if (!result)
12
- return resp
13
-
12
+ return resp;
13
+
14
14
  if (result.pagination) {
15
15
  result.data = {
16
16
  list: result.data,
17
17
  pagination: result.pagination,
18
- }
19
-
20
- Reflect.deleteProperty(result, 'pagination')
18
+ };
19
+
20
+ Reflect.deleteProperty(result, 'pagination');
21
21
  }
22
-
23
- return resp
24
- }
25
- ]
22
+
23
+ return resp;
24
+ },
25
+ ];
26
26
  }
@@ -1,9 +1,10 @@
1
- export { popupMessage } from './popupMessage'
2
- export { returnResultType } from './returnResultType'
3
- export { unitizeAxiosError } from './unitizeAxiosError'
4
- export { checkCode } from './checkCode'
5
- export { formatPaging } from './formatPaging'
6
- export { filterEmptyValue } from './filterEmptyValue'
1
+ export { popupMessage } from './popupMessage';
2
+ export { returnResultType } from './returnResultType';
3
+ export { unitizeAxiosError } from './unitizeAxiosError';
4
+ export { checkCode } from './checkCode';
5
+ export { formatPaging } from './formatPaging';
6
+ export { filterEmptyValue } from './filterEmptyValue';
7
+ export { toLogin } from './toLogin';
7
8
 
8
9
  declare module 'axios' {
9
10
  interface AxiosRequestConfig {
@@ -1,6 +1,6 @@
1
- import axios from 'axios'
2
- import type { AxiosInterceptorManager } from "axios";
3
- import { isTimeout } from "../helpers";
1
+ import axios from 'axios';
2
+ import type { AxiosInterceptorManager } from 'axios';
3
+ import { isTimeout } from '../helpers';
4
4
 
5
5
  /**
6
6
  * 【响应拦截器】弹出 message 提示
@@ -8,44 +8,44 @@ import { isTimeout } from "../helpers";
8
8
  */
9
9
  export function popupMessage(popup: (type: 'error' | 'success', message: string) => void): Parameters<AxiosInterceptorManager<any>['use']> {
10
10
  return [
11
- (resp) => {
12
- const successMessageConfig = resp?.config?.successMessage
11
+ (resp) => {
12
+ const successMessageConfig = resp?.config?.successMessage;
13
13
 
14
- if (successMessageConfig === false)
15
- return resp
14
+ if (successMessageConfig === false)
15
+ return resp;
16
16
 
17
- let successMsg = successMessageConfig
17
+ let successMsg = successMessageConfig;
18
18
 
19
- if (typeof successMessageConfig !== 'string')
20
- successMsg = resp?.data?.msg
19
+ if (typeof successMessageConfig !== 'string')
20
+ successMsg = resp?.data?.msg;
21
21
 
22
- popup('success', successMsg)
22
+ popup('success', successMsg);
23
23
 
24
- return resp
25
- },
26
- (error) => {
27
- const errorMessageConfig = error?.config?.errorMessage
24
+ return resp;
25
+ },
26
+ (error) => {
27
+ const errorMessageConfig = error?.config?.errorMessage;
28
28
 
29
- if (errorMessageConfig === false)
30
- throw error
29
+ if (errorMessageConfig === false)
30
+ throw error;
31
31
 
32
- let errorMsg: boolean | string = errorMessageConfig
32
+ let errorMsg: boolean | string = errorMessageConfig;
33
33
 
34
- if (axios.isAxiosError(error)) {
34
+ if (axios.isAxiosError(error)) {
35
35
  // 请求超时
36
- if (isTimeout(error))
37
- errorMsg = 'Request Timeout'
38
- else if (typeof errorMessageConfig !== 'string')
39
- errorMsg = error.response?.data?.msg || error.message || error.response?.statusText
40
- }
41
- else if (error instanceof Error && typeof errorMessageConfig !== 'string') {
42
- errorMsg = error.message
43
- }
44
-
45
- if (typeof errorMsg === 'string')
46
- popup('error', errorMsg)
47
-
48
- throw error
49
- },
50
- ]
51
- }
36
+ if (isTimeout(error))
37
+ errorMsg = 'Request Timeout';
38
+ else if (typeof errorMessageConfig !== 'string')
39
+ errorMsg = error.response?.data?.msg || error.message || error.response?.statusText;
40
+ }
41
+ else if (error instanceof Error && typeof errorMessageConfig !== 'string') {
42
+ errorMsg = error.message;
43
+ }
44
+
45
+ if (typeof errorMsg === 'string')
46
+ popup('error', errorMsg);
47
+
48
+ throw error;
49
+ },
50
+ ];
51
+ }
@@ -1,5 +1,5 @@
1
- import type { AxiosInterceptorManager } from "axios";
2
- import { ApiCode, isTimeout, ApiError } from "../helpers";
1
+ import type { AxiosInterceptorManager } from 'axios';
2
+ import { ApiCode, ApiError, isTimeout } from '../helpers';
3
3
 
4
4
  /**
5
5
  * 【响应拦截器】返回请求结果
@@ -7,27 +7,27 @@ import { ApiCode, isTimeout, ApiError } from "../helpers";
7
7
  export function returnResultType(): Parameters<AxiosInterceptorManager<any>['use']> {
8
8
  return [
9
9
  (resp) => {
10
- const { resultType } = resp.config
11
-
10
+ const { resultType } = resp.config;
11
+
12
12
  if (resultType === 'api')
13
- return resp.data
14
-
13
+ return resp.data;
14
+
15
15
  else if (resultType === 'axios')
16
- return resp
17
-
18
- return resp.data?.data
16
+ return resp;
17
+
18
+ return resp.data?.data;
19
19
  },
20
20
  (error) => {
21
- let code = error?.response?.data?.code || error?.response?.status || ApiCode.UNKNOWN
22
- let msg = error?.response?.data?.msg || error?.message || error?.response?.statusText || 'Unknown Error'
23
- const data = error?.response?.data?.data || null
24
-
21
+ let code = error?.response?.data?.code || error?.response?.status || ApiCode.UNKNOWN;
22
+ let msg = error?.response?.data?.msg || error?.message || error?.response?.statusText || 'Unknown Error';
23
+ const data = error?.response?.data?.data || null;
24
+
25
25
  if (isTimeout(error)) {
26
- code = ApiCode.TIMEOUT
27
- msg = 'Request Timeout'
26
+ code = ApiCode.TIMEOUT;
27
+ msg = 'Request Timeout';
28
28
  }
29
-
30
- throw new ApiError({ code, msg, data })
29
+
30
+ throw new ApiError({ code, msg, data });
31
31
  },
32
- ]
33
- }
32
+ ];
33
+ }
@@ -0,0 +1,13 @@
1
+ import type { AxiosInterceptorManager } from 'axios';
2
+
3
+ export function toLogin(path = '/auth/login', code = 15001): Parameters<AxiosInterceptorManager<any>['use']> {
4
+ return [
5
+ undefined,
6
+ (err) => {
7
+ if (err.code === code)
8
+ window.location.href = path;
9
+
10
+ throw err;
11
+ },
12
+ ];
13
+ }
@@ -1,5 +1,5 @@
1
- import axios from "axios";
2
- import type { AxiosInterceptorManager } from "axios";
1
+ import axios from 'axios';
2
+ import type { AxiosInterceptorManager } from 'axios';
3
3
 
4
4
  /**
5
5
  * 【响应拦截器】统一处理 AxiosError
@@ -9,15 +9,15 @@ export function unitizeAxiosError(): Parameters<AxiosInterceptorManager<any>['us
9
9
  resp => resp,
10
10
  (error) => {
11
11
  if (axios.isAxiosError(error))
12
- throw error
12
+ throw error;
13
13
 
14
14
  if (error instanceof Error)
15
- throw new axios.AxiosError(`${error.message}[AppError01]`)
15
+ throw new axios.AxiosError(`${error.message}[AppError01]`);
16
16
 
17
17
  if (typeof error === 'object')
18
- throw new axios.AxiosError(`${JSON.stringify(error)}[AppError02]`)
18
+ throw new axios.AxiosError(`${JSON.stringify(error)}[AppError02]`);
19
19
 
20
- throw new axios.AxiosError(`${String(error)}[AppError03]`)
20
+ throw new axios.AxiosError(`${String(error)}[AppError03]`);
21
21
  },
22
- ]
22
+ ];
23
23
  }
@@ -0,0 +1,42 @@
1
+ import type { QueryClientConfig } from '@tanstack/vue-query';
2
+
3
+ /** 不需要重试的 api code */
4
+ export const ignoreRetryCodes = [
5
+ 11000, // 操作失败
6
+ 11001, // 操作过于频繁
7
+ 11002, // 权限不足
8
+ 11003, // 缺少必要参数
9
+ 15001, // 未登录
10
+ ];
11
+
12
+ export const presetOptions: QueryClientConfig = {
13
+ defaultOptions: {
14
+ queries: {
15
+ refetchOnWindowFocus: false,
16
+ retry(failureCount, error: any) {
17
+ if (ignoreRetryCodes.includes(error?.code))
18
+ return false;
19
+
20
+ return failureCount < 3;
21
+ },
22
+ getNextPageParam: (lastPage: any) => {
23
+ const { pagination } = lastPage ?? {};
24
+
25
+ if (pagination?.has_more) {
26
+ return {
27
+ page: (pagination.page ?? 0) + 1,
28
+ page_size: pagination?.page_size ?? 10,
29
+ };
30
+ }
31
+ },
32
+ getPreviousPageParam: (lastPage: any) => {
33
+ const { pagination } = lastPage ?? {};
34
+
35
+ return {
36
+ page: (pagination.page ?? 1) - 1,
37
+ page_size: pagination?.page_size ?? 10,
38
+ };
39
+ },
40
+ },
41
+ },
42
+ };
@@ -1,50 +1,50 @@
1
- import type { AxiosRequestConfig, AxiosResponse, AxiosInstance } from 'axios'
1
+ import type { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios';
2
2
 
3
- export { createRequest }
3
+ export { createRequest };
4
4
 
5
5
  function createRequest<Req, OResp, Resp = Api.TransformPageResult<OResp>>(
6
6
  // function createRequest<Req, OResp, Resp = OResp>(
7
7
  id: string,
8
8
  paramBuilder: (params: any) => any,
9
9
  ) {
10
- type ReqConfig = Partial<AxiosRequestConfig>
11
- let defaultConfig: ReqConfig | null = null
10
+ type ReqConfig = Partial<AxiosRequestConfig>;
11
+ let defaultConfig: ReqConfig | null = null;
12
12
 
13
13
  // 返回 Axios 的 Response
14
- async function request<Rt extends 'axios'>(reqData: Req, options: ReqConfig & { resultType: Rt }): Promise<AxiosResponse<Resp>>
14
+ async function request<Rt extends 'axios'>(reqData: Req, options: ReqConfig & { resultType: Rt }): Promise<AxiosResponse<Resp>>;
15
15
  // 返回 API 数据
16
- async function request<Rt extends 'api'>(reqData: Req, options: ReqConfig & { resultType: Rt }): Promise<Resp>
16
+ async function request<Rt extends 'api'>(reqData: Req, options: ReqConfig & { resultType: Rt }): Promise<Resp>;
17
17
  // 返回 API 数据中的 data 字段值,默认
18
- async function request(reqData: Req, config?: ReqConfig): Promise<Api.GetDataField<Resp>>
18
+ async function request(reqData: Req, config?: ReqConfig): Promise<Api.GetDataField<Resp>>;
19
19
  async function request(reqData: Req, config?: ReqConfig): Promise<any> {
20
- const params = paramBuilder(reqData)
21
- const serviceName = params.headers?.['Service-Name'] ?? ''
22
- const service = createRequest.services[serviceName]?.server
20
+ const params = paramBuilder(reqData);
21
+ const serviceName = params.headers?.['Service-Name'] ?? '';
22
+ const service = createRequest.services[serviceName]?.server;
23
23
 
24
24
  if (service)
25
- Reflect.deleteProperty(params.headers, 'Service-Name')
25
+ Reflect.deleteProperty(params.headers, 'Service-Name');
26
26
  else
27
- throw new Error(`${serviceName} 接口服务不存在`)
27
+ throw new Error(`${serviceName} 接口服务不存在`);
28
28
 
29
29
  const res = await service.request({
30
30
  apiName: `${serviceName}/${id}`,
31
31
  ...params,
32
32
  ...Object.assign({}, defaultConfig, config),
33
- })
33
+ });
34
34
 
35
- return res as Api.GetDataField<Resp>
35
+ return res as Api.GetDataField<Resp>;
36
36
  }
37
37
 
38
- request.id = id
38
+ request.id = id;
39
39
  request.setDefaultConfig = (config: ReqConfig) => {
40
- defaultConfig = config
41
- return request
42
- }
40
+ defaultConfig = config;
41
+ return request;
42
+ };
43
43
 
44
- return request
44
+ return request;
45
45
  }
46
46
 
47
47
  // 服务
48
48
  createRequest.services = {} as Record<string, {
49
- server: AxiosInstance;
50
- } | undefined>
49
+ server: AxiosInstance
50
+ } | undefined>;