giime 0.8.13 → 0.9.0-beta.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.
- package/dist/index.css +55 -56
- package/es/api/gstore/request.mjs +4 -8
- package/es/api/gstore/request.mjs.map +1 -1
- package/es/api/guardBasic/request.mjs +4 -7
- package/es/api/guardBasic/request.mjs.map +1 -1
- package/es/api/materialApi/request.mjs +4 -7
- package/es/api/materialApi/request.mjs.map +1 -1
- package/es/api/productCenter/request.mjs +4 -7
- package/es/api/productCenter/request.mjs.map +1 -1
- package/es/api/resource/request.mjs +4 -7
- package/es/api/resource/request.mjs.map +1 -1
- package/es/api/shopAdmin/request.mjs +4 -10
- package/es/api/shopAdmin/request.mjs.map +1 -1
- package/es/api/utils/createModes.mjs +1 -1
- package/es/api/utils/index.mjs +1 -1
- package/es/api/utils/resetAxiosBaseUrl.d.ts +2 -4
- package/es/api/utils/resetAxiosBaseUrl.mjs +10 -6
- package/es/api/utils/resetAxiosBaseUrl.mjs.map +1 -1
- package/es/components/src/business/loginDialog/LoginDialog.vue2.mjs +15 -18
- package/es/components/src/business/loginDialog/LoginDialog.vue2.mjs.map +1 -1
- package/es/giime/index.mjs +4 -2
- package/es/giime/index.mjs.map +1 -1
- package/es/giime/version.d.ts +1 -1
- package/es/giime/version.mjs +1 -1
- package/es/giime/version.mjs.map +1 -1
- package/es/hooks/base/index.mjs +1 -1
- package/es/hooks/base/useDownload/index.d.ts +20 -0
- package/es/hooks/base/useDownload/index.mjs +1 -1
- package/es/hooks/base/useDownload/index.mjs.map +1 -1
- package/es/hooks/index.mjs +1 -1
- package/es/index.css +55 -56
- package/es/utils/__tests__/http/devProxy.test.d.ts +1 -0
- package/es/utils/index.d.ts +1 -0
- package/es/utils/index.mjs +3 -1
- package/es/utils/index.mjs.map +1 -1
- package/es/utils/src/http/createModes.d.ts +23 -0
- package/es/utils/src/http/createModes.mjs +26 -13
- package/es/utils/src/http/createModes.mjs.map +1 -1
- package/es/utils/src/http/devProxy.d.ts +89 -2
- package/es/utils/src/http/devProxy.mjs +59 -53
- package/es/utils/src/http/devProxy.mjs.map +1 -1
- package/es/utils/src/http/index.d.ts +1 -0
- package/es/utils/src/http/index.mjs +2 -1
- package/es/utils/src/http/index.mjs.map +1 -1
- package/es/utils/src/tenant.d.ts +19 -0
- package/es/utils/src/tenant.mjs +22 -0
- package/es/utils/src/tenant.mjs.map +1 -0
- package/lib/api/gstore/request.js +4 -8
- package/lib/api/gstore/request.js.map +1 -1
- package/lib/api/guardBasic/request.js +4 -7
- package/lib/api/guardBasic/request.js.map +1 -1
- package/lib/api/materialApi/request.js +4 -7
- package/lib/api/materialApi/request.js.map +1 -1
- package/lib/api/productCenter/request.js +4 -7
- package/lib/api/productCenter/request.js.map +1 -1
- package/lib/api/resource/request.js +4 -7
- package/lib/api/resource/request.js.map +1 -1
- package/lib/api/shopAdmin/request.js +4 -10
- package/lib/api/shopAdmin/request.js.map +1 -1
- package/lib/api/utils/createModes.js +2 -0
- package/lib/api/utils/createModes.js.map +1 -1
- package/lib/api/utils/index.js +2 -0
- package/lib/api/utils/index.js.map +1 -1
- package/lib/api/utils/resetAxiosBaseUrl.d.ts +2 -4
- package/lib/api/utils/resetAxiosBaseUrl.js +10 -6
- package/lib/api/utils/resetAxiosBaseUrl.js.map +1 -1
- package/lib/components/src/business/loginDialog/LoginDialog.vue2.js +14 -17
- package/lib/components/src/business/loginDialog/LoginDialog.vue2.js.map +1 -1
- package/lib/giime/index.js +11 -0
- package/lib/giime/index.js.map +1 -1
- package/lib/giime/version.d.ts +1 -1
- package/lib/giime/version.js +1 -1
- package/lib/giime/version.js.map +1 -1
- package/lib/hooks/base/index.js +3 -0
- package/lib/hooks/base/index.js.map +1 -1
- package/lib/hooks/base/useDownload/index.d.ts +20 -0
- package/lib/hooks/base/useDownload/index.js +3 -0
- package/lib/hooks/base/useDownload/index.js.map +1 -1
- package/lib/hooks/index.js +3 -0
- package/lib/hooks/index.js.map +1 -1
- package/lib/index.css +55 -56
- package/lib/utils/__tests__/http/devProxy.test.d.ts +1 -0
- package/lib/utils/index.d.ts +1 -0
- package/lib/utils/index.js +8 -0
- package/lib/utils/index.js.map +1 -1
- package/lib/utils/src/http/createModes.d.ts +23 -0
- package/lib/utils/src/http/createModes.js +27 -12
- package/lib/utils/src/http/createModes.js.map +1 -1
- package/lib/utils/src/http/devProxy.d.ts +89 -2
- package/lib/utils/src/http/devProxy.js +58 -51
- package/lib/utils/src/http/devProxy.js.map +1 -1
- package/lib/utils/src/http/index.d.ts +1 -0
- package/lib/utils/src/http/index.js +4 -0
- package/lib/utils/src/http/index.js.map +1 -1
- package/lib/utils/src/tenant.d.ts +19 -0
- package/lib/utils/src/tenant.js +26 -0
- package/lib/utils/src/tenant.js.map +1 -0
- package/package.json +1 -1
|
@@ -18,3 +18,23 @@ export declare const useDownload: () => {
|
|
|
18
18
|
downloadToZip: (fileList: DateownloadZipItem[], filename: string) => Promise<unknown>;
|
|
19
19
|
downloadFolderToZip: (fileList: DownloadFolderItem[], zipName?: string) => Promise<boolean>;
|
|
20
20
|
};
|
|
21
|
+
/**
|
|
22
|
+
* 从 URL 中提取文件名
|
|
23
|
+
* @param url 文件URL
|
|
24
|
+
* @returns 文件名
|
|
25
|
+
*/
|
|
26
|
+
export declare const getUrlFilename: (url: string) => string;
|
|
27
|
+
/**
|
|
28
|
+
* 从文件名中提取扩展名
|
|
29
|
+
* @param filename 文件名
|
|
30
|
+
* @returns 扩展名(包含.)或空字符串
|
|
31
|
+
*/
|
|
32
|
+
export declare const getFileExtension: (filename: string) => string;
|
|
33
|
+
/**
|
|
34
|
+
* 确保文件名包含正确的扩展名
|
|
35
|
+
* 如果传入的 filename 没有扩展名,则从 URL 中提取扩展名并追加
|
|
36
|
+
* @param filename 传入的文件名
|
|
37
|
+
* @param url 文件URL
|
|
38
|
+
* @returns 带有扩展名的文件名
|
|
39
|
+
*/
|
|
40
|
+
export declare const ensureFilenameWithExtension: (filename: string | undefined, url: string) => string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../../../../../packages/hooks/base/useDownload/index.ts"],"sourcesContent":["import { h, ref } from 'vue';\nimport FileSaver from 'file-saver';\n\nimport GmNotification from '@giime/components/src/plugins/notification';\nimport { v4 as uuidv4 } from 'uuid';\nimport JSZip from 'jszip';\nimport { GmMessage } from '@giime/components/src/plugins/message';\nimport type { AxiosResponse } from 'axios';\nimport { isString } from '@giime/utils';\n\nexport interface DownloadOptions {\n filename?: string;\n}\nexport interface DateownloadZipItem {\n url: string;\n filename?: string;\n}\n\nexport interface DownloadFolderItem {\n url: string;\n /** 资源所在文件夹名称多级使用 / 隔开 例如:一级文件夹/二级文件夹/三级文件夹 */\n folder?: string;\n filename?: string;\n}\n\nexport const useDownload = () => {\n /**\n * 通过url下载\n * @param url\n * @param options\n */\n const downloadByUrl = async (url: string, options?: DownloadOptions) => {\n const filename = options?.filename || getUrlFilename(url);\n const curId = uuidv4();\n const modalInfo = GmNotification({\n title: '下载中',\n message: h('div', { className: curId }, [`当前下载进度 0%`]),\n duration: 0,\n });\n try {\n await createDownload({\n url,\n filename,\n uuid: curId,\n });\n } finally {\n modalInfo.close();\n }\n };\n /**\n * 通过接口响应结果下载\n * @param res\n * @param options\n */\n const downloadByRes = async (res: AxiosResponse<any, any>, options?: DownloadOptions) => {\n const filename =\n options?.filename || getFileNameFromContentDisposition(res?.headers?.['content-disposition'] || res?.headers?.['Content-Disposition']);\n const resBlob = await res.data;\n const curId = uuidv4();\n const modalInfo = GmNotification({\n title: '下载中',\n message: h('div', { className: curId }, [`当前下载进度 0%`]),\n duration: 0,\n });\n // 设置type类型\n const blob = new Blob([resBlob]);\n const fileUrl = window.URL.createObjectURL(blob);\n try {\n await createDownload({\n url: fileUrl,\n filename,\n uuid: curId,\n });\n } finally {\n modalInfo.close();\n }\n };\n /**\n * 下载多文件 转为zip\n * @param fileList\n * @param filename\n */\n const downloadToZip = async (fileList: DateownloadZipItem[], filename: string) => {\n return new Promise((resolve, reject) => {\n const currentContentClass = `message${Date.now()}`;\n const downloadCount = ref(0);\n const len = fileList.length;\n const modalInfo = GmNotification({\n title: '下载中',\n message: h('div', [h('div', { className: currentContentClass }, [`总下载文件数:${len},已下载文件数:${downloadCount.value}`])]),\n duration: 0,\n });\n // h('div', { className: currentClass }, [`当前下载进度 ${progress.value}%`]),\n const zipInstance = new JSZip();\n for (let i = 0; i < len; i++) {\n const currentItem = fileList[i];\n // const fileBlob = await\n const downblobOptions = {\n url: currentItem.url,\n filename: ensureFilenameWithExtension(currentItem.filename, currentItem.url),\n isZip: true,\n };\n createDownload(downblobOptions)\n .then(res => {\n zipInstance.file(downblobOptions.filename, res);\n downloadCount.value++;\n editElementContent(currentContentClass, `总下载文件数:${len},已下载文件数:${downloadCount.value}`);\n if (downloadCount.value == len) {\n editElementContent(currentContentClass, `正在合并...`);\n zipInstance\n .generateAsync({ type: 'blob' })\n .then(async res => {\n modalInfo.close();\n\n const fileUrl = window.URL.createObjectURL(res);\n // FileSaver.saveAs(res, filename);\n await downloadByUrl(fileUrl, { filename });\n resolve(true);\n })\n .catch(error => {\n console.error('error', error);\n reject(error);\n });\n }\n })\n .catch(error => {\n reject(error);\n modalInfo.close();\n });\n }\n });\n };\n const createDownload = (options: { url: string; filename: string; uuid?: string; isZip?: boolean }) => {\n return new Promise<Blob>((resolve, reject) => {\n // 创建一个新的 XMLHttpRequest 对象\n const xhr = new XMLHttpRequest();\n // 初始化一个GET请求\n xhr.open('GET', options.url, true);\n xhr.responseType = 'blob'; // 设置响应类型为blob,以便处理二进制文件\n\n // 监听 progress 事件\n xhr.onprogress = function (event) {\n if (event.lengthComputable) {\n const percentComplete = Math.floor((event.loaded / event.total) * 100);\n if (options.uuid) {\n editElementContent(options.uuid, `当前下载进度 ${percentComplete}%`);\n }\n }\n };\n\n // 监听 load 事件,表示下载完成\n xhr.onload = function (e) {\n const eventTarget = e.target as XMLHttpRequest;\n if ([200, 304].includes(eventTarget.status)) {\n const blob = eventTarget.response;\n // const url = window.URL.createObjectURL(blob);\n if (!options.isZip) {\n FileSaver.saveAs(blob, options.filename);\n GmNotification({\n type: 'success',\n title: '温馨提示',\n message: '下载完成',\n duration: 3000,\n });\n }\n\n resolve(blob);\n } else if (eventTarget.status === 404) {\n GmMessage.error('文件不存在,或已被删除');\n reject(e);\n } else {\n GmMessage.error('下载异常,请重试!');\n reject(e);\n }\n };\n\n // 监听 error 事件\n xhr.onerror = function (e) {\n GmMessage.error('下载异常,请重试');\n reject(e);\n };\n\n // 发送请求\n xhr.send();\n });\n };\n\n /**\n * - 下载文件夹和文件 支持文件夹结构\n *\n * - 如果下载多级文件夹则文件所属文件夹路径使用 / 隔开\n *\n * - 文件夹路径folder结构为:一级文件夹/二级文件夹/三级文件夹...\n * @param fileList 文件列表\n * @param zipName zip文件名,默认为 '资源+当前时间戳'\n */\n const downloadFolderToZip = async (fileList: DownloadFolderItem[], zipName?: string) => {\n const finalZipName = zipName || `资源${Date.now()}`;\n const currentContentClass = `message${Date.now()}`;\n const downloadCount = ref(0);\n const errorCount = ref(0);\n const totalCount = fileList.length;\n\n const modalInfo = GmNotification({\n title: '下载中',\n message: h('div', [\n h('div', { className: currentContentClass }, [`总文件数:${totalCount},已下载:${downloadCount.value},失败:${errorCount.value}`]),\n ]),\n duration: 0,\n });\n\n const zipInstance = new JSZip();\n const concurrentLimit = 5;\n let currentIndex = 0;\n\n const downloadSingleFile = async (item: DownloadFolderItem): Promise<void> => {\n try {\n // 如果 url 为空,只创建文件夹(如果有 folder 的话)\n if (!item.url) {\n if (item.folder) {\n zipInstance.folder(item.folder);\n }\n downloadCount.value++;\n editElementContent(currentContentClass, `总文件数:${totalCount},已下载:${downloadCount.value},失败:${errorCount.value}`);\n return;\n }\n\n // 确保文件名不为空且包含正确的扩展名\n const finalFilename = ensureFilenameWithExtension(item.filename, item.url);\n\n const blob = await createDownload({\n url: item.url,\n filename: finalFilename,\n isZip: true,\n });\n\n // 构建文件在zip中的路径,使用处理后的文件名\n const filePath = item.folder ? `${item.folder}/${finalFilename}` : finalFilename;\n zipInstance.file(filePath, blob);\n\n downloadCount.value++;\n editElementContent(currentContentClass, `总文件数:${totalCount},已下载:${downloadCount.value},失败:${errorCount.value}`);\n } catch (error) {\n console.error(`下载文件失败: ${item.filename}`, error);\n errorCount.value++;\n editElementContent(currentContentClass, `总文件数:${totalCount},已下载:${downloadCount.value},失败:${errorCount.value}`);\n }\n };\n\n const processNextBatch = async (): Promise<void> => {\n const batch: Promise<void>[] = [];\n\n for (let i = 0; i < concurrentLimit && currentIndex < fileList.length; i++) {\n const item = fileList[currentIndex++];\n batch.push(downloadSingleFile(item));\n }\n\n if (batch.length > 0) {\n await Promise.all(batch);\n if (currentIndex < fileList.length) {\n await processNextBatch();\n }\n }\n };\n\n try {\n await processNextBatch();\n\n editElementContent(currentContentClass, `正在打包zip文件...`);\n\n const zipBlob = await zipInstance.generateAsync({ type: 'blob' });\n modalInfo.close();\n\n FileSaver.saveAs(zipBlob, `${finalZipName}.zip`);\n\n if (errorCount.value > 0) {\n GmNotification({\n type: 'warning',\n title: '温馨提示',\n message: `成功下载 ${downloadCount.value} 个文件,${errorCount.value} 个文件下载失败`,\n duration: 5000,\n });\n } else {\n GmNotification({\n type: 'success',\n title: '温馨提示',\n message: `成功下载 ${downloadCount.value} 个文件`,\n duration: 3000,\n });\n }\n\n return true;\n } catch (error) {\n modalInfo.close();\n GmMessage.error('打包下载失败,请重试');\n throw error;\n }\n };\n\n return { downloadByUrl, downloadByRes, downloadToZip, downloadFolderToZip };\n};\n\n// 动态更新 notify 中的message 信息\nconst editElementContent = (className: string, content: string) => {\n // eslint-disable-next-line unicorn/prefer-query-selector\n const currentEle = document.getElementsByClassName(className)[0];\n if (currentEle) {\n currentEle.innerHTML = content;\n }\n};\n\n/**\n * 从 Content-Disposition 头中解析文件名,兼容 RFC 5987、RFC 6266 和传统标准\n * @param {string} [disposition] - Content-Disposition 头内容\n * @returns {string} 解析后的文件名,默认返回 'file'\n */\nconst getFileNameFromContentDisposition = (disposition?: string) => {\n if (!disposition || !isString(disposition)) {\n return 'file';\n }\n\n const normalized = disposition.replace(/\\s+/g, '');\n\n try {\n // RFC 5987: filename*=UTF-8''encoded-filename\n const rfc5987Match = normalized.match(/filename\\*=UTF-8''([^;]+)/i);\n if (rfc5987Match) {\n return decodeURIComponent(rfc5987Match[1]);\n }\n\n // 标准: filename=\"filename\" 或 filename=filename\n const standardMatch = normalized.match(/filename[^;=\\n]*=((['\"]).*?\\2|[^;\\n]*)/i);\n if (standardMatch) {\n return decodeURIComponent(standardMatch[1].replace(/['\"]/g, ''));\n }\n\n return 'file';\n } catch (error) {\n console.error(error);\n return 'filename-error';\n }\n};\n\n/**\n * 从 URL 中提取文件名\n * @param url 文件URL\n * @returns 文件名\n */\nconst getUrlFilename = (url: string): string => {\n // 先去掉查询参数,再提取文件名(避免查询参数中的 / 干扰)\n const urlWithoutQuery = url.split('?')[0];\n const filename = urlWithoutQuery.split('/').pop() || 'file';\n return filename;\n};\n\n/**\n * 从文件名中提取扩展名\n * @param filename 文件名\n * @returns 扩展名(包含.)或空字符串\n */\nconst getFileExtension = (filename: string): string => {\n const match = filename.match(/\\.[^./\\\\]+$/);\n return match ? match[0] : '';\n};\n\n/**\n * 确保文件名包含正确的扩展名\n * 如果传入的 filename 没有扩展名,则从 URL 中提取扩展名并追加\n * @param filename 传入的文件名\n * @param url 文件URL\n * @returns 带有扩展名的文件名\n */\nconst ensureFilenameWithExtension = (filename: string | undefined, url: string): string => {\n // 如果没有传入 filename,直接从 URL 获取\n if (!filename) {\n return getUrlFilename(url);\n }\n\n // 检查 filename 是否已有扩展名\n if (getFileExtension(filename)) {\n return filename;\n }\n\n // 从 URL 中获取扩展名并追加\n const urlFilename = getUrlFilename(url);\n const extension = getFileExtension(urlFilename);\n\n return filename + extension;\n};\n"],"names":["uuidv4","res"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../../../../../packages/hooks/base/useDownload/index.ts"],"sourcesContent":["import { h, ref } from 'vue';\nimport FileSaver from 'file-saver';\n\nimport GmNotification from '@giime/components/src/plugins/notification';\nimport { v4 as uuidv4 } from 'uuid';\nimport JSZip from 'jszip';\nimport { GmMessage } from '@giime/components/src/plugins/message';\nimport type { AxiosResponse } from 'axios';\nimport { isString } from '@giime/utils';\n\nexport interface DownloadOptions {\n filename?: string;\n}\nexport interface DateownloadZipItem {\n url: string;\n filename?: string;\n}\n\nexport interface DownloadFolderItem {\n url: string;\n /** 资源所在文件夹名称多级使用 / 隔开 例如:一级文件夹/二级文件夹/三级文件夹 */\n folder?: string;\n filename?: string;\n}\n\nexport const useDownload = () => {\n /**\n * 通过url下载\n * @param url\n * @param options\n */\n const downloadByUrl = async (url: string, options?: DownloadOptions) => {\n const filename = options?.filename || getUrlFilename(url);\n const curId = uuidv4();\n const modalInfo = GmNotification({\n title: '下载中',\n message: h('div', { className: curId }, [`当前下载进度 0%`]),\n duration: 0,\n });\n try {\n await createDownload({\n url,\n filename,\n uuid: curId,\n });\n } finally {\n modalInfo.close();\n }\n };\n /**\n * 通过接口响应结果下载\n * @param res\n * @param options\n */\n const downloadByRes = async (res: AxiosResponse<any, any>, options?: DownloadOptions) => {\n const filename =\n options?.filename || getFileNameFromContentDisposition(res?.headers?.['content-disposition'] || res?.headers?.['Content-Disposition']);\n const resBlob = await res.data;\n const curId = uuidv4();\n const modalInfo = GmNotification({\n title: '下载中',\n message: h('div', { className: curId }, [`当前下载进度 0%`]),\n duration: 0,\n });\n // 设置type类型\n const blob = new Blob([resBlob]);\n const fileUrl = window.URL.createObjectURL(blob);\n try {\n await createDownload({\n url: fileUrl,\n filename,\n uuid: curId,\n });\n } finally {\n modalInfo.close();\n }\n };\n /**\n * 下载多文件 转为zip\n * @param fileList\n * @param filename\n */\n const downloadToZip = async (fileList: DateownloadZipItem[], filename: string) => {\n return new Promise((resolve, reject) => {\n const currentContentClass = `message${Date.now()}`;\n const downloadCount = ref(0);\n const len = fileList.length;\n const modalInfo = GmNotification({\n title: '下载中',\n message: h('div', [h('div', { className: currentContentClass }, [`总下载文件数:${len},已下载文件数:${downloadCount.value}`])]),\n duration: 0,\n });\n // h('div', { className: currentClass }, [`当前下载进度 ${progress.value}%`]),\n const zipInstance = new JSZip();\n for (let i = 0; i < len; i++) {\n const currentItem = fileList[i];\n // const fileBlob = await\n const downblobOptions = {\n url: currentItem.url,\n filename: ensureFilenameWithExtension(currentItem.filename, currentItem.url),\n isZip: true,\n };\n createDownload(downblobOptions)\n .then(res => {\n zipInstance.file(downblobOptions.filename, res);\n downloadCount.value++;\n editElementContent(currentContentClass, `总下载文件数:${len},已下载文件数:${downloadCount.value}`);\n if (downloadCount.value == len) {\n editElementContent(currentContentClass, `正在合并...`);\n zipInstance\n .generateAsync({ type: 'blob' })\n .then(async res => {\n modalInfo.close();\n\n const fileUrl = window.URL.createObjectURL(res);\n // FileSaver.saveAs(res, filename);\n await downloadByUrl(fileUrl, { filename });\n resolve(true);\n })\n .catch(error => {\n console.error('error', error);\n reject(error);\n });\n }\n })\n .catch(error => {\n reject(error);\n modalInfo.close();\n });\n }\n });\n };\n const createDownload = (options: { url: string; filename: string; uuid?: string; isZip?: boolean }) => {\n return new Promise<Blob>((resolve, reject) => {\n // 创建一个新的 XMLHttpRequest 对象\n const xhr = new XMLHttpRequest();\n // 初始化一个GET请求\n xhr.open('GET', options.url, true);\n xhr.responseType = 'blob'; // 设置响应类型为blob,以便处理二进制文件\n\n // 监听 progress 事件\n xhr.onprogress = function (event) {\n if (event.lengthComputable) {\n const percentComplete = Math.floor((event.loaded / event.total) * 100);\n if (options.uuid) {\n editElementContent(options.uuid, `当前下载进度 ${percentComplete}%`);\n }\n }\n };\n\n // 监听 load 事件,表示下载完成\n xhr.onload = function (e) {\n const eventTarget = e.target as XMLHttpRequest;\n if ([200, 304].includes(eventTarget.status)) {\n const blob = eventTarget.response;\n // const url = window.URL.createObjectURL(blob);\n if (!options.isZip) {\n FileSaver.saveAs(blob, options.filename);\n GmNotification({\n type: 'success',\n title: '温馨提示',\n message: '下载完成',\n duration: 3000,\n });\n }\n\n resolve(blob);\n } else if (eventTarget.status === 404) {\n GmMessage.error('文件不存在,或已被删除');\n reject(e);\n } else {\n GmMessage.error('下载异常,请重试!');\n reject(e);\n }\n };\n\n // 监听 error 事件\n xhr.onerror = function (e) {\n GmMessage.error('下载异常,请重试');\n reject(e);\n };\n\n // 发送请求\n xhr.send();\n });\n };\n\n /**\n * - 下载文件夹和文件 支持文件夹结构\n *\n * - 如果下载多级文件夹则文件所属文件夹路径使用 / 隔开\n *\n * - 文件夹路径folder结构为:一级文件夹/二级文件夹/三级文件夹...\n * @param fileList 文件列表\n * @param zipName zip文件名,默认为 '资源+当前时间戳'\n */\n const downloadFolderToZip = async (fileList: DownloadFolderItem[], zipName?: string) => {\n const finalZipName = zipName || `资源${Date.now()}`;\n const currentContentClass = `message${Date.now()}`;\n const downloadCount = ref(0);\n const errorCount = ref(0);\n const totalCount = fileList.length;\n\n const modalInfo = GmNotification({\n title: '下载中',\n message: h('div', [\n h('div', { className: currentContentClass }, [`总文件数:${totalCount},已下载:${downloadCount.value},失败:${errorCount.value}`]),\n ]),\n duration: 0,\n });\n\n const zipInstance = new JSZip();\n const concurrentLimit = 5;\n let currentIndex = 0;\n\n const downloadSingleFile = async (item: DownloadFolderItem): Promise<void> => {\n try {\n // 如果 url 为空,只创建文件夹(如果有 folder 的话)\n if (!item.url) {\n if (item.folder) {\n zipInstance.folder(item.folder);\n }\n downloadCount.value++;\n editElementContent(currentContentClass, `总文件数:${totalCount},已下载:${downloadCount.value},失败:${errorCount.value}`);\n return;\n }\n\n // 确保文件名不为空且包含正确的扩展名\n const finalFilename = ensureFilenameWithExtension(item.filename, item.url);\n\n const blob = await createDownload({\n url: item.url,\n filename: finalFilename,\n isZip: true,\n });\n\n // 构建文件在zip中的路径,使用处理后的文件名\n const filePath = item.folder ? `${item.folder}/${finalFilename}` : finalFilename;\n zipInstance.file(filePath, blob);\n\n downloadCount.value++;\n editElementContent(currentContentClass, `总文件数:${totalCount},已下载:${downloadCount.value},失败:${errorCount.value}`);\n } catch (error) {\n console.error(`下载文件失败: ${item.filename}`, error);\n errorCount.value++;\n editElementContent(currentContentClass, `总文件数:${totalCount},已下载:${downloadCount.value},失败:${errorCount.value}`);\n }\n };\n\n const processNextBatch = async (): Promise<void> => {\n const batch: Promise<void>[] = [];\n\n for (let i = 0; i < concurrentLimit && currentIndex < fileList.length; i++) {\n const item = fileList[currentIndex++];\n batch.push(downloadSingleFile(item));\n }\n\n if (batch.length > 0) {\n await Promise.all(batch);\n if (currentIndex < fileList.length) {\n await processNextBatch();\n }\n }\n };\n\n try {\n await processNextBatch();\n\n editElementContent(currentContentClass, `正在打包zip文件...`);\n\n const zipBlob = await zipInstance.generateAsync({ type: 'blob' });\n modalInfo.close();\n\n FileSaver.saveAs(zipBlob, `${finalZipName}.zip`);\n\n if (errorCount.value > 0) {\n GmNotification({\n type: 'warning',\n title: '温馨提示',\n message: `成功下载 ${downloadCount.value} 个文件,${errorCount.value} 个文件下载失败`,\n duration: 5000,\n });\n } else {\n GmNotification({\n type: 'success',\n title: '温馨提示',\n message: `成功下载 ${downloadCount.value} 个文件`,\n duration: 3000,\n });\n }\n\n return true;\n } catch (error) {\n modalInfo.close();\n GmMessage.error('打包下载失败,请重试');\n throw error;\n }\n };\n\n return { downloadByUrl, downloadByRes, downloadToZip, downloadFolderToZip };\n};\n\n// 动态更新 notify 中的message 信息\nconst editElementContent = (className: string, content: string) => {\n // eslint-disable-next-line unicorn/prefer-query-selector\n const currentEle = document.getElementsByClassName(className)[0];\n if (currentEle) {\n currentEle.innerHTML = content;\n }\n};\n\n/**\n * 从 Content-Disposition 头中解析文件名,兼容 RFC 5987、RFC 6266 和传统标准\n * @param {string} [disposition] - Content-Disposition 头内容\n * @returns {string} 解析后的文件名,默认返回 'file'\n */\nconst getFileNameFromContentDisposition = (disposition?: string) => {\n if (!disposition || !isString(disposition)) {\n return 'file';\n }\n\n const normalized = disposition.replace(/\\s+/g, '');\n\n try {\n // RFC 5987: filename*=UTF-8''encoded-filename\n const rfc5987Match = normalized.match(/filename\\*=UTF-8''([^;]+)/i);\n if (rfc5987Match) {\n return decodeURIComponent(rfc5987Match[1]);\n }\n\n // 标准: filename=\"filename\" 或 filename=filename\n const standardMatch = normalized.match(/filename[^;=\\n]*=((['\"]).*?\\2|[^;\\n]*)/i);\n if (standardMatch) {\n return decodeURIComponent(standardMatch[1].replace(/['\"]/g, ''));\n }\n\n return 'file';\n } catch (error) {\n console.error(error);\n return 'filename-error';\n }\n};\n\n/**\n * 从 URL 中提取文件名\n * @param url 文件URL\n * @returns 文件名\n */\nexport const getUrlFilename = (url: string): string => {\n // 先去掉查询参数,再提取文件名(避免查询参数中的 / 干扰)\n const urlWithoutQuery = url.split('?')[0];\n const filename = urlWithoutQuery.split('/').pop() || 'file';\n return filename;\n};\n\n/**\n * 从文件名中提取扩展名\n * @param filename 文件名\n * @returns 扩展名(包含.)或空字符串\n */\nexport const getFileExtension = (filename: string): string => {\n const match = filename.match(/\\.[^./\\\\]+$/);\n return match ? match[0] : '';\n};\n\n/**\n * 确保文件名包含正确的扩展名\n * 如果传入的 filename 没有扩展名,则从 URL 中提取扩展名并追加\n * @param filename 传入的文件名\n * @param url 文件URL\n * @returns 带有扩展名的文件名\n */\nexport const ensureFilenameWithExtension = (filename: string | undefined, url: string): string => {\n // 如果没有传入 filename,直接从 URL 获取\n if (!filename) {\n return getUrlFilename(url);\n }\n\n // 检查 filename 是否已有扩展名\n if (getFileExtension(filename)) {\n return filename;\n }\n\n // 从 URL 中获取扩展名并追加\n const urlFilename = getUrlFilename(url);\n const extension = getFileExtension(urlFilename);\n\n return filename + extension;\n};\n"],"names":["uuidv4","res"],"mappings":"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"}
|
package/es/hooks/index.mjs
CHANGED
|
@@ -2,7 +2,7 @@ import './base/index.mjs';
|
|
|
2
2
|
import './store/index.mjs';
|
|
3
3
|
export { useCheckAll } from './base/useCheckAll/index.mjs';
|
|
4
4
|
export { useIDBKeyval } from './base/useIDBKeyval/index.mjs';
|
|
5
|
-
export { useDownload } from './base/useDownload/index.mjs';
|
|
5
|
+
export { ensureFilenameWithExtension, getFileExtension, getUrlFilename, useDownload } from './base/useDownload/index.mjs';
|
|
6
6
|
export { useLoading } from './base/useLoading/index.mjs';
|
|
7
7
|
export { useTimeoutPromise } from './base/useTimeout/index.mjs';
|
|
8
8
|
export { useRectSelect } from './base/useRectSelect/index.mjs';
|
package/es/index.css
CHANGED
|
@@ -983,61 +983,10 @@ video {
|
|
|
983
983
|
.gm-number-interval-single[data-v-4e6f4d6f]:hover .gm-number-interval-close[data-v-4e6f4d6f] {
|
|
984
984
|
display: flex;
|
|
985
985
|
}
|
|
986
|
-
.gm-flex-center[data-v-c17deec9] {
|
|
987
|
-
align-items: center;
|
|
988
|
-
}
|
|
989
|
-
|
|
990
|
-
.gm-flex-justify-between[data-v-c17deec9] {
|
|
991
|
-
justify-content: space-between;
|
|
992
|
-
}
|
|
993
986
|
[data-v-79615afd] .gmSearchForm .el-form-item {
|
|
994
987
|
margin-right: 0;
|
|
995
988
|
margin-bottom: 4px;
|
|
996
989
|
}
|
|
997
|
-
.gm-upload-preview-dialog[data-v-c615121c] [data-v-c615121c] .el-dialog__body {
|
|
998
|
-
padding: 0;
|
|
999
|
-
}
|
|
1000
|
-
|
|
1001
|
-
.gm-upload-file-picture-card[data-v-c615121c] [data-v-c615121c] .el-upload-list__item, .gm-upload-file-picture-card[data-v-c615121c] [data-v-c615121c] .el-upload--picture-card {
|
|
1002
|
-
width: auto;
|
|
1003
|
-
height: auto;
|
|
1004
|
-
}
|
|
1005
|
-
.gm-upload-file {
|
|
1006
|
-
line-height: normal;
|
|
1007
|
-
}
|
|
1008
|
-
.gm-upload-file li > .el-checkbox {
|
|
1009
|
-
position: absolute;
|
|
1010
|
-
left: 10px;
|
|
1011
|
-
top: 0;
|
|
1012
|
-
z-index: 9;
|
|
1013
|
-
}
|
|
1014
|
-
.gm-upload-file .el-upload-list--picture-card {
|
|
1015
|
-
gap: 10px;
|
|
1016
|
-
}
|
|
1017
|
-
.gm-upload-file .el-upload-list__item {
|
|
1018
|
-
margin: 0;
|
|
1019
|
-
border: none;
|
|
1020
|
-
}
|
|
1021
|
-
.gm-upload-file .el-upload-list__item-file-name {
|
|
1022
|
-
line-height: normal;
|
|
1023
|
-
}
|
|
1024
|
-
.gm-upload-file .el-upload-dragger {
|
|
1025
|
-
padding: 0;
|
|
1026
|
-
border: none;
|
|
1027
|
-
width: 100%;
|
|
1028
|
-
height: 100%;
|
|
1029
|
-
display: flex;
|
|
1030
|
-
}
|
|
1031
|
-
.gm-upload-file .el-upload--picture-card {
|
|
1032
|
-
border: none;
|
|
1033
|
-
}
|
|
1034
|
-
|
|
1035
|
-
.gm-upload-file-disabled .el-upload--picture-card {
|
|
1036
|
-
display: none;
|
|
1037
|
-
}
|
|
1038
|
-
.gm-upload-file-disabled .el-upload-list__item-status-label {
|
|
1039
|
-
display: none;
|
|
1040
|
-
}
|
|
1041
990
|
[data-v-98c2e804] .gmTableNoBorder .el-table__body .el-table__cell {
|
|
1042
991
|
border-right: none;
|
|
1043
992
|
}
|
|
@@ -1084,15 +1033,57 @@ video {
|
|
|
1084
1033
|
[data-v-050a4f74] .gmTableNoBorder .el-table__border-left-patch {
|
|
1085
1034
|
height: 0;
|
|
1086
1035
|
}
|
|
1036
|
+
.gm-upload-preview-dialog[data-v-c615121c] [data-v-c615121c] .el-dialog__body {
|
|
1037
|
+
padding: 0;
|
|
1038
|
+
}
|
|
1087
1039
|
|
|
1088
|
-
.
|
|
1089
|
-
|
|
1090
|
-
|
|
1040
|
+
.gm-upload-file-picture-card[data-v-c615121c] [data-v-c615121c] .el-upload-list__item, .gm-upload-file-picture-card[data-v-c615121c] [data-v-c615121c] .el-upload--picture-card {
|
|
1041
|
+
width: auto;
|
|
1042
|
+
height: auto;
|
|
1091
1043
|
}
|
|
1092
|
-
.
|
|
1044
|
+
.gm-upload-file {
|
|
1045
|
+
line-height: normal;
|
|
1046
|
+
}
|
|
1047
|
+
.gm-upload-file li > .el-checkbox {
|
|
1048
|
+
position: absolute;
|
|
1049
|
+
left: 10px;
|
|
1050
|
+
top: 0;
|
|
1051
|
+
z-index: 9;
|
|
1052
|
+
}
|
|
1053
|
+
.gm-upload-file .el-upload-list--picture-card {
|
|
1054
|
+
gap: 10px;
|
|
1055
|
+
}
|
|
1056
|
+
.gm-upload-file .el-upload-list__item {
|
|
1057
|
+
margin: 0;
|
|
1058
|
+
border: none;
|
|
1059
|
+
}
|
|
1060
|
+
.gm-upload-file .el-upload-list__item-file-name {
|
|
1061
|
+
line-height: normal;
|
|
1062
|
+
}
|
|
1063
|
+
.gm-upload-file .el-upload-dragger {
|
|
1064
|
+
padding: 0;
|
|
1065
|
+
border: none;
|
|
1066
|
+
width: 100%;
|
|
1067
|
+
height: 100%;
|
|
1068
|
+
display: flex;
|
|
1069
|
+
}
|
|
1070
|
+
.gm-upload-file .el-upload--picture-card {
|
|
1071
|
+
border: none;
|
|
1072
|
+
}
|
|
1073
|
+
|
|
1074
|
+
.gm-upload-file-disabled .el-upload--picture-card {
|
|
1093
1075
|
display: none;
|
|
1094
1076
|
}
|
|
1077
|
+
.gm-upload-file-disabled .el-upload-list__item-status-label {
|
|
1078
|
+
display: none;
|
|
1079
|
+
}
|
|
1080
|
+
.gm-flex-center[data-v-c17deec9] {
|
|
1081
|
+
align-items: center;
|
|
1082
|
+
}
|
|
1095
1083
|
|
|
1084
|
+
.gm-flex-justify-between[data-v-c17deec9] {
|
|
1085
|
+
justify-content: space-between;
|
|
1086
|
+
}
|
|
1096
1087
|
@charset "UTF-8";
|
|
1097
1088
|
.custom-operate-drawer .el-drawer__header {
|
|
1098
1089
|
padding: 10px 15px;
|
|
@@ -1204,4 +1195,12 @@ video {
|
|
|
1204
1195
|
box-shadow: inset 0 0 3px rgba(0, 0, 0, 0.1);
|
|
1205
1196
|
border-radius: 10px;
|
|
1206
1197
|
background: #eee;
|
|
1207
|
-
}
|
|
1198
|
+
}
|
|
1199
|
+
|
|
1200
|
+
.pagination-container[data-v-47d35e7b] {
|
|
1201
|
+
background: #fff;
|
|
1202
|
+
padding-top: 12px;
|
|
1203
|
+
}
|
|
1204
|
+
.pagination-container.hidden[data-v-47d35e7b] {
|
|
1205
|
+
display: none;
|
|
1206
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/es/utils/index.d.ts
CHANGED
package/es/utils/index.mjs
CHANGED
|
@@ -14,16 +14,18 @@ export { PasteFileError, generateFileName, handlePasteEvent } from './src/pasteF
|
|
|
14
14
|
export { getCountryImageUrl } from './src/image.mjs';
|
|
15
15
|
export { mergePropsToArray } from './src/array.mjs';
|
|
16
16
|
import './src/regexPatterns/index.mjs';
|
|
17
|
+
export { getTenantType, isGiikin, isGiiktok } from './src/tenant.mjs';
|
|
17
18
|
export { withInstall, withInstallDirective, withInstallFunction, withNoopInstall } from './src/vue/install.mjs';
|
|
18
19
|
export { GiimeResolver, bypass, kebabCase } from './src/vue/resolver.mjs';
|
|
19
20
|
export { getRouteParams, getRouteQuery } from './src/vue/router.mjs';
|
|
20
21
|
export { getGmEvent } from './src/elementPlus/event.mjs';
|
|
21
22
|
export { getGmExports, getGmObjExports } from './src/elementPlus/exports.mjs';
|
|
22
23
|
export { getCascaderLastValue } from './src/elementPlus/cascader.mjs';
|
|
24
|
+
export { envConfigs, getEnvConfig } from './src/http/createModes.mjs';
|
|
23
25
|
export { createAxios } from './src/http/createAxios.mjs';
|
|
24
26
|
export { errorMessage, responseErrorMessage } from './src/http/errorMessage.mjs';
|
|
25
27
|
export { req401Interceptors, res401Interceptors } from './src/http/interceptors.mjs';
|
|
26
|
-
export { giimeDevProxy, giimeDevProxyFn } from './src/http/devProxy.mjs';
|
|
28
|
+
export { autoGenerateProxy, giimeDevProxy, giimeDevProxyFn } from './src/http/devProxy.mjs';
|
|
27
29
|
export { getDomain, getHeaderValue, urlJoin } from './src/http/url.mjs';
|
|
28
30
|
export { getDateShortcuts } from './src/date/dateShortcuts.mjs';
|
|
29
31
|
export { genFileId } from 'element-plus';
|
package/es/utils/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -1,9 +1,32 @@
|
|
|
1
|
+
import type { TenantType } from '../tenant';
|
|
1
2
|
export interface CreateModesOptions {
|
|
2
3
|
/** 开发环境路径,如 '/giime-guard-resource-api' */
|
|
3
4
|
developmentPath: string;
|
|
4
5
|
/** 服务类型:如 'guard', 'middle' 等 */
|
|
5
6
|
serviceType: string;
|
|
6
7
|
}
|
|
8
|
+
/**
|
|
9
|
+
* 环境配置项
|
|
10
|
+
*/
|
|
11
|
+
export interface EnvConfig {
|
|
12
|
+
/** 环境URL */
|
|
13
|
+
url: string;
|
|
14
|
+
/** 租户类型 */
|
|
15
|
+
tenant: TenantType;
|
|
16
|
+
/** 域名(可选,用于域名匹配) */
|
|
17
|
+
domain?: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* 环境配置映射表
|
|
21
|
+
* 统一的配置源,控制所有环境、租户、域名映射
|
|
22
|
+
*/
|
|
23
|
+
export declare const envConfigs: Record<string, EnvConfig>;
|
|
24
|
+
/**
|
|
25
|
+
* 根据模式获取环境配置
|
|
26
|
+
* @param mode 环境模式
|
|
27
|
+
* @returns 环境配置对象
|
|
28
|
+
*/
|
|
29
|
+
export declare const getEnvConfig: (mode?: string) => EnvConfig;
|
|
7
30
|
/**
|
|
8
31
|
* 创建API模式配置
|
|
9
32
|
* @param options 配置对象
|
|
@@ -1,20 +1,33 @@
|
|
|
1
1
|
import { urlJoin } from './url.mjs';
|
|
2
2
|
|
|
3
|
+
const envConfigs = {
|
|
4
|
+
// 本地开发环境
|
|
5
|
+
development: { url: "https://manage-dev.giikin.cn", tenant: "giikin", domain: "manage-dev.giikin.cn" },
|
|
6
|
+
// 前后端联调的开发环境
|
|
7
|
+
dev: { url: "https://manage-dev.giikin.cn", tenant: "giikin", domain: "manage-dev.giikin.cn" },
|
|
8
|
+
develop: { url: "https://manage-dev.giikin.cn", tenant: "giikin", domain: "manage-dev.giikin.cn" },
|
|
9
|
+
// 测试环境
|
|
10
|
+
test: { url: "https://manage-test.giikin.cn", tenant: "giikin", domain: "manage-test.giikin.cn" },
|
|
11
|
+
// 预发布环境
|
|
12
|
+
release: { url: "https://manage-pre.giikin.com", tenant: "giikin", domain: "manage-pre.giikin.com" },
|
|
13
|
+
// 生产环境
|
|
14
|
+
production: { url: "https://manage.giikin.com", tenant: "giikin", domain: "manage.giikin.com" },
|
|
15
|
+
// 租户:吉客拓客
|
|
16
|
+
"giiktok.production": { url: "https://manage.kingkungmeta.com", tenant: "giiktok", domain: "manage.kingkungmeta.com" }
|
|
17
|
+
};
|
|
18
|
+
const getEnvConfig = (mode) => {
|
|
19
|
+
if (!mode) return envConfigs.development;
|
|
20
|
+
return envConfigs[mode] || envConfigs.development;
|
|
21
|
+
};
|
|
3
22
|
const createModes = (options) => {
|
|
4
23
|
const { developmentPath, serviceType } = options;
|
|
5
|
-
return
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
{ mode
|
|
10
|
-
|
|
11
|
-
{ mode: "test", url: urlJoin("https://manage-test.giikin.cn", serviceType) },
|
|
12
|
-
{ mode: "release", url: urlJoin("https://manage-pre.giikin.com", serviceType) },
|
|
13
|
-
{ mode: "production", url: urlJoin("https://manage.giikin.com", serviceType) },
|
|
14
|
-
/** 租户:吉客拓客 */
|
|
15
|
-
{ mode: "giiktok.production", url: urlJoin("https://manage.kingkungmeta.com", serviceType) }
|
|
16
|
-
];
|
|
24
|
+
return Object.keys(envConfigs).map((mode) => {
|
|
25
|
+
if (mode === "development") {
|
|
26
|
+
return { mode, url: developmentPath };
|
|
27
|
+
}
|
|
28
|
+
return { mode, url: urlJoin(envConfigs[mode].url, serviceType) };
|
|
29
|
+
});
|
|
17
30
|
};
|
|
18
31
|
|
|
19
|
-
export { createModes };
|
|
32
|
+
export { createModes, envConfigs, getEnvConfig };
|
|
20
33
|
//# sourceMappingURL=createModes.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createModes.mjs","sources":["../../../../../../packages/utils/src/http/createModes.ts"],"sourcesContent":["import { urlJoin } from './url';\n\nexport interface CreateModesOptions {\n /** 开发环境路径,如 '/giime-guard-resource-api' */\n developmentPath: string;\n /** 服务类型:如 'guard', 'middle' 等 */\n serviceType: string;\n}\n\n/**\n *
|
|
1
|
+
{"version":3,"file":"createModes.mjs","sources":["../../../../../../packages/utils/src/http/createModes.ts"],"sourcesContent":["import type { TenantType } from '../tenant';\nimport { urlJoin } from './url';\n\nexport interface CreateModesOptions {\n /** 开发环境路径,如 '/giime-guard-resource-api' */\n developmentPath: string;\n /** 服务类型:如 'guard', 'middle' 等 */\n serviceType: string;\n}\n\n/**\n * 环境配置项\n */\nexport interface EnvConfig {\n /** 环境URL */\n url: string;\n /** 租户类型 */\n tenant: TenantType;\n /** 域名(可选,用于域名匹配) */\n domain?: string;\n}\n\n/**\n * 环境配置映射表\n * 统一的配置源,控制所有环境、租户、域名映射\n */\nexport const envConfigs: Record<string, EnvConfig> = {\n // 本地开发环境\n development: { url: 'https://manage-dev.giikin.cn', tenant: 'giikin', domain: 'manage-dev.giikin.cn' },\n // 前后端联调的开发环境\n dev: { url: 'https://manage-dev.giikin.cn', tenant: 'giikin', domain: 'manage-dev.giikin.cn' },\n develop: { url: 'https://manage-dev.giikin.cn', tenant: 'giikin', domain: 'manage-dev.giikin.cn' },\n // 测试环境\n test: { url: 'https://manage-test.giikin.cn', tenant: 'giikin', domain: 'manage-test.giikin.cn' },\n // 预发布环境\n release: { url: 'https://manage-pre.giikin.com', tenant: 'giikin', domain: 'manage-pre.giikin.com' },\n // 生产环境\n production: { url: 'https://manage.giikin.com', tenant: 'giikin', domain: 'manage.giikin.com' },\n // 租户:吉客拓客\n 'giiktok.production': { url: 'https://manage.kingkungmeta.com', tenant: 'giiktok', domain: 'manage.kingkungmeta.com' },\n} as const;\n\n/**\n * 根据模式获取环境配置\n * @param mode 环境模式\n * @returns 环境配置对象\n */\nexport const getEnvConfig = (mode?: string): EnvConfig => {\n if (!mode) return envConfigs.development;\n return envConfigs[mode as keyof typeof envConfigs] || envConfigs.development;\n};\n\n/**\n * 创建API模式配置\n * @param options 配置对象\n * @param options.developmentPath 开发环境路径,如 '/giime-guard-resource-api'\n * @param options.serviceType 服务类型:如 'guard', 'middle' 等\n * @returns ViteMode数组\n */\nexport const createModes = (options: CreateModesOptions) => {\n const { developmentPath, serviceType } = options;\n\n return Object.keys(envConfigs).map(mode => {\n // 本地开发环境特殊处理:使用 developmentPath\n if (mode === 'development') {\n return { mode, url: developmentPath };\n }\n // 其他环境:拼接 baseUrl + serviceType\n return { mode, url: urlJoin(envConfigs[mode].url, serviceType) };\n });\n};\n"],"names":[],"mappings":";;AA0BO,MAAM,UAAA,GAAwC;AAAA;AAAA,EAEnD,aAAa,EAAE,GAAA,EAAK,gCAAgC,MAAA,EAAQ,QAAA,EAAU,QAAQ,sBAAA,EAAuB;AAAA;AAAA,EAErG,KAAK,EAAE,GAAA,EAAK,gCAAgC,MAAA,EAAQ,QAAA,EAAU,QAAQ,sBAAA,EAAuB;AAAA,EAC7F,SAAS,EAAE,GAAA,EAAK,gCAAgC,MAAA,EAAQ,QAAA,EAAU,QAAQ,sBAAA,EAAuB;AAAA;AAAA,EAEjG,MAAM,EAAE,GAAA,EAAK,iCAAiC,MAAA,EAAQ,QAAA,EAAU,QAAQ,uBAAA,EAAwB;AAAA;AAAA,EAEhG,SAAS,EAAE,GAAA,EAAK,iCAAiC,MAAA,EAAQ,QAAA,EAAU,QAAQ,uBAAA,EAAwB;AAAA;AAAA,EAEnG,YAAY,EAAE,GAAA,EAAK,6BAA6B,MAAA,EAAQ,QAAA,EAAU,QAAQ,mBAAA,EAAoB;AAAA;AAAA,EAE9F,sBAAsB,EAAE,GAAA,EAAK,mCAAmC,MAAA,EAAQ,SAAA,EAAW,QAAQ,yBAAA;AAC7F;AAOO,MAAM,YAAA,GAAe,CAAC,IAAA,KAA6B;AACxD,EAAA,IAAI,CAAC,IAAA,EAAM,OAAO,UAAA,CAAW,WAAA;AAC7B,EAAA,OAAO,UAAA,CAAW,IAA+B,CAAA,IAAK,UAAA,CAAW,WAAA;AACnE;AASO,MAAM,WAAA,GAAc,CAAC,OAAA,KAAgC;AAC1D,EAAA,MAAM,EAAE,eAAA,EAAiB,WAAA,EAAY,GAAI,OAAA;AAEzC,EAAA,OAAO,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA,CAAE,IAAI,CAAA,IAAA,KAAQ;AAEzC,IAAA,IAAI,SAAS,aAAA,EAAe;AAC1B,MAAA,OAAO,EAAE,IAAA,EAAM,GAAA,EAAK,eAAA,EAAgB;AAAA,IACtC;AAEA,IAAA,OAAO,EAAE,MAAM,GAAA,EAAK,OAAA,CAAQ,WAAW,IAAI,CAAA,CAAE,GAAA,EAAK,WAAW,CAAA,EAAE;AAAA,EACjE,CAAC,CAAA;AACH;;;;"}
|
|
@@ -1,12 +1,99 @@
|
|
|
1
1
|
import type { ProxyOptions } from 'vite';
|
|
2
|
+
/**
|
|
3
|
+
* 自动代理配置选项
|
|
4
|
+
*/
|
|
5
|
+
export interface AutoProxyOptions {
|
|
6
|
+
/** 需要排除的环境变量名称数组 */
|
|
7
|
+
excludeKeys?: string[];
|
|
8
|
+
/** 是否禁用本地开发环境代理(禁用后不会代理到 localhost) */
|
|
9
|
+
disableLocal?: boolean;
|
|
10
|
+
/** 需要排除的路径数组(支持带或不带尾部斜杠,如 '/third/am' 或 '/third/am/') */
|
|
11
|
+
excludePaths?: string[];
|
|
12
|
+
}
|
|
2
13
|
/**
|
|
3
14
|
* 默认开发代理配置
|
|
4
15
|
* https://cn.vitejs.dev/config/#server-proxy
|
|
5
16
|
*/
|
|
6
17
|
export declare const giimeDevProxy: Record<string, string | ProxyOptions>;
|
|
7
18
|
/**
|
|
8
|
-
*
|
|
19
|
+
* 自动生成代理配置(通过扫描环境变量)
|
|
20
|
+
* - 自动读取环境变量中以斜杠开头的 VITE_ 变量
|
|
21
|
+
* - 根据 VITE_GIIME_MODE 自动确定代理目标服务器
|
|
22
|
+
* - 支持排除特定环境变量
|
|
23
|
+
* - 支持禁用本地开发环境代理
|
|
24
|
+
*
|
|
25
|
+
* @param env 环境变量对象
|
|
26
|
+
* @param options 配置选项
|
|
27
|
+
* @param options.excludeKeys 需要排除的环境变量名称数组
|
|
28
|
+
* @param options.disableLocal 是否禁用本地开发环境代理
|
|
29
|
+
* @returns 代理配置对象
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* // 基础用法 - 自动扫描环境变量
|
|
33
|
+
* export default defineConfig({
|
|
34
|
+
* server: {
|
|
35
|
+
* proxy: autoGenerateProxy(process.env)
|
|
36
|
+
* }
|
|
37
|
+
* })
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* // 排除特定环境变量并禁用本地代理
|
|
41
|
+
* export default defineConfig({
|
|
42
|
+
* server: {
|
|
43
|
+
* proxy: autoGenerateProxy(process.env, {
|
|
44
|
+
* excludeKeys: ['VITE_APP_TITLE', 'VITE_PUBLIC_PATH'],
|
|
45
|
+
* disableLocal: true
|
|
46
|
+
* })
|
|
47
|
+
* }
|
|
48
|
+
* })
|
|
49
|
+
*
|
|
50
|
+
* @example
|
|
51
|
+
* // 排除特定路径(支持带或不带尾部斜杠)
|
|
52
|
+
* export default defineConfig({
|
|
53
|
+
* server: {
|
|
54
|
+
* proxy: autoGenerateProxy(process.env, {
|
|
55
|
+
* excludePaths: ['/third/am', '/third/gstore/']
|
|
56
|
+
* })
|
|
57
|
+
* }
|
|
58
|
+
* })
|
|
59
|
+
*/
|
|
60
|
+
export declare const autoGenerateProxy: (env: Record<string, string>, options?: AutoProxyOptions) => Record<string, string | ProxyOptions>;
|
|
61
|
+
/**
|
|
62
|
+
* 根据环境动态生成代理配置(融合版)
|
|
63
|
+
* - 包含预定义的 API 服务类型代理配置
|
|
64
|
+
* - 包含自动扫描环境变量的代理配置
|
|
65
|
+
*
|
|
9
66
|
* @param env 环境变量对象
|
|
67
|
+
* @param options 自动代理配置选项
|
|
10
68
|
* @returns 代理配置对象
|
|
69
|
+
*
|
|
70
|
+
* @example
|
|
71
|
+
* // 基础用法
|
|
72
|
+
* export default defineConfig({
|
|
73
|
+
* server: {
|
|
74
|
+
* proxy: giimeDevProxyFn(process.env)
|
|
75
|
+
* }
|
|
76
|
+
* })
|
|
77
|
+
*
|
|
78
|
+
* @example
|
|
79
|
+
* // 带选项
|
|
80
|
+
* export default defineConfig({
|
|
81
|
+
* server: {
|
|
82
|
+
* proxy: giimeDevProxyFn(process.env, {
|
|
83
|
+
* excludeKeys: ['VITE_APP_TITLE'],
|
|
84
|
+
* disableLocal: true
|
|
85
|
+
* })
|
|
86
|
+
* }
|
|
87
|
+
* })
|
|
88
|
+
*
|
|
89
|
+
* @example
|
|
90
|
+
* // 排除特定路径
|
|
91
|
+
* export default defineConfig({
|
|
92
|
+
* server: {
|
|
93
|
+
* proxy: giimeDevProxyFn(process.env, {
|
|
94
|
+
* excludePaths: ['/third/am', '/third/am/']
|
|
95
|
+
* })
|
|
96
|
+
* }
|
|
97
|
+
* })
|
|
11
98
|
*/
|
|
12
|
-
export declare const giimeDevProxyFn: (env: Record<string, string
|
|
99
|
+
export declare const giimeDevProxyFn: (env: Record<string, string>, options?: AutoProxyOptions) => Record<string, string | ProxyOptions>;
|