diff --git a/public/i18n/en.yml b/public/i18n/en.yml index 3035e9d0..d998e81d 100644 --- a/public/i18n/en.yml +++ b/public/i18n/en.yml @@ -275,6 +275,7 @@ SETTINGS_SYNC_DOWNLOAD_FAILED: Download failed SETTINGS_SYNC_COMMON_CONFIG: Common configuration SETTINGS_SYNC_MANAGE_CONFIG: Manage configuration SETTINGS_AUTO_IMPORT: Auto import config in manage page +SETTINGS_AUTO_IMPORT_SELECT_PICBED: Select picbed SETTINGS_TAB_SYSTEM: System SETTINGS_TAB_SYNC_CONFIG: Sync and Configuration SETTINGS_TAB_UPLOAD: Upload @@ -598,6 +599,9 @@ MANAGE_CONSTANT_WEBDAV_CUSTOM_URL_DESC: Custom Domain - Optional MANAGE_CONSTANT_WEBDAV_CUSTOM_URL_PLACEHOLDER: 'e.g. https://example.com' MANAGE_CONSTANT_WEBDAV_CUSTOM_URL_TOOLTIP: If your WebDAV server supports custom domains, please fill in MANAGE_CONSTANT_WEBDAV_CUSTOM_URL_RULE_MESSAGE: 'Custom domain should start with http:// or https://' +MANAGE_CONSTANT_WEBDAV_WEB_PATH: Web Path - Optional +MANAGE_CONSTANT_WEBDAV_WEB_PATH_PLACEHOLDER: 'e.g. test/ttc' +MANAGE_CONSTANT_WEBDAV_WEB_PATH_TOOLTIP: 'Used to generate URL' MANAGE_CONSTANT_WEBDAV_PROXY_DESC: Proxy - Optional MANAGE_CONSTANT_WEBDAV_PROXY_PLACEHOLDER: 'e.g. http://127.0.0.1:1080' MANAGE_CONSTANT_WEBDAV_PROXY_TOOLTIP: If special network environment is required to access, please use proxy @@ -606,6 +610,21 @@ MANAGE_CONSTANT_WEBDAV_SSL_TOOLTIP: Depending on the configuration of your WebDA MANAGE_CONSTANT_WEBDAV_EXPLAIN: 'WebDAV Configuration' MANAGE_CONSTANT_WEBDAV_REFER_TEXT: 'Refer to:' +MANAGE_CONSTANT_LOCAL_NAME: Local +MANAGE_CONSTANT_LOCAL_ALIAS_DESC: Alias - Required +MANAGE_CONSTANT_LOCAL_ALIAS_PLACEHOLDER: Unique identifier for this configuration +MANAGE_CONSTANT_LOCAL_BASE_DIR_DESC: Base directory - Required +MANAGE_CONSTANT_LOCAL_BASE_DIR_PLACEHOLDER: 'e.g. /dir1' +MANAGE_CONSTANT_LOCAL_CUSTOM_URL_DESC: Custom Domain - Optional +MANAGE_CONSTANT_LOCAL_CUSTOM_URL_PLACEHOLDER: 'e.g. https://example.com' +MANAGE_CONSTANT_LOCAL_CUSTOM_URL_TOOLTIP: If your local path supports custom domains, please fill in +MANAGE_CONSTANT_LOCAL_WEB_PATH: Web Path - Optional +MANAGE_CONSTANT_LOCAL_WEB_PATH_PLACEHOLDER: 'e.g. test/ttc' +MANAGE_CONSTANT_LOCAL_WEB_PATH_TOOLTIP: 'Used to generate URL' +MANAGE_CONSTANT_LOCAL_EXPLAIN: 'Local Configuration' +MANAGE_CONSTANT_LOCAL_REFER_TEXT: 'Refer to:' +MANAGE_CONSTANT_LOCAL_BASE_DIR_RULE_MESSAGE: baseDir cannot be empty + MANAGE_LOGIN_PAGE_PANE_NAME: Saved Config MANAGE_LOGIN_PAGE_PANE_DESC: Click on the icon or alias to view details, Enter to view the file page, Delete to remove the configuration MANAGE_LOGIN_PAGE_PANE_LOADING: Importing... diff --git a/public/i18n/zh-CN.yml b/public/i18n/zh-CN.yml index 1ef9fad7..6be6ce08 100644 --- a/public/i18n/zh-CN.yml +++ b/public/i18n/zh-CN.yml @@ -278,6 +278,7 @@ SETTINGS_SYNC_DOWNLOAD_FAILED: 下载失败 SETTINGS_SYNC_COMMON_CONFIG: 通用配置 SETTINGS_SYNC_MANAGE_CONFIG: 管理配置 SETTINGS_AUTO_IMPORT: 管理页面自动导入配置 +SETTINGS_AUTO_IMPORT_SELECT_PICBED: 选择需要开启自动导入的图床 SETTINGS_TAB_SYSTEM: 系统设置 SETTINGS_TAB_SYNC_CONFIG: 同步与配置 SETTINGS_TAB_UPLOAD: 上传设置 @@ -601,6 +602,9 @@ MANAGE_CONSTANT_WEBDAV_CUSTOM_URL_DESC: 自定义域名-可选 MANAGE_CONSTANT_WEBDAV_CUSTOM_URL_PLACEHOLDER: '例如:https://example.com' MANAGE_CONSTANT_WEBDAV_CUSTOM_URL_TOOLTIP: 如果您的WebDAV服务器支持自定义域名,请填写 MANAGE_CONSTANT_WEBDAV_CUSTOM_URL_RULE_MESSAGE: '自定义域名请以http://或https://开头' +MANAGE_CONSTANT_WEBDAV_WEB_PATH: 网址拼接用起始路径 +MANAGE_CONSTANT_WEBDAV_WEB_PATH_PLACEHOLDER: '例如:test/ttc' +MANAGE_CONSTANT_WEBDAV_WEB_PATH_TOOLTIP: '用于拼接网址' MANAGE_CONSTANT_WEBDAV_PROXY_DESC: 代理-可选 MANAGE_CONSTANT_WEBDAV_PROXY_PLACEHOLDER: '例如:http://127.0.0.1:1080' MANAGE_CONSTANT_WEBDAV_PROXY_TOOLTIP: 如果需要特殊网络环境才能访问,请使用代理 @@ -609,6 +613,21 @@ MANAGE_CONSTANT_WEBDAV_SSL_TOOLTIP: 根据WebDAV服务器的配置,如果您 MANAGE_CONSTANT_WEBDAV_EXPLAIN: 'WebDAV配置' MANAGE_CONSTANT_WEBDAV_REFER_TEXT: '配置教程请参考: ' +MANAGE_CONSTANT_LOCAL_NAME: 本地存储 +MANAGE_CONSTANT_LOCAL_ALIAS_DESC: 配置别名-必需 +MANAGE_CONSTANT_LOCAL_ALIAS_PLACEHOLDER: 该配置的唯一标识 +MANAGE_CONSTANT_LOCAL_BASE_DIR_DESC: 起始目录-必需 +MANAGE_CONSTANT_LOCAL_BASE_DIR_PLACEHOLDER: 请填写起始目录 +MANAGE_CONSTANT_LOCAL_CUSTOM_URL_DESC: 自定义域名-可选 +MANAGE_CONSTANT_LOCAL_CUSTOM_URL_PLACEHOLDER: '例如:https://example.com' +MANAGE_CONSTANT_LOCAL_CUSTOM_URL_TOOLTIP: 如果您的本地存储支持自定义域名,请填写 +MANAGE_CONSTANT_LOCAL_WEB_PATH: 网址拼接用起始路径 +MANAGE_CONSTANT_LOCAL_WEB_PATH_PLACEHOLDER: '例如:test/ttc' +MANAGE_CONSTANT_LOCAL_WEB_PATH_TOOLTIP: '用于拼接网址' +MANAGE_CONSTANT_LOCAL_EXPLAIN: '本地存储配置' +MANAGE_CONSTANT_LOCAL_REFER_TEXT: '配置教程请参考: ' +MANAGE_CONSTANT_LOCAL_BASE_DIR_RULE_MESSAGE: 起始目录不能为空 + MANAGE_LOGIN_PAGE_PANE_NAME: 已保存配置 MANAGE_LOGIN_PAGE_PANE_DESC: 点击图标和别名可查看详情,点击进入可查看文件页面,点击删除可删除配置 MANAGE_LOGIN_PAGE_PANE_LOADING: 导入配置... diff --git a/public/i18n/zh-TW.yml b/public/i18n/zh-TW.yml index 9cbf16e9..67a4ba34 100644 --- a/public/i18n/zh-TW.yml +++ b/public/i18n/zh-TW.yml @@ -276,6 +276,7 @@ SETTINGS_SYNC_DOWNLOAD_FAILED: 下載失敗 SETTINGS_SYNC_COMMON_CONFIG: 通用配置 SETTINGS_SYNC_MANAGE_CONFIG: 管理配置 SETTINGS_AUTO_IMPORT: 管理頁面自動導入配置 +SETTINGS_AUTO_IMPORT_SELECT_PICBED: 選擇需要開啟自動導入的圖床 SETTINGS_TAB_SYSTEM: 系統設置 SETTINGS_TAB_SYNC_CONFIG: 同步與配置 SETTINGS_TAB_UPLOAD: 上傳設置 @@ -598,6 +599,9 @@ MANAGE_CONSTANT_WEBDAV_CUSTOM_URL_DESC: 自訂網域名稱-可選 MANAGE_CONSTANT_WEBDAV_CUSTOM_URL_PLACEHOLDER: '例如:https://example.com' MANAGE_CONSTANT_WEBDAV_CUSTOM_URL_TOOLTIP: 如果您的WebDAV伺服器支援自訂網域名稱,請填寫 MANAGE_CONSTANT_WEBDAV_CUSTOM_URL_RULE_MESSAGE: '自訂網域名稱請以http://或https://開頭' +MANAGE_CONSTANT_WEBDAV_WEB_PATH: WebDAV網路路徑-可選 +MANAGE_CONSTANT_WEBDAV_WEB_PATH_PLACEHOLDER: '例如:test/ttc' +MANAGE_CONSTANT_WEBDAV_WEB_PATH_TOOLTIP: '用於拼接網址' MANAGE_CONSTANT_WEBDAV_PROXY_DESC: 代理-可選 MANAGE_CONSTANT_WEBDAV_PROXY_PLACEHOLDER: '例如:http://127.0.0.1:1080' MANAGE_CONSTANT_WEBDAV_PROXY_TOOLTIP: 如果需要特殊網路環境才能訪問,請使用代理 @@ -606,6 +610,21 @@ MANAGE_CONSTANT_WEBDAV_SSL_TOOLTIP: 根據WebDAV伺服器的配置,如果您 MANAGE_CONSTANT_WEBDAV_EXPLAIN: 'WebDAV配置' MANAGE_CONSTANT_WEBDAV_REFER_TEXT: '配置教程請參考: ' +MANAGE_CONSTANT_LOCAL_NAME: 本地 +MANAGE_CONSTANT_LOCAL_ALIAS_DESC: 配置別名-必需 +MANAGE_CONSTANT_LOCAL_ALIAS_PLACEHOLDER: 該配置的唯一標識 +MANAGE_CONSTANT_LOCAL_BASE_DIR_DESC: 起始目錄-必需 +MANAGE_CONSTANT_LOCAL_BASE_DIR_PLACEHOLDER: 請填寫起始目錄 +MANAGE_CONSTANT_LOCAL_CUSTOM_URL_DESC: 自定義網域-可選 +MANAGE_CONSTANT_LOCAL_CUSTOM_URL_PLACEHOLDER: '例如:https://example.com' +MANAGE_CONSTANT_LOCAL_CUSTOM_URL_TOOLTIP: 如果您的目錄支援自定義網域,請填寫 +MANAGE_CONSTANT_LOCAL_WEB_PATH: 網路路徑-可選 +MANAGE_CONSTANT_LOCAL_WEB_PATH_PLACEHOLDER: '例如:test/ttc' +MANAGE_CONSTANT_LOCAL_WEB_PATH_TOOLTIP: '用於拼接網址' +MANAGE_CONSTANT_LOCAL_EXPLAIN: '本地配置' +MANAGE_CONSTANT_LOCAL_REFER_TEXT: '配置教程請參考: ' +MANAGE_CONSTANT_LOCAL_BASE_DIR_RULE_MESSAGE: 起始目錄不能為空 + MANAGE_LOGIN_PAGE_PANE_NAME: 已保存配置 MANAGE_LOGIN_PAGE_PANE_DESC: 點擊圖標和別名可查看詳情,點擊進入可查看檔案頁面,點擊刪除可刪除配置 MANAGE_LOGIN_PAGE_PANE_LOADING: 導入配置... diff --git a/public/picbed/github.png b/public/picbed/github.png index 10737d47..fd798e15 100644 Binary files a/public/picbed/github.png and b/public/picbed/github.png differ diff --git a/public/picbed/imgur.png b/public/picbed/imgur.png index 4631b7ec..5f66f94f 100644 Binary files a/public/picbed/imgur.png and b/public/picbed/imgur.png differ diff --git a/public/picbed/qiniu.png b/public/picbed/qiniu.png index 6c862643..dfe08c39 100644 Binary files a/public/picbed/qiniu.png and b/public/picbed/qiniu.png differ diff --git a/public/picbed/sftp.png b/public/picbed/sftp.png new file mode 100644 index 00000000..1385fe64 Binary files /dev/null and b/public/picbed/sftp.png differ diff --git a/public/picbed/smms.png b/public/picbed/smms.png index 97bb61c7..4795c087 100644 Binary files a/public/picbed/smms.png and b/public/picbed/smms.png differ diff --git a/src/renderer/components/ImageLocal.vue b/src/renderer/components/ImageLocal.vue new file mode 100644 index 00000000..b959ad97 --- /dev/null +++ b/src/renderer/components/ImageLocal.vue @@ -0,0 +1,56 @@ + + + diff --git a/src/renderer/manage/pages/assets/localplist.webp b/src/renderer/manage/pages/assets/local.webp similarity index 100% rename from src/renderer/manage/pages/assets/localplist.webp rename to src/renderer/manage/pages/assets/local.webp diff --git a/src/renderer/manage/pages/logIn.vue b/src/renderer/manage/pages/logIn.vue index 7020c4a0..628c337d 100644 --- a/src/renderer/manage/pages/logIn.vue +++ b/src/renderer/manage/pages/logIn.vue @@ -61,17 +61,24 @@ />
@@ -485,9 +492,7 @@ const getAllConfigAliasArray = async () => { for (const key in allConfigAliasMap) { delete allConfigAliasMap[key] } - if (!result) { - return - } + if (!result) return let i = 0 Object.keys(result).forEach((key) => { allConfigAliasMap[i] = { @@ -536,232 +541,218 @@ function handleConfigImport (alias: string) { } } +const importedNewConfig: IStringKeyMap = {} + async function getCurrentConfigList () { const configList = await getPicBedsConfig('uploader') ?? {} - const pbList = ['aliyun', 'tcyun', 'upyun', 'qiniu', 'smms', 'qiniu', 'github', 'webdavplist', 'aws-s3', 'imgur'] - const filteredConfigList = pbList.map((pb) => { + const pbList = ['aliyun', 'tcyun', 'upyun', 'qiniu', 'smms', 'qiniu', 'github', 'webdavplist', 'aws-s3', 'imgur', 'local'] + const filteredConfigList = pbList.flatMap((pb) => { const config = configList[pb] if (config && config.configList.length > 0) { - config.configList.forEach((item: any) => { - item.type = pb - }) - return config + return config.configList.map((item: any) => ({ ...item, type: pb })) } else { - return null + return [] } - }).filter((config) => config && config.configList.length > 0) + }) await getAllConfigAliasArray() - const promises: Promise[] = [] - for (const config of filteredConfigList.flatMap((config) => config.configList)) { - const pb = config.type - promises.push(transUpToManage(config, pb)) + const autoImport = await getPicBedsConfig('settings.autoImport') || false + if (!autoImport) return + const autoImportPicBed = initArray(await getPicBedsConfig('settings.autoImportPicBed') || '', []) + await Promise.all(filteredConfigList.flatMap((config) => transUpToManage(config, config.type, autoImportPicBed))) + if (Object.keys(importedNewConfig).length > 0) { + const oldConfig = await getConfig('picBed') + const newConfig = { ...oldConfig, ...importedNewConfig } + saveConfig('picBed', newConfig) + await manageStore.refreshConfig() } - await Promise.all(promises) } function isImported (alias: string) { - for (const key in allConfigAliasMap) { - if (allConfigAliasMap[key].alias === alias) { - return true - } - } - return false + return Object.values(allConfigAliasMap).some((item) => item.alias === alias) } -async function transUpToManage (config: IUploaderConfigListItem, picBedName: string) { - const autoImport = await getConfig('settings.autoImport') || false - if (!autoImport) { - return +function initArray (arrayT: string | string[], defaultValue: string[]) { + if (!Array.isArray(arrayT)) { + arrayT = arrayT ? [arrayT] : defaultValue + } + return arrayT +} + +async function transUpToManage (config: IUploaderConfigListItem, picBedName: string, autoImportPicBed: string[]) { + const alias = `${picBedName === 'webdavplist' ? 'webdav' : picBedName}-${config._configName ?? 'Default'}-imp` + if (!autoImportPicBed.includes(picBedName) || isImported(alias)) return + const commonConfig = { + alias, + picBedName, + paging: true } - let alias: string = '' const resultMap: IStringKeyMap = {} switch (picBedName) { case 'smms': - alias = `smms-${config._configName ?? 'Default'}-imp` - if (!config.token || isImported(alias)) { - return - } - resultMap.alias = alias - resultMap.picBedName = 'smms' - resultMap.token = config.token - resultMap.paging = true - saveConfig(`picBed.${resultMap.alias}`, resultMap) + if (!config.token) return + Object.assign(resultMap, { + ...commonConfig, + token: config.token + }) break case 'aliyun': - if (!config.accessKeyId || !config.accessKeySecret) { - return - } - resultMap.alias = `aliyun-${config._configName ?? 'Default'}-imp` - resultMap.picBedName = 'aliyun' - resultMap.accessKeyId = config.accessKeyId - resultMap.accessKeySecret = config.accessKeySecret - resultMap.bucketName = '' - resultMap.baseDir = '/' - resultMap.paging = true - resultMap.itemsPerPage = 50 - resultMap.isAutoCustomUrl = !config.customUrl - resultMap.transformedConfig = JSON.stringify(config.customUrl - ? { - [config.bucket]: { - customUrl: config.customUrl - } - } - : {}) - resultMap.paging = true - saveConfig(`picBed.${resultMap.alias}`, resultMap) - break - case 'qiniu': - alias = `qiniu-${config._configName ?? 'Default'}-imp` - if (!config.accessKey || !config.secretKey || isImported(alias)) { - return - } - resultMap.alias = alias - resultMap.picBedName = 'qiniu' - resultMap.accessKey = config.accessKey - resultMap.secretKey = config.secretKey - resultMap.bucketName = '' - resultMap.baseDir = '/' - resultMap.isAutoCustomUrl = false - resultMap.transformedConfig = JSON.stringify({ [config.bucket]: config.url }) - resultMap.paging = true - resultMap.itemsPerPage = 50 - saveConfig(`picBed.${resultMap.alias}`, resultMap) - break - case 'tcyun': - alias = `tcyun-${config._configName ?? 'Default'}-imp` - if (!config.secretId || !config.secretKey || config.version === 'v4' || isImported(alias)) { - return - } - resultMap.alias = alias - resultMap.picBedName = 'tcyun' - resultMap.secretId = config.secretId - resultMap.secretKey = config.secretKey - resultMap.bucketName = '' - resultMap.baseDir = '/' - resultMap.appId = config.appId - resultMap.isAutoCustomUrl = !config.customUrl - resultMap.transformedConfig = JSON.stringify(config.customUrl - ? { - [config.bucket]: { - customUrl: config.customUrl - } - } - : {}) - resultMap.paging = true - resultMap.itemsPerPage = 50 - saveConfig(`picBed.${resultMap.alias}`, resultMap) - break - case 'github': - alias = `github-${config._configName ?? 'Default'}-imp` - if (!config.token || isImported(alias)) { - return - } - resultMap.alias = alias - resultMap.picBedName = 'github' - resultMap.token = config.token - resultMap.githubUsername = config.repo.split('/')[0] - resultMap.customUrl = '' - resultMap.proxy = '' - resultMap.paging = true - resultMap.itemsPerPage = 50 - saveConfig(`picBed.${resultMap.alias}`, resultMap) - break - case 'upyun': - alias = `upyun-${config._configName ?? 'Default'}-imp` - if (!config.operator || !config.password || isImported(alias)) { - return - } - resultMap.alias = alias - resultMap.picBedName = 'upyun' - resultMap.operator = config.operator - resultMap.password = config.password - resultMap.bucketName = config.bucket - resultMap.baseDir = '/' - resultMap.customUrl = config.url - resultMap.transformedConfig = JSON.stringify({ - [config.bucket]: { - customUrl: config.url, - baseDir: '/', - area: '', - operator: config.operator, - password: config.password - } - }) - resultMap.paging = true - resultMap.itemsPerPage = 50 - saveConfig(`picBed.${resultMap.alias}`, resultMap) - break - case 'webdavplist': - alias = `webdav-${config._configName ?? 'Default'}-imp` - if (!config.host || isImported(alias)) { - return - } - resultMap.alias = alias - resultMap.endpoint = formatEndpoint(config.host, config.sslEnabled) - resultMap.picBedName = 'webdavplist' - resultMap.username = config.username - resultMap.password = config.password - resultMap.bucketName = 'webdav' - resultMap.baseDir = config.path || '/' - resultMap.customUrl = config.customUrl || '' - resultMap.sslEnabled = !!config.sslEnabled - resultMap.proxy = '' - resultMap.transformedConfig = JSON.stringify({ - webdav: { - operator: '', - password: config.password, - baseDir: config.path || '/', - customUrl: config.customUrl || '', - area: '' - } - }) - saveConfig(`picBed.${resultMap.alias}`, resultMap) - break - case 'aws-s3': - alias = `aws-s3-${config._configName ?? 'Default'}-imp` - if (!config.accessKeyID || !config.secretAccessKey || isImported(alias)) { - return - } - resultMap.alias = alias - resultMap.picBedName = 's3plist' - resultMap.accessKeyId = config.accessKeyID - resultMap.secretAccessKey = config.secretAccessKey - resultMap.endpoint = config.endpoint || '' - resultMap.baseDir = '/' - resultMap.bucketName = '' - resultMap.paging = true - resultMap.itemsPerPage = 50 - resultMap.proxy = '' - resultMap.sslEnabled = config.endpoint ? config.endpoint.startsWith('https') : false - resultMap.aclForUpload = 'public-read' - resultMap.s3ForcePathStyle = config.pathStyleAccess - resultMap.transformedConfig = JSON.stringify( - config.urlPrefix + if (!config.accessKeyId || !config.accessKeySecret) return + Object.assign(resultMap, { + ...commonConfig, + accessKeyId: config.accessKeyId, + accessKeySecret: config.accessKeySecret, + bucketName: '', + baseDir: '/', + itemsPerPage: 50, + isAutoCustomUrl: !config.customUrl, + transformedConfig: JSON.stringify(config.customUrl ? { - [config.bucketName]: { - customUrl: config.urlPrefix + [config.bucket]: { + customUrl: config.customUrl } } - : {} - ) - saveConfig(`picBed.${resultMap.alias}`, resultMap) + : {}) + }) + break + case 'qiniu': + if (!config.accessKey || !config.secretKey) return + Object.assign(resultMap, { + ...commonConfig, + accessKey: config.accessKey, + secretKey: config.secretKey, + bucketName: '', + baseDir: '/', + isAutoCustomUrl: false, + transformedConfig: JSON.stringify({ [config.bucket]: config.url }), + itemsPerPage: 50 + }) + break + case 'tcyun': + if (!config.secretId || !config.secretKey || config.version === 'v4') return + Object.assign(resultMap, { + ...commonConfig, + secretId: config.secretId, + secretKey: config.secretKey, + bucketName: '', + baseDir: '/', + appId: config.appId, + isAutoCustomUrl: !config.customUrl, + transformedConfig: JSON.stringify(config.customUrl + ? { + [config.bucket]: { + customUrl: config.customUrl + } + } + : {}), + itemsPerPage: 50 + }) + break + case 'github': + if (!config.token) return + Object.assign(resultMap, { + ...commonConfig, + token: config.token, + githubUsername: config.repo.split('/')[0], + customUrl: '', + proxy: '', + itemsPerPage: 50 + }) + break + case 'upyun': + if (!config.operator || !config.password) return + Object.assign(resultMap, { + ...commonConfig, + operator: config.operator, + password: config.password, + bucketName: config.bucket, + baseDir: '/', + customUrl: config.url, + transformedConfig: JSON.stringify({ + [config.bucket]: { + customUrl: config.url, + baseDir: '/', + area: '', + operator: config.operator, + password: config.password + } + }), + itemsPerPage: 50 + }) + break + case 'webdavplist': + if (!config.host) return + Object.assign(resultMap, { + ...commonConfig, + endpoint: formatEndpoint(config.host, config.sslEnabled), + username: config.username, + password: config.password, + bucketName: 'webdav', + baseDir: config.path || '/', + webPath: config.webpath || '', + customUrl: config.customUrl || '', + sslEnabled: !!config.sslEnabled, + proxy: '', + transformedConfig: JSON.stringify({ + webdav: { + operator: '', + password: config.password, + baseDir: config.path || '/', + customUrl: config.customUrl || '', + area: '' + } + }) + }) + delete resultMap.paging + break + case 'local': + if (!config.path) return + Object.assign(resultMap, { + ...commonConfig, + baseDir: config.path, + webPath: config.webpath || '', + customUrl: config.customUrl || '' + }) + delete resultMap.paging + break + case 'aws-s3': + if (!config.accessKeyID || !config.secretAccessKey) return + Object.assign(resultMap, { + ...commonConfig, + accessKeyId: config.accessKeyID, + secretAccessKey: config.secretAccessKey, + endpoint: config.endpoint || '', + bucketName: '', + baseDir: '/', + itemsPerPage: 50, + proxy: '', + sslEnabled: config.endpoint ? config.endpoint.startsWith('https') : false, + aclForUpload: 'public-read', + s3ForcePathStyle: config.pathStyleAccess, + transformedConfig: JSON.stringify( + config.urlPrefix + ? { + [config.bucketName]: { + customUrl: config.urlPrefix + } + } + : {} + ) + }) break case 'imgur': - alias = `imgur-${config._configName ?? 'Default'}-imp` - if (!config.username || !config.accessToken || isImported(alias)) { - return - } - resultMap.alias = alias - resultMap.picBedName = 'imgur' - resultMap.imgurUserName = config.username - resultMap.accessToken = config.accessToken - resultMap.proxy = config.proxy || '' - saveConfig(`picBed.${resultMap.alias}`, resultMap) + if (!config.username || !config.accessToken) return + Object.assign(resultMap, { + ...commonConfig, + username: config.username, + accessToken: config.accessToken, + proxy: '' + }) + delete resultMap.paging break default: return } - manageStore.refreshConfig() + importedNewConfig[alias] = resultMap } onMounted(async () => { diff --git a/src/renderer/manage/utils/constants.ts b/src/renderer/manage/utils/constants.ts index 4e56c7a1..8d34c4c0 100644 --- a/src/renderer/manage/utils/constants.ts +++ b/src/renderer/manage/utils/constants.ts @@ -712,8 +712,7 @@ export const supportedPicBedList: IStringKeyMap = { description: $T('MANAGE_CONSTANT_WEBDAV_BASE_DIR_DESC'), placeholder: $T('MANAGE_CONSTANT_WEBDAV_BASE_DIR_PLACEHOLDER'), type: 'string', - default: '/', - tooltip: baseDirTooltip + default: '/' }, customUrl: { required: false, @@ -738,6 +737,14 @@ export const supportedPicBedList: IStringKeyMap = { } ] }, + webPath: { + required: false, + description: $T('MANAGE_CONSTANT_WEBDAV_WEB_PATH'), + placeholder: $T('MANAGE_CONSTANT_WEBDAV_WEB_PATH_PLACEHOLDER'), + type: 'string', + tooltip: $T('MANAGE_CONSTANT_WEBDAV_WEB_PATH_TOOLTIP'), + default: '' + }, proxy: { required: false, description: $T('MANAGE_CONSTANT_WEBDAV_PROXY_DESC'), @@ -754,8 +761,76 @@ export const supportedPicBedList: IStringKeyMap = { } }, explain: $T('MANAGE_CONSTANT_WEBDAV_EXPLAIN'), - options: ['alias', 'endpoint', 'username', 'password', 'bucketName', 'baseDir', 'customUrl', 'proxy', 'sslEnabled'], + options: ['alias', 'endpoint', 'username', 'password', 'bucketName', 'baseDir', 'customUrl', 'webPath', 'proxy', 'sslEnabled'], refLink: 'https://pichoro.horosama.com/#/PicHoroDocs/configure?id=webdav', referenceText: $T('MANAGE_CONSTANT_WEBDAV_REFER_TEXT') + }, + local: { + name: $T('MANAGE_CONSTANT_LOCAL_NAME'), + icon: 'local', + configOptions: { + alias: { + required: true, + description: $T('MANAGE_CONSTANT_LOCAL_ALIAS_DESC'), + placeholder: $T('MANAGE_CONSTANT_LOCAL_ALIAS_PLACEHOLDER'), + type: 'string', + rule: aliasRule, + default: 'local-A', + tooltip: aliasTooltip + }, + baseDir: { + required: true, + description: $T('MANAGE_CONSTANT_LOCAL_BASE_DIR_DESC'), + placeholder: $T('MANAGE_CONSTANT_LOCAL_BASE_DIR_PLACEHOLDER'), + type: 'string', + default: '', + rule: [ + { + validator: (rule: any, value: any, callback: any) => { + if (!value) { + callback(new Error($T('MANAGE_CONSTANT_LOCAL_BASE_DIR_RULE_MESSAGE'))) + } else { + callback() + } + } + } + ] + }, + customUrl: { + required: false, + description: $T('MANAGE_CONSTANT_LOCAL_CUSTOM_URL_DESC'), + placeholder: $T('MANAGE_CONSTANT_LOCAL_CUSTOM_URL_PLACEHOLDER'), + type: 'string', + tooltip: $T('MANAGE_CONSTANT_LOCAL_CUSTOM_URL_TOOLTIP'), + rule: [ + { + validator: (rule: any, value: any, callback: any) => { + if (value) { + if (!/^https?:\/\/.+/.test(value)) { + callback(new Error($T('MANAGE_CONSTANT_WEBDAV_CUSTOM_URL_RULE_MESSAGE'))) + } else { + callback() + } + } else { + callback() + } + }, + trigger: 'change' + } + ] + }, + webPath: { + required: false, + description: $T('MANAGE_CONSTANT_LOCAL_WEB_PATH'), + placeholder: $T('MANAGE_CONSTANT_LOCAL_WEB_PATH_PLACEHOLDER'), + type: 'string', + tooltip: $T('MANAGE_CONSTANT_LOCAL_WEB_PATH_TOOLTIP'), + default: '' + } + }, + explain: $T('MANAGE_CONSTANT_LOCAL_EXPLAIN'), + options: ['alias', 'baseDir', 'customUrl', 'webPath'], + refLink: 'https://piclist.cn', + referenceText: $T('MANAGE_CONSTANT_LOCAL_REFER_TEXT') } } diff --git a/src/renderer/pages/PicGoSetting.vue b/src/renderer/pages/PicGoSetting.vue index 6fe0b98c..06726217 100644 --- a/src/renderer/pages/PicGoSetting.vue +++ b/src/renderer/pages/PicGoSetting.vue @@ -289,6 +289,26 @@ @change="autoImportChange" /> + + + + + @@ -1596,6 +1616,7 @@ const form = reactive({ customMiniIcon: '', isHideDock: false, autoImport: false, + autoImportPicBed: [], encodeOutputURL: false, isAutoListenClipboard: false, useShortUrl: false, @@ -1741,7 +1762,7 @@ async function initData () { form.miniWindowOntop = settings.miniWindowOntop || false form.autoCloseMiniWindow = settings.autoCloseMiniWindow || false form.autoCloseMainWindow = settings.autoCloseMainWindow || false - form.logLevel = initLogLevel(settings.logLevel || []) + form.logLevel = initArray(settings.logLevel || [], ['all']) form.autoCopyUrl = settings.autoCopy === undefined ? true : settings.autoCopy form.checkBetaUpdate = settings.checkBetaUpdate === undefined ? true : settings.checkBetaUpdate form.useBuiltinClipboard = settings.useBuiltinClipboard === undefined ? true : settings.useBuiltinClipboard @@ -1750,6 +1771,7 @@ async function initData () { form.encodeOutputURL = settings.encodeOutputURL === undefined ? false : settings.encodeOutputURL form.deleteCloudFile = settings.deleteCloudFile || false form.autoImport = settings.autoImport || false + form.autoImportPicBed = initArray(settings.autoImportPicBed || [], []) form.isCustomMiniIcon = settings.isCustomMiniIcon || false form.customMiniIcon = settings.customMiniIcon || '' form.isHideDock = settings.isHideDock || false @@ -1795,15 +1817,15 @@ async function initData () { } } -function initLogLevel (logLevel: string | string[]) { - if (!Array.isArray(logLevel)) { - if (logLevel && logLevel.length > 0) { - logLevel = [logLevel] +function initArray (arrayT: string | string[], defaultValue: string[]) { + if (!Array.isArray(arrayT)) { + if (arrayT && arrayT.length > 0) { + arrayT = [arrayT] } else { - logLevel = ['all'] + arrayT = defaultValue } } - return logLevel + return arrayT } function getPicBeds (event: Event, picBeds: IPicBedType[]) { @@ -1919,6 +1941,10 @@ function autoImportChange (val: ICheckBoxValueType) { saveConfig('settings.autoImport', val) } +function handleAutoImportPicBedChange (val: string[]) { + saveConfig('settings.autoImportPicBed', val) +} + function handleHideDockChange (val: ICheckBoxValueType) { if (val && currentStartMode.value === 'no-tray') { ElMessage.warning($T('SETTINGS_ISHIDEDOCK_TIPS')) diff --git a/src/universal/types/i18n.d.ts b/src/universal/types/i18n.d.ts index 758df678..feca625b 100644 --- a/src/universal/types/i18n.d.ts +++ b/src/universal/types/i18n.d.ts @@ -271,6 +271,7 @@ interface ILocales { SETTINGS_SYNC_COMMON_CONFIG: string SETTINGS_SYNC_MANAGE_CONFIG: string SETTINGS_AUTO_IMPORT: string + SETTINGS_AUTO_IMPORT_SELECT_PICBED: string SETTINGS_TAB_SYSTEM: string SETTINGS_TAB_SYNC_CONFIG: string SETTINGS_TAB_UPLOAD: string @@ -560,6 +561,9 @@ interface ILocales { MANAGE_CONSTANT_WEBDAV_CUSTOM_URL_PLACEHOLDER: string MANAGE_CONSTANT_WEBDAV_CUSTOM_URL_TOOLTIP: string MANAGE_CONSTANT_WEBDAV_CUSTOM_URL_RULE_MESSAGE: string + MANAGE_CONSTANT_WEBDAV_WEB_PATH: string + MANAGE_CONSTANT_WEBDAV_WEB_PATH_PLACEHOLDER: string + MANAGE_CONSTANT_WEBDAV_WEB_PATH_TOOLTIP: string MANAGE_CONSTANT_WEBDAV_PROXY_DESC: string MANAGE_CONSTANT_WEBDAV_PROXY_PLACEHOLDER: string MANAGE_CONSTANT_WEBDAV_PROXY_TOOLTIP: string @@ -567,6 +571,20 @@ interface ILocales { MANAGE_CONSTANT_WEBDAV_SSL_TOOLTIP: string MANAGE_CONSTANT_WEBDAV_EXPLAIN: string MANAGE_CONSTANT_WEBDAV_REFER_TEXT: string + MANAGE_CONSTANT_LOCAL_NAME: string + MANAGE_CONSTANT_LOCAL_ALIAS_DESC: string + MANAGE_CONSTANT_LOCAL_ALIAS_PLACEHOLDER: string + MANAGE_CONSTANT_LOCAL_BASE_DIR_DESC: string + MANAGE_CONSTANT_LOCAL_BASE_DIR_PLACEHOLDER: string + MANAGE_CONSTANT_LOCAL_CUSTOM_URL_DESC: string + MANAGE_CONSTANT_LOCAL_CUSTOM_URL_PLACEHOLDER: string + MANAGE_CONSTANT_LOCAL_CUSTOM_URL_TOOLTIP: string + MANAGE_CONSTANT_LOCAL_WEB_PATH: string + MANAGE_CONSTANT_LOCAL_WEB_PATH_PLACEHOLDER: string + MANAGE_CONSTANT_LOCAL_WEB_PATH_TOOLTIP: string + MANAGE_CONSTANT_LOCAL_EXPLAIN: string + MANAGE_CONSTANT_LOCAL_REFER_TEXT: string + MANAGE_CONSTANT_LOCAL_BASE_DIR_RULE_MESSAGE: string MANAGE_LOGIN_PAGE_PANE_NAME: string MANAGE_LOGIN_PAGE_PANE_DESC: string MANAGE_LOGIN_PAGE_PANE_LOADING: string diff --git a/src/universal/types/view.d.ts b/src/universal/types/view.d.ts index 70c690b2..b7770d91 100644 --- a/src/universal/types/view.d.ts +++ b/src/universal/types/view.d.ts @@ -20,6 +20,7 @@ interface ISettingForm { customMiniIcon: string, isHideDock: boolean, autoImport: boolean, + autoImportPicBed: string[], encodeOutputURL: boolean, isAutoListenClipboard: boolean, useShortUrl: boolean,