feat: add web entry to download desktop client

This commit is contained in:
2026-02-19 21:49:32 +08:00
parent cdfe45b3a2
commit e2318ac42e
2 changed files with 89 additions and 0 deletions

View File

@@ -271,6 +271,8 @@ createApp({
error: '',
lastLoadedAt: ''
},
desktopClientDownloading: false,
desktopClientDownloadUrl: '',
// 健康检测
healthCheck: {
@@ -731,6 +733,70 @@ createApp({
this._debouncedLoadUserProfile();
},
resolveDesktopClientUrl(rawUrl) {
const trimmed = String(rawUrl || '').trim();
if (!trimmed) return '';
try {
return new URL(trimmed, `${this.apiBase}/`).toString();
} catch (error) {
console.warn('[客户端下载] 下载地址格式异常:', trimmed, error);
return '';
}
},
triggerDesktopClientDownload(url) {
const resolved = this.resolveDesktopClientUrl(url);
if (!resolved) return false;
const link = document.createElement('a');
link.href = resolved;
link.target = '_blank';
link.rel = 'noopener noreferrer';
link.download = '';
document.body.appendChild(link);
link.click();
link.remove();
return true;
},
async fetchDesktopClientDownloadUrl() {
try {
const response = await axios.get(`${this.apiBase}/api/client/desktop-update`, {
params: {
currentVersion: '0.0.0',
platform: 'windows-x64',
channel: 'stable'
}
});
const resolved = this.resolveDesktopClientUrl(response.data?.downloadUrl);
if (resolved) {
this.desktopClientDownloadUrl = resolved;
return resolved;
}
} catch (error) {
console.warn('[客户端下载] 获取最新版下载地址失败:', error?.message || error);
}
return this.resolveDesktopClientUrl(this.desktopClientDownloadUrl);
},
async downloadDesktopClient() {
if (this.desktopClientDownloading) return;
this.desktopClientDownloading = true;
try {
const downloadUrl = await this.fetchDesktopClientDownloadUrl();
if (!downloadUrl) {
this.showToast('warning', '暂无安装包', '服务器尚未配置客户端安装包下载地址');
return;
}
if (!this.triggerDesktopClientDownload(downloadUrl)) {
this.showToast('error', '下载失败', '下载地址无效,请稍后重试');
return;
}
this.showToast('success', '开始下载', '客户端安装包已开始下载');
} finally {
this.desktopClientDownloading = false;
}
},
// ========== 主题管理 ==========
// 初始化主题
async initTheme() {