@minilo/utils 0.0.1

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 (70) hide show
  1. package/dist/config/config.d.ts +3 -0
  2. package/dist/config/config.d.ts.map +1 -0
  3. package/dist/config/config.js +21 -0
  4. package/dist/config/config.js.map +1 -0
  5. package/dist/config/guider.d.ts +70 -0
  6. package/dist/config/guider.d.ts.map +1 -0
  7. package/dist/config/guider.js +50 -0
  8. package/dist/config/guider.js.map +1 -0
  9. package/dist/config/index.d.ts +6 -0
  10. package/dist/config/index.d.ts.map +1 -0
  11. package/dist/config/index.js +6 -0
  12. package/dist/config/index.js.map +1 -0
  13. package/dist/config/storageManager.d.ts +45 -0
  14. package/dist/config/storageManager.d.ts.map +1 -0
  15. package/dist/config/storageManager.js +90 -0
  16. package/dist/config/storageManager.js.map +1 -0
  17. package/dist/config/types.d.ts +30 -0
  18. package/dist/config/types.d.ts.map +1 -0
  19. package/dist/config/types.js +2 -0
  20. package/dist/config/types.js.map +1 -0
  21. package/dist/config/updateCssVariables.d.ts +16 -0
  22. package/dist/config/updateCssVariables.d.ts.map +1 -0
  23. package/dist/config/updateCssVariables.js +91 -0
  24. package/dist/config/updateCssVariables.js.map +1 -0
  25. package/dist/constrant/index.d.ts +13 -0
  26. package/dist/constrant/index.d.ts.map +1 -0
  27. package/dist/constrant/index.js +18 -0
  28. package/dist/constrant/index.js.map +1 -0
  29. package/dist/func/color.d.ts +13 -0
  30. package/dist/func/color.d.ts.map +1 -0
  31. package/dist/func/color.js +23 -0
  32. package/dist/func/color.js.map +1 -0
  33. package/dist/func/common.d.ts +62 -0
  34. package/dist/func/common.d.ts.map +1 -0
  35. package/dist/func/common.js +116 -0
  36. package/dist/func/common.js.map +1 -0
  37. package/dist/func/index.d.ts +4 -0
  38. package/dist/func/index.d.ts.map +1 -0
  39. package/dist/func/index.js +4 -0
  40. package/dist/func/index.js.map +1 -0
  41. package/dist/func/merge.d.ts +2 -0
  42. package/dist/func/merge.d.ts.map +1 -0
  43. package/dist/func/merge.js +2 -0
  44. package/dist/func/merge.js.map +1 -0
  45. package/dist/hooks/index.d.ts +4 -0
  46. package/dist/hooks/index.d.ts.map +1 -0
  47. package/dist/hooks/index.js +4 -0
  48. package/dist/hooks/index.js.map +1 -0
  49. package/dist/hooks/useButtonPermission.d.ts +9 -0
  50. package/dist/hooks/useButtonPermission.d.ts.map +1 -0
  51. package/dist/hooks/useButtonPermission.js +38 -0
  52. package/dist/hooks/useButtonPermission.js.map +1 -0
  53. package/dist/hooks/useGuider.d.ts +2 -0
  54. package/dist/hooks/useGuider.d.ts.map +1 -0
  55. package/dist/hooks/useGuider.js +5 -0
  56. package/dist/hooks/useGuider.js.map +1 -0
  57. package/dist/hooks/useInitGlobalStyle.d.ts +2 -0
  58. package/dist/hooks/useInitGlobalStyle.d.ts.map +1 -0
  59. package/dist/hooks/useInitGlobalStyle.js +80 -0
  60. package/dist/hooks/useInitGlobalStyle.js.map +1 -0
  61. package/dist/index.d.ts +8 -0
  62. package/dist/index.d.ts.map +1 -0
  63. package/dist/index.js +8 -0
  64. package/dist/index.js.map +1 -0
  65. package/dist/request/index.d.ts +42 -0
  66. package/dist/request/index.d.ts.map +1 -0
  67. package/dist/request/index.js +160 -0
  68. package/dist/request/index.js.map +1 -0
  69. package/dist/tsconfig.tsbuildinfo +1 -0
  70. package/package.json +42 -0
