🚧 WIP: add local picbed into manage page, optimize webdav picbed

This commit is contained in:
萌萌哒赫萝
2023-08-05 23:00:40 -07:00
parent bdc11dad43
commit 4827dcdca8
15 changed files with 445 additions and 221 deletions

View File

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 18 KiB

View File

@@ -61,17 +61,24 @@
/>
</el-table>
<template #reference>
<el-button
style="width: 100%; text-align: center;overflow: hidden;text-overflow: ellipsis;white-space: nowrap;"
<el-tooltip
effect="light"
:content="item.alias"
placement="top"
:disabled="item.alias.length <= 15"
>
<template #icon>
<img
:src="require(`./assets/${item.picBedName}.webp`)"
style="width: 25px; height: 25px;"
>
</template>
{{ item.alias }}
</el-button>
<el-button
style="width: 100%; text-align: center;overflow: hidden;text-overflow: ellipsis;white-space: nowrap;"
>
<template #icon>
<img
:src="require(`./assets/${item.picBedName}.webp`)"
style="width: 25px; height: 25px;"
>
</template>
{{ item.alias.length > 15 ? item.alias.slice(0, 8) + '...' + item.alias.slice(-6) : item.alias }}
</el-button>
</el-tooltip>
</template>
</el-popover>
<br>
@@ -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<any>('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<any>[] = []
for (const config of filteredConfigList.flatMap((config) => config.configList)) {
const pb = config.type
promises.push(transUpToManage(config, pb))
const autoImport = await getPicBedsConfig<boolean>('settings.autoImport') || false
if (!autoImport) return
const autoImportPicBed = initArray(await getPicBedsConfig<string | string[]>('settings.autoImportPicBed') || '', [])
await Promise.all(filteredConfigList.flatMap((config) => transUpToManage(config, config.type, autoImportPicBed)))
if (Object.keys(importedNewConfig).length > 0) {
const oldConfig = await getConfig<any>('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<boolean>('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 () => {

View File

@@ -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')
}
}