From 226f1704c3bce31d63d9e3c07560edddcfd36499 Mon Sep 17 00:00:00 2001 From: Kuingsmile Date: Sun, 2 Jun 2024 11:45:40 +0800 Subject: [PATCH 01/23] :sparkles: Feature(custom): support create bucket for s3 --- public/i18n/en.yml | 23 +++-- public/i18n/zh-CN.yml | 23 +++-- public/i18n/zh-TW.yml | 22 +++-- src/main/manage/apis/s3plist.ts | 88 +++++++++++++++++++- src/main/manage/apis/tcyun.ts | 7 +- src/main/manage/manageApi.ts | 1 + src/renderer/manage/pages/manageMain.vue | 3 +- src/renderer/manage/utils/newBucketConfig.ts | 71 ++++++---------- src/universal/types/i18n.d.ts | 22 +++-- 9 files changed, 156 insertions(+), 104 deletions(-) diff --git a/public/i18n/en.yml b/public/i18n/en.yml index 02f1ee1..7284c42 100644 --- a/public/i18n/en.yml +++ b/public/i18n/en.yml @@ -944,19 +944,16 @@ MANAGE_NEW_BUCKET_QINIU_BUCKETNAME_RULE_MSG_B: Bucket name length cannot exceed MANAGE_NEW_BUCKET_QINIU_BUCKETNAME_RULE_MSG_C: Bucket names can only contain lowercase letters, numbers, and hyphens, and cannot start or end with a hyphen. MANAGE_NEW_BUCKET_QINIU_REGION: Region MANAGE_NEW_BUCKET_QINIU_ACL_DESC: Public Access -MANAGE_NEW_BUCKET_UPYUN_NAME: Upyun -MANAGE_NEW_BUCKET_UPYUN_BUCKETNAME_DESC: Bucket Name -MANAGE_NEW_BUCKET_UPYUN_BUCKETNAME_PLACEHOLDER: Please enter bucket name -MANAGE_NEW_BUCKET_UPYUN_BUCKETNAME_RULE_MSG_A: Bucket name cannot be empty -MANAGE_NEW_BUCKET_UPYUN_BUCKETNAME_RULE_MSG_B: Bucket name length should be between 5-20 characters -MANAGE_NEW_BUCKET_UPYUN_BUCKETNAME_RULE_MSG_C: Bucket names can only contain lowercase letters, numbers, and hyphens, and cannot start or end with a hyphen. -MANAGE_NEW_BUCKET_UPYUN_OPERATORNAME_DESC: Operator Name -MANAGE_NEW_BUCKET_UPYUN_OPERATORNAME_PLACEHOLDER: Please enter operator name -MANAGE_NEW_BUCKET_UPYUN_OPERATORNAME_RULE_MSG_A: Operator name cannot be empty -MANAGE_NEW_BUCKET_UPYUN_PASSWORD_DESC: Password -MANAGE_NEW_BUCKET_UPYUN_PASSWORD_PLACEHOLDER: Please enter password -MANAGE_NEW_BUCKET_UPYUN_PASSWORD_RULE_MSG_A: Password cannot be empty - +MANAGE_NEW_BUCKET_S3PLIST_NAME: S3-Compatible +MANAGE_NEW_BUCKET_S3PLIST_BUCKETNAME_DESC: Bucket Name +MANAGE_NEW_BUCKET_S3PLIST_BUCKETNAME_PLACEHOLDER: Please enter the Bucket name +MANAGE_NEW_BUCKET_S3PLIST_BUCKETNAME_RULE_MSG_A: Bucket name can't be empty +MANAGE_NEW_BUCKET_S3PLIST_REGION: Region +MANAGE_NEW_BUCKET_S3PLIST_ACL_DESC: Access Control +MANAGE_NEW_BUCKET_S3PLIST_ACL_PUBLIC_RW: Public Read and Write +MANAGE_NEW_BUCKET_S3PLIST_ACL_PUBLIC_R: Public Read +MANAGE_NEW_BUCKET_S3PLIST_ACL_PRIVATE: Private +MANAGE_NEW_BUCKET_S3PLIST_ACL_AUTHENTICATED_READ: Authenticated Read # ---renderer i18n end--- # plugins diff --git a/public/i18n/zh-CN.yml b/public/i18n/zh-CN.yml index 1a2a1c2..c211ef2 100644 --- a/public/i18n/zh-CN.yml +++ b/public/i18n/zh-CN.yml @@ -949,19 +949,16 @@ MANAGE_NEW_BUCKET_QINIU_BUCKETNAME_RULE_MSG_B: Bucket名称长度不能超过63 MANAGE_NEW_BUCKET_QINIU_BUCKETNAME_RULE_MSG_C: Bucket名称只能包含小写字母、数字和中划线,且不能以中划线开头和结尾 MANAGE_NEW_BUCKET_QINIU_REGION: 区域 MANAGE_NEW_BUCKET_QINIU_ACL_DESC: 公开访问 -MANAGE_NEW_BUCKET_UPYUN_NAME: 又拍云 -MANAGE_NEW_BUCKET_UPYUN_BUCKETNAME_DESC: Bucket名 -MANAGE_NEW_BUCKET_UPYUN_BUCKETNAME_PLACEHOLDER: 请输入Bucket名 -MANAGE_NEW_BUCKET_UPYUN_BUCKETNAME_RULE_MSG_A: Bucket名不能为空 -MANAGE_NEW_BUCKET_UPYUN_BUCKETNAME_RULE_MSG_B: Bucket名称长度为5-20个字符 -MANAGE_NEW_BUCKET_UPYUN_BUCKETNAME_RULE_MSG_C: Bucket名称只能包含小写字母、数字和中划线,且不能以中划线开头和结尾 -MANAGE_NEW_BUCKET_UPYUN_OPERATORNAME_DESC: 操作员 -MANAGE_NEW_BUCKET_UPYUN_OPERATORNAME_PLACEHOLDER: 请输入操作员 -MANAGE_NEW_BUCKET_UPYUN_OPERATORNAME_RULE_MSG_A: 操作员不能为空 -MANAGE_NEW_BUCKET_UPYUN_PASSWORD_DESC: 密码 -MANAGE_NEW_BUCKET_UPYUN_PASSWORD_PLACEHOLDER: 请输入密码 -MANAGE_NEW_BUCKET_UPYUN_PASSWORD_RULE_MSG_A: 密码不能为空 - +MANAGE_NEW_BUCKET_S3PLIST_NAME: S3兼容云 +MANAGE_NEW_BUCKET_S3PLIST_BUCKETNAME_DESC: Bucket名 +MANAGE_NEW_BUCKET_S3PLIST_BUCKETNAME_PLACEHOLDER: 请输入Bucket名 +MANAGE_NEW_BUCKET_S3PLIST_BUCKETNAME_RULE_MSG_A: Bucket名不能为空 +MANAGE_NEW_BUCKET_S3PLIST_REGION: 区域 +MANAGE_NEW_BUCKET_S3PLIST_ACL_DESC: 访问权限 +MANAGE_NEW_BUCKET_S3PLIST_ACL_PUBLIC_RW: 公共读写 +MANAGE_NEW_BUCKET_S3PLIST_ACL_PUBLIC_R: 公共读 +MANAGE_NEW_BUCKET_S3PLIST_ACL_PRIVATE: 私有 +MANAGE_NEW_BUCKET_S3PLIST_ACL_AUTHENTICATED_READ: 授权读 # ---renderer i18n end--- diff --git a/public/i18n/zh-TW.yml b/public/i18n/zh-TW.yml index 971e944..82704df 100644 --- a/public/i18n/zh-TW.yml +++ b/public/i18n/zh-TW.yml @@ -944,18 +944,16 @@ MANAGE_NEW_BUCKET_QINIU_BUCKETNAME_RULE_MSG_B: Bucket名稱長度不能超過63 MANAGE_NEW_BUCKET_QINIU_BUCKETNAME_RULE_MSG_C: Bucket名稱只能包含小寫字母、數字和中橫線,且不能以中橫線開頭和結尾 MANAGE_NEW_BUCKET_QINIU_REGION: 區域 MANAGE_NEW_BUCKET_QINIU_ACL_DESC: 公開訪問 -MANAGE_NEW_BUCKET_UPYUN_NAME: 又拍雲 -MANAGE_NEW_BUCKET_UPYUN_BUCKETNAME_DESC: Bucket名稱 -MANAGE_NEW_BUCKET_UPYUN_BUCKETNAME_PLACEHOLDER: 請輸入Bucket名稱 -MANAGE_NEW_BUCKET_UPYUN_BUCKETNAME_RULE_MSG_A: Bucket名稱不能為空 -MANAGE_NEW_BUCKET_UPYUN_BUCKETNAME_RULE_MSG_B: Bucket名稱長度為5-20個字符 -MANAGE_NEW_BUCKET_UPYUN_BUCKETNAME_RULE_MSG_C: Bucket名稱只能包含小寫字母、數字和中橫線,且不能以中橫線開頭和結尾 -MANAGE_NEW_BUCKET_UPYUN_OPERATORNAME_DESC: 操作員 -MANAGE_NEW_BUCKET_UPYUN_OPERATORNAME_PLACEHOLDER: 請輸入操作員 -MANAGE_NEW_BUCKET_UPYUN_OPERATORNAME_RULE_MSG_A: 操作員不能為空 -MANAGE_NEW_BUCKET_UPYUN_PASSWORD_DESC: 密碼 -MANAGE_NEW_BUCKET_UPYUN_PASSWORD_PLACEHOLDER: 請輸入密碼 -MANAGE_NEW_BUCKET_UPYUN_PASSWORD_RULE_MSG_A: 密碼不能為空 +MANAGE_NEW_BUCKET_S3PLIST_NAME: S3兼容雲 +MANAGE_NEW_BUCKET_S3PLIST_BUCKETNAME_DESC: Bucket名稱 +MANAGE_NEW_BUCKET_S3PLIST_BUCKETNAME_PLACEHOLDER: 請輸入Bucket名稱 +MANAGE_NEW_BUCKET_S3PLIST_BUCKETNAME_RULE_MSG_A: Bucket名稱不能為空 +MANAGE_NEW_BUCKET_S3PLIST_REGION: 區域 +MANAGE_NEW_BUCKET_S3PLIST_ACL_DESC: 訪問權限 +MANAGE_NEW_BUCKET_S3PLIST_ACL_PUBLIC_RW: 公共讀寫 +MANAGE_NEW_BUCKET_S3PLIST_ACL_PUBLIC_R: 公共讀 +MANAGE_NEW_BUCKET_S3PLIST_ACL_PRIVATE: 私有 +MANAGE_NEW_BUCKET_S3PLIST_ACL_AUTHENTICATED_READ: 授權讀 # ---renderer i18n end--- # plugins diff --git a/src/main/manage/apis/s3plist.ts b/src/main/manage/apis/s3plist.ts index 8875516..40e33d2 100644 --- a/src/main/manage/apis/s3plist.ts +++ b/src/main/manage/apis/s3plist.ts @@ -12,7 +12,10 @@ import { DeleteObjectCommand, DeleteObjectsCommand, PutObjectCommand, - S3ClientConfig + S3ClientConfig, + CreateBucketCommand, + PutPublicAccessBlockCommand, + PutBucketAclCommand } from '@aws-sdk/client-s3' // AWS S3 上传和进度 @@ -171,6 +174,89 @@ class S3plistApi { } } + async putPublicAccess (bucketName: string, client: S3Client) { + const input = { + Bucket: bucketName, + PublicAccessBlockConfiguration: { + BlockPublicAcls: false, + IgnorePublicAcls: false, + BlockPublicPolicy: false, + RestrictPublicBuckets: false + } + } + const command = new PutPublicAccessBlockCommand(input) + const data = await client.send(command) + if (data.$metadata.httpStatusCode !== 200) { + this.logParam(data, 'putPublicAccess') + throw new Error('manage.setting.putPublicAccessError') + } + } + + /** + * 新建存储桶 + * @param {Object} configMap + * configMap = { + * BucketName: string, + * region: string, + * acl: string + * } + */ + async createBucket (configMap: IStringKeyMap): Promise { + const { BucketName, region, acl, endpoint } = configMap + try { + await this.getDogeCloudToken() + const options = Object.assign({}, this.baseOptions) as S3ClientConfig + options.region = String(region) || 'us-east-1' + const client = new S3Client(options) + const command = new ListBucketsCommand({}) + const data = await client.send(command) + if (data.$metadata.httpStatusCode === 200) { + const bucketList = data.Buckets?.map((item) => item.Name) + if (bucketList?.includes(BucketName)) { + return true + } + } + if (endpoint === '' || endpoint.includes('amazonaws')) { + const createCommand = new CreateBucketCommand({ + Bucket: BucketName, + ObjectOwnership: 'BucketOwnerPreferred' + }) + const createData = await client.send(createCommand) + if (createData.$metadata.httpStatusCode === 200) { + if (acl !== 'private') { + await this.putPublicAccess(BucketName, client) + const putACLCommand = new PutBucketAclCommand({ + Bucket: BucketName, + ACL: acl + }) + const putACLData = await client.send(putACLCommand) + if (putACLData.$metadata.httpStatusCode !== 200) { + this.logParam(putACLData, 'createBucket') + return false + } + } + return true + } else { + this.logParam(createData, 'createBucket') + } + } else { + const createCommand = new CreateBucketCommand({ + Bucket: BucketName, + ACL: acl + }) + const createData = await client.send(createCommand) + if (createData.$metadata.httpStatusCode === 200) { + return true + } else { + this.logParam(createData, 'createBucket') + } + } + } catch (error) { + this.logParam(error, 'createBucket') + } + return false + } + /** * 获取存储桶列表 */ diff --git a/src/main/manage/apis/tcyun.ts b/src/main/manage/apis/tcyun.ts index 296ef8b..57e3276 100644 --- a/src/main/manage/apis/tcyun.ts +++ b/src/main/manage/apis/tcyun.ts @@ -108,13 +108,8 @@ class TcyunApi { * acl: private | publicRead | publicReadWrite */ async createBucket (configMap: IStringKeyMap): Promise < boolean > { - const aclTransMap: IStringKeyMap = { - private: 'private', - publicRead: 'public-read', - publicReadWrite: 'public-read-write' - } const res = await this.ctx.putBucket({ - ACL: aclTransMap[configMap.acl], + ACL: configMap.acl, Bucket: configMap.BucketName, Region: configMap.region }) diff --git a/src/main/manage/manageApi.ts b/src/main/manage/manageApi.ts index 7380029..e22081c 100644 --- a/src/main/manage/manageApi.ts +++ b/src/main/manage/manageApi.ts @@ -230,6 +230,7 @@ export class ManageApi extends EventEmitter implements ManageApiType { case 'tcyun': case 'aliyun': case 'qiniu': + case 's3plist': try { client = this.createClient() as any return await client.createBucket(param!) diff --git a/src/renderer/manage/pages/manageMain.vue b/src/renderer/manage/pages/manageMain.vue index f5f42b3..c40ffc3 100644 --- a/src/renderer/manage/pages/manageMain.vue +++ b/src/renderer/manage/pages/manageMain.vue @@ -355,7 +355,7 @@ const urlMap : IStringKeyMap = { webdavplist: 'https://baike.baidu.com/item/WebDAV/4610909' } -const showNewIconList = ['aliyun', 'qiniu', 'tcyun'] +const showNewIconList = ['aliyun', 'qiniu', 'tcyun', 's3plist'] const bucketT = $T('MANAGE_MAIN_PAGE_BUCKET') const galleryT = $T('MANAGE_MAIN_PAGE_GALLERY') @@ -415,6 +415,7 @@ function createNewBucket (picBedName: string) { if (currentPicBedName.value === 'tcyun') { resultMap.BucketName = `${resultMap.BucketName}-${currentPagePicBedConfig.appId}` } + resultMap.endpoint = currentPagePicBedConfig.endpoint invokeToMain('createBucket', currentAlias, resultMap).then((result: any) => { if (result) { ElNotification({ diff --git a/src/renderer/manage/utils/newBucketConfig.ts b/src/renderer/manage/utils/newBucketConfig.ts index bab4ec2..f9d6263 100644 --- a/src/renderer/manage/utils/newBucketConfig.ts +++ b/src/renderer/manage/utils/newBucketConfig.ts @@ -50,8 +50,8 @@ export const newBucketConfig:IStringKeyMap = { default: 'private', options: { private: $T('MANAGE_NEW_BUCKET_TCYUN_ACL_PRIVATE'), - publicRead: $T('MANAGE_NEW_BUCKET_TCYUN_ACL_PUBLIC_R'), - publicReadWrite: $T('MANAGE_NEW_BUCKET_TCYUN_ACL_PUBLIC_RW') + 'public-read': $T('MANAGE_NEW_BUCKET_TCYUN_ACL_PUBLIC_R'), + 'public-read-write': $T('MANAGE_NEW_BUCKET_TCYUN_ACL_PUBLIC_RW') } } }, @@ -162,67 +162,46 @@ export const newBucketConfig:IStringKeyMap = { }, options: ['BucketName', 'region', 'acl'] }, - upyun: { - name: $T('MANAGE_NEW_BUCKET_UPYUN_NAME'), - icon: 'upyun', + s3plist: { + name: $T('MANAGE_NEW_BUCKET_S3PLIST_NAME'), + icon: 's3plist', configOptions: { BucketName: { required: true, - description: $T('MANAGE_NEW_BUCKET_UPYUN_BUCKETNAME_DESC'), - placeholder: $T('MANAGE_NEW_BUCKET_UPYUN_BUCKETNAME_PLACEHOLDER'), + description: $T('MANAGE_NEW_BUCKET_S3PLIST_BUCKETNAME_DESC'), + placeholder: $T('MANAGE_NEW_BUCKET_S3PLIST_BUCKETNAME_PLACEHOLDER'), paraType: 'string', component: 'input', default: 'piclist', rule: [ { required: true, - message: $T('MANAGE_NEW_BUCKET_UPYUN_BUCKETNAME_RULE_MSG_A'), - trigger: 'blur' - }, - { - validator: (rule: any, value: any, callback: any) => { - const reg = /^[a-z][a-z0-9-]{4,19}$/ - if (value.length > 23 || value.length < 5) { - callback(new Error($T('MANAGE_NEW_BUCKET_UPYUN_BUCKETNAME_RULE_MSG_B'))) - } else if (!reg.test(value)) { - callback(new Error($T('MANAGE_NEW_BUCKET_UPYUN_BUCKETNAME_RULE_MSG_C'))) - } else { - callback() - } - }, - trigger: 'change' - } - ] - }, - operator: { - required: true, - description: $T('MANAGE_NEW_BUCKET_UPYUN_OPERATORNAME_DESC'), - placeholder: $T('MANAGE_NEW_BUCKET_UPYUN_OPERATORNAME_PLACEHOLDER'), - paraType: 'string', - component: 'input', - rule: [ - { - required: true, - message: $T('MANAGE_NEW_BUCKET_UPYUN_OPERATORNAME_RULE_MSG_A'), + message: $T('MANAGE_NEW_BUCKET_S3PLIST_BUCKETNAME_RULE_MSG_A'), trigger: 'blur' } ] }, - password: { + region: { required: true, - description: $T('MANAGE_NEW_BUCKET_UPYUN_PASSWORD_DESC'), - placeholder: $T('MANAGE_NEW_BUCKET_UPYUN_PASSWORD_PLACEHOLDER'), + description: $T('MANAGE_NEW_BUCKET_S3PLIST_REGION'), paraType: 'string', component: 'input', - rule: [ - { - required: true, - message: $T('MANAGE_NEW_BUCKET_UPYUN_PASSWORD_RULE_MSG_A'), - trigger: 'blur' - } - ] + default: 'us-east-1' + }, + acl: { + required: true, + description: $T('MANAGE_NEW_BUCKET_S3PLIST_ACL_DESC'), + paraType: 'string', + component: 'select', + default: 'private', + options: { + private: $T('MANAGE_NEW_BUCKET_S3PLIST_ACL_PRIVATE'), + 'public-read': $T('MANAGE_NEW_BUCKET_S3PLIST_ACL_PUBLIC_R'), + 'public-read-write': $T('MANAGE_NEW_BUCKET_S3PLIST_ACL_PUBLIC_RW'), + 'authenticated-read': $T('MANAGE_NEW_BUCKET_S3PLIST_ACL_AUTHENTICATED_READ') + } } }, - options: ['BucketName', 'operator', 'password'] + options: ['BucketName', 'region', 'acl'] } } diff --git a/src/universal/types/i18n.d.ts b/src/universal/types/i18n.d.ts index baa9b2a..dacf790 100644 --- a/src/universal/types/i18n.d.ts +++ b/src/universal/types/i18n.d.ts @@ -901,18 +901,16 @@ interface ILocales { MANAGE_NEW_BUCKET_QINIU_BUCKETNAME_RULE_MSG_C: string MANAGE_NEW_BUCKET_QINIU_REGION: string MANAGE_NEW_BUCKET_QINIU_ACL_DESC: string - MANAGE_NEW_BUCKET_UPYUN_NAME: string - MANAGE_NEW_BUCKET_UPYUN_BUCKETNAME_DESC: string - MANAGE_NEW_BUCKET_UPYUN_BUCKETNAME_PLACEHOLDER: string - MANAGE_NEW_BUCKET_UPYUN_BUCKETNAME_RULE_MSG_A: string - MANAGE_NEW_BUCKET_UPYUN_BUCKETNAME_RULE_MSG_B: string - MANAGE_NEW_BUCKET_UPYUN_BUCKETNAME_RULE_MSG_C: string - MANAGE_NEW_BUCKET_UPYUN_OPERATORNAME_DESC: string - MANAGE_NEW_BUCKET_UPYUN_OPERATORNAME_PLACEHOLDER: string - MANAGE_NEW_BUCKET_UPYUN_OPERATORNAME_RULE_MSG_A: string - MANAGE_NEW_BUCKET_UPYUN_PASSWORD_DESC: string - MANAGE_NEW_BUCKET_UPYUN_PASSWORD_PLACEHOLDER: string - MANAGE_NEW_BUCKET_UPYUN_PASSWORD_RULE_MSG_A: string + MANAGE_NEW_BUCKET_S3PLIST_NAME: string + MANAGE_NEW_BUCKET_S3PLIST_BUCKETNAME_DESC: string + MANAGE_NEW_BUCKET_S3PLIST_BUCKETNAME_PLACEHOLDER: string + MANAGE_NEW_BUCKET_S3PLIST_BUCKETNAME_RULE_MSG_A: string + MANAGE_NEW_BUCKET_S3PLIST_REGION: string + MANAGE_NEW_BUCKET_S3PLIST_ACL_DESC: string + MANAGE_NEW_BUCKET_S3PLIST_ACL_PUBLIC_RW: string + MANAGE_NEW_BUCKET_S3PLIST_ACL_PUBLIC_R: string + MANAGE_NEW_BUCKET_S3PLIST_ACL_PRIVATE: string + MANAGE_NEW_BUCKET_S3PLIST_ACL_AUTHENTICATED_READ: string PLUGIN_INSTALL_SUCCEED: string PLUGIN_INSTALL_FAILED: string PLUGIN_UNINSTALL_SUCCEED: string From f1a7a13eda54921becbe2d6cf8d988e85ae5ff00 Mon Sep 17 00:00:00 2001 From: Kuingsmile Date: Sun, 2 Jun 2024 21:09:50 +0800 Subject: [PATCH 02/23] :bug: Fix(custom): fix url copy error for dirs --- src/main/manage/apis/aliyun.ts | 7 ++++--- src/main/manage/apis/github.ts | 16 ++++++++++++++-- src/main/manage/apis/qiniu.ts | 7 ++++--- src/main/manage/apis/s3plist.ts | 7 ++++--- src/main/manage/apis/tcyun.ts | 7 ++++--- src/main/manage/apis/upyun.ts | 11 ++++++++--- 6 files changed, 38 insertions(+), 17 deletions(-) diff --git a/src/main/manage/apis/aliyun.ts b/src/main/manage/apis/aliyun.ts index ccbe17f..ec3cac6 100644 --- a/src/main/manage/apis/aliyun.ts +++ b/src/main/manage/apis/aliyun.ts @@ -53,9 +53,10 @@ class AliyunApi { this.logger = logger } - formatFolder (item: string, slicedPrefix: string) { + formatFolder (item: string, slicedPrefix: string, urlPrefix: string): any { return { key: item, + url: `${urlPrefix}/${item}`, fileSize: 0, formatedTime: '', fileName: item.replace(slicedPrefix, '').replace('/', ''), @@ -288,7 +289,7 @@ class AliyunApi { }) if (res?.res?.statusCode === 200) { res?.prefixes?.forEach((item: string) => { - result.fullList.push(this.formatFolder(item, slicedPrefix)) + result.fullList.push(this.formatFolder(item, slicedPrefix, urlPrefix)) }) res?.objects?.forEach((item: OSS.ObjectMeta) => { item.size !== 0 && result.fullList.push(this.formatFile(item, slicedPrefix, urlPrefix)) @@ -348,7 +349,7 @@ class AliyunApi { } } const fullList = [ - ...(res.prefixes?.map((item: string) => this.formatFolder(item, slicedPrefix)) || []), + ...(res.prefixes?.map((item: string) => this.formatFolder(item, slicedPrefix, urlPrefix)) || []), ...(res.objects?.filter((item: OSS.ObjectMeta) => item.size !== 0).map((item: OSS.ObjectMeta) => this.formatFile(item, slicedPrefix, urlPrefix)) || []) ] return { diff --git a/src/main/manage/apis/github.ts b/src/main/manage/apis/github.ts index f7c4ccc..139ba0a 100644 --- a/src/main/manage/apis/github.ts +++ b/src/main/manage/apis/github.ts @@ -52,11 +52,23 @@ class GithubApi { } } - formatFolder (item: any, slicedPrefix: string) { + formatFolder (item: any, slicedPrefix: string, branch: string, repo: string, cdnUrl: string | undefined) { const key = `${slicedPrefix ? `${slicedPrefix}/` : ''}${item.path}/` + let rawUrl = '' + const placeholders = ['{username}', '{repo}', '{branch}', '{path}'] + rawUrl = cdnUrl + ? placeholders.some(item => cdnUrl.includes(item)) + ? placeholders.reduce((url, ph) => { + const value = ph === '{username}' ? this.username : ph === '{repo}' ? repo : ph === '{branch}' ? branch : ph === '{path}' ? key : '' + return url.replaceAll(ph, value) + }, cdnUrl) + : `${cdnUrl}/${key}` + : `https://raw.githubusercontent.com/${this.username}/${repo}/${branch}/${key}` + rawUrl = rawUrl.replace(/(? { if (item.type === 'tree') { - result.fullList.push(this.formatFolder(item, slicedPrefix)) + result.fullList.push(this.formatFolder(item, slicedPrefix, branch, repo, cdnUrl)) } else { result.fullList.push(this.formatFile(item, slicedPrefix, branch, repo, cdnUrl)) } diff --git a/src/main/manage/apis/qiniu.ts b/src/main/manage/apis/qiniu.ts index 1b64711..7f53bfc 100644 --- a/src/main/manage/apis/qiniu.ts +++ b/src/main/manage/apis/qiniu.ts @@ -52,10 +52,11 @@ class QiniuApi { this.logger = logger } - formatFolder (item: string, slicedPrefix: string) { + formatFolder (item: string, slicedPrefix: string, urlPrefix: string) { return { Key: item, key: item, + url: `${urlPrefix}/${item}`, fileSize: 0, fileName: item.replace(slicedPrefix, '').replace('/', ''), isDir: true, @@ -342,7 +343,7 @@ class QiniuApi { }) if (res && res.respInfo.statusCode === 200) { res.respBody && res.respBody.commonPrefixes && res.respBody.commonPrefixes.forEach((item: any) => { - result.fullList.push(this.formatFolder(item, slicedPrefix)) + result.fullList.push(this.formatFolder(item, slicedPrefix, urlPrefix)) }) res.respBody && res.respBody.items && res.respBody.items.forEach((item: any) => { item.fsize !== 0 && result.fullList.push(this.formatFile(item, slicedPrefix, urlPrefix)) @@ -409,7 +410,7 @@ class QiniuApi { if (res?.respInfo?.statusCode === 200) { if (res.respBody?.commonPrefixes) { res.respBody.commonPrefixes.forEach((item: string) => { - result.fullList.push(this.formatFolder(item, slicedPrefix)) + result.fullList.push(this.formatFolder(item, slicedPrefix, urlPrefix)) }) } if (res.respBody?.items) { diff --git a/src/main/manage/apis/s3plist.ts b/src/main/manage/apis/s3plist.ts index 40e33d2..a9f30cb 100644 --- a/src/main/manage/apis/s3plist.ts +++ b/src/main/manage/apis/s3plist.ts @@ -144,9 +144,10 @@ class S3plistApi { logParam = (error:any, method: string) => this.logger.error(formatError(error, { class: 'S3plistApi', method })) - formatFolder (item: CommonPrefix, slicedPrefix: string): any { + formatFolder (item: CommonPrefix, slicedPrefix: string, urlPrefix: string): any { return { Key: item.Prefix, + url: `${urlPrefix}/${item.Prefix}`, fileSize: 0, formatedTime: '', fileName: item.Prefix?.replace(slicedPrefix, '').replace('/', ''), @@ -419,7 +420,7 @@ class S3plistApi { res = await client.send(command) if (res.$metadata.httpStatusCode === 200) { res.CommonPrefixes && res.CommonPrefixes.forEach((item: CommonPrefix) => { - result.fullList.push(this.formatFolder(item, slicedPrefix)) + result.fullList.push(this.formatFolder(item, slicedPrefix, urlPrefix)) }) res.Contents && res.Contents.forEach((item: _Object) => { result.fullList.push(this.formatFile(item, slicedPrefix, urlPrefix)) @@ -471,7 +472,7 @@ class S3plistApi { const data = await client.send(command) if (data.$metadata.httpStatusCode === 200) { result.fullList = [ - ...(data.CommonPrefixes?.map(item => this.formatFolder(item, slicedPrefix)) || []), + ...(data.CommonPrefixes?.map(item => this.formatFolder(item, slicedPrefix, urlPrefix)) || []), ...(data.Contents?.map(item => this.formatFile(item, slicedPrefix, urlPrefix)) || []) ] result.isTruncated = data.IsTruncated || false diff --git a/src/main/manage/apis/tcyun.ts b/src/main/manage/apis/tcyun.ts index 57e3276..51ec0be 100644 --- a/src/main/manage/apis/tcyun.ts +++ b/src/main/manage/apis/tcyun.ts @@ -46,11 +46,12 @@ class TcyunApi { this.logger = logger } - formatFolder (item: {Prefix: string}, slicedPrefix: string): any { + formatFolder (item: {Prefix: string}, slicedPrefix: string, urlPrefix: string) { return { ...item, key: item.Prefix, fileSize: 0, + url: `${urlPrefix}/${item.Prefix}`, formatedTime: '', fileName: item.Prefix.replace(slicedPrefix, '').replace('/', ''), isDir: true, @@ -191,7 +192,7 @@ class TcyunApi { }) if (res?.statusCode === 200) { result.fullList.push( - ...res.CommonPrefixes.map(item => this.formatFolder(item, slicedPrefix)), + ...res.CommonPrefixes.map(item => this.formatFolder(item, slicedPrefix, urlPrefix)), ...res.Contents.filter(item => parseInt(item.Size) !== 0) .map(item => this.formatFile(item, slicedPrefix, urlPrefix)) ) @@ -247,7 +248,7 @@ class TcyunApi { } const result = { fullList: [ - ...res.CommonPrefixes.map(item => this.formatFolder(item, slicedPrefix)), + ...res.CommonPrefixes.map(item => this.formatFolder(item, slicedPrefix, urlPrefix)), ...res.Contents.filter(item => parseInt(item.Size) !== 0) .map(item => this.formatFile(item, slicedPrefix, urlPrefix)) ], diff --git a/src/main/manage/apis/upyun.ts b/src/main/manage/apis/upyun.ts index a961466..6a472dd 100644 --- a/src/main/manage/apis/upyun.ts +++ b/src/main/manage/apis/upyun.ts @@ -67,11 +67,16 @@ class UpyunApi { return `_upt=${upt}` } - formatFolder (item: any, slicedPrefix: string) { + formatFolder (item: any, slicedPrefix: string, urlPrefix: string) { const key = `${slicedPrefix}${item.name}/` + let url = `${urlPrefix}/${key}` + if (this.antiLeechToken) { + url = `${url}?${this.getAntiLeechParam(key)}` + } return { ...item, key, + url, fileSize: 0, formatedTime: '', fileName: item.name, @@ -202,7 +207,7 @@ class UpyunApi { if (res) { res.files?.forEach((item: any) => { item.type === 'N' && result.fullList.push(this.formatFile(item, slicedPrefix, urlPrefix)) - item.type === 'F' && result.fullList.push(this.formatFolder(item, slicedPrefix)) + item.type === 'F' && result.fullList.push(this.formatFolder(item, slicedPrefix, urlPrefix)) }) window.webContents.send('refreshFileTransferList', result) } else { @@ -252,7 +257,7 @@ class UpyunApi { if (res) { res.files?.forEach((item: any) => { item.type === 'N' && result.fullList.push(this.formatFile(item, slicedPrefix, urlPrefix)) - item.type === 'F' && result.fullList.push(this.formatFolder(item, slicedPrefix)) + item.type === 'F' && result.fullList.push(this.formatFolder(item, slicedPrefix, urlPrefix)) }) result.isTruncated = res.next !== this.stopMarker result.nextMarker = res.next From 30341d47a02532bc667dc04cb8640f999946cae6 Mon Sep 17 00:00:00 2001 From: Kuingsmile Date: Mon, 3 Jun 2024 16:23:46 +0800 Subject: [PATCH 03/23] :bug: Fix(custom): fix bug while using webp plugin ISSUES CLOSED: #205 --- src/main/apis/app/uploader/index.ts | 2 +- src/main/lifeCycle/index.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/apis/app/uploader/index.ts b/src/main/apis/app/uploader/index.ts index 33c9316..d345492 100644 --- a/src/main/apis/app/uploader/index.ts +++ b/src/main/apis/app/uploader/index.ts @@ -155,7 +155,7 @@ class Uploader { return false } finally { if (filePath) { - fse.unlink(filePath) + fse.remove(filePath) } } } diff --git a/src/main/lifeCycle/index.ts b/src/main/lifeCycle/index.ts index 0ce5304..bd72260 100644 --- a/src/main/lifeCycle/index.ts +++ b/src/main/lifeCycle/index.ts @@ -223,7 +223,7 @@ class LifeCycle { settingWindow.focus() } const clipboardDir = path.join(picgo.baseDir, CLIPBOARD_IMAGE_FOLDER) - fs.ensureDir(clipboardDir) + fs.emptyDir(clipboardDir) } app.whenReady().then(readyFunction) } From 0c241bc82c6ca89c241d479aa07763d7938bea96 Mon Sep 17 00:00:00 2001 From: Kuingsmile Date: Mon, 3 Jun 2024 19:25:06 +0800 Subject: [PATCH 04/23] :bug: Fix(custom): fix css error --- src/renderer/manage/pages/bucketPage.vue | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/renderer/manage/pages/bucketPage.vue b/src/renderer/manage/pages/bucketPage.vue index 6369aac..15921ed 100644 --- a/src/renderer/manage/pages/bucketPage.vue +++ b/src/renderer/manage/pages/bucketPage.vue @@ -821,7 +821,7 @@ https://www.baidu.com/img/bd_logo1.png"
From afffea762378dbbb0697cfe8b71cb999ae78c418 Mon Sep 17 00:00:00 2001 From: Kuingsmile Date: Tue, 4 Jun 2024 14:58:51 +0800 Subject: [PATCH 05/23] :hammer: Refactor(custom): refactor drop down item in bucket page --- public/i18n/en.yml | 11 +++- public/i18n/zh-CN.yml | 11 +++- public/i18n/zh-TW.yml | 11 +++- src/renderer/manage/pages/bucketPage.vue | 82 ++++++------------------ src/renderer/pages/Gallery.vue | 4 +- src/universal/types/i18n.d.ts | 11 +++- 6 files changed, 55 insertions(+), 75 deletions(-) diff --git a/public/i18n/en.yml b/public/i18n/en.yml index 7284c42..f18e8c4 100644 --- a/public/i18n/en.yml +++ b/public/i18n/en.yml @@ -758,13 +758,18 @@ MANAGE_BUCKET_DELETE_BTN: Delete MANAGE_BUCKET_SORT_TITLE: Sort MANAGE_BUCKET_SORT_NAME: Name MANAGE_BUCKET_SORT_SIZE: Size -MANAGE_BUCKET_SORT_TYPE: Type +MANAGE_BUCKET_SORT_EXT: Type MANAGE_BUCKET_SORT_TIME: Time -MANAGE_BUCKET_SORT_SELECTED: Selected status -MANAGE_BUCKET_INIT: Init +MANAGE_BUCKET_SORT_CHECK: Selected status +MANAGE_BUCKET_SORT_INIT: Init MANAGE_BUCKET_URL_UPLOAD_DIALOG_TITLE: Please enter URL(s), support multiple URLs separated by line breaks MANAGE_BUCKET_URL_UPLOAD_DIALOG_CONFIRM: Confirm MANAGE_BUCKET_URL_UPLOAD_DIALOG_CANCEL: Cancel +MANAGE_BUCKET_URL_FORMAT_MARKDOWN: Markdown +MANAGE_BUCKET_URL_FORMAT_MARKDOWN_WITH_LINK: Markdown-link +MANAGE_BUCKET_URL_FORMAT_URL: Url +MANAGE_BUCKET_URL_FORMAT_HTML: Html +MANAGE_BUCKET_URL_FORMAT_BBCODE: BBCode MANAGE_BUCKET_URL_FORMAT_CUSTOM: Custom MANAGE_BUCKET_URL_FORMAT_PRESIGN: Presigned link MANAGE_BUCKET_FILE_INFO_TITLE: File information diff --git a/public/i18n/zh-CN.yml b/public/i18n/zh-CN.yml index c211ef2..5083db2 100644 --- a/public/i18n/zh-CN.yml +++ b/public/i18n/zh-CN.yml @@ -763,13 +763,18 @@ MANAGE_BUCKET_DELETE_BTN: 删除 MANAGE_BUCKET_SORT_TITLE: 排序 MANAGE_BUCKET_SORT_NAME: 文件名 MANAGE_BUCKET_SORT_SIZE: 大小 -MANAGE_BUCKET_SORT_TYPE: 类型 +MANAGE_BUCKET_SORT_EXT: 类型 MANAGE_BUCKET_SORT_TIME: 时间 -MANAGE_BUCKET_SORT_SELECTED: 选中状态 -MANAGE_BUCKET_INIT: 初始化 +MANAGE_BUCKET_SORT_CHECK: 选中状态 +MANAGE_BUCKET_SORT_INIT: 初始化 MANAGE_BUCKET_URL_UPLOAD_DIALOG_TITLE: 请输入URL,支持多个URL,以换行分隔 MANAGE_BUCKET_URL_UPLOAD_DIALOG_CONFIRM: 确定 MANAGE_BUCKET_URL_UPLOAD_DIALOG_CANCEL: 取消 +MANAGE_BUCKET_URL_FORMAT_MARKDOWN: Markdown +MANAGE_BUCKET_URL_FORMAT_MARKDOWN_WITH_LINK: Markdown-link +MANAGE_BUCKET_URL_FORMAT_URL: Url +MANAGE_BUCKET_URL_FORMAT_HTML: Html +MANAGE_BUCKET_URL_FORMAT_BBCODE: BBCode MANAGE_BUCKET_URL_FORMAT_CUSTOM: 自定义 MANAGE_BUCKET_URL_FORMAT_PRESIGN: 预签名链接 MANAGE_BUCKET_FILE_INFO_TITLE: 文件信息 diff --git a/public/i18n/zh-TW.yml b/public/i18n/zh-TW.yml index 82704df..d468dfc 100644 --- a/public/i18n/zh-TW.yml +++ b/public/i18n/zh-TW.yml @@ -758,13 +758,18 @@ MANAGE_BUCKET_DELETE_BTN: 刪除 MANAGE_BUCKET_SORT_TITLE: 排序 MANAGE_BUCKET_SORT_NAME: 檔案名稱 MANAGE_BUCKET_SORT_SIZE: 大小 -MANAGE_BUCKET_SORT_TYPE: 類型 +MANAGE_BUCKET_SORT_EXT: 類型 MANAGE_BUCKET_SORT_TIME: 時間 -MANAGE_BUCKET_SORT_SELECTED: 選取狀態 -MANAGE_BUCKET_INIT: 初始化 +MANAGE_BUCKET_SORT_CHECK: 選取狀態 +MANAGE_BUCKET_SORT_INIT: 初始化 MANAGE_BUCKET_URL_UPLOAD_DIALOG_TITLE: 請輸入 URL,支援多個 URL,以換行分隔 MANAGE_BUCKET_URL_UPLOAD_DIALOG_CONFIRM: 確定 MANAGE_BUCKET_URL_UPLOAD_DIALOG_CANCEL: 取消 +MANAGE_BUCKET_URL_FORMAT_MARKDOWN: Markdown +MANAGE_BUCKET_URL_FORMAT_MARKDOWN_WITH_LINK: Markdown-link +MANAGE_BUCKET_URL_FORMAT_URL: Url +MANAGE_BUCKET_URL_FORMAT_HTML: Html +MANAGE_BUCKET_URL_FORMAT_BBCODE: BBCode MANAGE_BUCKET_URL_FORMAT_CUSTOM: 自訂 MANAGE_BUCKET_URL_FORMAT_PRESIGN: 預簽名連結 MANAGE_BUCKET_FILE_INFO_TITLE: 檔案資訊 diff --git a/src/renderer/manage/pages/bucketPage.vue b/src/renderer/manage/pages/bucketPage.vue index 15921ed..4e3961c 100644 --- a/src/renderer/manage/pages/bucketPage.vue +++ b/src/renderer/manage/pages/bucketPage.vue @@ -400,23 +400,12 @@ {{ $T('MANAGE_BUCKET_SORT_TITLE') }} @@ -634,46 +623,11 @@ https://www.baidu.com/img/bd_logo1.png" diff --git a/src/universal/types/i18n.d.ts b/src/universal/types/i18n.d.ts index dacf790..92f6eb6 100644 --- a/src/universal/types/i18n.d.ts +++ b/src/universal/types/i18n.d.ts @@ -716,13 +716,18 @@ interface ILocales { MANAGE_BUCKET_SORT_TITLE: string MANAGE_BUCKET_SORT_NAME: string MANAGE_BUCKET_SORT_SIZE: string - MANAGE_BUCKET_SORT_TYPE: string + MANAGE_BUCKET_SORT_EXT: string MANAGE_BUCKET_SORT_TIME: string - MANAGE_BUCKET_SORT_SELECTED: string - MANAGE_BUCKET_INIT: string + MANAGE_BUCKET_SORT_CHECK: string + MANAGE_BUCKET_SORT_INIT: string MANAGE_BUCKET_URL_UPLOAD_DIALOG_TITLE: string MANAGE_BUCKET_URL_UPLOAD_DIALOG_CONFIRM: string MANAGE_BUCKET_URL_UPLOAD_DIALOG_CANCEL: string + MANAGE_BUCKET_URL_FORMAT_MARKDOWN: string + MANAGE_BUCKET_URL_FORMAT_MARKDOWN_WITH_LINK: string + MANAGE_BUCKET_URL_FORMAT_URL: string + MANAGE_BUCKET_URL_FORMAT_HTML: string + MANAGE_BUCKET_URL_FORMAT_BBCODE: string MANAGE_BUCKET_URL_FORMAT_CUSTOM: string MANAGE_BUCKET_URL_FORMAT_PRESIGN: string MANAGE_BUCKET_FILE_INFO_TITLE: string From 2ae98621ba1147cda38df3a6a5809aa0096c453a Mon Sep 17 00:00:00 2001 From: Kuingsmile Date: Wed, 5 Jun 2024 08:25:50 +0800 Subject: [PATCH 06/23] :hammer: Refactor(custom): remove unused ipc evt --- src/main/events/ipcList.ts | 7 ------- src/renderer/layouts/Main.vue | 12 ++++++------ 2 files changed, 6 insertions(+), 13 deletions(-) diff --git a/src/main/events/ipcList.ts b/src/main/events/ipcList.ts index 016ce7a..335dce5 100644 --- a/src/main/events/ipcList.ts +++ b/src/main/events/ipcList.ts @@ -340,13 +340,6 @@ export default { settingWindow.webContents.reloadIgnoringCache() }) - // from mini window - ipcMain.on('syncPicBed', () => { - if (windowManager.has(IWindowList.SETTING_WINDOW)) { - windowManager.get(IWindowList.SETTING_WINDOW)!.webContents.send('syncPicBed') - } - }) - ipcMain.on(GET_PICBEDS, (evt: IpcMainEvent) => { const picBeds = getPicBeds() evt.sender.send(GET_PICBEDS, picBeds) diff --git a/src/renderer/layouts/Main.vue b/src/renderer/layouts/Main.vue index 075be33..4a0de1d 100644 --- a/src/renderer/layouts/Main.vue +++ b/src/renderer/layouts/Main.vue @@ -48,8 +48,8 @@
= ref([]) const isAlwaysOnTop = ref(false) const keepAlivePages = $router.getRoutes().filter(item => item.meta.keepAlive).map(item => item.name as string) -const progressShow = ref(false) -const progressPercentage = ref(0) +const isShowprogress = ref(false) +const progress = ref(0) onBeforeMount(() => { os.value = process.platform @@ -306,8 +306,8 @@ onBeforeMount(() => { qrcodeVisible.value = true }) ipcRenderer.on('updateProgress', (_event: IpcRendererEvent, data: { progress: number}) => { - progressShow.value = data.progress !== 100 && data.progress !== 0 - progressPercentage.value = data.progress + isShowprogress.value = data.progress !== 100 && data.progress !== 0 + progress.value = data.progress }) }) From 9a23d5fb9961c80fa96a13964dd4ace6709e4ec2 Mon Sep 17 00:00:00 2001 From: Kuingsmile Date: Wed, 5 Jun 2024 22:51:13 +0800 Subject: [PATCH 07/23] :hammer: Refactor(custom): refactored manage setting page --- .vscode/settings.json | 17 - package.json | 18 +- public/i18n/en.yml | 50 +- public/i18n/zh-CN.yml | 50 +- public/i18n/zh-TW.yml | 50 +- .../manage/components/DynamicSwitch.vue | 46 ++ src/renderer/manage/pages/manageSetting.vue | 639 ++++-------------- src/universal/types/i18n.d.ts | 50 +- yarn.lock | 521 ++++++++------ 9 files changed, 585 insertions(+), 856 deletions(-) create mode 100644 src/renderer/manage/components/DynamicSwitch.vue diff --git a/.vscode/settings.json b/.vscode/settings.json index 329bd7b..fbe6d00 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,24 +1,7 @@ { - "eslint.enable": true, - "eslint.alwaysShowStatus": true, - "eslint.validate": [ - "javascript", - "javascriptreact", - "typescript", - "vue", - "typescriptreact" - ], "[stylus]": { "editor.formatOnSave": true }, - "stylusSupremacy.insertSemicolons": false, - "stylusSupremacy.insertBraces": false, - "stylusSupremacy.insertNewLineBetweenSelectors": true, - "stylusSupremacy.insertParenthesisAroundIfCondition": false, - "stylusSupremacy.alwaysUseNoneOverZero": true, - "stylusSupremacy.alwaysUseZeroWithoutUnit": true, - "stylusSupremacy.sortProperties": "grouped", - "stylusSupremacy.quoteChar": "\"", "editor.codeActionsOnSave": { "source.fixAll.eslint": "explicit" }, diff --git a/package.json b/package.json index c9e3eab..50ffb7c 100644 --- a/package.json +++ b/package.json @@ -48,11 +48,11 @@ "ali-oss": "^6.18.1", "axios": "^1.6.8", "compare-versions": "^4.1.3", - "core-js": "^3.33.3", + "core-js": "^3.37.1", "cos-nodejs-sdk-v5": "^2.12.5", "dexie": "^3.2.4", "electron-updater": "^6.1.4", - "element-plus": "2.4.4", + "element-plus": "2.7.4", "epipebomb": "^1.0.0", "fast-xml-parser": "^4.3.2", "form-data": "^4.0.0", @@ -70,7 +70,7 @@ "nodejs-file-downloader": "^4.12.1", "piclist": "^1.8.8", "pinia": "^2.1.7", - "pinia-plugin-persistedstate": "^3.2.0", + "pinia-plugin-persistedstate": "^3.2.1", "proxy-agent": "^5.0.0", "qiniu": "7.9.0", "qrcode.vue": "^3.4.1", @@ -80,8 +80,8 @@ "upyun": "^3.4.6", "uuid": "^9.0.1", "video.js": "^8.6.1", - "vue": "^3.3.13", - "vue-router": "^4.2.5", + "vue": "^3.4.27", + "vue-router": "^4.3.2", "vue3-lazyload": "^0.3.8", "vue3-photo-preview": "^0.3.0", "webdav": "^5.3.1", @@ -114,7 +114,7 @@ "@vue/cli-service": "^5.0.8", "@vue/eslint-config-standard": "^8.0.1", "@vue/eslint-config-typescript": "^12.0.0", - "@vue/runtime-dom": "^3.3.13", + "@vue/runtime-dom": "^3.4.27", "conventional-changelog": "^5.1.0", "cz-customizable": "^7.0.0", "dotenv": "^16.3.1", @@ -124,12 +124,12 @@ "eslint-config-standard": ">=16.0.0", "eslint-plugin-import": "^2.29.1", "eslint-plugin-node": "^11.1.0", - "eslint-plugin-promise": "^6.1.1", - "eslint-plugin-vue": "^9.18.1", + "eslint-plugin-promise": "^6.2.0", + "eslint-plugin-vue": "^9.26.0", "husky": "^3.1.0", "node-bump-version": "^1.0.2", "node-loader": "^2.0.0", - "npm-check-updates": "^16.14.12", + "npm-check-updates": "^16.14.20", "stylus": "^0.59.0", "stylus-loader": "^7.1.3", "typescript": "^4.9.5", diff --git a/public/i18n/en.yml b/public/i18n/en.yml index f18e8c4..45e5f57 100644 --- a/public/i18n/en.yml +++ b/public/i18n/en.yml @@ -378,37 +378,37 @@ TIPS_GET_PLUGIN_LIST_FAILED: Get plugin list failed # manageSetting MANAGE_SETTING_TITLE: Manage Setting -MANAGE_SETTING_AUTO_FRESH_TITLE: Auto refresh file list when entering new directory -MANAGE_SETTING_AUTO_FRESH_TIPS: Only applies to non-paginated mode, data is cached to indexdb to speed up loading speed +MANAGE_SETTING_ISAUTOREFRESH_TITLE: Auto refresh file list when entering new directory +MANAGE_SETTING_ISAUTOREFRESH_TIPS: Only applies to non-paginated mode, data is cached to indexdb to speed up loading speed MANAGE_SETTING_CLEAR_CACHE_TITLE: 'Clear file list cache database, currently in use:' MANAGE_SETTING_CLEAR_CACHE_FREE_TITLE: 'Available:' MANAGE_SETTING_CLEAR_CACHE_TIPS: After clearing, the file list will be reloaded when entering a new directory next time MANAGE_SETTING_CLEAR_CACHE_PROMPT: Are you sure you want to clear the file list cache database? MANAGE_SETTING_CLEAR_CACHE_BUTTON: Clear -MANAGE_SETTING_SHOW_THUMBNAIL_TITLE: Display the original image instead of format icon (requires public access permissions) -MANAGE_SETTING_SHOW_FILE_LIST_TYPE_TITLE: Default display mode for the file list -MANAGE_SETTING_SHOW_FILE_LIST_TYPE_LIST: List -MANAGE_SETTING_SHOW_FILE_LIST_TYPE_CARD: Card -MANAGE_SETTING_FORCE_CUSTOM_URL_HTTPS_TITLE: Force custom URL to use HTTPS -MANAGE_SETTING_FORCE_CUSTOM_URL_HTTPS_TIPS: After enabling, all operations will automatically add the https prefix to custom domains -MANAGE_SETTING_KEEP_FOLDER_STRUCTURE_UPLOAD_TITLE: Preserve directory structure when uploading -MANAGE_SETTING_KEEP_FOLDER_STRUCTURE_UPLOAD_TIPS: After disabling, all files will be expanded to the specified directory -MANAGE_SETTING_KEEP_FOLDER_STRUCTURE_DOWNLOAD_TITLE_A: Download -MANAGE_SETTING_KEEP_FOLDER_STRUCTURE_DOWNLOAD_TITLE_B: ' File ' -MANAGE_SETTING_KEEP_FOLDER_STRUCTURE_DOWNLOAD_TITLE_C: will preserve the directory structure -MANAGE_SETTING_KEEP_FOLDER_STRUCTURE_DOWNLOAD_TITLE_D: ' Folder ' -MANAGE_SETTING_KEEP_FOLDER_STRUCTURE_DOWNLOAD_FILE_TIPS: After enabling, the original directory structure will be preserved +MANAGE_SETTING_ISSHOWTHUMBNAIL_TITLE: Display the original image instead of format icon (requires public access permissions) +MANAGE_SETTING_ISSHOWLIST_TITLE: Default display mode for the file list +MANAGE_SETTING_ISSHOWLIST_ON: List +MANAGE_SETTING_ISSHOWLIST_OFF: Card +MANAGE_SETTING_ISFORCECUSTOMURLHTTPS_TITLE: Force custom URL to use HTTPS +MANAGE_SETTING_ISFORCECUSTOMURLHTTPS_TIPS: After enabling, all operations will automatically add the https prefix to custom domains +MANAGE_SETTING_ISUPLOADKEEPDIRSTRUCTURE_TITLE: Preserve directory structure when uploading +MANAGE_SETTING_ISUPLOADKEEPDIRSTRUCTURE_TIPS: After disabling, all files will be expanded to the specified directory +MANAGE_SETTING_ISDOWNLOADFILEKEEPDIRSTRUCTURE_TITLE_A: Download +MANAGE_SETTING_ISDOWNLOADFILEKEEPDIRSTRUCTURE_TITLE_B: ' File ' +MANAGE_SETTING_ISDOWNLOADFILEKEEPDIRSTRUCTURE_TITLE_C: will preserve the directory structure +MANAGE_SETTING_ISDOWNLOADFOLDERKEEPDIRSTRUCTURE_TITLE_D: ' Folder ' +MANAGE_SETTING_ISDOWNLOADFILEKEEPDIRSTRUCTURE_TIPS: After enabling, the original directory structure will be preserved MANAGE_SETTING_MAX_DOWNLOAD_FILE_SIZE_TITLE: Maximum number of files to download simultaneously (1-9999) MANAGE_SETTING_MAX_DOWNLOAD_FILE_SIZE_TIPS: Not work on Tencent MANAGE_SETTING_MAX_DOWNLOAD_FILE_SIZE_INPUT_TIPS: Please enter the maximum number of files to download simultaneously -MANAGE_SETTING_SEARCH_IGNORE_CASE_TITLE: Should file search be case-insensitive -MANAGE_SETTING_SEARCH_IGNORE_CASE_TIPS: After enabling, the search will be case-insensitive -MANAGE_SETTING_TIMESTAMP_RENAME_TITLE: Rename uploaded files with timestamp - (highest priority) -MANAGE_SETTING_TIMESTAMP_RENAME_TIPS: After enabling, the uploaded file will be renamed with the timestamp -MANAGE_SETTING_RANDOM_STRING_RENAME_TITLE: Rename uploaded files with random strings - (medium priority) -MANAGE_SETTING_RANDOM_STRING_RENAME_TIPS: Random string length is 20 -MANAGE_SETTING_CUSTOM_RENAME_TITLE: Rename uploaded files with custom names - (lowest priority) -MANAGE_SETTING_CUSTOM_RENAME_TIPS: After enabling, the uploaded file will be renamed with the custom pattern +MANAGE_SETTING_ISIGNORECASE_TITLE: Should file search be case-insensitive +MANAGE_SETTING_ISIGNORECASE_TIPS: After enabling, the search will be case-insensitive +MANAGE_SETTING_TIMESTAMPRENAME_TITLE: Rename uploaded files with timestamp - (highest priority) +MANAGE_SETTING_TIMESTAMPRENAME_TIPS: After enabling, the uploaded file will be renamed with the timestamp +MANAGE_SETTING_RANDOMSTRINGRENAME_TITLE: Rename uploaded files with random strings - (medium priority) +MANAGE_SETTING_RANDOMSTRINGRENAME_TIPS: Random string length is 20 +MANAGE_SETTING_CUSTOMRENAME_TITLE: Rename uploaded files with custom names - (lowest priority) +MANAGE_SETTING_CUSTOMRENAME_TIPS: After enabling, the uploaded file will be renamed with the custom pattern MANAGE_SETTING_CUSTOM_PATTERN_TITLE: Custom rename format, placeholders can be freely combined, please refer to the table below MANAGE_SETTING_CUSTOM_PATTERN_TIPS: Please enter the custom rename format MANAGE_SETTING_CUSTOM_PATTERN_TABLE_TITLE: Placeholder @@ -430,8 +430,8 @@ MANAGE_SETTING_CHOOSE_DOWNLOAD_FOLDER_BUTTON: Choose folder MANAGE_SETTING_COPY_MESSAGE: Copied MANAGE_SETTING_CLEAR_CACHE_SUCCESS: Cleared successfully MANAGE_SETTING_CLEAR_CACHE_FAILED: Clear failed -MANAGE_SETTING_ENCODE_URL_WHEN_COPY: Encode URL when copy -MANAGE_SETTING_ENCODE_URL_WHEN_COPY_TIPS: After enabling, the URL will be encoded when copying +MANAGE_SETTING_ISENCODEURL_TITLE: Encode URL when copy +MANAGE_SETTING_ISENCODEURL_TIPS: After enabling, the URL will be encoded when copying # Empty MANAGE_NO_DATA: No data diff --git a/public/i18n/zh-CN.yml b/public/i18n/zh-CN.yml index 5083db2..9e7d199 100644 --- a/public/i18n/zh-CN.yml +++ b/public/i18n/zh-CN.yml @@ -380,37 +380,37 @@ TIPS_GET_PLUGIN_LIST_FAILED: 获取插件列表失败 # manageSetting MANAGE_SETTING_TITLE: 管理页面设置 -MANAGE_SETTING_AUTO_FRESH_TITLE: 每次进入新目录时,是否自动刷新文件列表 -MANAGE_SETTING_AUTO_FRESH_TIPS: 仅对不分页模式有效,默认在加载过一次后自动缓存到数据库来加快下次加载速度 +MANAGE_SETTING_ISAUTOREFRESH_TITLE: 每次进入新目录时,是否自动刷新文件列表 +MANAGE_SETTING_ISAUTOREFRESH_TIPS: 仅对不分页模式有效,默认在加载过一次后自动缓存到数据库来加快下次加载速度 MANAGE_SETTING_CLEAR_CACHE_TITLE: '清空文件列表缓存数据库 已占用:' MANAGE_SETTING_CLEAR_CACHE_FREE_TITLE: '剩余可用:' MANAGE_SETTING_CLEAR_CACHE_TIPS: 清空后下次进入新目录时将会重新加载文件列表 MANAGE_SETTING_CLEAR_CACHE_PROMPT: 确定要清空文件列表缓存数据库吗? MANAGE_SETTING_CLEAR_CACHE_BUTTON: 清空 -MANAGE_SETTING_SHOW_THUMBNAIL_TITLE: 图片显示为原图而非默认文件格式图标(需要存储桶可公开访问) -MANAGE_SETTING_SHOW_FILE_LIST_TYPE_TITLE: 文件列表默认显示方式 -MANAGE_SETTING_SHOW_FILE_LIST_TYPE_LIST: 列表 -MANAGE_SETTING_SHOW_FILE_LIST_TYPE_CARD: 卡片 -MANAGE_SETTING_FORCE_CUSTOM_URL_HTTPS_TITLE: 为自定义域名开启强制HTTPS -MANAGE_SETTING_FORCE_CUSTOM_URL_HTTPS_TIPS: 开启后, 复制链接等操作将会自动为自定义域名添加https前缀 -MANAGE_SETTING_KEEP_FOLDER_STRUCTURE_UPLOAD_TITLE: 上传时保留目录结构 -MANAGE_SETTING_KEEP_FOLDER_STRUCTURE_UPLOAD_TIPS: 关闭后会将所有文件展开到指定目录下 -MANAGE_SETTING_KEEP_FOLDER_STRUCTURE_DOWNLOAD_TITLE_A: 下载 -MANAGE_SETTING_KEEP_FOLDER_STRUCTURE_DOWNLOAD_TITLE_B: 文件 -MANAGE_SETTING_KEEP_FOLDER_STRUCTURE_DOWNLOAD_TITLE_C: 时保留目录结构 -MANAGE_SETTING_KEEP_FOLDER_STRUCTURE_DOWNLOAD_TITLE_D: 文件夹 -MANAGE_SETTING_KEEP_FOLDER_STRUCTURE_DOWNLOAD_FILE_TIPS: 开启后,下载时会保留原始目录结构 +MANAGE_SETTING_ISSHOWTHUMBNAIL_TITLE: 图片显示为原图而非默认文件格式图标(需要存储桶可公开访问) +MANAGE_SETTING_ISSHOWLIST_TITLE: 文件列表默认显示方式 +MANAGE_SETTING_ISSHOWLIST_ON: 列表 +MANAGE_SETTING_ISSHOWLIST_OFF: 卡片 +MANAGE_SETTING_ISFORCECUSTOMURLHTTPS_TITLE: 为自定义域名开启强制HTTPS +MANAGE_SETTING_ISFORCECUSTOMURLHTTPS_TIPS: 开启后, 复制链接等操作将会自动为自定义域名添加https前缀 +MANAGE_SETTING_ISUPLOADKEEPDIRSTRUCTURE_TITLE: 上传时保留目录结构 +MANAGE_SETTING_ISUPLOADKEEPDIRSTRUCTURE_TIPS: 关闭后会将所有文件展开到指定目录下 +MANAGE_SETTING_ISDOWNLOADFILEKEEPDIRSTRUCTURE_TITLE_A: 下载 +MANAGE_SETTING_ISDOWNLOADFILEKEEPDIRSTRUCTURE_TITLE_B: 文件 +MANAGE_SETTING_ISDOWNLOADFILEKEEPDIRSTRUCTURE_TITLE_C: 时保留目录结构 +MANAGE_SETTING_ISDOWNLOADFOLDERKEEPDIRSTRUCTURE_TITLE_D: 文件夹 +MANAGE_SETTING_ISDOWNLOADFILEKEEPDIRSTRUCTURE_TIPS: 开启后,下载时会保留原始目录结构 MANAGE_SETTING_MAX_DOWNLOAD_FILE_SIZE_TITLE: 最大同时下载文件数(1-9999) MANAGE_SETTING_MAX_DOWNLOAD_FILE_SIZE_TIPS: 腾讯云由于后端实现不同,该设置不生效 MANAGE_SETTING_MAX_DOWNLOAD_FILE_SIZE_INPUT_TIPS: 请输入最大同时下载文件数 -MANAGE_SETTING_SEARCH_IGNORE_CASE_TITLE: 文件搜索时,是否忽略大小写 -MANAGE_SETTING_SEARCH_IGNORE_CASE_TIPS: 开启后,搜索时会忽略大小写 -MANAGE_SETTING_TIMESTAMP_RENAME_TITLE: 上传文件时间戳重命名--(优先级最高) -MANAGE_SETTING_TIMESTAMP_RENAME_TIPS: 开启后,上传文件时会自动重命名为时间戳 -MANAGE_SETTING_RANDOM_STRING_RENAME_TITLE: 上传文件随机字符串重命名--(优先级中) -MANAGE_SETTING_RANDOM_STRING_RENAME_TIPS: 随机字符串长度为20 -MANAGE_SETTING_CUSTOM_RENAME_TITLE: 上传文件自定义重命名--(优先级最低) -MANAGE_SETTING_CUSTOM_RENAME_TIPS: 请填写自定义重命名格式 +MANAGE_SETTING_ISIGNORECASE_TITLE: 文件搜索时,是否忽略大小写 +MANAGE_SETTING_ISIGNORECASE_TIPS: 开启后,搜索时会忽略大小写 +MANAGE_SETTING_TIMESTAMPRENAME_TITLE: 上传文件时间戳重命名--(优先级最高) +MANAGE_SETTING_TIMESTAMPRENAME_TIPS: 开启后,上传文件时会自动重命名为时间戳 +MANAGE_SETTING_RANDOMSTRINGRENAME_TITLE: 上传文件随机字符串重命名--(优先级中) +MANAGE_SETTING_RANDOMSTRINGRENAME_TIPS: 随机字符串长度为20 +MANAGE_SETTING_CUSTOMRENAME_TITLE: 上传文件自定义重命名--(优先级最低) +MANAGE_SETTING_CUSTOMRENAME_TIPS: 请填写自定义重命名格式 MANAGE_SETTING_CUSTOM_PATTERN_TITLE: 自定义重命名格式,占位符请参考下表,可自由组合 MANAGE_SETTING_CUSTOM_PATTERN_TIPS: 请填写自定义重命名格式 MANAGE_SETTING_CUSTOM_PATTERN_TABLE_TITLE: 占位符 @@ -432,8 +432,8 @@ MANAGE_SETTING_CHOOSE_DOWNLOAD_FOLDER_BUTTON: 选择目录 MANAGE_SETTING_COPY_MESSAGE: 已复制 MANAGE_SETTING_CLEAR_CACHE_SUCCESS: 清除成功 MANAGE_SETTING_CLEAR_CACHE_FAILED: 清除失败 -MANAGE_SETTING_ENCODE_URL_WHEN_COPY: 复制链接时进行URL编码 -MANAGE_SETTING_ENCODE_URL_WHEN_COPY_TIPS: 根据平台选择是否开启 +MANAGE_SETTING_ISENCODEURL_TITLE: 复制链接时进行URL编码 +MANAGE_SETTING_ISENCODEURL_TIPS: 根据平台选择是否开启 # Empty MANAGE_NO_DATA: 暂无数据 diff --git a/public/i18n/zh-TW.yml b/public/i18n/zh-TW.yml index d468dfc..1adf279 100644 --- a/public/i18n/zh-TW.yml +++ b/public/i18n/zh-TW.yml @@ -378,37 +378,37 @@ TIPS_GET_PLUGIN_LIST_FAILED: 取得插件列表失敗 # manageSetting MANAGE_SETTING_TITLE: 管理設定 -MANAGE_SETTING_AUTO_FRESH_TITLE: 每次進入新目錄時,是否自動重新整理檔案列表 -MANAGE_SETTING_AUTO_FRESH_TIPS: 僅對不分頁模式有效,預設會在載入後自動快取至資料庫以提升下次載入速度 +MANAGE_SETTING_ISAUTOREFRESH_TITLE: 每次進入新目錄時,是否自動重新整理檔案列表 +MANAGE_SETTING_ISAUTOREFRESH_TIPS: 僅對不分頁模式有效,預設會在載入後自動快取至資料庫以提升下次載入速度 MANAGE_SETTING_CLEAR_CACHE_TITLE: '清空檔案列表快取資料庫 已佔用:' MANAGE_SETTING_CLEAR_CACHE_FREE_TITLE: '剩餘可用:' MANAGE_SETTING_CLEAR_CACHE_TIPS: 清空後下次進入新目錄時將會重新載入檔案列表 MANAGE_SETTING_CLEAR_CACHE_PROMPT: 確定要清空檔案列表快取資料庫嗎? MANAGE_SETTING_CLEAR_CACHE_BUTTON: 清空 -MANAGE_SETTING_SHOW_THUMBNAIL_TITLE: 顯示圖片的原始圖像而非預設的檔案格式圖示(需要存儲桶公開訪問權限) -MANAGE_SETTING_SHOW_FILE_LIST_TYPE_TITLE: 檔案列表預設顯示方式 -MANAGE_SETTING_SHOW_FILE_LIST_TYPE_LIST: 列表 -MANAGE_SETTING_SHOW_FILE_LIST_TYPE_CARD: 卡片 -MANAGE_SETTING_FORCE_CUSTOM_URL_HTTPS_TITLE: 自定義域名啟用強制 HTTPS -MANAGE_SETTING_FORCE_CUSTOM_URL_HTTPS_TIPS: 開啟後,複製鏈結等操作將會自動為自定義域名添加 HTTPS 前綴 -MANAGE_SETTING_KEEP_FOLDER_STRUCTURE_UPLOAD_TITLE: 保留上傳時的目錄結構 -MANAGE_SETTING_KEEP_FOLDER_STRUCTURE_UPLOAD_TIPS: 停用後,所有文件將會展開到指定目錄下 -MANAGE_SETTING_KEEP_FOLDER_STRUCTURE_DOWNLOAD_TITLE_A: 下載 -MANAGE_SETTING_KEEP_FOLDER_STRUCTURE_DOWNLOAD_TITLE_B: 文件 -MANAGE_SETTING_KEEP_FOLDER_STRUCTURE_DOWNLOAD_TITLE_C: 時保留目錄結構 -MANAGE_SETTING_KEEP_FOLDER_STRUCTURE_DOWNLOAD_TITLE_D: 目錄 -MANAGE_SETTING_KEEP_FOLDER_STRUCTURE_DOWNLOAD_FILE_TIPS: 啟用後,下載時會保留原始目錄結構 +MANAGE_SETTING_ISSHOWTHUMBNAIL_TITLE: 顯示圖片的原始圖像而非預設的檔案格式圖示(需要存儲桶公開訪問權限) +MANAGE_SETTING_ISSHOWLIST_TITLE: 檔案列表預設顯示方式 +MANAGE_SETTING_ISSHOWLIST_ON: 列表 +MANAGE_SETTING_ISSHOWLIST_OFF: 卡片 +MANAGE_SETTING_ISFORCECUSTOMURLHTTPS_TITLE: 自定義域名啟用強制 HTTPS +MANAGE_SETTING_ISFORCECUSTOMURLHTTPS_TIPS: 開啟後,複製鏈結等操作將會自動為自定義域名添加 HTTPS 前綴 +MANAGE_SETTING_ISUPLOADKEEPDIRSTRUCTURE_TITLE: 保留上傳時的目錄結構 +MANAGE_SETTING_ISUPLOADKEEPDIRSTRUCTURE_TIPS: 停用後,所有文件將會展開到指定目錄下 +MANAGE_SETTING_ISDOWNLOADFILEKEEPDIRSTRUCTURE_TITLE_A: 下載 +MANAGE_SETTING_ISDOWNLOADFILEKEEPDIRSTRUCTURE_TITLE_B: 文件 +MANAGE_SETTING_ISDOWNLOADFILEKEEPDIRSTRUCTURE_TITLE_C: 時保留目錄結構 +MANAGE_SETTING_ISDOWNLOADFOLDERKEEPDIRSTRUCTURE_TITLE_D: 目錄 +MANAGE_SETTING_ISDOWNLOADFILEKEEPDIRSTRUCTURE_TIPS: 啟用後,下載時會保留原始目錄結構 MANAGE_SETTING_MAX_DOWNLOAD_FILE_SIZE_TITLE: 最大同時下載檔案數量(1-9999) MANAGE_SETTING_MAX_DOWNLOAD_FILE_SIZE_TIPS: 由於後端實現方式不同,此設定在腾讯云上不生效 MANAGE_SETTING_MAX_DOWNLOAD_FILE_SIZE_INPUT_TIPS: 請輸入最大同時下載檔案數量 -MANAGE_SETTING_SEARCH_IGNORE_CASE_TITLE: 搜尋檔案時,是否忽略大小寫 -MANAGE_SETTING_SEARCH_IGNORE_CASE_TIPS: 啟用後,搜尋時將會忽略大小寫 -MANAGE_SETTING_TIMESTAMP_RENAME_TITLE: 上傳檔案時間戳重新命名--(最高優先級) -MANAGE_SETTING_TIMESTAMP_RENAME_TIPS: 啟用後,上傳檔案時將會使用時間戳重新命名 -MANAGE_SETTING_RANDOM_STRING_RENAME_TITLE: 上傳檔案隨機字符串重新命名--(中優先級) -MANAGE_SETTING_RANDOM_STRING_RENAME_TIPS: 隨機字符串長度為20 -MANAGE_SETTING_CUSTOM_RENAME_TITLE: 上傳檔案自定義重新命名--(最低優先級) -MANAGE_SETTING_CUSTOM_RENAME_TIPS: 啟用後,上傳檔案時將會使用自定義重新命名 +MANAGE_SETTING_ISIGNORECASE_TITLE: 搜尋檔案時,是否忽略大小寫 +MANAGE_SETTING_ISIGNORECASE_TIPS: 啟用後,搜尋時將會忽略大小寫 +MANAGE_SETTING_TIMESTAMPRENAME_TITLE: 上傳檔案時間戳重新命名--(最高優先級) +MANAGE_SETTING_TIMESTAMPRENAME_TIPS: 啟用後,上傳檔案時將會使用時間戳重新命名 +MANAGE_SETTING_RANDOMSTRINGRENAME_TITLE: 上傳檔案隨機字符串重新命名--(中優先級) +MANAGE_SETTING_RANDOMSTRINGRENAME_TIPS: 隨機字符串長度為20 +MANAGE_SETTING_CUSTOMRENAME_TITLE: 上傳檔案自定義重新命名--(最低優先級) +MANAGE_SETTING_CUSTOMRENAME_TIPS: 啟用後,上傳檔案時將會使用自定義重新命名 MANAGE_SETTING_CUSTOM_PATTERN_TITLE: 自訂重新命名格式,占位符請參考下表,可自由組合 MANAGE_SETTING_CUSTOM_PATTERN_TIPS: 請輸入自訂重新命名格式 MANAGE_SETTING_CUSTOM_PATTERN_TABLE_TITLE: 占位符 @@ -430,8 +430,8 @@ MANAGE_SETTING_CHOOSE_DOWNLOAD_FOLDER_BUTTON: 選擇目錄 MANAGE_SETTING_COPY_MESSAGE: 已複製 MANAGE_SETTING_CLEAR_CACHE_SUCCESS: 清除成功 MANAGE_SETTING_CLEAR_CACHE_FAILED: 清除失敗 -MANAGE_SETTING_ENCODE_URL_WHEN_COPY: 複製鏈結時編碼 -MANAGE_SETTING_ENCODE_URL_WHEN_COPY_TIPS: 啟用後,複製鏈結時將會編碼 +MANAGE_SETTING_ISENCODEURL_TITLE: 複製鏈結時編碼 +MANAGE_SETTING_ISENCODEURL_TIPS: 啟用後,複製鏈結時將會編碼 # Empty MANAGE_NO_DATA: 暫無數據 diff --git a/src/renderer/manage/components/DynamicSwitch.vue b/src/renderer/manage/components/DynamicSwitch.vue new file mode 100644 index 0000000..c69e1f1 --- /dev/null +++ b/src/renderer/manage/components/DynamicSwitch.vue @@ -0,0 +1,46 @@ + + + diff --git a/src/renderer/manage/pages/manageSetting.vue b/src/renderer/manage/pages/manageSetting.vue index 30bca98..213c6af 100644 --- a/src/renderer/manage/pages/manageSetting.vue +++ b/src/renderer/manage/pages/manageSetting.vue @@ -24,31 +24,6 @@ size="default" style="position: relative;width: 100%;" > - - - - - - - + + {{ $T('MANAGE_SETTING_CUSTOM_PATTERN_TITLE') }} + + + + - - - - - - - - - - - - - - - - - - - - - - - - - + +
+ - {{ $T('MANAGE_SETTING_SEARCH_IGNORE_CASE_TITLE') }} + {{ $T('MANAGE_SETTING_PRESIGNED_URL_EXPIRE_TITLE') }} - - - - - - - - - - - - - - - {{ $T('MANAGE_SETTING_CUSTOM_PATTERN_TITLE') }} - - - - - - - - - - {{ $T('MANAGE_SETTING_PRESIGNED_URL_EXPIRE_TITLE') }} - -
- - {{ $T('MANAGE_SETTING_CHOOSE_COPY_FORMAT_MARKDOWN') }} - - - {{ $T('MANAGE_SETTING_CHOOSE_COPY_FORMAT_MARKDOWN_WITH_LINK') }} - - - {{ $T('MANAGE_SETTING_CHOOSE_COPY_FORMAT_RAWURL') }} - - - {{ $T('MANAGE_SETTING_CHOOSE_COPY_FORMAT_HTML') }} - - - {{ $T('MANAGE_SETTING_CHOOSE_COPY_FORMAT_BBCODE') }} - - - {{ $T('MANAGE_SETTING_CHOOSE_COPY_FORMAT_CUSTOM') }} + + {{ $T(`MANAGE_SETTING_CHOOSE_COPY_FORMAT_${item.toUpperCase().replace(/-/g, '_')}` as any) }} {{ $T('MANAGE_SETTING_CUSTOM_COPY_FORMAT_TITLE') }} @@ -487,7 +213,7 @@
diff --git a/src/renderer/i18n/index.ts b/src/renderer/i18n/index.ts index 08bf77a..2bc47f1 100644 --- a/src/renderer/i18n/index.ts +++ b/src/renderer/i18n/index.ts @@ -10,14 +10,14 @@ export class I18nManager { #getLanguageList () { ipcRenderer.send(GET_LANGUAGE_LIST) - ipcRenderer.once(GET_LANGUAGE_LIST, (event, list: II18nItem[]) => { + ipcRenderer.once(GET_LANGUAGE_LIST, (_, list: II18nItem[]) => { this.#i18nFileList = list }) } #getCurrentLanguage () { ipcRenderer.send(GET_CURRENT_LANGUAGE) - ipcRenderer.once(GET_CURRENT_LANGUAGE, (event, lang: string, locales: ILocales) => { + ipcRenderer.once(GET_CURRENT_LANGUAGE, (_, lang: string, locales: ILocales) => { this.#setLocales(lang, locales) bus.emit(FORCE_UPDATE) }) @@ -36,7 +36,7 @@ export class I18nManager { constructor () { this.#getCurrentLanguage() this.#getLanguageList() - ipcRenderer.on(SET_CURRENT_LANGUAGE, (event, lang: string, locales: ILocales) => { + ipcRenderer.on(SET_CURRENT_LANGUAGE, (_, lang: string, locales: ILocales) => { this.#setLocales(lang, locales) bus.emit(FORCE_UPDATE) }) diff --git a/src/renderer/manage/components/DynamicSwitch.vue b/src/renderer/manage/components/DynamicSwitch.vue index c69e1f1..ac13873 100644 --- a/src/renderer/manage/components/DynamicSwitch.vue +++ b/src/renderer/manage/components/DynamicSwitch.vue @@ -35,12 +35,12 @@ import { InfoFilled } from '@element-plus/icons-vue' defineProps<{ - tooltip: string, + tooltip?: string, activeText?: string, inactiveText?: string, segments?: { text: string, style: string }[], }>() -const value = defineModel() +const value = defineModel() diff --git a/src/renderer/manage/pages/bucketPage.vue b/src/renderer/manage/pages/bucketPage.vue index 4e3961c..fdfc7e6 100644 --- a/src/renderer/manage/pages/bucketPage.vue +++ b/src/renderer/manage/pages/bucketPage.vue @@ -50,7 +50,10 @@ style="display: flex;" @click="showUploadDialog" > - +
- + - +
- + @@ -207,7 +221,10 @@
- + @@ -230,7 +247,8 @@
{{ $T(`MANAGE_SETTING_CHOOSE_COPY_FORMAT_${item.toUpperCase().replace(/-/g, '_')}` as any) }} diff --git a/src/renderer/pages/Gallery.vue b/src/renderer/pages/Gallery.vue index 40bae8a..b583eba 100644 --- a/src/renderer/pages/Gallery.vue +++ b/src/renderer/pages/Gallery.vue @@ -24,7 +24,8 @@ @change="handleDeleteCloudFile" /> - + @@ -590,6 +590,7 @@ v-for="item in picBed" :key="item.name" :label="item.name" + :value="item.name" /> @@ -1480,10 +1481,10 @@ :label="$T('UPLOAD_PAGE_IMAGE_PROCESS_WMTYPE')" > - + {{ $T('UPLOAD_PAGE_IMAGE_PROCESS_WMTYPE_TEXT') }} - + {{ $T('UPLOAD_PAGE_IMAGE_PROCESS_WMTYPE_IMAGE') }} @@ -1554,7 +1555,7 @@ {{ item[1] }} @@ -2230,8 +2231,6 @@ function confirmCustomLink () { saveConfig(configPaths.settings.customLink, customLink.value) customLinkVisible.value = false sendToMain('updateCustomLink') - } else { - return false } }) } diff --git a/src/renderer/pages/Plugin.vue b/src/renderer/pages/Plugin.vue index f54e34b..95f275b 100644 --- a/src/renderer/pages/Plugin.vue +++ b/src/renderer/pages/Plugin.vue @@ -534,7 +534,6 @@ async function handleConfirmConfig () { } function _getSearchResult (val: string) { - // this.$http.get(`https://api.npms.io/v2/search?q=${val}`) axios.get(`https://registry.npmjs.com/-/v1/search?text=${val}`) .then((res: INPMSearchResult) => { pluginList.value = res.data.objects diff --git a/src/renderer/pages/ShortKey.vue b/src/renderer/pages/ShortKey.vue index c25eeab..d0bd555 100644 --- a/src/renderer/pages/ShortKey.vue +++ b/src/renderer/pages/ShortKey.vue @@ -58,7 +58,8 @@ :class="{ disabled: scope.row.enable }" - type="text" + type="info" + :link="true" @click="toggleEnable(scope.row)" > {{ scope.row.enable ? $T('SHORTCUT_DISABLE') : $T('SHORTCUT_ENABLE') }} @@ -66,7 +67,8 @@ {{ $T('SHORTCUT_EDIT') }} diff --git a/src/renderer/pages/Upload.vue b/src/renderer/pages/Upload.vue index 06060a0..79e6e79 100644 --- a/src/renderer/pages/Upload.vue +++ b/src/renderer/pages/Upload.vue @@ -82,27 +82,13 @@ @change="handlePasteStyleChange" > - Markdown + {{ key }} - - - - {{ $T('UPLOAD_SHORT_URL') }} {{ $T('UPLOAD_NORMAL_URL') }} @@ -180,10 +166,10 @@ :label="$T('UPLOAD_PAGE_IMAGE_PROCESS_WMTYPE')" > - + {{ $T('UPLOAD_PAGE_IMAGE_PROCESS_WMTYPE_TEXT') }} - + {{ $T('UPLOAD_PAGE_IMAGE_PROCESS_WMTYPE_IMAGE') }} @@ -254,7 +240,7 @@ {{ item[1] }} @@ -473,6 +459,22 @@ const $router = useRouter() const imageProcessDialogVisible = ref(false) const useShortUrl = ref(false) +const dragover = ref(false) +const progress = ref(0) +const showProgress = ref(false) +const showError = ref(false) +const pasteStyle = ref('') +const picBed = ref([]) +const picBedName = ref('') +const picBedConfigName = ref('') + +const pasteFormatList = ref({ + [IPasteStyle.MARKDOWN]: '![alt](url)', + [IPasteStyle.HTML]: '', + [IPasteStyle.URL]: 'http://test.com/test.png', + [IPasteStyle.UBB]: '[img]url[/img]', + [IPasteStyle.CUSTOM]: '' +}) const waterMarkPositionMap = new Map([ ['north', $T('UPLOAD_PAGE_IMAGE_PROCESS_POSITION_TOP')], @@ -519,6 +521,8 @@ const compressForm = reactive({ isFlip: false, isFlop: false }) +const waterMarkFormKeys = Object.keys(waterMarkForm) +const compressFormKeys = Object.keys(compressForm) const formatConvertObj = ref('{}') @@ -548,20 +552,9 @@ async function initData () { const compress = await getConfig(configPaths.buildIn.compress) const watermark = await getConfig(configPaths.buildIn.watermark) if (compress) { - compressForm.quality = compress.quality ?? 100 - compressForm.isConvert = compress.isConvert ?? false - compressForm.convertFormat = compress.convertFormat ?? 'jpg' - compressForm.isReSize = compress.isReSize ?? false - compressForm.reSizeWidth = compress.reSizeWidth ?? 500 - compressForm.reSizeHeight = compress.reSizeHeight ?? 500 - compressForm.skipReSizeOfSmallImg = compress.skipReSizeOfSmallImg ?? false - compressForm.isReSizeByPercent = compress.isReSizeByPercent ?? false - compressForm.reSizePercent = compress.reSizePercent ?? 50 - compressForm.isRotate = compress.isRotate ?? false - compressForm.rotateDegree = compress.rotateDegree ?? 0 - compressForm.isRemoveExif = compress.isRemoveExif ?? false - compressForm.isFlip = compress.isFlip ?? false - compressForm.isFlop = compress.isFlop ?? false + compressFormKeys.forEach((key) => { + compressForm[key] = compress[key] ?? compressForm[key] + }) try { if (typeof compress.formatConvertObj === 'object') { formatConvertObj.value = JSON.stringify(compress.formatConvertObj) @@ -573,29 +566,13 @@ async function initData () { } } if (watermark) { - waterMarkForm.isAddWatermark = watermark.isAddWatermark ?? false - waterMarkForm.watermarkType = watermark.watermarkType ?? 'text' - waterMarkForm.isFullScreenWatermark = watermark.isFullScreenWatermark ?? false - waterMarkForm.watermarkDegree = watermark.watermarkDegree ?? 0 - waterMarkForm.watermarkText = watermark.watermarkText ?? '' - waterMarkForm.watermarkFontPath = watermark.watermarkFontPath ?? '' - waterMarkForm.watermarkScaleRatio = watermark.watermarkScaleRatio ?? 0.15 - waterMarkForm.watermarkColor = watermark.watermarkColor === undefined || watermark.watermarkColor === '' ? '#CCCCCC73' : watermark.watermarkColor - waterMarkForm.watermarkImagePath = watermark.watermarkImagePath ?? '' - waterMarkForm.watermarkPosition = watermark.watermarkPosition ?? 'southeast' + waterMarkFormKeys.forEach((key) => { + waterMarkForm[key] = watermark[key as keyof IBuildInWaterMarkOptions] ?? waterMarkForm[key] + }) + waterMarkForm.watermarkColor = watermark.watermarkColor === '' ? '#CCCCCC73' : watermark.watermarkColor } } -const dragover = ref(false) -const progress = ref(0) -const showProgress = ref(false) -const showError = ref(false) -const pasteStyle = ref('') -const picBed = ref([]) -const picBedName = ref('') -const customLink = ref('') -const picBedConfigName = ref('') - onBeforeMount(() => { ipcRenderer.on('uploadProgress', (_event: IpcRendererEvent, _progress: number) => { if (_progress !== -1) { @@ -723,7 +700,7 @@ function ipcSendFiles (files: FileList) { async function getPasteStyle () { pasteStyle.value = await getConfig(configPaths.settings.pasteStyle) || IPasteStyle.MARKDOWN - customLink.value = await getConfig(configPaths.settings.customLink) || '![$fileName]($url)' + pasteFormatList.value.Custom = await getConfig(configPaths.settings.customLink) || '![$fileName]($url)' } async function getUseShortUrl () { @@ -736,9 +713,9 @@ async function handleUseShortUrlChange () { }) } -function handlePasteStyleChange (val: string | number | boolean) { +function handlePasteStyleChange (val: string | number | boolean | undefined) { saveConfig({ - [configPaths.settings.pasteStyle]: val + [configPaths.settings.pasteStyle]: val || IPasteStyle.MARKDOWN }) } diff --git a/src/renderer/utils/mainMixin.ts b/src/renderer/utils/mainMixin.ts index 03212df..8208501 100644 --- a/src/renderer/utils/mainMixin.ts +++ b/src/renderer/utils/mainMixin.ts @@ -1,13 +1,6 @@ -// Vue 组件选项 import { ComponentOptions } from 'vue' - -// 事件常量 import { FORCE_UPDATE, GET_PICBEDS } from '~/universal/events/constants' - -// 事件总线 import bus from '~/renderer/utils/bus' - -// Electron 相关 import { ipcRenderer } from 'electron' export const mainMixin: ComponentOptions = { diff --git a/src/universal/types/extra-vue.d.ts b/src/universal/types/extra-vue.d.ts index 9f482ce..c21d9e0 100644 --- a/src/universal/types/extra-vue.d.ts +++ b/src/universal/types/extra-vue.d.ts @@ -17,11 +17,8 @@ declare module 'vue/types/vue' { declare module 'vue' { interface ComponentCustomProperties { - $http: typeof axios - $builtInPicBed: string[] $$db: IGalleryDB $T: typeof import('~/renderer/i18n/index').T - $i18n: import('~/renderer/i18n/index').I18nManager saveConfig(data: IObj | string, value?: any): void getConfig(key?: string): Promise setDefaultPicBed(picBed: string): void From 3bc784f4d81da3a4e0d79afbf943e0f2be7aad4e Mon Sep 17 00:00:00 2001 From: Kuingsmile Date: Thu, 6 Jun 2024 21:29:18 +0800 Subject: [PATCH 09/23] :hammer: Refactor(custom): add new image process setting component --- .../components/ImageProcessSetting.vue | 372 ++++++++++++++++ src/renderer/pages/MiniPage.vue | 50 +-- src/renderer/pages/PicGoSetting.vue | 413 +----------------- src/renderer/pages/Upload.vue | 389 +---------------- src/renderer/pages/picbeds/index.vue | 25 +- src/universal/utils/configPaths.ts | 78 +--- 6 files changed, 403 insertions(+), 924 deletions(-) create mode 100644 src/renderer/components/ImageProcessSetting.vue diff --git a/src/renderer/components/ImageProcessSetting.vue b/src/renderer/components/ImageProcessSetting.vue new file mode 100644 index 0000000..c0dcb72 --- /dev/null +++ b/src/renderer/components/ImageProcessSetting.vue @@ -0,0 +1,372 @@ + + + diff --git a/src/renderer/pages/MiniPage.vue b/src/renderer/pages/MiniPage.vue index 4faf68f..6a215da 100644 --- a/src/renderer/pages/MiniPage.vue +++ b/src/renderer/pages/MiniPage.vue @@ -4,15 +4,15 @@ >
+ +