giime 0.9.4 → 0.9.5

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 CHANGED
@@ -887,24 +887,6 @@ video {
887
887
  .gm-group:hover .group-hover\:gm-block {
888
888
  display: block;
889
889
  }
890
- .gm-number-interval-single[data-v-4e6f4d6f] {
891
- border-radius: var(--el-input-border-radius, var(--el-border-radius-base));
892
- box-shadow: 0 0 0 1px var(--el-input-border-color, var(--el-border-color)) inset;
893
- background-color: var(--el-input-bg-color, var(--el-fill-color-blank));
894
- }
895
- .gm-number-interval-single[data-v-4e6f4d6f] [data-v-4e6f4d6f] .el-input__wrapper {
896
- box-shadow: none;
897
- background: none;
898
- }
899
-
900
- .gm-number-interval-close[data-v-4e6f4d6f] {
901
- display: none;
902
- color: var(--el-input-icon-color, var(--el-text-color-placeholder));
903
- }
904
-
905
- .gm-number-interval-single[data-v-4e6f4d6f]:hover .gm-number-interval-close[data-v-4e6f4d6f] {
906
- display: flex;
907
- }
908
890
  .gm-flex-center[data-v-c17deec9] {
909
891
  align-items: center;
910
892
  }
@@ -912,55 +894,49 @@ video {
912
894
  .gm-flex-justify-between[data-v-c17deec9] {
913
895
  justify-content: space-between;
914
896
  }
915
- [data-v-050a4f74] .gmTableNoBorder .el-table__body .el-table__cell {
916
- border-right: none;
917
- }
918
-
919
- [data-v-050a4f74] .gmTableNoBorder .el-table__inner-wrapper:before {
920
- height: 0;
921
- }
922
-
923
- [data-v-050a4f74] .gmTableNoBorder.el-table--border .el-table__inner-wrapper:after {
924
- height: 0;
925
- }
926
-
927
- [data-v-050a4f74] .gmTableNoBorder.el-table--border:after {
928
- height: 0;
929
- }
930
-
931
- [data-v-050a4f74] .gmTableNoBorder.el-table--border:before {
932
- height: 0;
897
+ .circular[data-v-d7b04fae] {
898
+ animation: loading-rotate-d7b04fae 2s linear infinite;
933
899
  }
934
900
 
935
- [data-v-050a4f74] .gmTableNoBorder .el-table__border-left-patch {
936
- height: 0;
937
- }
938
- [data-v-79615afd] .gmSearchForm .el-form-item {
939
- margin-right: 0;
940
- margin-bottom: 4px;
941
- }
942
- [data-v-3f2c8504] .gmTableNoBorder .el-table__body .el-table__cell {
943
- border-right: none;
901
+ .path[data-v-d7b04fae] {
902
+ animation: loading-dash-d7b04fae 1.5s ease-in-out infinite;
903
+ stroke-dasharray: 90, 150;
904
+ stroke-dashoffset: 0;
905
+ stroke: var(--el-color-primary);
906
+ stroke-linecap: round;
944
907
  }
945
908
 
946
- [data-v-3f2c8504] .gmTableNoBorder .el-table__inner-wrapper:before {
947
- height: 0;
909
+ @keyframes loading-rotate-d7b04fae {
910
+ to {
911
+ transform: rotate(360deg);
912
+ }
948
913
  }
949
-
950
- [data-v-3f2c8504] .gmTableNoBorder.el-table--border .el-table__inner-wrapper:after {
951
- height: 0;
914
+ @keyframes loading-dash-d7b04fae {
915
+ 0% {
916
+ stroke-dasharray: 1, 200;
917
+ stroke-dashoffset: 0;
918
+ }
919
+ 50% {
920
+ stroke-dasharray: 90, 150;
921
+ stroke-dashoffset: -40px;
922
+ }
923
+ 100% {
924
+ stroke-dasharray: 90, 150;
925
+ stroke-dashoffset: -120px;
926
+ }
952
927
  }
953
928
 
954
- [data-v-3f2c8504] .gmTableNoBorder.el-table--border:after {
955
- height: 0;
929
+ .gm-range-number .el-form-item[data-v-1ae16d96] {
930
+ margin: 0;
956
931
  }
957
932
 
958
- [data-v-3f2c8504] .gmTableNoBorder.el-table--border:before {
959
- height: 0;
933
+ .gm-upload-pro-preview-dialog[data-v-80b383d8] [data-v-80b383d8] .el-dialog__body {
934
+ padding: 0;
960
935
  }
961
936
 
962
- [data-v-3f2c8504] .gmTableNoBorder .el-table__border-left-patch {
963
- height: 0;
937
+ .gm-upload-pro-file-picture-card[data-v-80b383d8] [data-v-80b383d8] .el-upload-list__item, .gm-upload-pro-file-picture-card[data-v-80b383d8] [data-v-80b383d8] .el-upload--picture-card {
938
+ width: auto;
939
+ height: auto;
964
940
  }
965
941
  .gm-upload-pro-file {
966
942
  line-height: normal;
@@ -1000,93 +976,50 @@ video {
1000
976
  .gm-upload-pro-file-disabled .el-upload-list__item-status-label {
1001
977
  display: none;
1002
978
  }
1003
- .gm-upload-pro-preview-dialog[data-v-80b383d8] [data-v-80b383d8] .el-dialog__body {
1004
- padding: 0;
1005
- }
1006
-
1007
- .gm-upload-pro-file-picture-card[data-v-80b383d8] [data-v-80b383d8] .el-upload-list__item, .gm-upload-pro-file-picture-card[data-v-80b383d8] [data-v-80b383d8] .el-upload--picture-card {
1008
- width: auto;
1009
- height: auto;
979
+ .gm-number-interval-single[data-v-4e6f4d6f] {
980
+ border-radius: var(--el-input-border-radius, var(--el-border-radius-base));
981
+ box-shadow: 0 0 0 1px var(--el-input-border-color, var(--el-border-color)) inset;
982
+ background-color: var(--el-input-bg-color, var(--el-fill-color-blank));
1010
983
  }
1011
- .gm-upload-preview-dialog[data-v-c615121c] [data-v-c615121c] .el-dialog__body {
1012
- padding: 0;
984
+ .gm-number-interval-single[data-v-4e6f4d6f] [data-v-4e6f4d6f] .el-input__wrapper {
985
+ box-shadow: none;
986
+ background: none;
1013
987
  }
1014
988
 
1015
- .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 {
1016
- width: auto;
1017
- height: auto;
1018
- }
1019
- .gm-upload-file {
1020
- line-height: normal;
1021
- }
1022
- .gm-upload-file li > .el-checkbox {
1023
- position: absolute;
1024
- left: 10px;
1025
- top: 0;
1026
- z-index: 9;
1027
- }
1028
- .gm-upload-file .el-upload-list--picture-card {
1029
- gap: 10px;
1030
- }
1031
- .gm-upload-file .el-upload-list__item {
1032
- margin: 0;
1033
- border: none;
1034
- }
1035
- .gm-upload-file .el-upload-list__item-file-name {
1036
- line-height: normal;
989
+ .gm-number-interval-close[data-v-4e6f4d6f] {
990
+ display: none;
991
+ color: var(--el-input-icon-color, var(--el-text-color-placeholder));
1037
992
  }
1038
- .gm-upload-file .el-upload-dragger {
1039
- padding: 0;
1040
- border: none;
1041
- width: 100%;
1042
- height: 100%;
993
+
994
+ .gm-number-interval-single[data-v-4e6f4d6f]:hover .gm-number-interval-close[data-v-4e6f4d6f] {
1043
995
  display: flex;
1044
996
  }
1045
- .gm-upload-file .el-upload--picture-card {
1046
- border: none;
1047
- }
1048
-
1049
- .gm-upload-file-disabled .el-upload--picture-card {
1050
- display: none;
997
+ [data-v-79615afd] .gmSearchForm .el-form-item {
998
+ margin-right: 0;
999
+ margin-bottom: 4px;
1051
1000
  }
1052
- .gm-upload-file-disabled .el-upload-list__item-status-label {
1053
- display: none;
1001
+ [data-v-050a4f74] .gmTableNoBorder .el-table__body .el-table__cell {
1002
+ border-right: none;
1054
1003
  }
1055
1004
 
1056
- .gm-range-number .el-form-item[data-v-1ae16d96] {
1057
- margin: 0;
1005
+ [data-v-050a4f74] .gmTableNoBorder .el-table__inner-wrapper:before {
1006
+ height: 0;
1058
1007
  }
1059
1008
 
1060
- .circular[data-v-d7b04fae] {
1061
- animation: loading-rotate-d7b04fae 2s linear infinite;
1009
+ [data-v-050a4f74] .gmTableNoBorder.el-table--border .el-table__inner-wrapper:after {
1010
+ height: 0;
1062
1011
  }
1063
1012
 
1064
- .path[data-v-d7b04fae] {
1065
- animation: loading-dash-d7b04fae 1.5s ease-in-out infinite;
1066
- stroke-dasharray: 90, 150;
1067
- stroke-dashoffset: 0;
1068
- stroke: var(--el-color-primary);
1069
- stroke-linecap: round;
1013
+ [data-v-050a4f74] .gmTableNoBorder.el-table--border:after {
1014
+ height: 0;
1070
1015
  }
1071
1016
 
1072
- @keyframes loading-rotate-d7b04fae {
1073
- to {
1074
- transform: rotate(360deg);
1075
- }
1017
+ [data-v-050a4f74] .gmTableNoBorder.el-table--border:before {
1018
+ height: 0;
1076
1019
  }
1077
- @keyframes loading-dash-d7b04fae {
1078
- 0% {
1079
- stroke-dasharray: 1, 200;
1080
- stroke-dashoffset: 0;
1081
- }
1082
- 50% {
1083
- stroke-dasharray: 90, 150;
1084
- stroke-dashoffset: -40px;
1085
- }
1086
- 100% {
1087
- stroke-dasharray: 90, 150;
1088
- stroke-dashoffset: -120px;
1089
- }
1020
+
1021
+ [data-v-050a4f74] .gmTableNoBorder .el-table__border-left-patch {
1022
+ height: 0;
1090
1023
  }
1091
1024
 
1092
1025
  .pagination-container[data-v-47d35e7b] {
@@ -1153,6 +1086,29 @@ video {
1153
1086
  border-radius: 10px;
1154
1087
  background: #eee;
1155
1088
  }
1089
+ [data-v-3f2c8504] .gmTableNoBorder .el-table__body .el-table__cell {
1090
+ border-right: none;
1091
+ }
1092
+
1093
+ [data-v-3f2c8504] .gmTableNoBorder .el-table__inner-wrapper:before {
1094
+ height: 0;
1095
+ }
1096
+
1097
+ [data-v-3f2c8504] .gmTableNoBorder.el-table--border .el-table__inner-wrapper:after {
1098
+ height: 0;
1099
+ }
1100
+
1101
+ [data-v-3f2c8504] .gmTableNoBorder.el-table--border:after {
1102
+ height: 0;
1103
+ }
1104
+
1105
+ [data-v-3f2c8504] .gmTableNoBorder.el-table--border:before {
1106
+ height: 0;
1107
+ }
1108
+
1109
+ [data-v-3f2c8504] .gmTableNoBorder .el-table__border-left-patch {
1110
+ height: 0;
1111
+ }
1156
1112
  @charset "UTF-8";
1157
1113
  .table-custom-header-drawer .el-drawer__header {
1158
1114
  padding: 10px 15px;
@@ -1208,4 +1164,48 @@ video {
1208
1164
  box-shadow: inset 0 0 3px rgba(0, 0, 0, 0.1);
1209
1165
  border-radius: 10px;
1210
1166
  background: #eee;
1167
+ }
1168
+ .gm-upload-preview-dialog[data-v-c615121c] [data-v-c615121c] .el-dialog__body {
1169
+ padding: 0;
1170
+ }
1171
+
1172
+ .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 {
1173
+ width: auto;
1174
+ height: auto;
1175
+ }
1176
+ .gm-upload-file {
1177
+ line-height: normal;
1178
+ }
1179
+ .gm-upload-file li > .el-checkbox {
1180
+ position: absolute;
1181
+ left: 10px;
1182
+ top: 0;
1183
+ z-index: 9;
1184
+ }
1185
+ .gm-upload-file .el-upload-list--picture-card {
1186
+ gap: 10px;
1187
+ }
1188
+ .gm-upload-file .el-upload-list__item {
1189
+ margin: 0;
1190
+ border: none;
1191
+ }
1192
+ .gm-upload-file .el-upload-list__item-file-name {
1193
+ line-height: normal;
1194
+ }
1195
+ .gm-upload-file .el-upload-dragger {
1196
+ padding: 0;
1197
+ border: none;
1198
+ width: 100%;
1199
+ height: 100%;
1200
+ display: flex;
1201
+ }
1202
+ .gm-upload-file .el-upload--picture-card {
1203
+ border: none;
1204
+ }
1205
+
1206
+ .gm-upload-file-disabled .el-upload--picture-card {
1207
+ display: none;
1208
+ }
1209
+ .gm-upload-file-disabled .el-upload-list__item-status-label {
1210
+ display: none;
1211
1211
  }
@@ -335,7 +335,7 @@ export { vSee } from '../components/src/directives/see/directive.mjs';
335
335
  export { GmVSeeDirective } from '../components/src/directives/see/index.mjs';
336
336
  export { useCheckAll } from '../hooks/base/useCheckAll/index.mjs';
337
337
  export { useIDBKeyval } from '../hooks/base/useIDBKeyval/index.mjs';
338
- export { ensureFilenameWithExtension, getFileExtension, getUrlFilename, useDownload } from '../hooks/base/useDownload/index.mjs';
338
+ export { ensureFilenameWithExtension, getFileExtension, getUrlExtension, getUrlFilename, useDownload } from '../hooks/base/useDownload/index.mjs';
339
339
  export { useLoading } from '../hooks/base/useLoading/index.mjs';
340
340
  export { useTimeoutPromise } from '../hooks/base/useTimeout/index.mjs';
341
341
  export { useRectSelect } from '../hooks/base/useRectSelect/index.mjs';
@@ -1 +1 @@
1
- export declare const version = "0.9.4";
1
+ export declare const version = "0.9.5";
@@ -1,4 +1,4 @@
1
- const version = "0.9.4-beta.1";
1
+ const version = "0.9.5-beta.1";
2
2
 
3
3
  export { version };
4
4
  //# sourceMappingURL=version.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.mjs","sources":["../../../../packages/giime/version.ts"],"sourcesContent":["export const version = '0.9.4-beta.1';\n"],"names":[],"mappings":"AAAO,MAAM,OAAA,GAAU;;;;"}
1
+ {"version":3,"file":"version.mjs","sources":["../../../../packages/giime/version.ts"],"sourcesContent":["export const version = '0.9.5-beta.1';\n"],"names":[],"mappings":"AAAO,MAAM,OAAA,GAAU;;;;"}
@@ -1,6 +1,6 @@
1
1
  export { useCheckAll } from './useCheckAll/index.mjs';
2
2
  export { useIDBKeyval } from './useIDBKeyval/index.mjs';
3
- export { ensureFilenameWithExtension, getFileExtension, getUrlFilename, useDownload } from './useDownload/index.mjs';
3
+ export { ensureFilenameWithExtension, getFileExtension, getUrlExtension, getUrlFilename, useDownload } from './useDownload/index.mjs';
4
4
  export { useLoading } from './useLoading/index.mjs';
5
5
  export { useTimeoutPromise } from './useTimeout/index.mjs';
6
6
  export { useRectSelect } from './useRectSelect/index.mjs';
@@ -1,18 +1,18 @@
1
1
  import type { AxiosResponse } from 'axios';
2
2
  export interface DownloadOptions {
3
- /** 自定义文件名(一般情况下不建议修改,系统会自动从 URL 中提取文件名) */
3
+ /** 自定义文件名(可选)。如果想保证文件下载顺序,推荐使用 getUrlExtension 自行修改文件名 */
4
4
  filename?: string;
5
5
  }
6
6
  export interface DateownloadZipItem {
7
7
  url: string;
8
- /** 自定义文件名(一般情况下不建议修改,系统会自动从 URL 中提取文件名) */
8
+ /** 自定义文件名(可选)。如果想保证文件下载顺序,推荐使用 getUrlExtension 自行修改文件名 */
9
9
  filename?: string;
10
10
  }
11
11
  export interface DownloadFolderItem {
12
12
  url: string;
13
13
  /** 资源所在文件夹名称多级使用 / 隔开 例如:一级文件夹/二级文件夹/三级文件夹 */
14
14
  folder?: string;
15
- /** 自定义文件名(一般情况下不建议修改,系统会自动从 URL 中提取文件名) */
15
+ /** 自定义文件名(可选)。如果想保证文件下载顺序,推荐使用 getUrlExtension 自行修改文件名 */
16
16
  filename?: string;
17
17
  }
18
18
  export declare const useDownload: () => {
@@ -41,3 +41,10 @@ export declare const getFileExtension: (filename: string) => string;
41
41
  * @returns 带有扩展名的文件名
42
42
  */
43
43
  export declare const ensureFilenameWithExtension: (filename: string | undefined, url: string) => string;
44
+ /**
45
+ * 从 URL 中提取文件扩展名
46
+ * @param url 文件URL
47
+ * @returns 文件扩展名
48
+ * 例如:https://example.com/path/to/image.png?token=abc 返回 .png
49
+ */
50
+ export declare const getUrlExtension: (url: string) => string;
@@ -261,6 +261,10 @@ const ensureFilenameWithExtension = (filename, url) => {
261
261
  const extension = getFileExtension(urlFilename);
262
262
  return filename + extension;
263
263
  };
264
+ const getUrlExtension = (url) => {
265
+ const urlFilename = getUrlFilename(url);
266
+ return getFileExtension(urlFilename);
267
+ };
264
268
 
265
- export { ensureFilenameWithExtension, getFileExtension, getUrlFilename, useDownload };
269
+ export { ensureFilenameWithExtension, getFileExtension, getUrlExtension, getUrlFilename, useDownload };
266
270
  //# sourceMappingURL=index.mjs.map
@@ -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 /** 自定义文件名(一般情况下不建议修改,系统会自动从 URL 中提取文件名) */\n filename?: string;\n}\nexport interface DateownloadZipItem {\n url: string;\n /** 自定义文件名(一般情况下不建议修改,系统会自动从 URL 中提取文件名) */\n filename?: string;\n}\n\nexport interface DownloadFolderItem {\n url: string;\n /** 资源所在文件夹名称多级使用 / 隔开 例如:一级文件夹/二级文件夹/三级文件夹 */\n folder?: string;\n /** 自定义文件名(一般情况下不建议修改,系统会自动从 URL 中提取文件名) */\n filename?: string;\n}\n\nexport const useDownload = () => {\n /**\n * 通过url下载\n * @param url 文件URL\n * @param options 下载配置(一般情况下无需传入 filename,系统会自动从 URL 中提取文件名)\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 下载配置(一般情况下无需传入 filename,系统会自动从响应头中提取文件名)\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 文件列表(一般情况下每项无需传入 filename,系统会自动从 URL 中提取文件名)\n * @param filename zip文件名\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 文件列表(一般情况下每项无需传入 filename,系统会自动从 URL 中提取文件名)\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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"}
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 /** 自定义文件名(可选)。如果想保证文件下载顺序,推荐使用 getUrlExtension 自行修改文件名 */\n filename?: string;\n}\nexport interface DateownloadZipItem {\n url: string;\n /** 自定义文件名(可选)。如果想保证文件下载顺序,推荐使用 getUrlExtension 自行修改文件名 */\n filename?: string;\n}\n\nexport interface DownloadFolderItem {\n url: string;\n /** 资源所在文件夹名称多级使用 / 隔开 例如:一级文件夹/二级文件夹/三级文件夹 */\n folder?: string;\n /** 自定义文件名(可选)。如果想保证文件下载顺序,推荐使用 getUrlExtension 自行修改文件名 */\n filename?: string;\n}\n\nexport const useDownload = () => {\n /**\n * 通过url下载\n * @param url 文件URL\n * @param options 下载配置。如果想保证文件下载顺序,推荐使用 getUrlExtension 自行修改文件名\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 下载配置。如果想自定义文件名,推荐使用 getUrlExtension 获取扩展名\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 文件列表。如果想保证文件下载顺序,推荐使用 getUrlExtension 自行修改文件名\n * @param filename zip文件名\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 文件列表。如果想保证文件下载顺序,推荐使用 getUrlExtension 自行修改文件名\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/**\n * 从 URL 中提取文件扩展名\n * @param url 文件URL\n * @returns 文件扩展名\n * 例如:https://example.com/path/to/image.png?token=abc 返回 .png\n */\nexport const getUrlExtension = (url: string): string => {\n const urlFilename = getUrlFilename(url);\n return getFileExtension(urlFilename);\n};\n"],"names":["uuidv4","res"],"mappings":"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"}
@@ -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 { ensureFilenameWithExtension, getFileExtension, getUrlFilename, useDownload } from './base/useDownload/index.mjs';
5
+ export { ensureFilenameWithExtension, getFileExtension, getUrlExtension, 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';