mirror of
https://github.com/Kuingsmile/PicList.git
synced 2025-02-08 21:38:13 -05:00
🔨 Refactor: modify some code
This commit is contained in:
parent
8911217780
commit
c819872635
75
src/main/manage/utils/threadPool.ts
Normal file
75
src/main/manage/utils/threadPool.ts
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
import { Worker, WorkerOptions } from 'worker_threads'
|
||||||
|
|
||||||
|
interface Task {
|
||||||
|
data: any
|
||||||
|
workerOptions: WorkerOptions | undefined
|
||||||
|
resolve: (result: any) => void
|
||||||
|
reject: (error: any) => void
|
||||||
|
}
|
||||||
|
|
||||||
|
class ThreadPool {
|
||||||
|
private size: number
|
||||||
|
private workerPath: string
|
||||||
|
private availablePool: Worker[]
|
||||||
|
private taskQueue: Task[]
|
||||||
|
private busyPool: Worker[]
|
||||||
|
private callBackList: any[]
|
||||||
|
|
||||||
|
constructor (size: number, workerPath: string) {
|
||||||
|
this.size = size
|
||||||
|
this.workerPath = workerPath
|
||||||
|
this.availablePool = []
|
||||||
|
this.busyPool = []
|
||||||
|
for (let i = 0; i < this.size; i++) {
|
||||||
|
this.availablePool.push(new Worker(this.workerPath))
|
||||||
|
}
|
||||||
|
this.taskQueue = []
|
||||||
|
this.callBackList = []
|
||||||
|
this.init()
|
||||||
|
}
|
||||||
|
|
||||||
|
private init () {
|
||||||
|
for (const worker of this.availablePool) {
|
||||||
|
worker.on('message', (result) => {
|
||||||
|
const { data } = result
|
||||||
|
this.callBackList.shift()(data)
|
||||||
|
this.busyPool = this.busyPool.filter((w) => w.threadId !== worker.threadId)
|
||||||
|
this.availablePool.push(worker)
|
||||||
|
this.processQueue()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private processQueue () {
|
||||||
|
if (this.taskQueue.length === 0) return
|
||||||
|
if (this.availablePool.length === 0) return
|
||||||
|
const task = this.taskQueue.shift()
|
||||||
|
const worker = this.availablePool.pop()
|
||||||
|
if (worker && task) {
|
||||||
|
this.callBackList.push(task.resolve)
|
||||||
|
this.busyPool.push(worker)
|
||||||
|
worker.postMessage(task.data)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public async addTask (data: any, workerOptions?: WorkerOptions): Promise<any> {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
this.taskQueue.push({ data, workerOptions, resolve, reject })
|
||||||
|
this.processQueue()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
public async destroy (): Promise<void> {
|
||||||
|
const terminatePromises = this.availablePool.map((worker) => new Promise((resolve) => {
|
||||||
|
worker.terminate()
|
||||||
|
worker.on('exit', () => {
|
||||||
|
resolve(true)
|
||||||
|
})
|
||||||
|
}))
|
||||||
|
await Promise.all(terminatePromises)
|
||||||
|
this.availablePool = []
|
||||||
|
this.taskQueue = []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default ThreadPool
|
@ -54,6 +54,8 @@ const urlCreateObjectURL = async () => {
|
|||||||
headers: props.headers
|
headers: props.headers
|
||||||
}).then(res => res.blob()).then(blob => {
|
}).then(res => res.blob()).then(blob => {
|
||||||
base64Url.value = URL.createObjectURL(blob)
|
base64Url.value = URL.createObjectURL(blob)
|
||||||
|
}).catch(err => {
|
||||||
|
console.log(err)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
style="width: 100%;overflow-y: scroll;height: calc(100vh - 50px);"
|
style="width: 100%;overflow-y: scroll;height: calc(100vh - 50px);"
|
||||||
>
|
>
|
||||||
<el-alert
|
<el-alert
|
||||||
v-loading.fullscreen="isLoading"
|
v-loading="isLoading"
|
||||||
title="已设置配置列表,点击图标和别名可查看配置详情,点击进入可查看文件页面,点击删除可删除配置"
|
title="已设置配置列表,点击图标和别名可查看配置详情,点击进入可查看文件页面,点击删除可删除配置"
|
||||||
type="success"
|
type="success"
|
||||||
show-icon
|
show-icon
|
||||||
@ -705,7 +705,7 @@ async function transUpToManage (config: IUploaderConfigListItem, picBedName: str
|
|||||||
resultMap.transformedConfig = JSON.stringify(
|
resultMap.transformedConfig = JSON.stringify(
|
||||||
config.urlPrefix
|
config.urlPrefix
|
||||||
? {
|
? {
|
||||||
[config.bucket]: {
|
[config.bucketName]: {
|
||||||
customUrl: config.urlPrefix
|
customUrl: config.urlPrefix
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -317,8 +317,7 @@ const urlMap : IStringKeyMap = {
|
|||||||
tcyun: 'https://console.cloud.tencent.com/cos',
|
tcyun: 'https://console.cloud.tencent.com/cos',
|
||||||
upyun: 'https://console.upyun.com',
|
upyun: 'https://console.upyun.com',
|
||||||
s3plist: 'https://aws.amazon.com/cn/s3/',
|
s3plist: 'https://aws.amazon.com/cn/s3/',
|
||||||
webdavplist: 'https://baike.baidu.com/item/WebDAV/4610909',
|
webdavplist: 'https://baike.baidu.com/item/WebDAV/4610909'
|
||||||
localplist: 'https://plist.cn'
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const openPicBedUrl = () => shell.openExternal(urlMap[currentPagePicBedConfig.picBedName])
|
const openPicBedUrl = () => shell.openExternal(urlMap[currentPagePicBedConfig.picBedName])
|
||||||
@ -445,8 +444,7 @@ const menuTitleMap:IStringKeyMap = {
|
|||||||
smms: '相册',
|
smms: '相册',
|
||||||
imgur: '相册',
|
imgur: '相册',
|
||||||
github: '仓库',
|
github: '仓库',
|
||||||
webdavplist: '',
|
webdavplist: ''
|
||||||
localplist: '本地'
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const showNewIconList = ['aliyun', 'qiniu', 'tcyun']
|
const showNewIconList = ['aliyun', 'qiniu', 'tcyun']
|
||||||
|
@ -76,15 +76,17 @@ export function getFileIconPath (fileName: string) {
|
|||||||
return availableIconList.includes(ext) ? `${ext}.webp` : 'unknown.webp'
|
return availableIconList.includes(ext) ? `${ext}.webp` : 'unknown.webp'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const units = ['B', 'KB', 'MB', 'GB', 'TB', 'PB']
|
||||||
|
|
||||||
export function formatFileSize (size: number) {
|
export function formatFileSize (size: number) {
|
||||||
if (size === 0) return ''
|
if (size === 0) return ''
|
||||||
const units = ['B', 'KB', 'MB', 'GB', 'TB', 'PB']
|
|
||||||
const index = Math.floor(Math.log2(size) / 10)
|
const index = Math.floor(Math.log2(size) / 10)
|
||||||
return `${(size / Math.pow(2, index * 10)).toFixed(2)} ${units[index]}`
|
return `${(size / Math.pow(2, index * 10)).toFixed(2)} ${units[index]}`
|
||||||
}
|
}
|
||||||
|
|
||||||
export function formatFileName (fileName: string, length: number = 20) {
|
export function formatFileName (fileName: string, length: number = 20) {
|
||||||
const ext = path.extname(fileName)
|
let ext = path.extname(fileName)
|
||||||
|
ext = ext.length > 5 ? ext.slice(ext.length - 5) : ext
|
||||||
const name = path.basename(fileName, ext)
|
const name = path.basename(fileName, ext)
|
||||||
return name.length > length ? `${name.slice(0, length)}...${ext}` : fileName
|
return name.length > length ? `${name.slice(0, length)}...${ext}` : fileName
|
||||||
}
|
}
|
||||||
@ -92,7 +94,7 @@ export function formatFileName (fileName: string, length: number = 20) {
|
|||||||
export const getExtension = (fileName: string) => path.extname(fileName).slice(1)
|
export const getExtension = (fileName: string) => path.extname(fileName).slice(1)
|
||||||
|
|
||||||
export const isImage = (fileName: string) =>
|
export const isImage = (fileName: string) =>
|
||||||
['jpg', 'jpeg', 'png', 'gif', 'webp', 'bmp', 'ico'].includes(getExtension(fileName))
|
['jpg', 'jpeg', 'png', 'gif', 'webp', 'bmp', 'ico', 'svg'].includes(getExtension(fileName))
|
||||||
|
|
||||||
export function formObjToTableData (obj: any) {
|
export function formObjToTableData (obj: any) {
|
||||||
const exclude = [undefined, null, '', 'transformedConfig']
|
const exclude = [undefined, null, '', 'transformedConfig']
|
||||||
@ -103,16 +105,11 @@ export function formObjToTableData (obj: any) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function isValidUrl (str: string) {
|
export function isValidUrl (str: string) {
|
||||||
const pattern = new RegExp(
|
try {
|
||||||
'^([a-zA-Z]+:\\/\\/)?' +
|
return !!new URL(str)
|
||||||
'((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|' +
|
} catch (e) {
|
||||||
'((\\d{1,3}\\.){3}\\d{1,3}))' +
|
return false
|
||||||
'(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*' +
|
}
|
||||||
'(\\?[;&a-z\\d%_.~+=-]*)?' +
|
|
||||||
'(\\#[-a-z\\d_]*)?$',
|
|
||||||
'i'
|
|
||||||
)
|
|
||||||
return pattern.test(str)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface IHTTPProxy {
|
export interface IHTTPProxy {
|
||||||
|
@ -756,63 +756,5 @@ export const supportedPicBedList: IStringKeyMap = {
|
|||||||
options: ['alias', 'endpoint', 'username', 'password', 'bucketName', 'baseDir', 'customUrl', 'proxy', 'sslEnabled'],
|
options: ['alias', 'endpoint', 'username', 'password', 'bucketName', 'baseDir', 'customUrl', 'proxy', 'sslEnabled'],
|
||||||
refLink: 'https://pichoro.horosama.com/#/PicHoroDocs/configure?id=webdav',
|
refLink: 'https://pichoro.horosama.com/#/PicHoroDocs/configure?id=webdav',
|
||||||
referenceText: '配置教程请参考:'
|
referenceText: '配置教程请参考:'
|
||||||
},
|
|
||||||
localplist: {
|
|
||||||
name: '本地',
|
|
||||||
icon: 'localplist',
|
|
||||||
configOptions: {
|
|
||||||
alias: {
|
|
||||||
required: true,
|
|
||||||
description: '配置别名-必需',
|
|
||||||
placeholder: '该配置的唯一标识',
|
|
||||||
type: 'string',
|
|
||||||
rule: aliasRule,
|
|
||||||
default: 'localplist-A',
|
|
||||||
tooltip: aliasTooltip
|
|
||||||
},
|
|
||||||
baseDir: {
|
|
||||||
required: false,
|
|
||||||
description: '起始目录-可选',
|
|
||||||
placeholder: '例如:/test1',
|
|
||||||
type: 'string',
|
|
||||||
default: '/',
|
|
||||||
tooltip: '请填写完整的本地路径,例如:/test1'
|
|
||||||
},
|
|
||||||
customUrl: {
|
|
||||||
required: false,
|
|
||||||
description: '自定义域名-可选',
|
|
||||||
placeholder: '例如:https://example.com',
|
|
||||||
type: 'string',
|
|
||||||
tooltip: '如果您的本地服务器支持自定义域名,请填写完整的自定义域名,例如:https://example.com',
|
|
||||||
rule: [
|
|
||||||
{
|
|
||||||
validator: (rule: any, value: any, callback: any) => {
|
|
||||||
if (value) {
|
|
||||||
if (!/^https?:\/\/.+/.test(value)) {
|
|
||||||
callback(new Error('自定义域名请以http://或https://开头'))
|
|
||||||
} else {
|
|
||||||
callback()
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
callback()
|
|
||||||
}
|
|
||||||
},
|
|
||||||
trigger: 'change'
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
webDir: {
|
|
||||||
required: false,
|
|
||||||
description: 'Web目录-可选',
|
|
||||||
placeholder: '例如:/test1',
|
|
||||||
type: 'string',
|
|
||||||
default: '/',
|
|
||||||
tooltip: '请填写您的Web服务器的根目录,例如:/test1'
|
|
||||||
}
|
|
||||||
},
|
|
||||||
explain: '本地配置',
|
|
||||||
options: ['alias', 'baseDir', 'customUrl', 'webDir'],
|
|
||||||
refLink: '',
|
|
||||||
referenceText: ''
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user