@@ -0,0 +1,116 @@
1
+ /**
2
+ * @description 判断url是否是http或https
3
+ * @author xieshuhong
4
+ * @export
5
+ * @param {string} url
6
+ * @return {*}
7
+ */
8
+ export function isHttp(url) {
9
+ const regex = /^https?:\/\//i
10
+ return regex.test(url)
11
+ }
12
+ /**
13
+ * @description 递归查找当前path对应的所有层级路由,为面包屑提供数据
14
+ * @author xieshuhong
15
+ * @export
16
+ * @param {MenuDataItem[]} menuList
17
+ * @param {string} targetPath
18
+ * @param {BreadcrumbItem[]} [parentPaths=[]]
19
+ * @return {*} {BreadcrumbItem[]}
20
+ */
21
+ export function findLevelRoutes(menuList, targetPath, parentPaths = []) {
22
+ for (const item of menuList) {
23
+ // 当前项的完整路径(父级路径 + 当前path)
24
+ const currentPaths = [
25
+ ...parentPaths,
26
+ {
27
+ path: item.path,
28
+ name: item.name
29
+ }
30
+ ]
31
+ // 找到目标路径,返回完整层级
32
+ if (item.path === targetPath) {
33
+ return currentPaths
34
+ }
35
+ // 有子菜单则递归查找
36
+ if (item.children && item.children.length) {
37
+ const result = findLevelRoutes(item.children, targetPath, currentPaths)
38
+ if (result.length) return result
39
+ }
40
+ }
41
+ return [] // 未找到
42
+ }
43
+ /**
44
+ * @description 查找菜单栏中当前path对应的菜单项
45
+ * @author xieshuhong
46
+ * @export
47
+ * @param {MenuDataItem[]} items
48
+ * @param {string} targetPath
49
+ * @return {*} {(MenuDataItem | null)}
50
+ */
51
+ export function findMenuItem(items, targetPath) {
52
+ for (const item of items) {
53
+ if (item.path === targetPath) return item
54
+ if (item.children) {
55
+ const found = findMenuItem(item.children, targetPath)
56
+ if (found) return found
57
+ }
58
+ }
59
+ return null
60
+ }
61
+ /**
62
+ * @description 将options数组转换为对象,渲染
63
+ * @author xieshuhong
64
+ * @export
65
+ * @param {OptionItem[]} options 数据源
66
+ * @param {false} inverse 是否反向转换
67
+ * @return {*} {(Record<string | number, string>)}
68
+ */
69
+ export function transOptionsToObject(options, inverse) {
70
+ const obj = {}
71
+ options.forEach((item) => {
72
+ if (!inverse) {
73
+ obj[item.value] = item.label
74
+ } else {
75
+ obj[item.label] = item.value
76
+ }
77
+ })
78
+ return obj
79
+ }
80
+ /**
81
+ * @description 根据多层级键路径从对象中获取值
82
+ * @author xieshuhong
83
+ * @param {Object} obj - 要查询的对象
84
+ * @param {string} path - 键路径,如 'a.b' 或 'a.b.c'
85
+ * @param {any} [defaultValue] - 可选,路径不存在时返回的默认值
86
+ * @returns {any} 路径对应的 value 或 defaultValue
87
+ */
88
+ export function getNestedValue(obj, path, defaultValue) {
89
+ // 处理边界情况:如果obj不是对象或path为空,直接返回默认值
90
+ if (typeof obj !== 'object' || obj === null || !path) {
91
+ return defaultValue
92
+ }
93
+ // 将路径按 '.' 分割成数组(支持处理空字符串和连续点的情况)
94
+ const keys = path.split('.').filter((key) => key !== '')
95
+ // 逐层访问对象属性
96
+ return keys.reduce((current, key) => {
97
+ // 如果当前值不是对象,直接返回默认值(避免访问非对象的属性)
98
+ if (typeof current !== 'object' || current === null) {
99
+ return defaultValue
100
+ }
101
+ // 访问下一级属性
102
+ return current[key] !== undefined ? current[key] : defaultValue
103
+ }, obj)
104
+ }
105
+ /**
106
+ * @description 将驼峰命名法转换为连字符命名法
107
+ * @author xieshuhong
108
+ * @export
109
+ * @param {string} key
110
+ * @return {*}
111
+ */
112
+ export function kebabCase(key) {
113
+ const result = key.replace(/([A-Z])/g, ' $1').trim()
114
+ return result.split(' ').join('-').toLowerCase()
115
+ }
116
+ //# sourceMappingURL=common.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.js","sourceRoot":"","sources":["../../func/common.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export * from './color'
2
+ export * from './merge'
3
+ export * from './common'
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../func/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAA;AACvB,cAAc,SAAS,CAAA;AACvB,cAAc,UAAU,CAAA"}
@@ -0,0 +1,4 @@
1
+ export * from './color'
2
+ export * from './merge'
3
+ export * from './common'
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../func/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAA;AACvB,cAAc,SAAS,CAAA;AACvB,cAAc,UAAU,CAAA"}
@@ -0,0 +1,2 @@
1
+ export { defu as merge } from 'defu'
2
+ //# sourceMappingURL=merge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../func/merge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,IAAI,KAAK,EAAE,MAAM,MAAM,CAAA"}
@@ -0,0 +1,2 @@
1
+ export { defu as merge } from 'defu'
2
+ //# sourceMappingURL=merge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge.js","sourceRoot":"","sources":["../../func/merge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,IAAI,KAAK,EAAE,MAAM,MAAM,CAAA"}
@@ -0,0 +1,4 @@
1
+ export * from './useGuider'
2
+ export * from './useInitGlobalStyle'
3
+ export * from './useButtonPermission'
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../hooks/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAC3B,cAAc,sBAAsB,CAAA;AACpC,cAAc,uBAAuB,CAAA"}
@@ -0,0 +1,4 @@
1
+ export * from './useGuider'
2
+ export * from './useInitGlobalStyle'
3
+ export * from './useButtonPermission'
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../hooks/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAC3B,cAAc,sBAAsB,CAAA;AACpC,cAAc,uBAAuB,CAAA"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * 按钮权限相关的组合式API
3
+ */
4
+ export declare function useButtonPermission(): {
5
+ hasPermission: (permission: string, permissions: string[]) => boolean
6
+ hasAnyPermission: (permissionList: string[], userPermissions: string[]) => boolean
7
+ hasAllPermissions: (permissionList: string[], userPermissions: string[]) => boolean
8
+ }
9
+ //# sourceMappingURL=useButtonPermission.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useButtonPermission.d.ts","sourceRoot":"","sources":["../../hooks/useButtonPermission.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,wBAAgB,mBAAmB;gCAOE,MAAM,eAAe,MAAM,EAAE,KAAG,OAAO;uCAUhC,MAAM,EAAE,mBAAmB,MAAM,EAAE,KAAG,OAAO;wCAU5C,MAAM,EAAE,mBAAmB,MAAM,EAAE,KAAG,OAAO;EASzF"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * 按钮权限相关的组合式API
3
+ */
4
+ export function useButtonPermission() {
5
+ /**
6
+ * 检查是否具有指定的按钮权限
7
+ * @param permission 权限标识,如 'user:create', 'user:delete' 等
8
+ * @param permissions 用户权限列表
9
+ * @returns 是否具有该权限
10
+ */
11
+ const hasPermission = (permission, permissions) => {
12
+ return permissions.includes(permission)
13
+ }
14
+ /**
15
+ * 检查是否具有多个权限中的任意一个
16
+ * @param permissionList 权限标识数组
17
+ * @param userPermissions 用户权限列表
18
+ * @returns 是否具有其中任一权限
19
+ */
20
+ const hasAnyPermission = (permissionList, userPermissions) => {
21
+ return permissionList.some((permission) => hasPermission(permission, userPermissions))
22
+ }
23
+ /**
24
+ * 检查是否具有所有指定的权限
25
+ * @param permissionList 权限标识数组
26
+ * @param userPermissions 用户权限列表
27
+ * @returns 是否具有所有权限
28
+ */
29
+ const hasAllPermissions = (permissionList, userPermissions) => {
30
+ return permissionList.every((permission) => hasPermission(permission, userPermissions))
31
+ }
32
+ return {
33
+ hasPermission,
34
+ hasAnyPermission,
35
+ hasAllPermissions
36
+ }
37
+ }
38
+ //# sourceMappingURL=useButtonPermission.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useButtonPermission.js","sourceRoot":"","sources":["../../hooks/useButtonPermission.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,UAAU,mBAAmB;IACjC;;;;;OAKG;IACH,MAAM,aAAa,GAAG,CAAC,UAAkB,EAAE,WAAqB,EAAW,EAAE;QAC3E,OAAO,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAA;IACzC,CAAC,CAAA;IAED;;;;;OAKG;IACH,MAAM,gBAAgB,GAAG,CAAC,cAAwB,EAAE,eAAyB,EAAW,EAAE;QACxF,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC,CAAA;IACxF,CAAC,CAAA;IAED;;;;;OAKG;IACH,MAAM,iBAAiB,GAAG,CAAC,cAAwB,EAAE,eAAyB,EAAW,EAAE;QACzF,OAAO,cAAc,CAAC,KAAK,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC,CAAA;IACzF,CAAC,CAAA;IAED,OAAO;QACL,aAAa;QACb,gBAAgB;QAChB,iBAAiB;KAClB,CAAA;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function useGuider(): void
2
+ //# sourceMappingURL=useGuider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useGuider.d.ts","sourceRoot":"","sources":["../../hooks/useGuider.ts"],"names":[],"mappings":"AACA,wBAAgB,SAAS,SAExB"}
@@ -0,0 +1,5 @@
1
+ // import { guider } from '../config/guider'
2
+ export function useGuider() {
3
+ // const config = guider.getConfig()
4
+ }
5
+ //# sourceMappingURL=useGuider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useGuider.js","sourceRoot":"","sources":["../../hooks/useGuider.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAC5C,MAAM,UAAU,SAAS;IACvB,oCAAoC;AACtC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const useInitGlobalStyle: () => void
2
+ //# sourceMappingURL=useInitGlobalStyle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useInitGlobalStyle.d.ts","sourceRoot":"","sources":["../../hooks/useInitGlobalStyle.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,kBAAkB,YA6E9B,CAAA"}
@@ -0,0 +1,80 @@
1
+ import { watch } from 'vue'
2
+ import { convertToRgb } from '../func'
3
+ import { userConfig } from '../config'
4
+ import { executeUpdateCSSVariables } from '../config'
5
+ // 初始化全局样式
6
+ export const useInitGlobalStyle = () => {
7
+ const rootStyles = getComputedStyle(document.documentElement)
8
+ const getCssVariableValueRaw = (variable) => {
9
+ return rootStyles.getPropertyValue(variable)
10
+ }
11
+ /**
12
+ * @description: 将可用颜色转换为hsl颜色格式
13
+ * @param {string} variable
14
+ * @param {boolean} isColor
15
+ * @return {*}
16
+ * @Author: xieshuhong
17
+ */
18
+ const getCssVariableValue = (variable, isColor = true) => {
19
+ const value = getCssVariableValueRaw(variable)
20
+ return isColor ? convertToRgb(`hsl(${value})`) : value
21
+ }
22
+ watch(
23
+ () => userConfig.theme,
24
+ () => {
25
+ const background = getCssVariableValue('--background')
26
+ const border = getCssVariableValue('--border')
27
+ const accent = getCssVariableValue('--accent')
28
+ const variables = {
29
+ '--el-bg-color': background,
30
+ '--el-bg-color-overlay': getCssVariableValue('--popover'),
31
+ '--el-bg-color-page': getCssVariableValue('--background-deep'),
32
+ '--el-border-color': border,
33
+ '--el-border-color-dark': border,
34
+ '--el-border-color-extra-light': border,
35
+ '--el-border-color-hover': accent,
36
+ '--el-border-color-light': border,
37
+ '--el-border-color-lighter': border,
38
+ '--el-border-radius-base': getCssVariableValue('--radius', false),
39
+ '--el-color-danger': getCssVariableValue('--destructive-500'),
40
+ '--el-color-danger-dark-2': getCssVariableValue('--destructive-600'),
41
+ '--el-color-danger-light-3': getCssVariableValue('--destructive-400'),
42
+ '--el-color-danger-light-5': getCssVariableValue('--destructive-300'),
43
+ '--el-color-danger-light-7': getCssVariableValue('--destructive-200'),
44
+ '--el-color-danger-light-8': getCssVariableValue('--destructive-100'),
45
+ '--el-color-danger-light-9': getCssVariableValue('--destructive-50'),
46
+ '--el-color-error': getCssVariableValue('--destructive-500'),
47
+ '--el-color-error-dark-2': getCssVariableValue('--destructive-600'),
48
+ '--el-color-error-light-3': getCssVariableValue('--destructive-400'),
49
+ '--el-color-error-light-5': getCssVariableValue('--destructive-300'),
50
+ '--el-color-error-light-7': getCssVariableValue('--destructive-200'),
51
+ '--el-color-error-light-8': getCssVariableValue('--destructive-100'),
52
+ '--el-color-error-light-9': getCssVariableValue('--destructive-50'),
53
+ '--el-color-info-light-5': border,
54
+ '--el-color-info-light-8': border,
55
+ '--el-color-info-light-9': getCssVariableValue('--info'), // getCssVariableValue('--secondary'),
56
+ '--el-color-primary': getCssVariableValue('--primary-500'),
57
+ '--el-color-primary-dark-2': getCssVariableValue('--primary-600'),
58
+ '--el-color-primary-light-3': getCssVariableValue('--primary-400'),
59
+ '--el-color-primary-light-5': getCssVariableValue('--primary-300'),
60
+ '--el-color-primary-light-7': getCssVariableValue('--primary-200'),
61
+ '--el-color-primary-light-8': getCssVariableValue('--primary-100'),
62
+ '--el-color-primary-light-9': getCssVariableValue('--primary-50'),
63
+ '--el-color-success': getCssVariableValue('--success-500'),
64
+ '--el-fill-color': getCssVariableValue('--accent'),
65
+ '--el-fill-color-blank': background,
66
+ '--el-fill-color-light': getCssVariableValue('--accent'),
67
+ '--el-fill-color-lighter': getCssVariableValue('--accent-lighter'),
68
+ '--el-fill-color-dark': getCssVariableValue('--accent-dark'),
69
+ '--el-fill-color-darker': getCssVariableValue('--accent-darker'),
70
+ // 解决ElLoading背景色问题
71
+ '--el-mask-color': 'rgba(255,255,255,.9)',
72
+ '--el-text-color-primary': getCssVariableValue('--foreground'),
73
+ '--el-text-color-regular': getCssVariableValue('--foreground')
74
+ }
75
+ executeUpdateCSSVariables(variables, `__myself_design_styles__`)
76
+ },
77
+ { immediate: true }
78
+ )
79
+ }
80
+ //# sourceMappingURL=useInitGlobalStyle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useInitGlobalStyle.js","sourceRoot":"","sources":["../../hooks/useInitGlobalStyle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export { default as cloneDeep } from 'lodash.clonedeep'
2
+ export * from './func'
3
+ export * from './config'
4
+ export * from './hooks'
5
+ export * from './constrant'
6
+ export * from './request'
7
+ export * from '@vueuse/core'
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACvD,cAAc,QAAQ,CAAA;AACtB,cAAc,UAAU,CAAA;AACxB,cAAc,SAAS,CAAA;AACvB,cAAc,aAAa,CAAA;AAC3B,cAAc,WAAW,CAAA;AACzB,cAAc,cAAc,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,8 @@
1
+ export { default as cloneDeep } from 'lodash.clonedeep'
2
+ export * from './func'
3
+ export * from './config'
4
+ export * from './hooks'
5
+ export * from './constrant'
6
+ export * from './request'
7
+ export * from '@vueuse/core'
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACvD,cAAc,QAAQ,CAAA;AACtB,cAAc,UAAU,CAAA;AACxB,cAAc,SAAS,CAAA;AACvB,cAAc,aAAa,CAAA;AAC3B,cAAc,WAAW,CAAA;AACzB,cAAc,cAAc,CAAA"}
@@ -0,0 +1,42 @@
1
+ import { type AxiosRequestConfig, type AxiosResponse, type CreateAxiosDefaults } from 'axios'
2
+ export * from 'axios'
3
+ /**
4
+ * 后端统一响应格式
5
+ * @template T - 响应体中 result 字段的类型
6
+ */
7
+ export interface ApiResponse<T = any> {
8
+ data: T
9
+ code: number
10
+ msg: string
11
+ }
12
+ /**
13
+ * 取消所有 pending 状态的请求
14
+ */
15
+ export declare const cancelAllRequests: () => void
16
+ /**
17
+ * 根据URL取消相关请求
18
+ * @param {String} url 要取消请求的URL
19
+ */
20
+ export declare const cancelRequestsByUrl: (url: string) => void
21
+ export declare const initRequestInstance: (
22
+ extendConfig?: CreateAxiosDefaults,
23
+ interceptorsRequestFn?: (config?: AxiosRequestConfig) => void,
24
+ interceptorsResponseFn?: (Response?: AxiosResponse) => void
25
+ ) => import('axios').AxiosInstance
26
+ /**
27
+ * 生成请求唯一标识
28
+ * @param {Object} config 请求配置
29
+ * @returns {String} 唯一标识
30
+ */
31
+ export declare const generateRequestKey: (config: AxiosRequestConfig) => string
32
+ /**
33
+ * 添加请求到pending列表
34
+ * @param {Object} config 请求配置
35
+ */
36
+ export declare const addPendingRequest: (config: AxiosRequestConfig) => void
37
+ /**
38
+ * 从pending列表移除请求
39
+ * @param {Object} config 请求配置
40
+ */
41
+ export declare const removePendingRequest: (config: AxiosRequestConfig) => void
42
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../request/index.ts"],"names":[],"mappings":"AAAA,OAAc,EAAE,KAAK,kBAAkB,EAAE,KAAK,aAAa,EAAE,KAAK,mBAAmB,EAAE,MAAM,OAAO,CAAA;AAIpG,cAAc,OAAO,CAAA;AAErB;;;GAGG;AACH,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,GAAG;IAClC,IAAI,EAAE,CAAC,CAAA;IACP,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;CACZ;AAED;;GAEG;AACH,eAAO,MAAM,iBAAiB,YAK7B,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,mBAAmB,GAAI,KAAK,MAAM,SAO9C,CAAA;AAGD,eAAO,MAAM,mBAAmB,GAC9B,eAAc,mBAAwB,EACtC,wBAAuB,CAAC,MAAM,CAAC,EAAE,kBAAkB,KAAK,IAAe,EACvE,yBAAwB,CAAC,QAAQ,CAAC,EAAE,aAAa,KAAK,IAAe,kCAoGtE,CAAA;AAKD;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,GAAI,QAAQ,kBAAkB,WAM5D,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAAI,QAAQ,kBAAkB,SAa3D,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,oBAAoB,GAAI,QAAQ,kBAAkB,SAK9D,CAAA"}
@@ -0,0 +1,160 @@
1
+ import axios from 'axios'
2
+ import { ElMessage } from 'element-plus'
3
+ import { merge } from '../func'
4
+ export * from 'axios'
5
+ /**
6
+ * 取消所有 pending 状态的请求
7
+ */
8
+ export const cancelAllRequests = () => {
9
+ pendingRequests.forEach((source) => {
10
+ source.cancel('所有请求已被取消')
11
+ })
12
+ pendingRequests.clear()
13
+ }
14
+ /**
15
+ * 根据URL取消相关请求
16
+ * @param {String} url 要取消请求的URL
17
+ */
18
+ export const cancelRequestsByUrl = (url) => {
19
+ Array.from(pendingRequests.entries()).forEach(([key, source]) => {
20
+ if (key.includes(url)) {
21
+ source.cancel(`与${url}相关的请求已被取消`)
22
+ pendingRequests.delete(key)
23
+ }
24
+ })
25
+ }
26
+ // 创建请求实例
27
+ export const initRequestInstance = (
28
+ extendConfig = {},
29
+ interceptorsRequestFn = () => {},
30
+ interceptorsResponseFn = () => {}
31
+ ) => {
32
+ const axiosConfig = merge({}, extendConfig, {
33
+ baseURL: '/', // 从环境变量获取基础URL
34
+ timeout: 10000, // 超时时间
35
+ headers: {
36
+ 'Content-Type': 'application/json;charset=utf-8'
37
+ }
38
+ })
39
+ const instance = axios.create(axiosConfig)
40
+ // 请求拦截器
41
+ instance.interceptors.request.use(
42
+ (config) => {
43
+ interceptorsRequestFn(config)
44
+ // 添加请求到pending列表,处理重复请求
45
+ addPendingRequest(config)
46
+ // 可以在这里添加其他请求处理逻辑,如请求加载动画等
47
+ return config
48
+ },
49
+ (error) => {
50
+ // 请求错误处理
51
+ return Promise.reject(error)
52
+ }
53
+ )
54
+ // 响应拦截器
55
+ instance.interceptors.response.use(
56
+ (response) => {
57
+ interceptorsResponseFn(response)
58
+ // 从pending列表移除请求
59
+ removePendingRequest(response.config)
60
+ const data = response.data
61
+ console.log(data)
62
+ // 根据实际后端接口规范处理响应
63
+ if (data.code === 200) {
64
+ return Promise.resolve({
65
+ ...response,
66
+ ...data,
67
+ data: data.data
68
+ })
69
+ } else {
70
+ // 非成功状态,显示错误信息
71
+ ElMessage.error(data.msg || '请求失败')
72
+ return Promise.reject(new Error(data.msg || '请求失败'))
73
+ }
74
+ },
75
+ (error) => {
76
+ console.log('请求发生错误>>>>>>>>>>>>>>>>>>:', error)
77
+ // 请求完成后从pending列表移除
78
+ if (error.config) {
79
+ removePendingRequest(error.config)
80
+ }
81
+ // 处理取消请求的错误
82
+ if (axios.isCancel(error)) {
83
+ console.warn('请求已被取消:', error.message)
84
+ return Promise.reject(new Error('请求已被取消'))
85
+ }
86
+ // 处理网络错误
87
+ if (!window.navigator.onLine) {
88
+ ElMessage.error('网络连接已断开,请检查网络')
89
+ return Promise.reject(new Error('网络连接已断开'))
90
+ }
91
+ // 处理HTTP错误状态码
92
+ const { response } = error
93
+ if (response) {
94
+ switch (response.status) {
95
+ case 401:
96
+ ElMessage.error('身份验证失败,请重新登录')
97
+ // 可以在这里添加跳转到登录页的逻辑
98
+ break
99
+ case 403:
100
+ ElMessage.error('没有权限执行此操作')
101
+ break
102
+ case 404:
103
+ ElMessage.error('请求的资源不存在')
104
+ break
105
+ case 500:
106
+ ElMessage.error('服务器内部错误')
107
+ break
108
+ default:
109
+ ElMessage.error(`请求错误: ${response.status}`)
110
+ }
111
+ } else {
112
+ ElMessage.error('请求失败,请稍后重试')
113
+ }
114
+ return Promise.reject(error)
115
+ }
116
+ )
117
+ return instance
118
+ }
119
+ // 存储当前正在进行的请求
120
+ const pendingRequests = new Map()
121
+ /**
122
+ * 生成请求唯一标识
123
+ * @param {Object} config 请求配置
124
+ * @returns {String} 唯一标识
125
+ */
126
+ export const generateRequestKey = (config) => {
127
+ const { method, url, params, data } = config
128
+ // 序列化参数,确保相同参数生成相同key
129
+ const paramsStr = params ? JSON.stringify(params) : ''
130
+ const dataStr = data ? JSON.stringify(data) : ''
131
+ return `${method}-${url}-${paramsStr}-${dataStr}`
132
+ }
133
+ /**
134
+ * 添加请求到pending列表
135
+ * @param {Object} config 请求配置
136
+ */
137
+ export const addPendingRequest = (config) => {
138
+ const requestKey = generateRequestKey(config)
139
+ // 如果存在相同请求,则取消之前的请求
140
+ if (pendingRequests.has(requestKey)) {
141
+ const cancelToken = pendingRequests.get(requestKey)
142
+ cancelToken.cancel(`重复请求被取消: ${config.url}`)
143
+ pendingRequests.delete(requestKey)
144
+ }
145
+ // 创建新的取消令牌
146
+ const source = axios.CancelToken.source()
147
+ config.cancelToken = source.token
148
+ pendingRequests.set(requestKey, source)
149
+ }
150
+ /**
151
+ * 从pending列表移除请求
152
+ * @param {Object} config 请求配置
153
+ */
154
+ export const removePendingRequest = (config) => {
155
+ const requestKey = generateRequestKey(config)
156
+ if (pendingRequests.has(requestKey)) {
157
+ pendingRequests.delete(requestKey)
158
+ }
159
+ }
160
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../request/index.ts"],"names":[],"mappings":"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"}