mirror of
https://github.com/kuaifan/dootask.git
synced 2026-01-18 21:38:11 +00:00
perf: 优化下载工具
This commit is contained in:
parent
d4e754d601
commit
eecc6c9e53
@ -1404,7 +1404,12 @@ class Base
|
|||||||
*/
|
*/
|
||||||
public static function ajaxError($msg, $data = [], $ret = 0, $abortCode = 404)
|
public static function ajaxError($msg, $data = [], $ret = 0, $abortCode = 404)
|
||||||
{
|
{
|
||||||
abort_if(Request::header('Content-Type') !== 'application/json', $abortCode, Doo::translate($msg));
|
if (Request::header('Content-Type') !== 'application/json') {
|
||||||
|
$translateMsg = Doo::translate($msg);
|
||||||
|
abort($abortCode, $translateMsg, [
|
||||||
|
'X-Error-Message-Base64' => base64_encode($translateMsg),
|
||||||
|
]);
|
||||||
|
}
|
||||||
return Base::retError($msg, $data, $ret);
|
return Base::retError($msg, $data, $ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
6
electron/electron-down.js
vendored
6
electron/electron-down.js
vendored
@ -31,6 +31,12 @@ function initialize(onStarted= null) {
|
|||||||
onInterrupted: (item) => {
|
onInterrupted: (item) => {
|
||||||
downloadManager.refresh(item.getSavePath());
|
downloadManager.refresh(item.getSavePath());
|
||||||
syncDownloadItems();
|
syncDownloadItems();
|
||||||
|
// 尝试更新下载项的错误信息
|
||||||
|
downloadManager.updateError(item).then(success => {
|
||||||
|
if (success) {
|
||||||
|
syncDownloadItems();
|
||||||
|
}
|
||||||
|
});
|
||||||
},
|
},
|
||||||
onProgress: (item) => {
|
onProgress: (item) => {
|
||||||
downloadManager.refresh(item.path);
|
downloadManager.refresh(item.path);
|
||||||
|
|||||||
@ -70,7 +70,7 @@
|
|||||||
<span v-else class="download-time">{{ formatTime(item.startTime) }}</span>
|
<span v-else class="download-time">{{ formatTime(item.startTime) }}</span>
|
||||||
<!-- 状态 -->
|
<!-- 状态 -->
|
||||||
<span v-if="item.state !== 'progressing' || item.paused" class="state" :class="getStateClass(item)">
|
<span v-if="item.state !== 'progressing' || item.paused" class="state" :class="getStateClass(item)">
|
||||||
{{ getStateText(item) }}
|
{{ getStateText(item) }}{{item.error ? `: ${item.error}` : ''}}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
14
electron/render/download/style.css
vendored
14
electron/render/download/style.css
vendored
@ -498,11 +498,13 @@ body.win32 {
|
|||||||
/* Toast 提示框样式 */
|
/* Toast 提示框样式 */
|
||||||
.toast {
|
.toast {
|
||||||
position: fixed;
|
position: fixed;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
bottom: 20px;
|
bottom: 20px;
|
||||||
left: 50%;
|
|
||||||
transform: translateX(-50%);
|
|
||||||
z-index: 1000;
|
z-index: 1000;
|
||||||
animation: toast-slide-up 0.3s ease-out;
|
animation: toast-slide-up 0.3s ease-out;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
.toast-content {
|
.toast-content {
|
||||||
@ -516,7 +518,7 @@ body.win32 {
|
|||||||
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
|
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
|
||||||
font-size: 13px;
|
font-size: 13px;
|
||||||
min-width: 200px;
|
min-width: 200px;
|
||||||
white-space: nowrap;
|
max-width: 90vw;
|
||||||
}
|
}
|
||||||
|
|
||||||
.toast.success .toast-content {
|
.toast.success .toast-content {
|
||||||
@ -529,15 +531,17 @@ body.win32 {
|
|||||||
|
|
||||||
.toast-message {
|
.toast-message {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
|
max-height: 200px;
|
||||||
|
overflow-y: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
@keyframes toast-slide-up {
|
@keyframes toast-slide-up {
|
||||||
from {
|
from {
|
||||||
opacity: 0;
|
opacity: 0;
|
||||||
transform: translate(-50%, 20px);
|
transform: translateY(20px);
|
||||||
}
|
}
|
||||||
to {
|
to {
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
transform: translate(-50%, 0);
|
transform: translateY(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
36
electron/utils/download.js
vendored
36
electron/utils/download.js
vendored
@ -60,6 +60,7 @@ class DownloadManager {
|
|||||||
// 添加下载项
|
// 添加下载项
|
||||||
this.downloadHistory.unshift({
|
this.downloadHistory.unshift({
|
||||||
...this.convert(downloadItem),
|
...this.convert(downloadItem),
|
||||||
|
error: null,
|
||||||
_source: downloadItem,
|
_source: downloadItem,
|
||||||
});
|
});
|
||||||
if (this.downloadHistory.length > 1000) {
|
if (this.downloadHistory.length > 1000) {
|
||||||
@ -101,6 +102,41 @@ class DownloadManager {
|
|||||||
store.set('downloadHistory', this.downloadHistory);
|
store.set('downloadHistory', this.downloadHistory);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 尝试更新下载项的错误信息
|
||||||
|
* @param {Electron.DownloadItem} downloadItem
|
||||||
|
*/
|
||||||
|
async updateError(downloadItem) {
|
||||||
|
const urls = downloadItem.getURLChain()
|
||||||
|
const url = urls.length > 0 ? urls[0] : downloadItem.getURL()
|
||||||
|
const path = downloadItem.getSavePath()
|
||||||
|
|
||||||
|
const item = this.downloadHistory.find(d => d.path === path)
|
||||||
|
if (!item) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
const res = await fetch(url, {
|
||||||
|
method: 'HEAD',
|
||||||
|
})
|
||||||
|
let error = null
|
||||||
|
if (res.headers.get('X-Error-Message-Base64')) {
|
||||||
|
error = Buffer.from(res.headers.get('X-Error-Message-Base64'), 'base64').toString('utf-8')
|
||||||
|
} else if (res.headers.get('X-Error-Message')) {
|
||||||
|
error = res.headers.get('X-Error-Message')
|
||||||
|
}
|
||||||
|
if (error) {
|
||||||
|
Object.assign(item, {error});
|
||||||
|
store.set('downloadHistory', this.downloadHistory);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
} catch {
|
||||||
|
// 忽略错误
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 暂停下载项
|
* 暂停下载项
|
||||||
* @param {string} path
|
* @param {string} path
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user