giime 0.7.4 → 0.7.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 +536 -536
- package/es/components/index.mjs +3 -1
- package/es/components/index.mjs.map +1 -1
- package/es/components/src/business/index.mjs +1 -1
- package/es/components/src/business/uploadPro/UploadPro.vue.mjs +1 -1
- package/es/components/src/business/uploadPro/UploadPro.vue2.mjs +3 -3
- package/es/components/src/business/uploadPro/UploadPro.vue2.mjs.map +1 -1
- package/es/components/src/business/uploadPro/index.mjs +1 -1
- package/es/components/src/business/uploadPro/uploadPro.d.ts +1 -1
- package/es/components/src/business/uploadPro/uploadPro.mjs +2 -2
- package/es/components/src/business/uploadPro/uploadPro.mjs.map +1 -1
- package/es/components/src/composite/index.d.ts +1 -0
- package/es/components/src/composite/index.mjs +2 -0
- package/es/components/src/composite/index.mjs.map +1 -1
- package/es/components/src/composite/uploadFile/UploadFile.vue.d.ts +6 -4
- package/es/components/src/composite/uploadFile/UploadFile.vue.mjs +1 -1
- package/es/components/src/composite/uploadFile/UploadFile.vue2.mjs +1 -1
- package/es/components/src/composite/uploadFile/UploadFile.vue2.mjs.map +1 -1
- package/es/components/src/composite/uploadFile/index.d.ts +12 -12
- package/es/components/src/composite/uploadFile/uploadFile.d.ts +1 -2
- package/es/components/src/composite/uploadFile/uploadFile.mjs +2 -2
- package/es/components/src/composite/uploadFile/uploadFile.mjs.map +1 -1
- package/es/giime/index.mjs +4 -1
- package/es/giime/index.mjs.map +1 -1
- package/es/giime/version.d.ts +1 -1
- package/es/hooks/index.mjs +1 -0
- package/es/hooks/index.mjs.map +1 -1
- package/es/hooks/store/index.d.ts +1 -0
- package/es/hooks/store/index.mjs +1 -0
- package/es/hooks/store/index.mjs.map +1 -1
- package/es/hooks/store/useUploadTask/index.d.ts +1 -1
- package/es/hooks/store/useUploadTask/index.mjs.map +1 -1
- package/es/index.css +536 -536
- package/lib/components/index.js +19 -15
- package/lib/components/index.js.map +1 -1
- package/lib/components/src/business/index.js +1 -1
- package/lib/components/src/business/uploadPro/UploadPro.vue.js +1 -1
- package/lib/components/src/business/uploadPro/UploadPro.vue2.js +2 -2
- package/lib/components/src/business/uploadPro/UploadPro.vue2.js.map +1 -1
- package/lib/components/src/business/uploadPro/index.js +1 -1
- package/lib/components/src/business/uploadPro/uploadPro.d.ts +1 -1
- package/lib/components/src/business/uploadPro/uploadPro.js +2 -2
- package/lib/components/src/business/uploadPro/uploadPro.js.map +1 -1
- package/lib/components/src/composite/index.d.ts +1 -0
- package/lib/components/src/composite/index.js +4 -0
- package/lib/components/src/composite/index.js.map +1 -1
- package/lib/components/src/composite/uploadFile/UploadFile.vue.d.ts +6 -4
- package/lib/components/src/composite/uploadFile/UploadFile.vue.js +1 -1
- package/lib/components/src/composite/uploadFile/UploadFile.vue2.js +1 -1
- package/lib/components/src/composite/uploadFile/UploadFile.vue2.js.map +1 -1
- package/lib/components/src/composite/uploadFile/index.d.ts +12 -12
- package/lib/components/src/composite/uploadFile/uploadFile.d.ts +1 -2
- package/lib/components/src/composite/uploadFile/uploadFile.js +1 -1
- package/lib/components/src/composite/uploadFile/uploadFile.js.map +1 -1
- package/lib/giime/index.js +81 -75
- package/lib/giime/index.js.map +1 -1
- package/lib/giime/version.d.ts +1 -1
- package/lib/hooks/index.js +2 -0
- package/lib/hooks/index.js.map +1 -1
- package/lib/hooks/store/index.d.ts +1 -0
- package/lib/hooks/store/index.js +2 -0
- package/lib/hooks/store/index.js.map +1 -1
- package/lib/hooks/store/useUploadTask/index.d.ts +1 -1
- package/lib/hooks/store/useUploadTask/index.js.map +1 -1
- package/lib/index.css +536 -536
- package/package.json +1 -1
- package/es/utils/src/alioss/aliossPutHook.d.ts +0 -156
- package/es/utils/src/alioss/aliossPutHook.mjs +0 -261
- package/es/utils/src/alioss/aliossPutHook.mjs.map +0 -1
- package/es/utils/src/alioss/aliossToken.d.ts +0 -23
- package/es/utils/src/alioss/aliossToken.mjs +0 -51
- package/es/utils/src/alioss/aliossToken.mjs.map +0 -1
- package/lib/utils/src/alioss/aliossPutHook.d.ts +0 -156
- package/lib/utils/src/alioss/aliossPutHook.js +0 -265
- package/lib/utils/src/alioss/aliossPutHook.js.map +0 -1
- package/lib/utils/src/alioss/aliossToken.d.ts +0 -23
- package/lib/utils/src/alioss/aliossToken.js +0 -55
- package/lib/utils/src/alioss/aliossToken.js.map +0 -1
|
@@ -1,156 +0,0 @@
|
|
|
1
|
-
/// <reference types="@vueuse/shared" />
|
|
2
|
-
/**
|
|
3
|
-
* 阿里云OSS上传错误类型
|
|
4
|
-
*/
|
|
5
|
-
export declare class AliOssError extends Error {
|
|
6
|
-
code: string;
|
|
7
|
-
originalError?: unknown;
|
|
8
|
-
constructor(message: string, code: string, originalError?: unknown);
|
|
9
|
-
}
|
|
10
|
-
/**
|
|
11
|
-
* 上传到阿里云OSS的文件类型
|
|
12
|
-
*/
|
|
13
|
-
export type UploadAliOssFile = File & {
|
|
14
|
-
uid: number;
|
|
15
|
-
};
|
|
16
|
-
/**
|
|
17
|
-
* 上传进度回调函数类型
|
|
18
|
-
*/
|
|
19
|
-
export type ProgressCallback = (progress: {
|
|
20
|
-
percent: number;
|
|
21
|
-
loaded: number;
|
|
22
|
-
total: number;
|
|
23
|
-
}) => void;
|
|
24
|
-
/**
|
|
25
|
-
* 上传文件到阿里云参数类型
|
|
26
|
-
*/
|
|
27
|
-
export interface AliOssParams {
|
|
28
|
-
/** 资源文件 */
|
|
29
|
-
file: UploadAliOssFile;
|
|
30
|
-
/** 文件名(可选,默认使用原始文件名) */
|
|
31
|
-
fileName?: string;
|
|
32
|
-
/** 文件存储路径(可选,默认为'material') */
|
|
33
|
-
folder?: string;
|
|
34
|
-
/** 文件存储位置(可选,默认为'default') */
|
|
35
|
-
seat?: string;
|
|
36
|
-
/** 并行上传数量(可选,根据文件大小自动计算) */
|
|
37
|
-
parallel?: number;
|
|
38
|
-
/** 并行分片大小(可选,根据文件大小自动计算) */
|
|
39
|
-
partSize?: number;
|
|
40
|
-
/** 阿里上传配置(可选) */
|
|
41
|
-
options?: Record<string, any>;
|
|
42
|
-
/** 阿里服务器 Bucket 名称(可选,默认为'giikin-material') */
|
|
43
|
-
bucket?: string;
|
|
44
|
-
/** CDN域名(可选,默认为'https://sucai.giikin.cn/') */
|
|
45
|
-
cdn?: string;
|
|
46
|
-
/** 文件是否保存入库(可选,默认为false) */
|
|
47
|
-
saveStore?: boolean;
|
|
48
|
-
/** 上传进度回调(可选) */
|
|
49
|
-
onProgress?: ProgressCallback;
|
|
50
|
-
/** 取消上传的信号(可选) */
|
|
51
|
-
abortSignal?: AbortSignal;
|
|
52
|
-
/** 入库平台(可选) */
|
|
53
|
-
platform?: string;
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* 阿里云OSS上传响应类型
|
|
57
|
-
*/
|
|
58
|
-
export interface AliOssResponse {
|
|
59
|
-
/** 文件地址 */
|
|
60
|
-
url: string;
|
|
61
|
-
/** 文件名 */
|
|
62
|
-
name: string;
|
|
63
|
-
/** 文件唯一标识 */
|
|
64
|
-
uid: number;
|
|
65
|
-
/** 文件最后修改时间 */
|
|
66
|
-
lastModified: number;
|
|
67
|
-
/** 文件md5 */
|
|
68
|
-
md5: string;
|
|
69
|
-
/** 文件大小(字节) */
|
|
70
|
-
size: number;
|
|
71
|
-
/** 文件后缀(不含点) */
|
|
72
|
-
type: string;
|
|
73
|
-
/** 文件库是否存在 */
|
|
74
|
-
isExist: boolean;
|
|
75
|
-
/** 文件库中文件ID */
|
|
76
|
-
existId?: number;
|
|
77
|
-
}
|
|
78
|
-
/**
|
|
79
|
-
* 文件检查参数类型
|
|
80
|
-
*/
|
|
81
|
-
interface FileExistParams {
|
|
82
|
-
md5Code: string;
|
|
83
|
-
ext: string;
|
|
84
|
-
name: string;
|
|
85
|
-
size: number;
|
|
86
|
-
uid: number;
|
|
87
|
-
lastModified: number;
|
|
88
|
-
}
|
|
89
|
-
/**
|
|
90
|
-
* 根据文件大小计算并行上传参数
|
|
91
|
-
* @param size 文件大小(MB)
|
|
92
|
-
* @returns 并行上传参数配置
|
|
93
|
-
*/
|
|
94
|
-
export declare const getParallelPartSize: (size: number) => {
|
|
95
|
-
parallel: number;
|
|
96
|
-
partSize: number;
|
|
97
|
-
};
|
|
98
|
-
/**
|
|
99
|
-
* 阿里云OSS上传Hook
|
|
100
|
-
*/
|
|
101
|
-
export declare const useAliossHookStore: import("pinia").StoreDefinition<"aliossHook", import("pinia")._UnwrapAll<Pick<{
|
|
102
|
-
aliossResult: import("@vueuse/shared").EventHookOn<AliOssResponse>;
|
|
103
|
-
aliossError: import("@vueuse/shared").EventHookOn<Error | AliOssError>;
|
|
104
|
-
aliossProgress: import("@vueuse/shared").EventHookOn<{
|
|
105
|
-
file: UploadAliOssFile;
|
|
106
|
-
progress: {
|
|
107
|
-
percent: number;
|
|
108
|
-
loaded: number;
|
|
109
|
-
total: number;
|
|
110
|
-
};
|
|
111
|
-
}>;
|
|
112
|
-
saveFileResult: import("@vueuse/shared").EventHookOn<AliOssResponse>;
|
|
113
|
-
saveFileError: import("@vueuse/shared").EventHookOn<Error>;
|
|
114
|
-
uploadFile: (params: AliOssParams) => Promise<AliOssResponse>;
|
|
115
|
-
saveFileToStore: (params: AliOssResponse, platform?: string) => Promise<AliOssResponse>;
|
|
116
|
-
cancelUpload: (uid: number) => boolean;
|
|
117
|
-
cancelAllUploads: () => void;
|
|
118
|
-
checkFileExists: (params: FileExistParams) => Promise<AliOssResponse | false>;
|
|
119
|
-
}, never>>, Pick<{
|
|
120
|
-
aliossResult: import("@vueuse/shared").EventHookOn<AliOssResponse>;
|
|
121
|
-
aliossError: import("@vueuse/shared").EventHookOn<Error | AliOssError>;
|
|
122
|
-
aliossProgress: import("@vueuse/shared").EventHookOn<{
|
|
123
|
-
file: UploadAliOssFile;
|
|
124
|
-
progress: {
|
|
125
|
-
percent: number;
|
|
126
|
-
loaded: number;
|
|
127
|
-
total: number;
|
|
128
|
-
};
|
|
129
|
-
}>;
|
|
130
|
-
saveFileResult: import("@vueuse/shared").EventHookOn<AliOssResponse>;
|
|
131
|
-
saveFileError: import("@vueuse/shared").EventHookOn<Error>;
|
|
132
|
-
uploadFile: (params: AliOssParams) => Promise<AliOssResponse>;
|
|
133
|
-
saveFileToStore: (params: AliOssResponse, platform?: string) => Promise<AliOssResponse>;
|
|
134
|
-
cancelUpload: (uid: number) => boolean;
|
|
135
|
-
cancelAllUploads: () => void;
|
|
136
|
-
checkFileExists: (params: FileExistParams) => Promise<AliOssResponse | false>;
|
|
137
|
-
}, never>, Pick<{
|
|
138
|
-
aliossResult: import("@vueuse/shared").EventHookOn<AliOssResponse>;
|
|
139
|
-
aliossError: import("@vueuse/shared").EventHookOn<Error | AliOssError>;
|
|
140
|
-
aliossProgress: import("@vueuse/shared").EventHookOn<{
|
|
141
|
-
file: UploadAliOssFile;
|
|
142
|
-
progress: {
|
|
143
|
-
percent: number;
|
|
144
|
-
loaded: number;
|
|
145
|
-
total: number;
|
|
146
|
-
};
|
|
147
|
-
}>;
|
|
148
|
-
saveFileResult: import("@vueuse/shared").EventHookOn<AliOssResponse>;
|
|
149
|
-
saveFileError: import("@vueuse/shared").EventHookOn<Error>;
|
|
150
|
-
uploadFile: (params: AliOssParams) => Promise<AliOssResponse>;
|
|
151
|
-
saveFileToStore: (params: AliOssResponse, platform?: string) => Promise<AliOssResponse>;
|
|
152
|
-
cancelUpload: (uid: number) => boolean;
|
|
153
|
-
cancelAllUploads: () => void;
|
|
154
|
-
checkFileExists: (params: FileExistParams) => Promise<AliOssResponse | false>;
|
|
155
|
-
}, "uploadFile" | "cancelUpload" | "cancelAllUploads" | "aliossResult" | "aliossError" | "aliossProgress" | "saveFileResult" | "saveFileError" | "saveFileToStore" | "checkFileExists">>;
|
|
156
|
-
export {};
|
|
@@ -1,265 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var pinia = require('pinia');
|
|
4
|
-
var core = require('@vueuse/core');
|
|
5
|
-
var AliOss = require('ali-oss');
|
|
6
|
-
require('../../../api/materialApi/index.js');
|
|
7
|
-
var is = require('../is.js');
|
|
8
|
-
var file = require('../file.js');
|
|
9
|
-
var aliossToken = require('./aliossToken.js');
|
|
10
|
-
var getAdFileExist = require('../../../api/materialApi/cross/getAdFileExist.js');
|
|
11
|
-
var postSaveFileResources = require('../../../api/materialApi/cross/postSaveFileResources.js');
|
|
12
|
-
|
|
13
|
-
class AliOssError extends Error {
|
|
14
|
-
constructor(message, code, originalError) {
|
|
15
|
-
super(message);
|
|
16
|
-
this.code = code;
|
|
17
|
-
this.originalError = originalError;
|
|
18
|
-
this.name = "AliOssError";
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
const getParallelPartSize = (size) => {
|
|
22
|
-
const thresholds = [
|
|
23
|
-
{ max: 5, parallel: 1, multiplier: 5 },
|
|
24
|
-
// 小于5MB: 单线程,5MB分片
|
|
25
|
-
{ max: 10, parallel: 2, multiplier: 4 },
|
|
26
|
-
// 5-10MB: 2线程,4MB分片
|
|
27
|
-
{ max: 30, parallel: 4, multiplier: 5 },
|
|
28
|
-
// 10-30MB: 4线程,5MB分片
|
|
29
|
-
{ max: 50, parallel: 6, multiplier: 6 },
|
|
30
|
-
// 30-50MB: 6线程,6MB分片
|
|
31
|
-
{ max: Number.POSITIVE_INFINITY, parallel: 8, multiplier: 8 }
|
|
32
|
-
// >50MB: 8线程,8MB分片
|
|
33
|
-
];
|
|
34
|
-
const { parallel, multiplier } = thresholds.find(({ max }) => size <= max) || thresholds[thresholds.length - 1];
|
|
35
|
-
return {
|
|
36
|
-
parallel,
|
|
37
|
-
partSize: multiplier * 1024 * 1024
|
|
38
|
-
// 转换为字节
|
|
39
|
-
};
|
|
40
|
-
};
|
|
41
|
-
const getFileExtension = (filename) => {
|
|
42
|
-
const match = filename.match(/\.(\w+)$/i);
|
|
43
|
-
return match ? match[0] : "";
|
|
44
|
-
};
|
|
45
|
-
const getFileBaseName = (filename) => {
|
|
46
|
-
const ext = getFileExtension(filename);
|
|
47
|
-
return ext ? filename.slice(0, filename.length - ext.length) : filename;
|
|
48
|
-
};
|
|
49
|
-
const useAliossHookStore = pinia.defineStore("aliossHook", () => {
|
|
50
|
-
const aliossResult = core.createEventHook();
|
|
51
|
-
const aliossError = core.createEventHook();
|
|
52
|
-
const aliossProgress = core.createEventHook();
|
|
53
|
-
const saveFileResult = core.createEventHook();
|
|
54
|
-
const saveFileError = core.createEventHook();
|
|
55
|
-
const uploadTasks = /* @__PURE__ */ new Map();
|
|
56
|
-
const checkFileExists = async (params) => {
|
|
57
|
-
const { md5Code, ext, name, size, uid, lastModified } = params;
|
|
58
|
-
try {
|
|
59
|
-
const { data } = await getAdFileExist.getAdFileExist({ md5Code, ext });
|
|
60
|
-
if (data.code !== 0 || data.data.count === 0) {
|
|
61
|
-
return false;
|
|
62
|
-
}
|
|
63
|
-
const result = {
|
|
64
|
-
name,
|
|
65
|
-
uid,
|
|
66
|
-
lastModified,
|
|
67
|
-
size,
|
|
68
|
-
url: data.data.url,
|
|
69
|
-
md5: md5Code,
|
|
70
|
-
type: ext,
|
|
71
|
-
isExist: true,
|
|
72
|
-
existId: data.data.id ?? data.data.count
|
|
73
|
-
};
|
|
74
|
-
aliossResult.trigger(result);
|
|
75
|
-
return result;
|
|
76
|
-
} catch (error) {
|
|
77
|
-
const err = new AliOssError(`\u68C0\u67E5\u6587\u4EF6\u662F\u5426\u5B58\u5728\u5931\u8D25: ${error instanceof Error ? error.message : String(error)}`, "CHECK_FILE_EXIST_ERROR", error);
|
|
78
|
-
aliossError.trigger(err);
|
|
79
|
-
throw err;
|
|
80
|
-
}
|
|
81
|
-
};
|
|
82
|
-
const uploadFile = async (params) => {
|
|
83
|
-
const {
|
|
84
|
-
file: file$1,
|
|
85
|
-
fileName,
|
|
86
|
-
folder = "material",
|
|
87
|
-
seat = "default",
|
|
88
|
-
parallel,
|
|
89
|
-
partSize,
|
|
90
|
-
options = {},
|
|
91
|
-
bucket = "giikin-material",
|
|
92
|
-
cdn = "https://sucai.giikin.cn/",
|
|
93
|
-
saveStore = false,
|
|
94
|
-
onProgress,
|
|
95
|
-
abortSignal,
|
|
96
|
-
platform
|
|
97
|
-
// 入库平台
|
|
98
|
-
} = params;
|
|
99
|
-
const { name: originalName, uid, lastModified, size } = file$1;
|
|
100
|
-
const ext = getFileExtension(originalName);
|
|
101
|
-
const baseName = getFileBaseName(fileName || originalName);
|
|
102
|
-
const finalFileName = baseName + ext;
|
|
103
|
-
const fileType = ext.replace(".", "");
|
|
104
|
-
try {
|
|
105
|
-
const md5Code = await file.fileMd5(file$1);
|
|
106
|
-
const existingFile = await checkFileExists({
|
|
107
|
-
md5Code,
|
|
108
|
-
ext: fileType,
|
|
109
|
-
name: finalFileName,
|
|
110
|
-
size,
|
|
111
|
-
uid,
|
|
112
|
-
lastModified
|
|
113
|
-
});
|
|
114
|
-
if (existingFile) {
|
|
115
|
-
return existingFile;
|
|
116
|
-
}
|
|
117
|
-
if (abortSignal?.aborted) {
|
|
118
|
-
throw new AliOssError("\u4E0A\u4F20\u5DF2\u53D6\u6D88", "UPLOAD_ABORTED");
|
|
119
|
-
}
|
|
120
|
-
const timestamp = Date.now();
|
|
121
|
-
const path = `${folder}/${seat}/file-${timestamp}-${md5Code}${ext}`;
|
|
122
|
-
const sizeInMB = size / (1024 * 1024);
|
|
123
|
-
const uploadParams = getParallelPartSize(sizeInMB);
|
|
124
|
-
const uploadOptions = {
|
|
125
|
-
...uploadParams,
|
|
126
|
-
...parallel !== void 0 ? { parallel } : {},
|
|
127
|
-
...partSize !== void 0 ? { partSize } : {},
|
|
128
|
-
ContentDisposition: `attachment;filename=${encodeURIComponent(baseName)}${ext};filename*=${encodeURIComponent(baseName)}${ext}`,
|
|
129
|
-
...options
|
|
130
|
-
};
|
|
131
|
-
const { AccessKeyId, AccessKeySecret, SecurityToken } = await aliossToken.default().getAliossTokenAsync({
|
|
132
|
-
config_id: bucket
|
|
133
|
-
});
|
|
134
|
-
const client = new AliOss({
|
|
135
|
-
region: "oss-cn-shenzhen",
|
|
136
|
-
accessKeyId: AccessKeyId,
|
|
137
|
-
accessKeySecret: AccessKeySecret,
|
|
138
|
-
stsToken: SecurityToken,
|
|
139
|
-
refreshSTSTokenInterval: 3e5,
|
|
140
|
-
bucket
|
|
141
|
-
});
|
|
142
|
-
const uploadMethod = uploadOptions.parallel === 1 ? "put" : "multipartUpload";
|
|
143
|
-
const progressCallback = onProgress ? (p) => {
|
|
144
|
-
onProgress(p);
|
|
145
|
-
aliossProgress.trigger({ file: file$1, progress: p });
|
|
146
|
-
} : void 0;
|
|
147
|
-
if (uploadMethod === "multipartUpload") {
|
|
148
|
-
try {
|
|
149
|
-
const uploadOptions2 = { ...uploadOptions };
|
|
150
|
-
if (progressCallback) {
|
|
151
|
-
uploadOptions2.progress = progressCallback;
|
|
152
|
-
}
|
|
153
|
-
const uploadPromise = client.multipartUpload(path, file$1, uploadOptions2);
|
|
154
|
-
const cancelFn = () => {
|
|
155
|
-
console.warn("\u5C1D\u8BD5\u53D6\u6D88\u4E0A\u4F20\uFF0C\u4F46ali-oss SDK\u53EF\u80FD\u4E0D\u652F\u6301\u53D6\u6D88\u64CD\u4F5C");
|
|
156
|
-
};
|
|
157
|
-
uploadTasks.set(uid, { cancel: cancelFn });
|
|
158
|
-
if (abortSignal) {
|
|
159
|
-
abortSignal.addEventListener("abort", () => {
|
|
160
|
-
cancelFn();
|
|
161
|
-
});
|
|
162
|
-
}
|
|
163
|
-
const result2 = await uploadPromise;
|
|
164
|
-
uploadTasks.delete(uid);
|
|
165
|
-
if (!result2 || !result2.res || result2.res.status !== 200) {
|
|
166
|
-
throw new AliOssError(`\u4E0A\u4F20\u5931\u8D25: ${result2?.res ? `HTTP\u72B6\u6001\u7801 ${result2.res.status}` : "\u672A\u77E5\u9519\u8BEF"}`, "UPLOAD_FAILED", result2);
|
|
167
|
-
}
|
|
168
|
-
} catch (err) {
|
|
169
|
-
uploadTasks.delete(uid);
|
|
170
|
-
throw err;
|
|
171
|
-
}
|
|
172
|
-
} else {
|
|
173
|
-
const result2 = await client.put(path, file$1, uploadOptions);
|
|
174
|
-
if (!result2 || !result2.res || result2.res.status !== 200) {
|
|
175
|
-
throw new AliOssError(`\u4E0A\u4F20\u5931\u8D25: ${result2?.res ? `HTTP\u72B6\u6001\u7801 ${result2.res.status}` : "\u672A\u77E5\u9519\u8BEF"}`, "UPLOAD_FAILED", result2);
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
const resultUrl = cdn + path;
|
|
179
|
-
const result = {
|
|
180
|
-
url: resultUrl,
|
|
181
|
-
name: finalFileName,
|
|
182
|
-
md5: md5Code,
|
|
183
|
-
type: fileType,
|
|
184
|
-
uid,
|
|
185
|
-
lastModified,
|
|
186
|
-
size,
|
|
187
|
-
isExist: false
|
|
188
|
-
};
|
|
189
|
-
if (saveStore) {
|
|
190
|
-
saveFileToStore(result, platform).catch((error) => {
|
|
191
|
-
console.error("\u4FDD\u5B58\u6587\u4EF6\u5230\u7D20\u6750\u5E93\u5931\u8D25:", error);
|
|
192
|
-
});
|
|
193
|
-
}
|
|
194
|
-
aliossResult.trigger(result);
|
|
195
|
-
return result;
|
|
196
|
-
} catch (error) {
|
|
197
|
-
uploadTasks.delete(uid);
|
|
198
|
-
const err = error instanceof AliOssError ? error : new AliOssError(`\u4E0A\u4F20\u6587\u4EF6\u5931\u8D25: ${error instanceof Error ? error.message : String(error)}`, "UPLOAD_ERROR", error);
|
|
199
|
-
aliossError.trigger(err);
|
|
200
|
-
throw err;
|
|
201
|
-
}
|
|
202
|
-
};
|
|
203
|
-
const saveFileToStore = async (params, platform) => {
|
|
204
|
-
try {
|
|
205
|
-
let res = {};
|
|
206
|
-
const info = {};
|
|
207
|
-
if (is.isImageUrl(params.url)) {
|
|
208
|
-
res = await file.getImageInfo(params.url);
|
|
209
|
-
} else if (is.isVideoUrl(params.url)) {
|
|
210
|
-
res = await file.getVideoInfo(params.url);
|
|
211
|
-
info.pay_time = res.duration;
|
|
212
|
-
}
|
|
213
|
-
info.width = res.width;
|
|
214
|
-
info.high = res.height;
|
|
215
|
-
const { url, md5: md5_code, size: file_size } = params;
|
|
216
|
-
const { data } = await postSaveFileResources.postSaveFileResources({ fileData: { url, md5_code, file_size, ...info, platform } });
|
|
217
|
-
if (data?.code !== 0) {
|
|
218
|
-
const errorMsg = data?.comment || data?.data?.message || "\u672A\u77E5\u9519\u8BEF";
|
|
219
|
-
const error = new Error(`\u4FDD\u5B58\u6587\u4EF6\u5230\u7D20\u6750\u5E93\u5931\u8D25: ${errorMsg}`);
|
|
220
|
-
saveFileError.trigger(error);
|
|
221
|
-
throw error;
|
|
222
|
-
}
|
|
223
|
-
const result = { ...params, ...res, existId: data.data.id ?? data.comment };
|
|
224
|
-
saveFileResult.trigger(result);
|
|
225
|
-
return result;
|
|
226
|
-
} catch (error) {
|
|
227
|
-
const err = error instanceof Error ? error : new Error(`\u4FDD\u5B58\u6587\u4EF6\u5230\u7D20\u6750\u5E93\u5931\u8D25: ${String(error)}`);
|
|
228
|
-
saveFileError.trigger(err);
|
|
229
|
-
throw err;
|
|
230
|
-
}
|
|
231
|
-
};
|
|
232
|
-
const cancelUpload = (uid) => {
|
|
233
|
-
const task = uploadTasks.get(uid);
|
|
234
|
-
if (task) {
|
|
235
|
-
task.cancel();
|
|
236
|
-
uploadTasks.delete(uid);
|
|
237
|
-
return true;
|
|
238
|
-
}
|
|
239
|
-
return false;
|
|
240
|
-
};
|
|
241
|
-
const cancelAllUploads = () => {
|
|
242
|
-
uploadTasks.forEach((task) => task.cancel());
|
|
243
|
-
uploadTasks.clear();
|
|
244
|
-
};
|
|
245
|
-
return {
|
|
246
|
-
// 事件监听器
|
|
247
|
-
aliossResult: aliossResult.on,
|
|
248
|
-
aliossError: aliossError.on,
|
|
249
|
-
aliossProgress: aliossProgress.on,
|
|
250
|
-
saveFileResult: saveFileResult.on,
|
|
251
|
-
saveFileError: saveFileError.on,
|
|
252
|
-
// 主要方法
|
|
253
|
-
uploadFile,
|
|
254
|
-
saveFileToStore,
|
|
255
|
-
cancelUpload,
|
|
256
|
-
cancelAllUploads,
|
|
257
|
-
// 辅助方法
|
|
258
|
-
checkFileExists
|
|
259
|
-
};
|
|
260
|
-
});
|
|
261
|
-
|
|
262
|
-
exports.AliOssError = AliOssError;
|
|
263
|
-
exports.getParallelPartSize = getParallelPartSize;
|
|
264
|
-
exports.useAliossHookStore = useAliossHookStore;
|
|
265
|
-
//# sourceMappingURL=aliossPutHook.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"aliossPutHook.js","sources":["../../../../../../packages/utils/src/alioss/aliossPutHook.ts"],"sourcesContent":["import { defineStore } from 'pinia';\nimport { createEventHook } from '@vueuse/core';\nimport AliOss from 'ali-oss';\nimport { getAdFileExist, postSaveFileResources } from '@giime/api/materialApi';\nimport { isImageUrl, isVideoUrl } from '../is';\nimport { fileMd5, getImageInfo, getVideoInfo } from '../file';\nimport useAliossTokenStore from './aliossToken';\n\n/**\n * 阿里云OSS上传错误类型\n */\nexport class AliOssError extends Error {\n constructor(\n message: string,\n public code: string,\n public originalError?: unknown,\n ) {\n super(message);\n this.name = 'AliOssError';\n }\n}\n/**\n * 上传到阿里云OSS的文件类型\n */\nexport type UploadAliOssFile = File & { uid: number };\n\n/**\n * 上传进度回调函数类型\n */\nexport type ProgressCallback = (progress: { percent: number; loaded: number; total: number }) => void;\n\n/**\n * 上传文件到阿里云参数类型\n */\nexport interface AliOssParams {\n /** 资源文件 */\n file: UploadAliOssFile;\n /** 文件名(可选,默认使用原始文件名) */\n fileName?: string;\n /** 文件存储路径(可选,默认为'material') */\n folder?: string;\n /** 文件存储位置(可选,默认为'default') */\n seat?: string;\n /** 并行上传数量(可选,根据文件大小自动计算) */\n parallel?: number;\n /** 并行分片大小(可选,根据文件大小自动计算) */\n partSize?: number;\n /** 阿里上传配置(可选) */\n options?: Record<string, any>;\n /** 阿里服务器 Bucket 名称(可选,默认为'giikin-material') */\n bucket?: string;\n /** CDN域名(可选,默认为'https://sucai.giikin.cn/') */\n cdn?: string;\n /** 文件是否保存入库(可选,默认为false) */\n saveStore?: boolean;\n /** 上传进度回调(可选) */\n onProgress?: ProgressCallback;\n /** 取消上传的信号(可选) */\n abortSignal?: AbortSignal;\n /** 入库平台(可选) */\n platform?: string;\n}\n\n/**\n * 阿里云OSS上传响应类型\n */\nexport interface AliOssResponse {\n /** 文件地址 */\n url: string;\n /** 文件名 */\n name: string;\n /** 文件唯一标识 */\n uid: number;\n /** 文件最后修改时间 */\n lastModified: number;\n /** 文件md5 */\n md5: string;\n /** 文件大小(字节) */\n size: number;\n /** 文件后缀(不含点) */\n type: string;\n /** 文件库是否存在 */\n isExist: boolean;\n /** 文件库中文件ID */\n existId?: number;\n}\n\n/**\n * 文件检查参数类型\n */\ninterface FileExistParams {\n md5Code: string;\n ext: string;\n name: string;\n size: number;\n uid: number;\n lastModified: number;\n}\n\n/**\n * 根据文件大小计算并行上传参数\n * @param size 文件大小(MB)\n * @returns 并行上传参数配置\n */\nexport const getParallelPartSize = (size: number) => {\n // 文件大小阈值(MB)及对应的并行配置\n const thresholds = [\n { max: 5, parallel: 1, multiplier: 5 }, // 小于5MB: 单线程,5MB分片\n { max: 10, parallel: 2, multiplier: 4 }, // 5-10MB: 2线程,4MB分片\n { max: 30, parallel: 4, multiplier: 5 }, // 10-30MB: 4线程,5MB分片\n { max: 50, parallel: 6, multiplier: 6 }, // 30-50MB: 6线程,6MB分片\n { max: Number.POSITIVE_INFINITY, parallel: 8, multiplier: 8 }, // >50MB: 8线程,8MB分片\n ];\n\n // 查找适合当前文件大小的配置\n const { parallel, multiplier } = thresholds.find(({ max }) => size <= max) || thresholds[thresholds.length - 1];\n\n return {\n parallel,\n partSize: multiplier * 1024 * 1024, // 转换为字节\n };\n};\n\n/**\n * 从文件名中提取扩展名\n * @param filename 文件名\n * @returns 扩展名(包含点)\n */\nconst getFileExtension = (filename: string): string => {\n const match = filename.match(/\\.(\\w+)$/i);\n return match ? match[0] : '';\n};\n\n/**\n * 从文件名中提取基本名称(不含扩展名)\n * @param filename 文件名\n * @returns 基本名称\n */\nconst getFileBaseName = (filename: string): string => {\n const ext = getFileExtension(filename);\n return ext ? filename.slice(0, filename.length - ext.length) : filename;\n};\n\n/**\n * 阿里云OSS上传Hook\n */\nexport const useAliossHookStore = defineStore('aliossHook', () => {\n // 创建事件钩子\n const aliossResult = createEventHook<AliOssResponse>();\n const aliossError = createEventHook<AliOssError | Error>();\n const aliossProgress = createEventHook<{ file: UploadAliOssFile; progress: { percent: number; loaded: number; total: number } }>();\n const saveFileResult = createEventHook<AliOssResponse>();\n const saveFileError = createEventHook<Error>();\n\n // 存储当前上传任务,用于取消\n const uploadTasks = new Map<number, { cancel: () => void }>();\n\n /**\n * 检测文件是否已存在于素材库\n * @param params 文件检查参数\n * @returns 如果文件存在,返回文件信息;否则返回false\n */\n const checkFileExists = async (params: FileExistParams): Promise<AliOssResponse | false> => {\n const { md5Code, ext, name, size, uid, lastModified } = params;\n\n try {\n const { data } = await getAdFileExist({ md5Code, ext });\n\n // 文件不存在\n if (data.code !== 0 || data.data.count === 0) {\n return false;\n }\n\n // 文件已存在,构建响应\n const result: AliOssResponse = {\n name,\n uid,\n lastModified,\n size,\n url: data.data.url,\n md5: md5Code,\n type: ext,\n isExist: true,\n existId: data.data.id ?? data.data.count,\n };\n\n // 触发结果事件\n aliossResult.trigger(result);\n return result;\n } catch (error) {\n // 处理错误\n const err = new AliOssError(`检查文件是否存在失败: ${error instanceof Error ? error.message : String(error)}`, 'CHECK_FILE_EXIST_ERROR', error);\n aliossError.trigger(err);\n throw err;\n }\n };\n\n /**\n * 上传文件到阿里云OSS\n * @param params 上传参数\n * @returns 上传结果\n */\n const uploadFile = async (params: AliOssParams): Promise<AliOssResponse> => {\n const {\n file,\n fileName,\n folder = 'material',\n seat = 'default',\n parallel,\n partSize,\n options = {},\n bucket = 'giikin-material',\n cdn = 'https://sucai.giikin.cn/',\n saveStore = false,\n onProgress,\n abortSignal,\n platform, // 入库平台\n } = params;\n\n const { name: originalName, uid, lastModified, size } = file;\n\n // 提取文件扩展名和基本名称\n const ext = getFileExtension(originalName);\n const baseName = getFileBaseName(fileName || originalName);\n const finalFileName = baseName + ext;\n const fileType = ext.replace('.', '');\n\n try {\n // 计算文件MD5\n const md5Code = await fileMd5(file);\n\n // 检查文件是否已存在\n const existingFile = await checkFileExists({\n md5Code,\n ext: fileType,\n name: finalFileName,\n size,\n uid,\n lastModified,\n });\n\n // 如果文件已存在,直接返回\n if (existingFile) {\n return existingFile;\n }\n\n // 如果提供了取消信号并且已经被触发,则取消上传\n if (abortSignal?.aborted) {\n throw new AliOssError('上传已取消', 'UPLOAD_ABORTED');\n }\n\n // 生成文件存储路径\n const timestamp = Date.now();\n const path = `${folder}/${seat}/file-${timestamp}-${md5Code}${ext}`;\n\n // 根据文件大小计算上传参数\n const sizeInMB = size / (1024 * 1024);\n const uploadParams = getParallelPartSize(sizeInMB);\n\n // 合并上传选项\n const uploadOptions = {\n ...uploadParams,\n ...(parallel !== undefined ? { parallel } : {}),\n ...(partSize !== undefined ? { partSize } : {}),\n ContentDisposition: `attachment;filename=${encodeURIComponent(baseName)}${ext};filename*=${encodeURIComponent(baseName)}${ext}`,\n ...options,\n };\n\n // 获取阿里云临时上传权限\n const { AccessKeyId, AccessKeySecret, SecurityToken } = await useAliossTokenStore().getAliossTokenAsync({\n config_id: bucket,\n });\n\n // 创建阿里云OSS客户端\n const client = new AliOss({\n region: 'oss-cn-shenzhen',\n accessKeyId: AccessKeyId,\n accessKeySecret: AccessKeySecret,\n stsToken: SecurityToken,\n refreshSTSTokenInterval: 300000,\n bucket,\n });\n\n // 根据并行数选择上传方法\n const uploadMethod = uploadOptions.parallel === 1 ? 'put' : 'multipartUpload';\n\n // 添加进度回调\n const progressCallback = onProgress\n ? (p: { percent: number; loaded: number; total: number }) => {\n onProgress(p);\n aliossProgress.trigger({ file, progress: p });\n }\n : undefined;\n\n // 处理上传\n if (uploadMethod === 'multipartUpload') {\n // 分片上传\n try {\n // 创建一个可取消的上传任务\n // 注意:使用as any来绕过TypeScript类型检查,因为ali-oss类型定义可能不完整\n const uploadOptions2 = { ...uploadOptions };\n if (progressCallback) {\n (uploadOptions2 as any).progress = progressCallback;\n }\n\n const uploadPromise = client.multipartUpload(path, file, uploadOptions2 as any);\n\n // 创建一个取消函数\n const cancelFn = () => {\n // 注意:ali-oss SDK可能没有直接提供取消方法\n // 这里我们需要根据SDK文档调整实际取消逻辑\n console.warn('尝试取消上传,但ali-oss SDK可能不支持取消操作');\n };\n\n uploadTasks.set(uid, { cancel: cancelFn });\n\n // 监听取消信号\n if (abortSignal) {\n abortSignal.addEventListener('abort', () => {\n cancelFn();\n });\n }\n\n // 等待上传完成\n const result = await uploadPromise;\n uploadTasks.delete(uid);\n\n if (!result || !result.res || result.res.status !== 200) {\n throw new AliOssError(`上传失败: ${result?.res ? `HTTP状态码 ${result.res.status}` : '未知错误'}`, 'UPLOAD_FAILED', result);\n }\n } catch (err) {\n uploadTasks.delete(uid);\n throw err;\n }\n } else {\n // 普通上传\n const result = await client.put(path, file, uploadOptions as any);\n\n if (!result || !result.res || result.res.status !== 200) {\n throw new AliOssError(`上传失败: ${result?.res ? `HTTP状态码 ${result.res.status}` : '未知错误'}`, 'UPLOAD_FAILED', result);\n }\n }\n\n // 构建结果URL\n const resultUrl = cdn + path;\n\n // 构建响应对象\n const result: AliOssResponse = {\n url: resultUrl,\n name: finalFileName,\n md5: md5Code,\n type: fileType,\n uid,\n lastModified,\n size,\n isExist: false,\n };\n\n // 如果需要保存到素材库\n if (saveStore) {\n saveFileToStore(result, platform).catch(error => {\n console.error('保存文件到素材库失败:', error);\n });\n }\n\n // 触发成功事件\n aliossResult.trigger(result);\n return result;\n } catch (error) {\n // 移除上传任务\n uploadTasks.delete(uid);\n\n // 处理错误\n const err =\n error instanceof AliOssError\n ? error\n : new AliOssError(`上传文件失败: ${error instanceof Error ? error.message : String(error)}`, 'UPLOAD_ERROR', error);\n\n // 触发错误事件\n aliossError.trigger(err);\n throw err;\n }\n };\n\n /**\n * 保存文件到素材库\n * @param params 文件保存参数\n * @returns 保存结果\n */\n const saveFileToStore = async (params: AliOssResponse, platform?: string): Promise<AliOssResponse> => {\n try {\n let res: any = {};\n const info: any = {};\n if (isImageUrl(params.url)) {\n res = await getImageInfo(params.url);\n } else if (isVideoUrl(params.url)) {\n res = await getVideoInfo(params.url);\n info.pay_time = res.duration;\n }\n info.width = res.width;\n info.high = res.height;\n\n const { url, md5: md5_code, size: file_size } = params;\n\n const { data } = await postSaveFileResources({ fileData: { url, md5_code, file_size, ...info, platform } });\n\n if (data?.code !== 0) {\n const errorMsg = data?.comment || data?.data?.message || '未知错误';\n const error = new Error(`保存文件到素材库失败: ${errorMsg}`);\n saveFileError.trigger(error);\n throw error;\n }\n\n const result = { ...params, ...res, existId: data.data.id ?? data.comment };\n saveFileResult.trigger(result);\n return result;\n } catch (error) {\n const err = error instanceof Error ? error : new Error(`保存文件到素材库失败: ${String(error)}`);\n\n saveFileError.trigger(err);\n throw err;\n }\n };\n\n /**\n * 取消文件上传\n * @param uid 文件唯一标识\n * @returns 是否成功取消\n */\n const cancelUpload = (uid: number): boolean => {\n const task = uploadTasks.get(uid);\n if (task) {\n task.cancel();\n uploadTasks.delete(uid);\n return true;\n }\n return false;\n };\n\n /**\n * 取消所有上传任务\n */\n const cancelAllUploads = (): void => {\n uploadTasks.forEach(task => task.cancel());\n uploadTasks.clear();\n };\n\n return {\n // 事件监听器\n aliossResult: aliossResult.on,\n aliossError: aliossError.on,\n aliossProgress: aliossProgress.on,\n saveFileResult: saveFileResult.on,\n saveFileError: saveFileError.on,\n\n // 主要方法\n uploadFile,\n saveFileToStore,\n cancelUpload,\n cancelAllUploads,\n\n // 辅助方法\n checkFileExists,\n };\n});\n"],"names":["defineStore","createEventHook","getAdFileExist","file","fileMd5","useAliossTokenStore","result","isImageUrl","getImageInfo","isVideoUrl","getVideoInfo","postSaveFileResources"],"mappings":"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"}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { type GetOssAccessTokenResponseData } from '../../../api/materialApi';
|
|
2
|
-
/**
|
|
3
|
-
* @description 素材上传权限
|
|
4
|
-
* @param {*}
|
|
5
|
-
* @return {*}
|
|
6
|
-
**/
|
|
7
|
-
declare const useAliossTokenStore: import("pinia").StoreDefinition<"aliossToken", import("pinia")._UnwrapAll<Pick<{
|
|
8
|
-
isLoading: import("vue").Ref<boolean>;
|
|
9
|
-
getAliossTokenAsync: (params?: {
|
|
10
|
-
config_id?: string;
|
|
11
|
-
}) => Promise<GetOssAccessTokenResponseData>;
|
|
12
|
-
}, "isLoading">>, Pick<{
|
|
13
|
-
isLoading: import("vue").Ref<boolean>;
|
|
14
|
-
getAliossTokenAsync: (params?: {
|
|
15
|
-
config_id?: string;
|
|
16
|
-
}) => Promise<GetOssAccessTokenResponseData>;
|
|
17
|
-
}, never>, Pick<{
|
|
18
|
-
isLoading: import("vue").Ref<boolean>;
|
|
19
|
-
getAliossTokenAsync: (params?: {
|
|
20
|
-
config_id?: string;
|
|
21
|
-
}) => Promise<GetOssAccessTokenResponseData>;
|
|
22
|
-
}, "getAliossTokenAsync">>;
|
|
23
|
-
export default useAliossTokenStore;
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
-
|
|
5
|
-
var vue = require('vue');
|
|
6
|
-
var pinia = require('pinia');
|
|
7
|
-
require('../../../api/materialApi/index.js');
|
|
8
|
-
var core = require('@vueuse/core');
|
|
9
|
-
var Cookies = require('js-cookie');
|
|
10
|
-
var getOssAccessToken = require('../../../api/materialApi/cross/getOssAccessToken.js');
|
|
11
|
-
|
|
12
|
-
const useAliossTokenStore = pinia.defineStore("aliossToken", () => {
|
|
13
|
-
const isLoading = vue.ref(false);
|
|
14
|
-
const aliossTokenResult = core.createEventHook();
|
|
15
|
-
const setCookie = (data) => {
|
|
16
|
-
if (!data)
|
|
17
|
-
return;
|
|
18
|
-
const { Expiration } = data;
|
|
19
|
-
const time = new Date(new Date(Expiration ?? 0).getTime() - 1e4);
|
|
20
|
-
Cookies.set("aliossStsToken", JSON.stringify(data), { expires: time });
|
|
21
|
-
};
|
|
22
|
-
const getAliossToken = async (params) => {
|
|
23
|
-
const aliossStsToken = Cookies.get("aliossStsToken");
|
|
24
|
-
if (aliossStsToken) {
|
|
25
|
-
return JSON.parse(aliossStsToken);
|
|
26
|
-
}
|
|
27
|
-
isLoading.value = true;
|
|
28
|
-
try {
|
|
29
|
-
const { data } = await getOssAccessToken.getOssAccessToken({ config_id: params?.config_id || "giikin-material" });
|
|
30
|
-
if (data.code === 0) {
|
|
31
|
-
setCookie(data.data);
|
|
32
|
-
aliossTokenResult.trigger(data.data);
|
|
33
|
-
}
|
|
34
|
-
return data.data;
|
|
35
|
-
} finally {
|
|
36
|
-
isLoading.value = false;
|
|
37
|
-
}
|
|
38
|
-
};
|
|
39
|
-
const getAliossTokenAsync = (params) => {
|
|
40
|
-
return new Promise((resolve) => {
|
|
41
|
-
if (isLoading.value) {
|
|
42
|
-
aliossTokenResult.on((value) => resolve(value));
|
|
43
|
-
} else {
|
|
44
|
-
resolve(getAliossToken(params));
|
|
45
|
-
}
|
|
46
|
-
});
|
|
47
|
-
};
|
|
48
|
-
return {
|
|
49
|
-
isLoading,
|
|
50
|
-
getAliossTokenAsync
|
|
51
|
-
};
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
exports.default = useAliossTokenStore;
|
|
55
|
-
//# sourceMappingURL=aliossToken.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"aliossToken.js","sources":["../../../../../../packages/utils/src/alioss/aliossToken.ts"],"sourcesContent":["import { ref } from 'vue';\nimport { defineStore } from 'pinia';\nimport { type GetOssAccessTokenResponseData, getOssAccessToken } from '@giime/api/materialApi';\nimport { createEventHook } from '@vueuse/core';\nimport Cookies from 'js-cookie';\n\n/**\n * @description 素材上传权限\n * @param {*}\n * @return {*}\n **/\n\nconst useAliossTokenStore = defineStore('aliossToken', () => {\n const isLoading = ref(false);\n const aliossTokenResult = createEventHook<GetOssAccessTokenResponseData>();\n\n const setCookie = (data: GetOssAccessTokenResponseData) => {\n if (!data) return;\n const { Expiration } = data;\n const time = new Date(new Date(Expiration ?? 0).getTime() - 10000); //-10秒作为缓冲\n Cookies.set('aliossStsToken', JSON.stringify(data), { expires: time });\n };\n\n /* 请求临时上传权限 */\n const getAliossToken = async (params?: { config_id?: string }) => {\n const aliossStsToken = Cookies.get('aliossStsToken');\n if (aliossStsToken) {\n return JSON.parse(aliossStsToken) as GetOssAccessTokenResponseData;\n }\n isLoading.value = true;\n try {\n const { data } = await getOssAccessToken({ config_id: params?.config_id || 'giikin-material' });\n if (data.code === 0) {\n setCookie(data.data);\n aliossTokenResult.trigger(data.data);\n }\n return data.data;\n } finally {\n isLoading.value = false;\n }\n };\n\n /* 获取 alioss 临时上传 token*/\n const getAliossTokenAsync = (params?: { config_id?: string }) => {\n /* 若正在请求请求临时token接口 则其他后进来的等待 */\n return new Promise<GetOssAccessTokenResponseData>(resolve => {\n if (isLoading.value) {\n aliossTokenResult.on(value => resolve(value));\n } else {\n resolve(getAliossToken(params));\n }\n });\n };\n\n return {\n isLoading,\n getAliossTokenAsync,\n };\n});\n\nexport default useAliossTokenStore;\n"],"names":["defineStore","ref","createEventHook","getOssAccessToken"],"mappings":";;;;;;;;;;;AAYM,MAAA,mBAAA,GAAsBA,iBAAY,CAAA,aAAA,EAAe,MAAM;AAC3D,EAAM,MAAA,SAAA,GAAYC,QAAI,KAAK,CAAA,CAAA;AAC3B,EAAA,MAAM,oBAAoBC,oBAA+C,EAAA,CAAA;AAEzE,EAAM,MAAA,SAAA,GAAY,CAAC,IAAwC,KAAA;AACzD,IAAA,IAAI,CAAC,IAAA;AAAM,MAAA,OAAA;AACX,IAAM,MAAA,EAAE,YAAe,GAAA,IAAA,CAAA;AACvB,IAAM,MAAA,IAAA,GAAO,IAAI,IAAA,CAAK,IAAI,IAAA,CAAK,cAAc,CAAC,CAAA,CAAE,OAAQ,EAAA,GAAI,GAAK,CAAA,CAAA;AACjE,IAAQ,OAAA,CAAA,GAAA,CAAI,kBAAkB,IAAK,CAAA,SAAA,CAAU,IAAI,CAAG,EAAA,EAAE,OAAS,EAAA,IAAA,EAAM,CAAA,CAAA;AAAA,GACvE,CAAA;AAGA,EAAM,MAAA,cAAA,GAAiB,OAAO,MAAoC,KAAA;AAChE,IAAM,MAAA,cAAA,GAAiB,OAAQ,CAAA,GAAA,CAAI,gBAAgB,CAAA,CAAA;AACnD,IAAA,IAAI,cAAgB,EAAA;AAClB,MAAO,OAAA,IAAA,CAAK,MAAM,cAAc,CAAA,CAAA;AAAA,KAClC;AACA,IAAA,SAAA,CAAU,KAAQ,GAAA,IAAA,CAAA;AAClB,IAAI,IAAA;AACF,MAAM,MAAA,EAAE,IAAK,EAAA,GAAI,MAAMC,mCAAA,CAAkB,EAAE,SAAW,EAAA,MAAA,EAAQ,SAAa,IAAA,iBAAA,EAAmB,CAAA,CAAA;AAC9F,MAAI,IAAA,IAAA,CAAK,SAAS,CAAG,EAAA;AACnB,QAAA,SAAA,CAAU,KAAK,IAAI,CAAA,CAAA;AACnB,QAAkB,iBAAA,CAAA,OAAA,CAAQ,KAAK,IAAI,CAAA,CAAA;AAAA,OACrC;AACA,MAAA,OAAO,IAAK,CAAA,IAAA,CAAA;AAAA,KACZ,SAAA;AACA,MAAA,SAAA,CAAU,KAAQ,GAAA,KAAA,CAAA;AAAA,KACpB;AAAA,GACF,CAAA;AAGA,EAAM,MAAA,mBAAA,GAAsB,CAAC,MAAoC,KAAA;AAE/D,IAAO,OAAA,IAAI,QAAuC,CAAW,OAAA,KAAA;AAC3D,MAAA,IAAI,UAAU,KAAO,EAAA;AACnB,QAAA,iBAAA,CAAkB,EAAG,CAAA,CAAA,KAAA,KAAS,OAAQ,CAAA,KAAK,CAAC,CAAA,CAAA;AAAA,OACvC,MAAA;AACL,QAAQ,OAAA,CAAA,cAAA,CAAe,MAAM,CAAC,CAAA,CAAA;AAAA,OAChC;AAAA,KACD,CAAA,CAAA;AAAA,GACH,CAAA;AAEA,EAAO,OAAA;AAAA,IACL,SAAA;AAAA,IACA,mBAAA;AAAA,GACF,CAAA;AACF,CAAC;;;;"}
|