@robot-admin/request-core 0.1.2

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/axios/utils/helpers.ts","../src/axios/plugins/dedupe.ts","../src/axios/plugins/cache.ts","../src/axios/plugins/retry.ts","../src/axios/plugins/cancel.ts","../src/axios/plugins/index.ts","../src/axios/request.ts","../src/core.ts","../src/composables/useTableCrud/constants.ts","../src/composables/useTableCrud/utils.ts","../src/composables/useTableCrud/useTableCrud.ts"],"names":["onRequest","onResponse","onResponseError","cleanupExpiredRequests","detailData"],"mappings":"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","file":"index.js","sourcesContent":["/*\n * @Author: ChenYu ycyplus@gmail.com\n * @Date: 2026-02-07 10:00:00\n * @LastEditors: ChenYu ycyplus@gmail.com\n * @LastEditTime: 2026-02-07 10:00:00\n * @FilePath: \\robot-admin-request-core\\src\\axios\\utils\\helpers.ts\n * @Description: axios 插件 - 工具函数\n * Copyright (c) 2026 by CHENY, All Rights Reserved 😎.\n */\n\nimport type { AxiosRequestConfig } from \"axios\";\nimport type { CacheItem } from \"../types\";\n\n/**\n * 对象键排序后序列化(确保相同对象生成相同的 key)\n * 增强版:处理数组排序和循环引用\n */\nfunction sortedStringify(obj: any, seen = new WeakSet()): string {\n if (obj === null || obj === undefined) {\n return \"\";\n }\n\n if (typeof obj !== \"object\") {\n return String(obj);\n }\n\n // 处理循环引用 - 抛出错误而不是静默处理\n if (seen.has(obj)) {\n throw new Error(\"检测到循环引用,无法生成稳定的缓存键\");\n }\n seen.add(obj);\n\n if (Array.isArray(obj)) {\n // 数组保持原始顺序,不进行排序\n // 因为数组顺序通常是有意义的(如排序参数、多选等)\n return JSON.stringify(obj.map((item) => sortedStringify(item, seen)));\n }\n\n const sortedKeys = Object.keys(obj).sort();\n const sortedObj: Record<string, any> = {};\n\n for (const key of sortedKeys) {\n sortedObj[key] = obj[key];\n }\n\n return JSON.stringify(sortedObj);\n}\n\n/**\n * 生成请求唯一标识 key\n */\nexport function generateRequestKey(config: AxiosRequestConfig): string {\n const { method = \"get\", url = \"\", params, data } = config;\n\n const parts: string[] = [method.toUpperCase(), url];\n\n // 添加 params(GET 请求参数)- 使用排序后的序列化\n if (params && Object.keys(params).length > 0) {\n parts.push(sortedStringify(params));\n }\n\n // 添加 data(POST 请求体)- 使用排序后的序列化\n if (data && Object.keys(data).length > 0) {\n parts.push(sortedStringify(data));\n }\n\n return parts.join(\"|\");\n}\n\n/**\n * 内存缓存管理器(增强版:支持大小限制和 LRU)\n */\nexport class MemoryCache {\n private cache = new Map<string, CacheItem>();\n private maxSize = 1000; // 最大缓存数量\n private accessOrder = new Set<string>(); // 记录访问顺序\n\n /**\n * 获取缓存\n */\n get<T = any>(key: string): T | null {\n const item = this.cache.get(key);\n\n if (!item) return null;\n\n // 检查是否过期\n if (Date.now() > item.expireAt) {\n this.cache.delete(key);\n this.accessOrder.delete(key);\n return null;\n }\n\n // 更新访问顺序(LRU)\n this.accessOrder.delete(key);\n this.accessOrder.add(key);\n\n return item.data as T;\n }\n\n /**\n * 设置缓存\n */\n set<T = any>(key: string, data: T, ttl: number): void {\n // 如果超过最大大小,清理最旧的缓存\n if (this.cache.size >= this.maxSize && !this.cache.has(key)) {\n this.evictOldest();\n }\n\n const expireAt = Date.now() + ttl;\n\n this.cache.set(key, {\n data,\n expireAt,\n });\n\n // 更新访问顺序\n this.accessOrder.delete(key);\n this.accessOrder.add(key);\n }\n\n /**\n * 删除缓存\n */\n delete(key: string): boolean {\n this.accessOrder.delete(key);\n return this.cache.delete(key);\n }\n\n /**\n * 清空所有缓存\n */\n clear(): void {\n this.cache.clear();\n this.accessOrder.clear();\n }\n\n /**\n * 清理过期缓存\n */\n cleanup(): void {\n const now = Date.now();\n const entries = Array.from(this.cache.entries());\n\n for (const [key, item] of entries) {\n if (now > item.expireAt) {\n this.cache.delete(key);\n this.accessOrder.delete(key);\n }\n }\n }\n\n /**\n * 获取缓存大小\n */\n get size(): number {\n return this.cache.size;\n }\n\n /**\n * 设置最大缓存大小\n */\n setMaxSize(size: number): void {\n this.maxSize = size;\n\n // 如果当前缓存超过新的大小限制,清理最旧的\n while (this.cache.size > this.maxSize) {\n this.evictOldest();\n }\n }\n\n /**\n * 清理最旧的缓存(LRU)\n */\n private evictOldest(): void {\n const oldestKey = this.accessOrder.values().next().value;\n if (oldestKey) {\n this.cache.delete(oldestKey);\n this.accessOrder.delete(oldestKey);\n }\n }\n}\n\n/**\n * 全局缓存实例\n */\nexport const globalCache = new MemoryCache();\n\n/**\n * 延迟函数\n */\nexport function delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * 判断是否为网络错误\n */\nexport function isNetworkError(error: any): boolean {\n return (\n !error.response &&\n Boolean(error.code) &&\n error.code !== \"ECONNABORTED\" &&\n error.code !== \"ERR_CANCELED\" &&\n error.message !== \"canceled\" &&\n error.message !== \"Request aborted\" &&\n error.message !== \"Request cancelled\"\n );\n}\n\n/**\n * 判断是否为超时错误\n */\nexport function isTimeoutError(error: any): boolean {\n return error.code === \"ECONNABORTED\" && error.message.includes(\"timeout\");\n}\n\n/**\n * 判断是否为可重试的状态码\n */\nexport function isRetryableStatus(\n status: number,\n retryableStatusCodes: number[],\n): boolean {\n return retryableStatusCodes.includes(status);\n}\n\n/**\n * 规范化配置(将 boolean 转换为对象)\n */\nexport function normalizeConfig<T extends Record<string, any>>(\n config: boolean | T | undefined,\n defaults: T,\n): T {\n if (config === true) {\n return { ...defaults, enabled: true };\n }\n\n if (config === false) {\n return { ...defaults, enabled: false };\n }\n\n if (typeof config === \"object\") {\n return { ...defaults, ...config };\n }\n\n return defaults;\n}\n","/*\n * @Author: ChenYu ycyplus@gmail.com\n * @Date: 2026-02-07 10:00:00\n * @LastEditors: ChenYu ycyplus@gmail.com\n * @LastEditTime: 2026-02-07 10:00:00\n * @FilePath: \\robot-admin-request-core\\src\\axios\\plugins\\dedupe.ts\n * @Description: 请求去重插件(AbortController)\n * Copyright (c) 2026 by CHENY, All Rights Reserved 😎.\n */\n\nimport type { AxiosInstance, InternalAxiosRequestConfig } from \"axios\";\nimport type {\n EnhancedAxiosRequestConfig,\n DedupeConfig,\n EnhancedAbortController,\n} from \"../types\";\nimport { generateRequestKey, normalizeConfig } from \"../utils/helpers\";\n\n/**\n * 默认去重配置\n * - enabled: 是否启用去重,默认开启\n * - keyGenerator: 请求键生成器,默认使用 generateRequestKey\n */\nconst DEFAULT_DEDUPE_CONFIG: Required<DedupeConfig> = {\n enabled: true,\n keyGenerator: generateRequestKey,\n};\n\n/**\n * 正在进行的请求 Map\n * key: 请求唯一标识符(基于 URL、参数、方法等生成)\n * value: 增强的 AbortController(包含创建时间)\n *\n * 去重原理:\n * - 相同的请求(相同 key)只能有一个在进行\n * - 新请求会取消旧请求,确保只有一个活跃请求\n * - 避免重复请求造成的资源浪费\n */\nconst pendingRequests = new Map<string, EnhancedAbortController>();\n\n/**\n * 清理超时的请求\n *\n * 功能:\n * 1. 清理超过 5 分钟的请求\n * 2. 防止长时间挂起的请求占用内存\n * 3. 自动取消超时请求释放资源\n *\n * 清理策略:\n * - 每 30 秒执行一次清理\n * - 基于请求创建时间判断超时\n * - 安全地取消和清理请求\n */\nfunction cleanupExpiredRequests(): void {\n const now = Date.now();\n const TIMEOUT = 5 * 60 * 1000; // 5分钟\n\n Array.from(pendingRequests.entries()).forEach(([key, controller]) => {\n const startTime = controller._startTime || now;\n if (now - startTime > TIMEOUT) {\n try {\n controller.abort();\n } catch (error) {\n console.warn(\"Abort error:\", error);\n }\n pendingRequests.delete(key);\n }\n });\n}\n\n// 每 30 秒清理一次,仅在浏览器环境中执行\nif (typeof window !== \"undefined\") {\n setInterval(cleanupExpiredRequests, 30000);\n}\n\n/**\n * 请求拦截器:处理请求去重\n *\n * @param config 请求配置\n * @returns 增强的请求配置\n *\n * 去重逻辑:\n * 1. 检查去重配置是否启用\n * 2. 跳过缓存响应(不需要去重)\n * 3. 生成请求唯一标识符\n * 4. 检查是否有相同请求正在进行\n * 5. 如果有,取消旧请求并创建新请求\n * 6. 如果已有 signal(来自 cancel 插件),不重复创建\n *\n * 与 cancel 插件的协作:\n * - cancel 插件负责路由切换时的批量取消\n * - dedupe 插件负责相同请求的去重\n * - 两者可以同时工作,互不冲突\n */\nfunction onRequest(\n config: InternalAxiosRequestConfig,\n): InternalAxiosRequestConfig {\n const enhancedConfig = config as EnhancedAxiosRequestConfig;\n const dedupeConfig = normalizeConfig(\n enhancedConfig.dedupe,\n DEFAULT_DEDUPE_CONFIG,\n );\n\n if (!dedupeConfig.enabled) {\n return config;\n }\n\n // ✅ 如果来自缓存,不创建 AbortController\n // 缓存响应不需要网络请求,因此不需要去重机制\n if ((config as any).__fromCache) {\n return config;\n }\n\n const keyGenerator =\n dedupeConfig.keyGenerator || DEFAULT_DEDUPE_CONFIG.keyGenerator;\n const requestKey = keyGenerator(config);\n\n // 如果有相同的请求正在进行,取消旧的\n const existing = pendingRequests.get(requestKey);\n if (existing) {\n try {\n existing.abort();\n } catch (error) {\n console.warn(\"Abort existing request error:\", error);\n }\n pendingRequests.delete(requestKey);\n }\n\n // 如果已经有 signal(来自 cancel 插件),就不创建新的\n // 避免重复的 AbortController,确保 signal 的唯一性\n if (config.signal) {\n return config;\n }\n\n // 创建新的 AbortController\n const controller = new AbortController() as EnhancedAbortController;\n controller._startTime = Date.now();\n config.signal = controller.signal;\n pendingRequests.set(requestKey, controller);\n\n return config;\n}\n\n/**\n * 响应拦截器:清理已完成的请求\n *\n * @param response 响应对象\n * @returns 原始响应\n *\n * 清理机制:\n * - 请求成功完成后,从 Map 中移除对应的控制器\n * - 释放内存,避免无效的取消操作\n * - 确保后续相同请求可以正常发起\n */\nfunction onResponse(response: any): any {\n const config = response.config as EnhancedAxiosRequestConfig;\n const dedupeConfig = normalizeConfig(\n config.dedupe,\n DEFAULT_DEDUPE_CONFIG,\n ) as Required<DedupeConfig>;\n\n if (dedupeConfig.enabled) {\n const keyGenerator =\n dedupeConfig.keyGenerator || DEFAULT_DEDUPE_CONFIG.keyGenerator;\n const requestKey = keyGenerator(config);\n pendingRequests.delete(requestKey);\n }\n\n return response;\n}\n\n/**\n * 响应错误处理:清理失败的请求\n *\n * @param error 错误对象\n * @returns rejected Promise\n *\n * 清理机制:\n * - 请求失败时,同样需要清理控制器\n * - 确保无论成功还是失败都正确清理资源\n * - 避免失败的请求影响后续相同请求的去重\n */\nfunction onResponseError(error: any): Promise<never> {\n const config = error.config as EnhancedAxiosRequestConfig;\n\n if (config) {\n const dedupeConfig = normalizeConfig(\n config.dedupe,\n DEFAULT_DEDUPE_CONFIG,\n ) as Required<DedupeConfig>;\n\n if (dedupeConfig.enabled) {\n const keyGenerator =\n dedupeConfig.keyGenerator || DEFAULT_DEDUPE_CONFIG.keyGenerator;\n const requestKey = keyGenerator(config);\n pendingRequests.delete(requestKey);\n }\n }\n\n return Promise.reject(error);\n}\n\n/**\n * 设置请求去重插件\n *\n * @param instance Axios 实例\n *\n * 注册拦截器:\n * - 请求拦截器:处理去重逻辑\n * - 响应拦截器:清理完成的请求\n * - 响应错误拦截器:清理失败的请求\n */\nexport function setupDedupePlugin(instance: AxiosInstance): void {\n instance.interceptors.request.use(onRequest);\n instance.interceptors.response.use(onResponse, onResponseError);\n}\n\n/**\n * 取消所有待处理的请求\n *\n * 使用场景:\n * - 用户登出时清理所有请求\n * - 网络异常时重置请求状态\n * - 调试和测试场景\n *\n * 安全机制:\n * - 捕获每个取消操作的异常\n * - 确保一个请求的失败不影响其他请求的取消\n * - 完全清理 Map 中的所有引用\n */\nexport function cancelAllPendingRequests(): void {\n pendingRequests.forEach((controller) => {\n try {\n controller.abort();\n } catch (error) {\n console.warn(\"Error aborting pending request:\", error);\n }\n });\n pendingRequests.clear();\n}\n\n/**\n * 页面卸载时清理请求\n *\n * 生命周期管理:\n * - beforeunload 事件触发时清理所有请求\n * - 避免页面卸载后继续发送请求\n * - 防止内存泄漏\n *\n * 浏览器兼容性:\n * - 检查 window 对象存在性\n * - 仅在浏览器环境中执行\n */\nif (typeof window !== \"undefined\") {\n window.addEventListener(\"beforeunload\", () => {\n cancelAllPendingRequests();\n });\n}\n\n/**\n * 获取待处理请求数量\n *\n * @returns 当前待处理的请求数量\n *\n * 监控用途:\n * - 性能监控和分析\n * - 调试请求状态\n * - 检测潜在的请求泄漏\n * - 评估去重效果\n */\nexport function getPendingRequestCount(): number {\n return pendingRequests.size;\n}\n","/*\n * @Author: ChenYu ycyplus@gmail.com\n * @Date: 2026-02-07 10:00:00\n * @LastEditors: ChenYu ycyplus@gmail.com\n * @LastEditTime: 2026-02-07 10:00:00\n * @FilePath: \\robot-admin-request-core\\src\\axios\\plugins\\cache.ts\n * @Description: 请求缓存插件(内存缓存)\n * Copyright (c) 2026 by CHENY, All Rights Reserved 😎.\n */\n\nimport type {\n AxiosInstance,\n AxiosResponse,\n InternalAxiosRequestConfig,\n} from \"axios\";\nimport type {\n EnhancedAxiosRequestConfig,\n CacheConfig,\n CachedResponseData,\n} from \"../types\";\nimport {\n generateRequestKey,\n globalCache,\n normalizeConfig,\n} from \"../utils/helpers\";\n\n/**\n * 默认缓存配置\n * - enabled: 是否启用缓存,默认关闭\n * - ttl: 缓存生存时间,默认5分钟\n * - forceUpdate: 是否强制更新缓存,默认false\n */\nconst DEFAULT_CACHE_CONFIG: Required<CacheConfig> = {\n enabled: false,\n ttl: 5 * 60 * 1000, // 5 分钟\n forceUpdate: false,\n};\n\n/**\n * 判断是否应该使用缓存\n *\n * @param config 请求配置\n * @param cacheConfig 缓存配置\n * @returns 是否使用缓存\n *\n * 缓存策略:\n * 1. 只缓存 GET 请求\n * 2. 必须显式启用缓存\n * 3. 非强制刷新模式\n */\nfunction shouldUseCache(\n config: InternalAxiosRequestConfig,\n cacheConfig: CacheConfig,\n): boolean {\n // 只缓存 GET 请求\n if (config.method?.toUpperCase() !== \"GET\") {\n return false;\n }\n\n // 检查是否启用缓存\n if (!cacheConfig.enabled) {\n return false;\n }\n\n // 检查是否强制刷新\n if (cacheConfig.forceUpdate) {\n return false;\n }\n\n return true;\n}\n\n/**\n * 创建缓存响应对象\n *\n * @param cachedData 缓存的数据\n * @param config 请求配置\n * @returns 格式化的 Axios 响应对象\n *\n * 注意:在 statusText 中添加 \"(from cache)\" 标识,便于调试\n */\nfunction createCacheResponse(\n cachedData: CachedResponseData,\n config: InternalAxiosRequestConfig,\n): AxiosResponse {\n return {\n data: cachedData.data,\n status: cachedData.status,\n statusText: `${cachedData.statusText} (from cache)`,\n headers: cachedData.headers,\n config,\n } as AxiosResponse;\n}\n\n/**\n * 尝试从缓存获取响应\n *\n * @param config 请求配置\n * @param cacheConfig 缓存配置\n * @returns 缓存的响应或 null\n *\n * 流程:\n * 1. 检查是否应该使用缓存\n * 2. 生成请求键\n * 3. 从全局缓存中获取数据\n * 4. 如果命中,创建并返回缓存响应\n */\nfunction tryGetFromCache(\n config: InternalAxiosRequestConfig,\n cacheConfig: Required<CacheConfig>,\n): AxiosResponse | null {\n if (!shouldUseCache(config, cacheConfig)) {\n return null;\n }\n\n const requestKey = generateRequestKey(config);\n const cachedData = globalCache.get<CachedResponseData>(requestKey);\n\n if (cachedData) {\n return createCacheResponse(cachedData, config);\n }\n\n return null;\n}\n\n/**\n * 保存响应到缓存\n *\n * @param response Axios 响应对象\n * @param config 请求配置\n * @param cacheConfig 缓存配置\n *\n * 缓存条件:\n * 1. 必须是 GET 请求\n * 2. 缓存功能已启用\n * 3. 响应状态码为 200\n *\n * 保存内容:\n * - 响应数据\n * - 状态码和状态文本\n * - 完整的响应头\n */\nfunction saveToCache(\n response: AxiosResponse,\n config: InternalAxiosRequestConfig,\n cacheConfig: Required<CacheConfig>,\n): void {\n if (\n config.method?.toUpperCase() === \"GET\" &&\n cacheConfig.enabled &&\n response.status === 200\n ) {\n const requestKey = generateRequestKey(config);\n const ttl = cacheConfig.ttl ?? DEFAULT_CACHE_CONFIG.ttl;\n\n // 保存完整的响应信息,包括 headers\n const cachedResponse: CachedResponseData = {\n data: response.data,\n status: response.status,\n statusText: response.statusText,\n headers: { ...response.headers },\n };\n\n globalCache.set(requestKey, cachedResponse, ttl);\n }\n}\n\n/**\n * 请求拦截器:检查缓存\n *\n * @param config 请求配置\n * @returns 请求配置或 rejected Promise\n *\n * 核心机制:\n * 1. 检查缓存是否命中\n * 2. 如果命中,返回 rejected Promise 携带缓存响应\n * 3. 标记 __fromCache 让其他插件知道这是缓存响应\n *\n * 为什么用 rejected Promise:\n * - 避免发送真实网络请求\n * - 在响应拦截器中通过 onResponseError 处理\n * - 确保其他插件的请求拦截器正常执行\n */\nfunction onRequest(\n config: InternalAxiosRequestConfig,\n): InternalAxiosRequestConfig | Promise<never> {\n const enhancedConfig = config as EnhancedAxiosRequestConfig;\n const cacheConfig = normalizeConfig(\n enhancedConfig.cache,\n DEFAULT_CACHE_CONFIG,\n ) as Required<CacheConfig>;\n\n // 尝试从缓存获取\n const cachedResponse = tryGetFromCache(config, cacheConfig);\n if (cachedResponse) {\n // 标记来自缓存,让其他插件知道\n (config as any).__fromCache = true;\n\n // ✅ 直接返回一个 rejected Promise,携带缓存响应\n // 这样可以避免发送真实网络请求,同时在响应拦截器中处理\n return Promise.reject({\n __fromCache: true,\n __cachedResponse: cachedResponse,\n config,\n });\n }\n\n return config;\n}\n\n/**\n * 响应拦截器:处理缓存或保存缓存\n *\n * @param response Axios 响应对象\n * @returns 处理后的响应\n *\n * 处理逻辑:\n * 1. 如果是缓存响应,直接返回缓存数据\n * 2. 如果是真实响应,保存到缓存\n */\nfunction onResponse(response: AxiosResponse): AxiosResponse {\n const config = response.config as EnhancedAxiosRequestConfig;\n\n // 如果来自缓存,直接返回缓存数据\n if ((config as any).__fromCache) {\n return (config as any).__cachedResponse;\n }\n\n // 保存到缓存\n const cacheConfig = normalizeConfig(\n config.cache,\n DEFAULT_CACHE_CONFIG,\n ) as Required<CacheConfig>;\n saveToCache(response, response.config, cacheConfig);\n\n return response;\n}\n\n/**\n * 响应错误处理:处理缓存响应\n *\n * @param error 错误对象\n * @returns Promise<AxiosResponse | never>\n *\n * 关键作用:\n * - 处理缓存命中时的 rejected Promise\n * - 将缓存响应转换为正常的 Promise.resolve\n * - 确保缓存响应被正确处理,不被误判为错误\n *\n * 返回类型统一为 Promise,确保类型一致性\n */\nfunction onResponseError(error: any): Promise<AxiosResponse | never> {\n // 如果是缓存响应,直接返回缓存数据\n if (error.__fromCache) {\n return Promise.resolve(error.__cachedResponse);\n }\n\n return Promise.reject(error);\n}\n\n/**\n * 设置请求缓存插件\n *\n * @param instance Axios 实例\n *\n * 注册拦截器:\n * - 请求拦截器:检查缓存\n * - 响应拦截器:处理缓存响应或保存缓存\n * - 响应错误拦截器:处理缓存响应\n */\nexport function setupCachePlugin(instance: AxiosInstance): void {\n instance.interceptors.request.use(onRequest);\n instance.interceptors.response.use(onResponse, onResponseError);\n}\n\n/**\n * 清空所有缓存\n *\n * 用于:\n * - 用户登出时清理敏感数据\n * - 开发调试时重置缓存状态\n */\nexport function clearAllCache(): void {\n globalCache.clear();\n}\n\n/**\n * 删除指定缓存\n *\n * @param config 请求配置\n * @returns 是否删除成功\n *\n * 用于:\n * - 数据更新时清理特定缓存\n * - 缓存失效时的精确清理\n */\nexport function clearCache(config: InternalAxiosRequestConfig): boolean {\n const requestKey = generateRequestKey(config);\n return globalCache.delete(requestKey);\n}\n\n/**\n * 清理过期缓存\n *\n * 自动清理机制:\n * - 由 globalCache 内部实现\n * - 基于 TTL 过期时间\n * - 定期清理防止内存泄漏\n */\nexport function cleanupExpiredCache(): void {\n globalCache.cleanup();\n}\n\n/**\n * 获取缓存大小\n *\n * @returns 当前缓存条目数量\n *\n * 用于:\n * - 监控缓存使用情况\n * - 性能分析和调试\n */\nexport function getCacheSize(): number {\n return globalCache.size;\n}\n","/*\n * @Author: ChenYu ycyplus@gmail.com\n * @Date: 2026-02-07 10:00:00\n * @LastEditors: ChenYu ycyplus@gmail.com\n * @LastEditTime: 2026-02-07 10:00:00\n * @FilePath: \\robot-admin-request-core\\src\\axios\\plugins\\retry.ts\n * @Description: 请求重试插件\n * Copyright (c) 2026 by CHENY, All Rights Reserved 😎.\n */\n\nimport type { AxiosInstance, AxiosError } from \"axios\";\nimport type { EnhancedAxiosRequestConfig, RetryConfig } from \"../types\";\nimport {\n delay,\n isNetworkError,\n isTimeoutError,\n isRetryableStatus,\n normalizeConfig,\n} from \"../utils/helpers\";\n\n/**\n * 默认重试配置\n * - enabled: 是否启用重试,默认关闭\n * - count: 最大重试次数,默认3次\n * - delay: 重试延迟时间,默认1000ms\n * - exponentialBackoff: 是否启用指数退避,默认开启\n * - retryableStatusCodes: 可重试的状态码列表\n */\nconst DEFAULT_RETRY_CONFIG: Required<RetryConfig> = {\n enabled: false,\n count: 3,\n delay: 1000,\n exponentialBackoff: true,\n retryableStatusCodes: [408, 429, 500, 502, 503, 504],\n};\n\n/**\n * 判断是否为取消错误\n *\n * @param error 错误对象\n * @returns 是否为取消错误\n *\n * 取消错误类型:\n * - Axios 的 CanceledError\n * - DOM 的 AbortError\n * - Node.js 的 ERR_CANCELED\n * - 包含 'canceled' 或 'abort' 的错误消息\n *\n * 重试策略:\n * - 用户主动取消的请求不应该重试\n * - 避免无限重试循环\n */\nfunction isCancelError(error: any): boolean {\n return (\n error.name === \"CanceledError\" ||\n error.name === \"AbortError\" ||\n error.code === \"ERR_CANCELED\" ||\n error.message === \"canceled\" ||\n error.message?.includes(\"abort\")\n );\n}\n\n/**\n * 判断是否应该重试\n *\n * @param error Axios 错误对象\n * @param retryConfig 重试配置\n * @returns 是否应该重试\n *\n * 重试条件判断:\n * 1. 重试功能必须启用\n * 2. 未达到最大重试次数\n * 3. 非用户主动取消的请求\n * 4. 网络错误或超时错误可重试\n * 5. 特定状态码可重试\n *\n * 重试策略:\n * - 网络问题:可重试(网络不稳定)\n * - 超时问题:可重试(临时拥堵)\n * - 服务器错误:部分可重试(5xx 错误)\n * - 客户端错误:一般不重试(4xx 错误)\n */\nfunction shouldRetry(\n error: AxiosError,\n retryConfig: Required<RetryConfig>,\n): boolean {\n if (!retryConfig.enabled) {\n return false;\n }\n\n const config = error.config as EnhancedAxiosRequestConfig;\n const currentRetryCount = config.__retryCount ?? 0;\n\n // 检查重试次数\n if (currentRetryCount >= retryConfig.count) {\n return false;\n }\n\n // 用户主动取消的请求不重试\n if (isCancelError(error)) {\n return false;\n }\n\n // 网络错误可重试\n if (isNetworkError(error)) {\n return true;\n }\n\n // 超时错误可重试\n if (isTimeoutError(error)) {\n return true;\n }\n\n // 检查状态码是否可重试\n if (error.response?.status) {\n return isRetryableStatus(\n error.response.status,\n retryConfig.retryableStatusCodes,\n );\n }\n\n return false;\n}\n\n/**\n * 计算重试延迟时间\n *\n * @param retryCount 当前重试次数\n * @param retryConfig 重试配置\n * @returns 延迟时间(毫秒)\n *\n * 延迟策略:\n * - 固定延迟:使用配置的基础延迟时间\n * - 指数退避:delay * 2^retryCount,最大30秒\n *\n * 指数退避优势:\n * - 避免短时间内频繁重试\n * - 给服务器恢复时间\n * - 减少网络拥堵\n */\nfunction getRetryDelay(\n retryCount: number,\n retryConfig: Required<RetryConfig>,\n): number {\n if (!retryConfig.exponentialBackoff) {\n return retryConfig.delay;\n }\n\n // 指数退避:delay * 2^retryCount,最大30秒\n const calculatedDelay = retryConfig.delay * Math.pow(2, retryCount);\n return Math.min(calculatedDelay, 30000);\n}\n\n/**\n * 设置请求重试插件\n *\n * @param instance Axios 实例\n *\n * 核心功能:\n * 1. 自动重试失败的请求\n * 2. 智能延迟策略(固定或指数退避)\n * 3. 保留取消信号的能力\n * 4. 清理其他插件的内部状态\n *\n * 重试机制:\n * - 仅在响应错误拦截器中处理\n * - 增加重试计数器\n * - 延迟后重新发起请求\n * - 创建新的 AbortController 但关联原取消逻辑\n */\nexport function setupRetryPlugin(instance: AxiosInstance): void {\n /**\n * 响应错误处理:自动重试\n *\n * @param error Axios 错误对象\n * @returns 重试结果或 rejected Promise\n *\n * 重试流程:\n * 1. 检查配置和重试条件\n * 2. 增加重试计数\n * 3. 计算延迟时间\n * 4. 等待延迟\n * 5. 创建新的请求配置\n * 6. 处理取消信号的传递\n * 7. 清理其他插件状态\n * 8. 重新发起请求\n */\n const onResponseError = async (error: AxiosError): Promise<any> => {\n const config = error.config as EnhancedAxiosRequestConfig;\n\n if (!config) {\n return Promise.reject(error);\n }\n\n const retryConfig = normalizeConfig(\n config.retry,\n DEFAULT_RETRY_CONFIG,\n ) as Required<RetryConfig>;\n\n if (!shouldRetry(error, retryConfig)) {\n return Promise.reject(error);\n }\n\n // 增加重试计数\n config.__retryCount = (config.__retryCount ?? 0) + 1;\n\n // 计算延迟时间\n const retryDelay = getRetryDelay(config.__retryCount, retryConfig);\n\n // 延迟后重试\n await delay(retryDelay);\n\n // 创建干净的重试配置\n const retryConfig_: EnhancedAxiosRequestConfig = { ...config };\n\n // 创建新的 AbortController,但监听原 signal 的 abort 事件\n const originalSignal = config.signal;\n const newController = new AbortController();\n\n // ✅ 关键修复:如果原 signal 被触发,也触发新的 signal\n // 这样确保重试请求仍然可以被用户取消\n if (\n originalSignal &&\n typeof originalSignal.addEventListener === \"function\"\n ) {\n originalSignal.addEventListener(\"abort\", () => {\n newController.abort();\n });\n }\n\n // 设置新的 signal\n retryConfig_.signal = newController.signal;\n\n // 清除其他插件相关的内部状态(保留 signal 相关的)\n // 避免插件状态冲突,确保重试请求的干净状态\n delete retryConfig_.__cancelId;\n delete retryConfig_.__managedByCancel;\n delete retryConfig_.__handling401;\n\n // 使用闭包中的 instance 重新发起请求\n return instance.request(retryConfig_);\n };\n\n instance.interceptors.response.use(undefined, onResponseError);\n}\n","/*\n * @Author: ChenYu ycyplus@gmail.com\n * @Date: 2026-02-07 10:00:00\n * @LastEditors: ChenYu ycyplus@gmail.com\n * @LastEditTime: 2026-02-07 10:00:00\n * @FilePath: \\robot-admin-request-core\\src\\axios\\plugins\\cancel.ts\n * @Description: 路由切换时自动取消请求插件\n * Copyright (c) 2026 by CHENY, All Rights Reserved 😎.\n */\n\nimport type { AxiosInstance, InternalAxiosRequestConfig } from \"axios\";\nimport type {\n EnhancedAxiosRequestConfig,\n CancelConfig,\n EnhancedAbortController,\n} from \"../types\";\nimport { normalizeConfig } from \"../utils/helpers\";\n\n/**\n * 默认取消配置\n * - enabled: 是否启用自动取消,默认开启\n * - whitelist: 白名单,匹配的请求不会被取消\n */\nconst DEFAULT_CANCEL_CONFIG: Required<CancelConfig> = {\n enabled: true,\n whitelist: [],\n};\n\n/**\n * 待取消的请求 Map\n * key: 请求唯一标识符\n * value: 增强的 AbortController(包含创建时间)\n *\n * 设计说明:\n * - 使用 Map 而非 Object,提供更好的性能和 API\n * - 存储增强的 AbortController,支持超时管理\n */\nconst cancelableRequests = new Map<string, EnhancedAbortController>();\n\n/**\n * 请求计数器(用于生成唯一 ID)\n *\n * 确保每个请求都有唯一的标识符,避免冲突\n */\nlet requestId = 0;\n\n/**\n * 清理超时请求的定时器配置\n * - CLEANUP_INTERVAL: 清理间隔,30秒\n * - REQUEST_TIMEOUT: 请求超时时间,5分钟\n */\nconst CLEANUP_INTERVAL = 30000; // 30 秒\nconst REQUEST_TIMEOUT = 300000; // 5 分钟\n\nlet cleanupTimer: NodeJS.Timeout | null = null;\n\n/**\n * 清理超时的请求\n *\n * 功能:\n * 1. 遍历所有待取消的请求\n * 2. 检查请求是否超时(基于创建时间)\n * 3. 取消超时请求并从 Map 中移除\n * 4. 错误处理避免清理过程异常\n *\n * 防止内存泄漏:\n * - 长时间运行的请求可能永远不会完成\n * - 定期清理避免内存积累\n */\nfunction cleanupExpiredRequests(): void {\n const now = Date.now();\n const expiredKeys: string[] = [];\n\n for (const [key, controller] of cancelableRequests.entries()) {\n // 检查请求是否超时(基于创建时间)\n const requestStartTime = controller._startTime || now;\n if (now - requestStartTime > REQUEST_TIMEOUT) {\n expiredKeys.push(key);\n try {\n controller.abort();\n } catch (error) {\n console.warn(\"Error aborting expired request:\", error);\n }\n }\n }\n\n // 移除超时的请求\n expiredKeys.forEach((key) => cancelableRequests.delete(key));\n}\n\n/**\n * 启动清理定时器\n *\n * 生命周期管理:\n * - 清理之前的定时器(避免重复)\n * - 设置新的定时器进行定期清理\n */\nfunction startCleanupTimer(): void {\n if (cleanupTimer) {\n clearInterval(cleanupTimer);\n }\n\n cleanupTimer = setInterval(cleanupExpiredRequests, CLEANUP_INTERVAL);\n}\n\n/**\n * 停止清理定时器\n *\n * 资源清理:\n * - 清理定时器避免内存泄漏\n * - 页面卸载时调用\n */\nfunction stopCleanupTimer(): void {\n if (cleanupTimer) {\n clearInterval(cleanupTimer);\n cleanupTimer = null;\n }\n}\n\n/**\n * 判断请求是否在白名单中\n *\n * @param url 请求 URL\n * @param whitelist 白名单正则表达式数组\n * @returns 是否在白名单中\n *\n * 白名单机制:\n * - 匹配白名单的请求不会被自动取消\n * - 支持正则表达式灵活匹配\n * - 适用于重要的系统请求(如心跳检测)\n */\nfunction isInWhitelist(url: string, whitelist: RegExp[]): boolean {\n return whitelist.some((pattern) => pattern.test(url));\n}\n\n/**\n * 请求拦截器:添加取消控制器\n *\n * @param config 请求配置\n * @returns 增强的请求配置\n *\n * 核心功能:\n * 1. 检查 AbortController 兼容性\n * 2. 验证取消配置和白名单\n * 3. 创建 AbortController 并关联到请求\n * 4. 记录请求开始时间用于超时管理\n * 5. 将控制器存储到全局 Map 中\n *\n * 特殊处理:\n * - 缓存响应不创建 AbortController\n * - 白名单请求不创建 AbortController\n */\nfunction onRequest(\n config: InternalAxiosRequestConfig,\n): InternalAxiosRequestConfig {\n // 检查 AbortController 兼容性\n if (typeof AbortController === \"undefined\") {\n console.warn(\"AbortController is not supported in this environment\");\n return config;\n }\n\n const enhancedConfig = config as EnhancedAxiosRequestConfig;\n const cancelConfig = normalizeConfig(\n enhancedConfig.cancel,\n DEFAULT_CANCEL_CONFIG,\n ) as Required<CancelConfig>;\n\n if (!cancelConfig.enabled) {\n return config;\n }\n\n // ✅ 如果来自缓存,不创建 AbortController\n // 缓存响应不需要网络请求,因此不需要取消机制\n if ((config as any).__fromCache) {\n return config;\n }\n\n const url = config.url || \"\";\n\n // 检查是否在白名单中\n if (isInWhitelist(url, cancelConfig.whitelist)) {\n return config;\n }\n\n // 创建取消控制器\n const controller = new AbortController() as EnhancedAbortController;\n const id = `request_${++requestId}`;\n\n // 记录请求开始时间,用于超时管理\n controller._startTime = Date.now();\n config.signal = controller.signal;\n (config as any).__cancelId = id;\n\n cancelableRequests.set(id, controller);\n\n return config;\n}\n\n/**\n * 响应拦截器:清理已完成的请求\n *\n * @param response 响应对象\n * @returns 原始响应\n *\n * 清理机制:\n * - 请求成功完成后,从 Map 中移除对应的控制器\n * - 避免内存泄漏和无效的取消操作\n */\nfunction onResponse(response: any): any {\n const config = response.config as any;\n const cancelId = config.__cancelId;\n\n if (cancelId) {\n cancelableRequests.delete(cancelId);\n }\n\n return response;\n}\n\n/**\n * 响应错误处理:清理失败的请求\n *\n * @param error 错误对象\n * @returns rejected Promise\n *\n * 清理机制:\n * - 请求失败时,同样需要清理控制器\n * - 确保无论成功还是失败都正确清理资源\n */\nfunction onResponseError(error: any): Promise<never> {\n const config = error.config as any;\n const cancelId = config?.__cancelId;\n\n if (cancelId) {\n cancelableRequests.delete(cancelId);\n }\n\n return Promise.reject(error);\n}\n\n/**\n * 设置路由取消插件\n *\n * @param instance Axios 实例\n *\n * 注册拦截器:\n * - 请求拦截器:添加取消控制器\n * - 响应拦截器:清理完成的请求\n * - 响应错误拦截器:清理失败的请求\n */\nexport function setupCancelPlugin(instance: AxiosInstance): void {\n instance.interceptors.request.use(onRequest);\n instance.interceptors.response.use(onResponse, onResponseError);\n}\n\n/**\n * 取消所有待处理的请求\n *\n * 使用场景:\n * - 路由切换时取消当前页面的所有请求\n * - 用户登出时清理所有请求\n * - 网络异常时重置请求状态\n *\n * 安全机制:\n * - 捕获每个取消操作的异常\n * - 确保一个请求的失败不影响其他请求的取消\n */\nexport function cancelAllRequests(): void {\n cancelableRequests.forEach((controller) => {\n try {\n controller.abort();\n } catch (error) {\n console.warn(\"Error aborting request:\", error);\n }\n });\n cancelableRequests.clear();\n}\n\n/**\n * 页面卸载时清理请求\n *\n * 生命周期管理:\n * - beforeunload 事件触发时清理所有请求\n * - 避免页面卸载后继续发送请求\n * - 清理定时器防止内存泄漏\n *\n * 浏览器兼容性:\n * - 检查 window 对象存在性\n * - 仅在浏览器环境中执行\n */\nif (typeof window !== \"undefined\") {\n window.addEventListener(\"beforeunload\", () => {\n cancelAllRequests();\n stopCleanupTimer();\n });\n\n // 启动清理定时器\n startCleanupTimer();\n}\n\n/**\n * 获取待取消请求数量\n *\n * @returns 当前待取消的请求数量\n *\n * 监控用途:\n * - 性能监控和分析\n * - 调试请求状态\n * - 检测潜在的请求泄漏\n */\nexport function getCancelableRequestCount(): number {\n return cancelableRequests.size;\n}\n","/*\n * @Author: ChenYu ycyplus@gmail.com\n * @Date: 2026-02-07 10:00:00\n * @LastEditors: ChenYu ycyplus@gmail.com\n * @LastEditTime: 2026-02-07 10:00:00\n * @FilePath: \\robot-admin-request-core\\src\\axios\\plugins\\index.ts\n * @Description: axios 插件体系\n * Copyright (c) 2026 by CHENY, All Rights Reserved 😎.\n */\n\nimport type { AxiosInstance } from \"axios\";\nimport { setupRequestPlugin } from \"./request\";\nimport { setupDedupePlugin } from \"./dedupe\";\nimport { setupCachePlugin } from \"./cache\";\nimport { setupRetryPlugin } from \"./retry\";\nimport { setupResponsePlugin } from \"./response\";\nimport { setupCancelPlugin } from \"./cancel\";\n\n/**\n * 设置所有插件\n *\n * 插件加载顺序说明:\n * 1. 请求拦截器按注册顺序执行\n * 2. 响应拦截器按注册逆序执行\n *\n * 优化后的顺序(解决冲突问题):\n * - 请求阶段:request -> cache -> cancel -> dedupe -> retry -> response\n * - 响应阶段:response -> retry -> dedupe -> cancel -> cache -> request\n *\n * 优化说明:\n * - cache 在最前:确保缓存检查优先级最高\n * - cancel 在 dedupe 之前:确保 cancel 的 signal 不被覆盖\n * - dedupe 在 cancel 之后:复用 cancel 的 signal(如果存在)\n */\nexport function setupPlugins(instance: AxiosInstance): void {\n // 1. 请求通用处理(token、headers)\n setupRequestPlugin(instance);\n\n // 2. 请求缓存(GET 请求缓存,优先级最高)\n setupCachePlugin(instance);\n\n // 3. 路由取消(在去重之前,确保 signal 不被覆盖)\n setupCancelPlugin(instance);\n\n // 4. 请求去重(防止重复请求,复用 cancel 的 signal)\n setupDedupePlugin(instance);\n\n // 5. 请求重试(网络错误自动重试)\n setupRetryPlugin(instance);\n\n // 6. 响应统一处理(业务错误、401 处理)\n setupResponsePlugin(instance);\n}\n\n// 导出所有插件的工具函数\nexport { resolveReLogin, rejectReLogin, getReLoginPromise } from \"./request\";\nexport { cancelAllPendingRequests, getPendingRequestCount } from \"./dedupe\";\nexport {\n clearAllCache,\n clearCache,\n cleanupExpiredCache,\n getCacheSize,\n} from \"./cache\";\nexport { cancelAllRequests, getCancelableRequestCount } from \"./cancel\";\n","/*\n * @Author: ChenYu ycyplus@gmail.com\n * @Date: 2026-02-07 10:00:00\n * @LastEditors: ChenYu ycyplus@gmail.com\n * @LastEditTime: 2026-02-07 10:00:00\n * @FilePath: \\robot-admin-request-core\\src\\axios\\request.ts\n * @Description: axios 二次封装 + 插件体系\n * Copyright (c) 2026 by CHENY, All Rights Reserved 😎.\n */\n\nimport axios, { type AxiosInstance, type AxiosRequestConfig } from \"axios\";\nimport type { EnhancedAxiosRequestConfig } from \"./types\";\nimport { setupPlugins, resolveReLogin, rejectReLogin } from \"./plugins\";\n\n// 全局 axios 实例(用于兼容)\nlet globalService: AxiosInstance | null = null;\n\n/**\n * 创建 axios 实例\n * @param config axios 配置\n */\nexport function createAxiosInstance(\n config: AxiosRequestConfig = {},\n): AxiosInstance {\n const instance = axios.create({\n timeout: 5000,\n headers: {\n \"Content-Type\": \"application/json\",\n },\n ...config,\n });\n\n /**\n * 挂载所有插件\n * 优化后的插件顺序:request -> cache -> cancel -> dedupe -> retry -> response\n *\n * 顺序说明:\n * - cache 在最前:确保缓存检查优先级最高\n * - cancel 在 dedupe 之前:确保 cancel 的 signal 不被覆盖\n * - dedupe 在 cancel 之后:复用 cancel 的 signal(如果存在)\n */\n setupPlugins(instance);\n\n return instance;\n}\n\n/**\n * 设置全局 axios 实例\n */\nexport function setGlobalAxiosInstance(instance: AxiosInstance) {\n globalService = instance;\n}\n\n/**\n * 获取全局 axios 实例\n */\nexport function getGlobalAxiosInstance(): AxiosInstance {\n if (!globalService) {\n throw new Error(\n \"Axios instance not initialized. Please call createRequestCore() first.\",\n );\n }\n return globalService;\n}\n\n// 兼容旧代码:默认导出全局实例的 getter\nexport default new Proxy({} as AxiosInstance, {\n get(target, prop) {\n return getGlobalAxiosInstance()[prop as keyof AxiosInstance];\n },\n});\n\n// ================= 快捷请求方式 =================\n\n/**\n * GET 请求\n * @param url 请求地址\n * @param config 请求配置(可选),支持插件配置\n */\nexport const getData = async <T = any>(\n url: string,\n config?: EnhancedAxiosRequestConfig,\n): Promise<T> => {\n const res = await getGlobalAxiosInstance().get(url, config);\n return res.data;\n};\n\n/**\n * POST 请求\n * @param url 请求地址\n * @param data 请求体数据(可选)\n * @param config 请求配置(可选),支持插件配置\n */\nexport const postData = async <T = any>(\n url: string,\n data?: any,\n config?: EnhancedAxiosRequestConfig,\n): Promise<T> => {\n const res = await getGlobalAxiosInstance().post(url, data, config);\n return res.data;\n};\n\n/**\n * PUT 请求\n * @param url 请求地址\n * @param data 请求体数据(可选)\n * @param config 请求配置(可选),支持插件配置\n */\nexport const putData = async <T = any>(\n url: string,\n data?: any,\n config?: EnhancedAxiosRequestConfig,\n): Promise<T> => {\n const res = await getGlobalAxiosInstance().put(url, data, config);\n return res.data;\n};\n\n/**\n * DELETE 请求\n * @param url 请求地址\n * @param config 请求配置(可选),支持插件配置\n */\nexport const deleteData = async <T = any>(\n url: string,\n config?: EnhancedAxiosRequestConfig,\n): Promise<T> => {\n const res = await getGlobalAxiosInstance().delete(url, config);\n return res.data;\n};\n\n// ================= 导出插件工具函数 =================\nexport {\n getReLoginPromise,\n cancelAllPendingRequests,\n getPendingRequestCount,\n clearAllCache,\n clearCache,\n cleanupExpiredCache,\n getCacheSize,\n cancelAllRequests,\n getCancelableRequestCount,\n} from \"./plugins\";\n\n// ================= 重新登录回调 =================\n\n/**\n * 重新登录成功后的回调\n * 调用此函数会 resolve 所有等待中的请求\n */\nexport const onReLoginSuccess = () => {\n resolveReLogin();\n};\n\n/**\n * 重新登录取消后的回调\n * 调用此函数会 reject 所有等待中的请求\n */\nexport const onReLoginCancel = () => {\n rejectReLogin(new Error(\"重新登录已取消\"));\n};\n\n// ================= 使用示例 =================\n\n// 1. 简单 GET 请求\n// getData('/users')\n\n// 2. 带参数的 GET 请求(推荐方式 - axios 会自动处理参数)\n// getData('/users', { params: { page: 1, pageSize: 10 } })\n\n// 3. 带请求头的 GET 请求\n// getData('/users', {\n// params: { page: 1 },\n// headers: { 'X-Custom-Header': 'value' }\n// })\n\n// 4. POST 请求\n// postData('/users', { name: '张三' })\n\n// 5. POST 请求带额外配置\n// postData('/users', { name: '张三' }, {\n// headers: { 'X-Custom-Header': 'value' }\n// })\n","/*\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2026-02-07 10:00:00\r\n * @LastEditors: ChenYu ycyplus@gmail.com\r\n * @LastEditTime: 2026-02-07 10:00:00\r\n * @FilePath: \\robot-admin-request-core\\src\\core.ts\r\n * @Description: Request Core - 核心配置和初始化 API\r\n * Copyright (c) 2026 by CHENY, All Rights Reserved 😎.\r\n */\r\n\r\nimport type { App } from \"vue\";\r\nimport type {\r\n AxiosRequestConfig,\r\n AxiosResponse,\r\n InternalAxiosRequestConfig,\r\n} from \"axios\";\r\nimport { createAxiosInstance, setGlobalAxiosInstance } from \"./axios/request\";\r\n\r\n/**\r\n * 全局配置存储\r\n */\r\nlet globalConfig: Required<\r\n Pick<RequestCoreConfig, \"successCodes\" | \"fieldAliases\">\r\n> = {\r\n successCodes: [200, 0, \"200\", \"0\"],\r\n fieldAliases: {\r\n data: [\"data\", \"list\", \"items\", \"records\"],\r\n list: [\"list\", \"items\", \"records\", \"rows\", \"data\"],\r\n total: [\"total\", \"totalCount\", \"count\", \"totalElements\"],\r\n },\r\n};\r\n\r\n/**\r\n * 获取全局配置\r\n */\r\nexport function getGlobalConfig() {\r\n return globalConfig;\r\n}\r\n\r\n/**\r\n * 拦截器配置\r\n *\r\n * @description\r\n * 用于配置 axios 请求和响应拦截器,处理 token 注入、业务码判断等业务逻辑\r\n */\r\nexport interface InterceptorConfig {\r\n /**\r\n * 请求拦截器\r\n * @description 在请求发送前执行,常用于注入 token、修改请求头等\r\n */\r\n request?: (\r\n config: InternalAxiosRequestConfig,\r\n ) => InternalAxiosRequestConfig | Promise<InternalAxiosRequestConfig>;\r\n\r\n /**\r\n * 请求错误拦截器\r\n * @description 请求配置阶段发生错误时执行\r\n */\r\n requestError?: (error: any) => any;\r\n\r\n /**\r\n * 响应拦截器\r\n * @description 响应到达后执行,常用于统一处理业务码、数据格式等\r\n */\r\n response?: (\r\n response: AxiosResponse,\r\n ) => AxiosResponse | Promise<AxiosResponse>;\r\n\r\n /**\r\n * 响应错误拦截器\r\n * @description 响应阶段发生错误时执行,常用于处理 401、403、500 等错误\r\n */\r\n responseError?: (error: any) => any;\r\n}\r\n\r\n/**\r\n * 字段别名配置\r\n *\r\n * @description\r\n * 用于自定义 API 响应的字段映射,适配不同的后端响应格式\r\n */\r\nexport interface FieldAliases {\r\n /**\r\n * 数据层字段别名(用于提取响应中的 data 层)\r\n * @default ['data', 'list', 'items', 'records']\r\n * @example ['result', 'payload']\r\n */\r\n data?: string[];\r\n\r\n /**\r\n * 列表字段别名(用于提取数据层中的列表数组)\r\n * @default ['list', 'items', 'records', 'rows', 'data']\r\n * @example ['employees', 'users', 'products']\r\n */\r\n list?: string[];\r\n\r\n /**\r\n * 总数字段别名(用于提取数据总数)\r\n * @default ['total', 'totalCount', 'count', 'totalElements']\r\n * @example ['totalRecords', 'totalItems']\r\n */\r\n total?: string[];\r\n}\r\n\r\n/**\r\n * Request Core 配置\r\n *\r\n * @description\r\n * 用于初始化 Request Core 实例,配置 axios 和拦截器\r\n */\r\nexport interface RequestCoreConfig {\r\n /**\r\n * Axios 基础配置\r\n * @description 包括 baseURL、timeout、headers 等,参考 axios 官方文档\r\n */\r\n request?: AxiosRequestConfig;\r\n\r\n /**\r\n * 拦截器配置\r\n * @description 用于处理 token 注入、业务码判断、错误提示等业务逻辑\r\n */\r\n interceptors?: InterceptorConfig;\r\n\r\n /**\r\n * 成功状态码配置\r\n * @description 用于判断 API 响应的业务状态码是否成功\r\n * @default [200, 0, '200', '0']\r\n * @example [1, '1', 'success']\r\n */\r\n successCodes?: Array<number | string>;\r\n\r\n /**\r\n * 字段别名配置\r\n * @description 用于自定义 API 响应的字段映射,适配不同的后端响应格式\r\n */\r\n fieldAliases?: FieldAliases;\r\n}\r\n\r\n/**\r\n * 创建 Request Core 实例\r\n *\r\n * @description\r\n * 初始化 axios 实例并注册 7 个内置插件(cache、retry、dedupe、cancel、request、response、reLogin)\r\n * 返回 Vue 插件对象和 axios 实例\r\n *\r\n * @param config Request Core 配置\r\n * @returns Vue 插件对象(包含 install 方法)和 axios 实例\r\n *\r\n * @example\r\n * ```ts\r\n * // main.ts\r\n * import { createRequestCore, onReLoginSuccess } from '@robot-admin/request-core'\r\n * import { useUserStore } from '@/stores/user'\r\n *\r\n * const requestCore = createRequestCore({\r\n * request: {\r\n * baseURL: import.meta.env.VITE_API_BASE,\r\n * timeout: 10000,\r\n * },\r\n * interceptors: {\r\n * // 请求拦截:注入 token\r\n * request: (config) => {\r\n * const token = localStorage.getItem('token')\r\n * if (token) {\r\n * config.headers.Authorization = `Bearer ${token}`\r\n * }\r\n * return config\r\n * },\r\n * // 响应拦截:处理业务码\r\n * response: (response) => {\r\n * const { code, message } = response.data\r\n * if (code !== 200) {\r\n * window.$message?.error(message || '请求失败')\r\n * return Promise.reject(new Error(message))\r\n * }\r\n * return response\r\n * },\r\n * // 响应错误拦截:处理 401\r\n * responseError: async (error) => {\r\n * if (error.response?.status === 401) {\r\n * // 触发重新登录逻辑\r\n * const userStore = useUserStore()\r\n * await userStore.reLogin()\r\n * onReLoginSuccess() // 通知所有等待的请求继续\r\n * return Promise.reject(error)\r\n * }\r\n * return Promise.reject(error)\r\n * }\r\n * }\r\n * })\r\n *\r\n * app.use(requestCore)\r\n * ```\r\n */\r\nexport function createRequestCore(config: RequestCoreConfig = {}) {\r\n const {\r\n request = {},\r\n interceptors = {},\r\n successCodes,\r\n fieldAliases,\r\n } = config;\r\n\r\n // 合并全局配置\r\n if (successCodes) {\r\n globalConfig.successCodes = successCodes;\r\n }\r\n if (fieldAliases) {\r\n globalConfig.fieldAliases = {\r\n data: fieldAliases.data || globalConfig.fieldAliases.data,\r\n list: fieldAliases.list || globalConfig.fieldAliases.list,\r\n total: fieldAliases.total || globalConfig.fieldAliases.total,\r\n };\r\n }\r\n\r\n // 创建 axios 实例\r\n const axiosInstance = createAxiosInstance(request);\r\n\r\n // 设置为全局实例\r\n setGlobalAxiosInstance(axiosInstance);\r\n\r\n // 注册拦截器\r\n if (interceptors.request) {\r\n axiosInstance.interceptors.request.use(\r\n interceptors.request,\r\n interceptors.requestError,\r\n );\r\n }\r\n\r\n if (interceptors.response) {\r\n axiosInstance.interceptors.response.use(\r\n interceptors.response,\r\n interceptors.responseError,\r\n );\r\n }\r\n\r\n return {\r\n install(app: App) {\r\n // 可以挂载到 app.config.globalProperties\r\n app.config.globalProperties.$axios = axiosInstance;\r\n },\r\n axiosInstance,\r\n };\r\n}\r\n","/*\n * @Author: ChenYu ycyplus@gmail.com\n * @Date: 2026-02-07 10:00:00\n * @LastEditors: ChenYu ycyplus@gmail.com\n * @LastEditTime: 2026-02-07 10:00:00\n * @FilePath: \\robot-admin-request-core\\src\\composables\\useTableCrud\\constants.ts\n * @Description: useTableCrud 常量定义\n * Copyright (c) 2026 by CHENY, All Rights Reserved 😎.\n */\n\n/**\n * 默认配置\n */\nexport const DEFAULT_CONFIG = {\n /** 默认 ID 字段名 */\n idKey: \"id\",\n /** 默认分页大小 */\n pageSize: 10,\n /** 默认启用分页 */\n paginationEnabled: true,\n /** 默认当前页 */\n currentPage: 1,\n} as const;\n\n/**\n * 响应字段别名配置(支持多种后端响应格式)\n */\n\n/** 数据字段别名(按优先级排序) - 用于从响应中提取数据层 */\nexport const DATA_FIELD_ALIASES = [\"data\", \"list\", \"items\", \"records\"] as const;\n\n/** 列表字段别名(按优先级排序) - 用于从数据层提取列表数组 */\nexport const LIST_FIELD_ALIASES = [\n \"list\",\n \"items\",\n \"records\",\n \"rows\",\n \"data\",\n] as const;\n\n/** 总数字段别名(按优先级排序) - 用于提取数据总数 */\nexport const TOTAL_FIELD_ALIASES = [\n \"total\",\n \"totalCount\",\n \"count\",\n \"totalElements\",\n] as const;\n\n/** 成功状态码(支持数字和字符串) */\nexport const SUCCESS_CODES = [200, 0, \"200\", \"0\"] as const;\n\n/**\n * 默认消息文本\n */\nexport const DEFAULT_MESSAGES = {\n createSuccess: \"新增成功\",\n updateSuccess: \"更新成功\",\n deleteSuccess: \"删除成功\",\n saveError: \"保存失败\",\n deleteError: \"删除失败\",\n loadError: \"数据加载失败\",\n detailError: \"详情获取失败\",\n noDeleteApi: \"未配置删除接口\",\n} as const;\n","/*\n * @Author: ChenYu ycyplus@gmail.com\n * @Date: 2026-02-07 10:00:00\n * @LastEditors: ChenYu ycyplus@gmail.com\n * @LastEditTime: 2026-02-07 10:00:00\n * @FilePath: \\robot-admin-request-core\\src\\composables\\useTableCrud\\utils.ts\n * @Description: useTableCrud 工具函数\n * Copyright (c) 2026 by CHENY, All Rights Reserved 😎.\n */\n\nimport type { DataRecord } from \"./types\";\nimport {\n DATA_FIELD_ALIASES,\n LIST_FIELD_ALIASES,\n TOTAL_FIELD_ALIASES,\n SUCCESS_CODES,\n} from \"./constants\";\nimport { getGlobalConfig } from \"../../core\";\n\n/**\n * 获取运行时字段别名(优先使用全局配置)\n */\nfunction getRuntimeFieldAliases() {\n const config = getGlobalConfig();\n return {\n data: config.fieldAliases.data || DATA_FIELD_ALIASES,\n list: config.fieldAliases.list || LIST_FIELD_ALIASES,\n total: config.fieldAliases.total || TOTAL_FIELD_ALIASES,\n };\n}\n\n/**\n * 获取运行时成功状态码(优先使用全局配置)\n */\nfunction getRuntimeSuccessCodes() {\n const config = getGlobalConfig();\n return config.successCodes || SUCCESS_CODES;\n}\n\n/**\n * 字段查找器(支持多种字段别名)\n */\nexport const FieldFinder = {\n /**\n * 查找第一个存在的字段值\n */\n findFirst<T>(\n obj: Record<string, any> | null | undefined,\n aliases: readonly string[],\n defaultValue: T,\n ): T {\n if (!obj || typeof obj !== \"object\") return defaultValue;\n\n for (const key of aliases) {\n if (key in obj && obj[key] !== undefined) {\n return obj[key] as T;\n }\n }\n return defaultValue;\n },\n\n /**\n * 查找第一个存在的数字字段\n */\n findNumber(\n obj: Record<string, any> | null | undefined,\n aliases: readonly string[],\n defaultValue = 0,\n ): number {\n const value = this.findFirst(obj, aliases, defaultValue);\n return Number(value) || defaultValue;\n },\n};\n\n/**\n * 响应标准化工具\n */\nexport const ResponseNormalizer = {\n /**\n * 判断响应是否成功\n */\n isSuccess(res: any): boolean {\n if (typeof res.success === \"boolean\") return res.success;\n // 使用运行时配置的成功状态码\n const successCodes = getRuntimeSuccessCodes();\n return (\n successCodes.includes(res.code) ||\n successCodes.includes(String(res.code) as any)\n );\n },\n\n /**\n * 标准化响应数据(提取 data 层)\n */\n normalize<T = any>(res: any): { data: T; success: boolean; raw: any } {\n // 如果响应没有标准结构,直接返回\n if (!res || typeof res !== \"object\" || !(\"data\" in res)) {\n return { data: res as T, success: true, raw: res };\n }\n\n const aliases = getRuntimeFieldAliases();\n return {\n data: FieldFinder.findFirst(res, aliases.data, res),\n success: ResponseNormalizer.isSuccess(res),\n raw: res,\n };\n },\n};\n\n/**\n * URL 工具\n */\nexport const UrlUtils = {\n /**\n * 构建 URL(处理路径参数)\n */\n buildUrl(endpoint: string, id?: string | number): string {\n if (id !== undefined && endpoint.includes(\":id\")) {\n return endpoint.replace(\":id\", String(id));\n }\n return endpoint;\n },\n};\n\n/**\n * 数据提取工具(增强版,支持多种响应格式)\n */\nexport const DataExtractor = {\n /**\n * 从响应中提取列表数据(支持多种格式)\n *\n * 支持的响应结构:\n * 1. { code: 0, data: { list: [...], total: 10 } } // 嵌套结构(最常见)\n * 2. { data: { items: [...], total: 10 } } // 嵌套结构\n * 3. { list: [...], total: 10 } // 扁平结构\n * 4. { items: [...], totalCount: 10 } // 不同字段名\n * 5. { data: [...] } // 直接数组\n * 6. [...] // 纯数组\n */\n extractList<T = any>(response: any): { items: T[]; total: number } {\n // 第一步:标准化响应,提取 data 层\n const normalized = ResponseNormalizer.normalize(response);\n const dataLayer = normalized.data ?? response;\n\n // 第二步:从 data 层提取列表数组(使用运行时配置)\n const aliases = getRuntimeFieldAliases();\n const list = FieldFinder.findFirst<any[]>(dataLayer, aliases.list, []);\n\n // 第三步:提取总数(使用运行时配置)\n const total = FieldFinder.findNumber(dataLayer, aliases.total, 0);\n\n return {\n items: Array.isArray(list) ? list : [],\n total,\n };\n },\n\n /**\n * 从响应中提取详情数据\n */\n extractDetail<T = any>(response: any): T | null {\n // 标准化响应\n const normalized = ResponseNormalizer.normalize(response);\n return normalized.data as T | null;\n },\n};\n\n/**\n * 行操作工具\n */\nexport const RowUtils = {\n /**\n * 从数组中查找行索引\n */\n findIndex<T extends DataRecord>(items: T[], idKey: keyof T, id: any): number {\n return items.findIndex((item) => item[idKey] === id);\n },\n\n /**\n * 从数组中移除行\n */\n remove<T extends DataRecord>(items: T[], idKey: keyof T, id: any): boolean {\n const index = this.findIndex(items, idKey, id);\n if (index !== -1) {\n items.splice(index, 1);\n return true;\n }\n return false;\n },\n\n /**\n * 生成默认 ID\n */\n generateId(): number {\n return Date.now() + Math.floor(Math.random() * 1000);\n },\n};\n","/*\n * @Author: ChenYu ycyplus@gmail.com\n * @Date: 2026-02-07 10:00:00\n * @LastEditors: ChenYu ycyplus@gmail.com\n * @LastEditTime: 2026-02-07 10:00:00\n * @FilePath: \\robot-admin-request-core\\src\\composables\\useTableCrud\\useTableCrud.ts\n * @Description: useTableCrud 核心逻辑 - CRUD + 分页 + 表单管理\n * Copyright (c) 2026 by CHENY, All Rights Reserved 😎.\n */\n\nimport { ref, reactive, computed, shallowRef } from \"vue\";\nimport { useMessage, useDialog } from \"naive-ui\";\nimport { getData, postData, putData, deleteData } from \"../../axios/request\";\nimport type {\n DataRecord,\n UseTableCrudConfig,\n UseTableCrudReturn,\n ActionContext,\n DetailModal,\n} from \"./types\";\nimport { DEFAULT_CONFIG, DEFAULT_MESSAGES } from \"./constants\";\nimport { UrlUtils, DataExtractor, RowUtils } from \"./utils\";\n\n/**\n * 表格 CRUD 组合式 API\n *\n * @description\n * 配置驱动的表格 CRUD 解决方案,极简使用,功能完整\n * 完全替代 usePageCrud,专注于表格场景\n *\n * @template T 数据行类型\n * @param config 配置对象\n * @returns 表格 CRUD 实例\n *\n * @example\n * ```ts\n * const table = useTableCrud<Employee>({\n * api: {\n * list: '/employees/list',\n * get: '/employees/:id',\n * update: '/employees/:id',\n * remove: '/employees/:id',\n * create: '/employees'\n * },\n * columns: [...],\n * customActions: [\n * {\n * key: 'copy',\n * label: '复制',\n * icon: 'mdi:content-copy',\n * handler: (row, ctx) => {\n * const newRow = { ...row, id: Date.now() }\n * ctx.data.unshift(newRow)\n * ctx.message.success('复制成功')\n * }\n * }\n * ]\n * })\n *\n * // 组件中使用\n * <c-table\n * v-model:data=\"table.data.value\"\n * :columns=\"table.columns.value\"\n * :actions=\"table.actions.value\"\n * @save=\"table.save\"\n * />\n * ```\n */\nexport function useTableCrud<T extends DataRecord>(\n config: UseTableCrudConfig<T>,\n): UseTableCrudReturn<T> {\n // ==================== 配置解析 ====================\n const {\n api,\n columns,\n customActions = [],\n detail: detailConfig,\n idKey = DEFAULT_CONFIG.idKey as keyof T,\n defaultPageSize = DEFAULT_CONFIG.pageSize,\n defaultPaginationEnabled = DEFAULT_CONFIG.paginationEnabled,\n autoLoad = true,\n extractListData,\n } = config;\n\n // ==================== 全局实例 ====================\n const message = useMessage();\n const dialog = useDialog();\n\n // ==================== 响应式状态 ====================\n const data = shallowRef<T[]>([]);\n const total = ref(0);\n const loading = ref(false);\n const tableRef = ref();\n const paginationEnabled = ref(defaultPaginationEnabled);\n\n // 分页状态\n const page: { current: number; size: number } = reactive({\n current: DEFAULT_CONFIG.currentPage,\n size: defaultPageSize,\n });\n\n // ==================== 详情弹窗 ====================\n const detailVisible = ref(false);\n const detailData = ref<T | null>(null);\n const detailTitle = ref(\"\");\n\n const detail: DetailModal<T> = {\n visible: detailVisible,\n data: detailData as any,\n title: detailTitle,\n show: (row: T) => {\n detailData.value = row;\n detailTitle.value = `详情 - ${(row as any).name || row[idKey]}`;\n detailVisible.value = true;\n },\n close: () => {\n detailVisible.value = false;\n detailData.value = null;\n detailTitle.value = \"\";\n },\n };\n\n // ==================== 核心方法 ====================\n\n /**\n * 刷新数据\n */\n const refresh = async (): Promise<void> => {\n if (!api.list) return;\n\n loading.value = true;\n try {\n const queryParams = paginationEnabled.value\n ? { page: page.current, pageSize: page.size }\n : {};\n\n const response = await getData(api.list, { params: queryParams });\n\n const extracted = extractListData\n ? extractListData(response)\n : DataExtractor.extractList<T>(response);\n\n data.value = extracted.items;\n total.value = extracted.total;\n } catch (error) {\n console.error(\"[useTableCrud] 数据加载失败:\", error);\n message.error(DEFAULT_MESSAGES.loadError);\n } finally {\n loading.value = false;\n }\n };\n\n /**\n * 获取详情\n */\n const getDetail = async (row: T): Promise<T | null> => {\n if (!api.get) {\n // 如果没有详情接口,直接显示当前数据\n detail.show(row);\n return row;\n }\n\n loading.value = true;\n try {\n const url = UrlUtils.buildUrl(api.get, row[idKey] as any);\n const response = await getData(url, {});\n const detailData = DataExtractor.extractDetail<T>(response);\n\n if (detailData) {\n detail.show(detailData);\n return detailData;\n }\n\n return null;\n } catch (error) {\n console.error(\"[useTableCrud] 详情获取失败:\", error);\n message.error(DEFAULT_MESSAGES.detailError);\n return null;\n } finally {\n loading.value = false;\n }\n };\n\n /**\n * 新增数据\n */\n const create = async (row: T): Promise<void> => {\n if (!api.create) {\n message.warning(\"未配置新增接口\");\n return;\n }\n\n loading.value = true;\n try {\n await postData(api.create, row);\n message.success(DEFAULT_MESSAGES.createSuccess);\n await refresh();\n } catch (error) {\n console.error(\"[useTableCrud] 新增失败:\", error);\n message.error(\"新增失败\");\n throw error;\n } finally {\n loading.value = false;\n }\n };\n\n /**\n * 更新数据\n */\n const save = async (row: T): Promise<void> => {\n if (!api.update) {\n message.warning(\"未配置更新接口\");\n return;\n }\n\n loading.value = true;\n try {\n const url = UrlUtils.buildUrl(api.update, row[idKey] as any);\n await putData(url, row);\n message.success(DEFAULT_MESSAGES.updateSuccess);\n await refresh();\n } catch (error) {\n console.error(\"[useTableCrud] 更新失败:\", error);\n message.error(DEFAULT_MESSAGES.saveError);\n throw error;\n } finally {\n loading.value = false;\n }\n };\n\n /**\n * 删除数据\n */\n const remove = async (row: T): Promise<void> => {\n if (!api.remove) {\n message.warning(DEFAULT_MESSAGES.noDeleteApi);\n return;\n }\n\n loading.value = true;\n try {\n const url = UrlUtils.buildUrl(api.remove, row[idKey] as any);\n await deleteData(url);\n message.success(DEFAULT_MESSAGES.deleteSuccess);\n\n // 从本地数据中移除\n RowUtils.remove(data.value, idKey, row[idKey]);\n\n await refresh();\n } catch (error) {\n console.error(\"[useTableCrud] 删除失败:\", error);\n message.error(DEFAULT_MESSAGES.deleteError);\n throw error;\n } finally {\n loading.value = false;\n }\n };\n\n /**\n * 批量删除数据\n */\n const batchRemove = async (rows: T[]): Promise<void> => {\n if (!rows || rows.length === 0) {\n message.warning(\"请选择要删除的数据\");\n return;\n }\n\n if (!api.remove && !api.batchRemove) {\n message.warning(DEFAULT_MESSAGES.noDeleteApi);\n return;\n }\n\n loading.value = true;\n try {\n if (api.batchRemove) {\n // 使用批量删除接口\n const ids = rows.map((row) => row[idKey]);\n await postData(api.batchRemove, { ids });\n } else {\n // 使用单个删除接口循环删除\n await Promise.all(\n rows.map((row) => {\n const url = UrlUtils.buildUrl(api.remove!, row[idKey] as any);\n return deleteData(url);\n }),\n );\n }\n\n message.success(`成功删除 ${rows.length} 条数据`);\n await refresh();\n } catch (error) {\n console.error(\"[useTableCrud] 批量删除失败:\", error);\n message.error(\"批量删除失败\");\n throw error;\n } finally {\n loading.value = false;\n }\n };\n\n // ==================== 事件处理 ====================\n\n /**\n * 处理取消编辑\n */\n const handleCancel = async (): Promise<void> => {\n // 取消编辑,刷新数据恢复原始状态\n await refresh();\n };\n\n /**\n * 处理分页变化\n */\n const handlePaginationChange = (pageNum: number, pageSize: number): void => {\n page.current = pageNum;\n page.size = pageSize;\n refresh();\n };\n\n /**\n * 处理行删除(UI层)\n */\n const handleRowDelete = (deletedRow: T): void => {\n RowUtils.remove(data.value, idKey, deletedRow[idKey]);\n };\n\n // ==================== 计算属性 ====================\n\n /**\n * 分页配置\n */\n const pagination = computed(() => {\n if (!paginationEnabled.value) return false;\n return {\n enabled: true,\n page: page.current,\n pageSize: page.size,\n };\n });\n\n /**\n * 操作上下文(用于自定义操作)\n */\n const createActionContext = (index: number): ActionContext<T> => ({\n data: data.value,\n index,\n page,\n paginationEnabled: paginationEnabled.value,\n message,\n dialog,\n refresh,\n });\n\n /**\n * 表格操作配置\n */\n const actions = computed(() => {\n const result: any = {};\n\n // 编辑操作\n if (api.update) {\n result.edit = async (row: T) => {\n try {\n await save(row);\n return { data: row, error: null };\n } catch (error) {\n return { data: null, error };\n }\n };\n }\n\n // 删除操作\n if (api.remove) {\n result.delete = async (row: T) => {\n try {\n await remove(row);\n return { data: { success: true }, error: null };\n } catch (error) {\n return { data: null, error };\n }\n };\n }\n\n // 详情操作\n if (api.get) {\n result.detail = async (row: T) => {\n try {\n const detailData = await getDetail(row);\n return { data: detailData, error: null };\n } catch (error) {\n return { data: null, error };\n }\n };\n }\n\n // 自定义操作\n if (customActions.length > 0) {\n result.custom = customActions.map((action) => ({\n key: action.key,\n label: action.label,\n icon: action.icon,\n type: action.type || \"default\",\n onClick: (row: T, index: number) => {\n const context = createActionContext(index);\n return action.handler(row, context);\n },\n }));\n }\n\n return result;\n });\n\n // ==================== 返回 ====================\n\n // 自动加载数据\n if (autoLoad) {\n refresh();\n }\n\n return {\n // 数据状态\n data,\n loading,\n total,\n\n // 表格配置\n columns: computed(() => columns),\n actions,\n tableRef,\n\n // 分页\n page,\n paginationEnabled,\n pagination,\n\n // 核心方法\n refresh,\n create,\n save,\n remove,\n batchRemove,\n getDetail,\n\n // 事件处理\n handleCancel,\n handlePaginationChange,\n handleRowDelete,\n\n // 详情弹窗\n detail,\n detailConfig,\n };\n}\n"]}
package/package.json ADDED
@@ -0,0 +1,59 @@
1
+ {
2
+ "name": "@robot-admin/request-core",
3
+ "version": "0.1.2",
4
+ "description": "Axios + 7 plugins + CRUD composables for Vue 3",
5
+ "type": "module",
6
+ "keywords": [
7
+ "vue",
8
+ "axios",
9
+ "crud",
10
+ "composables",
11
+ "request"
12
+ ],
13
+ "author": "ChenYu <ycyplus@gmail.com>",
14
+ "license": "MIT",
15
+ "repository": {
16
+ "type": "git",
17
+ "url": "https://github.com/ChenyCHENYU/robot-admin-packages",
18
+ "directory": "packages/request-core"
19
+ },
20
+ "main": "./dist/index.cjs",
21
+ "module": "./dist/index.js",
22
+ "types": "./dist/index.d.ts",
23
+ "exports": {
24
+ ".": {
25
+ "types": "./dist/index.d.ts",
26
+ "import": "./dist/index.js",
27
+ "require": "./dist/index.cjs"
28
+ }
29
+ },
30
+ "files": [
31
+ "dist",
32
+ "README.md"
33
+ ],
34
+ "publishConfig": {
35
+ "access": "public",
36
+ "registry": "https://registry.npmjs.org/"
37
+ },
38
+ "scripts": {
39
+ "dev": "tsup --watch",
40
+ "build": "tsup",
41
+ "clean": "rm -rf dist",
42
+ "type-check": "tsc --noEmit",
43
+ "prepublishOnly": "bun run build"
44
+ },
45
+ "peerDependencies": {
46
+ "vue": "^3.4.0",
47
+ "naive-ui": "^2.38.0"
48
+ },
49
+ "dependencies": {
50
+ "axios": "^1.7.0"
51
+ },
52
+ "devDependencies": {
53
+ "@types/node": "^20.14.0",
54
+ "typescript": "^5.8.0",
55
+ "tsup": "^8.1.0",
56
+ "vue": "^3.4.0",
57
+ "naive-ui": "^2.38.0"
58
+ }
59
+ }