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

@@ -1796,6 +1796,10 @@
{{ isLogin ? '还没有账号?' : '已有账号?' }}
<a @click="toggleAuthMode">{{ isLogin ? '立即注册' : '去登录' }}</a>
</div>
<button type="button" class="btn btn-secondary" style="margin-top: 12px;" :disabled="desktopClientDownloading" @click="downloadDesktopClient">
<i :class="desktopClientDownloading ? 'fas fa-spinner fa-spin' : 'fas fa-desktop'"></i>
{{ desktopClientDownloading ? '获取安装包...' : '下载桌面客户端' }}
</button>
</div>
</div>
<!-- 导航栏 -->
@@ -1818,6 +1822,10 @@
<i class="fas fa-cog"></i> 设置
</div>
<button class="btn btn-secondary" :disabled="desktopClientDownloading" @click="downloadDesktopClient">
<i :class="desktopClientDownloading ? 'fas fa-spinner fa-spin' : 'fas fa-download'"></i>
{{ desktopClientDownloading ? '准备中...' : '下载客户端' }}
</button>
<div class="user-info">
<i class="fas fa-user-circle"></i>
<span>{{ user.username }}</span>
@@ -2480,6 +2488,21 @@
<p class="settings-page-subtitle">管理存储策略、主题外观与账号安全</p>
</div>
<h3 class="settings-section-title" style="margin-bottom: 20px;">
<i class="fas fa-desktop"></i> 客户端下载
</h3>
<div class="settings-panel" style="background: var(--bg-card); padding: 20px; border-radius: 12px; border: 1px solid var(--glass-border); margin-bottom: 30px;">
<div style="display: flex; justify-content: space-between; align-items: center; gap: 12px; flex-wrap: wrap;">
<div style="color: var(--text-secondary); font-size: 13px;">
下载最新版桌面客户端Windows x64
</div>
<button class="btn btn-primary" :disabled="desktopClientDownloading" @click="downloadDesktopClient">
<i :class="desktopClientDownloading ? 'fas fa-spinner fa-spin' : 'fas fa-download'"></i>
{{ desktopClientDownloading ? '获取安装包...' : '下载桌面客户端' }}
</button>
</div>
</div>
<!-- 存储管理 - 仅用户可选择 -->
<div v-if="user && !user.is_admin && storagePermission === 'user_choice'" class="settings-section settings-storage-choice" style="margin-bottom: 40px;">
<h3 class="settings-section-title" style="margin-bottom: 20px;">

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() {