Skip to content

Commit abf9f72

Browse files
committed
update
1 parent 3c89b53 commit abf9f72

File tree

7 files changed

+3433
-2419
lines changed

7 files changed

+3433
-2419
lines changed

package-lock.json

Lines changed: 3346 additions & 2263 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,9 @@
4545
"@tauri-apps/plugin-autostart": "^2.3.0",
4646
"@tauri-apps/plugin-fs": "^2.3.0",
4747
"@tauri-apps/plugin-opener": "^2",
48+
"@tauri-apps/plugin-process": "^2.2.1",
4849
"@tauri-apps/plugin-shell": "^2.2.1",
50+
"@tauri-apps/plugin-updater": "^2.7.1",
4951
"class-variance-authority": "^0.7.1",
5052
"clsx": "^2.1.1",
5153
"cmdk": "^1.0.0",

src-tauri/Cargo.lock

Lines changed: 0 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src-tauri/Cargo.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,5 +29,4 @@ tauri-plugin-autostart = "2"
2929
tauri-plugin-single-instance = "2"
3030
serde = { version = "1", features = ["derive"] }
3131
serde_json = "1"
32-
tokio = { version = "1", features = ["time"] }
3332

src-tauri/capabilities/default.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
"permissions": [
77
"core:default",
88
"opener:default",
9+
"updater:default",
910
"autostart:allow-enable",
1011
"autostart:allow-disable",
1112
"autostart:allow-is-enabled",

src-tauri/src/lib.rs

Lines changed: 2 additions & 133 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
use tauri::{
22
menu::{Menu, MenuItem},
33
tray::{MouseButton, MouseButtonState, TrayIconBuilder, TrayIconEvent},
4-
Emitter, Manager, WindowEvent
4+
Manager, WindowEvent
55
};
6-
use tauri_plugin_updater::UpdaterExt;
76

87
// Learn more about Tauri commands at https://tauri.app/develop/calling-rust/
98
#[tauri::command]
@@ -22,135 +21,7 @@ fn show_window(window: tauri::Window) {
2221
let _ = window.set_focus();
2322
}
2423

25-
#[tauri::command]
26-
async fn check_for_updates(app: tauri::AppHandle) -> Result<Option<serde_json::Value>, String> {
27-
println!("开始检查更新...");
28-
println!("当前应用版本: {}", app.package_info().version);
29-
30-
let updater = match app.updater() {
31-
Ok(u) => {
32-
println!("更新器初始化成功");
33-
u
34-
},
35-
Err(e) => {
36-
println!("更新器初始化失败: {:?}", e);
37-
return Err(format!("更新器初始化失败: {:?}", e));
38-
}
39-
};
40-
41-
println!("开始检查新版本...");
42-
43-
// 添加重试逻辑
44-
let mut retry_count = 0;
45-
let max_retries = 3;
46-
47-
while retry_count < max_retries {
48-
match updater.check().await {
49-
Ok(update_opt) => {
50-
if let Some(update) = update_opt {
51-
println!("发现新版本!");
52-
println!("当前版本: {}", app.package_info().version);
53-
println!("新版本: {}", update.version);
54-
println!("更新说明: {}", update.body.as_deref().unwrap_or("无更新说明"));
55-
56-
let update_info = serde_json::json!({
57-
"version": update.version,
58-
"date": update.date.map(|d| d.to_string()).unwrap_or_else(|| "未知".to_string()),
59-
"body": update.body.as_deref().unwrap_or("无更新说明"),
60-
"download_url": update.download_url
61-
});
62-
63-
return Ok(Some(update_info));
64-
} else {
65-
println!("检查完成:当前已是最新版本");
66-
return Ok(None);
67-
}
68-
}
69-
Err(e) => {
70-
println!("检查更新失败 (尝试 {}/{}): {:?}", retry_count + 1, max_retries, e);
71-
if retry_count == max_retries - 1 {
72-
return Err(format!("检查更新失败: {:?}", e));
73-
}
74-
}
75-
}
76-
77-
retry_count += 1;
78-
if retry_count < max_retries {
79-
println!("等待 3 秒后重试...");
80-
tokio::time::sleep(tokio::time::Duration::from_secs(3)).await;
81-
}
82-
}
83-
84-
Err("检查更新失败".to_string())
85-
}
86-
87-
#[tauri::command]
88-
async fn download_and_install_update(app: tauri::AppHandle) -> Result<(), String> {
89-
println!("开始下载并安装更新...");
90-
91-
let updater = match app.updater() {
92-
Ok(u) => u,
93-
Err(e) => {
94-
return Err(format!("更新器初始化失败: {:?}", e));
95-
}
96-
};
97-
98-
match updater.check().await {
99-
Ok(Some(update)) => {
100-
println!("开始下载更新...");
101-
let mut downloaded = 0;
10224

103-
match update
104-
.download_and_install(
105-
|chunk_length, content_length| {
106-
downloaded += chunk_length;
107-
if let Some(total) = content_length {
108-
let progress = (downloaded as f64 / total as f64 * 100.0) as u64;
109-
println!("下载进度: {}% ({} / {} 字节)", progress, downloaded, total);
110-
111-
// 发送下载进度事件到前端
112-
if let Some(window) = app.get_webview_window("main") {
113-
let _ = window.emit("download-progress", serde_json::json!({
114-
"progress": progress,
115-
"downloaded": downloaded,
116-
"total": total
117-
}));
118-
}
119-
} else {
120-
println!("已下载: {} 字节", downloaded);
121-
}
122-
},
123-
|| {
124-
println!("下载完成,准备安装...");
125-
// 发送下载完成事件到前端
126-
if let Some(window) = app.get_webview_window("main") {
127-
let _ = window.emit("download-complete", ());
128-
}
129-
},
130-
)
131-
.await
132-
{
133-
Ok(_) => {
134-
println!("更新已安装完成,准备重启应用...");
135-
app.restart();
136-
// 注意:app.restart() 会终止当前进程,下面的代码不会执行
137-
#[allow(unreachable_code)]
138-
Ok(())
139-
}
140-
Err(e) => {
141-
println!("下载或安装更新失败: {:?}", e);
142-
Err(format!("下载或安装更新失败: {:?}", e))
143-
}
144-
}
145-
}
146-
Ok(None) => {
147-
Err("没有可用的更新".to_string())
148-
}
149-
Err(e) => {
150-
Err(format!("检查更新失败: {:?}", e))
151-
}
152-
}
153-
}
15425

15526
#[cfg_attr(mobile, tauri::mobile_entry_point)]
15627
pub fn run() {
@@ -253,9 +124,7 @@ pub fn run() {
253124
.invoke_handler(tauri::generate_handler![
254125
greet,
255126
hide_window,
256-
show_window,
257-
check_for_updates,
258-
download_and_install_update
127+
show_window
259128
])
260129
.run(tauri::generate_context!())
261130
.expect("error while running tauri application");

src/pages/Index.tsx

Lines changed: 82 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import { Search, Filter, Calendar, Tag, BarChart3, Plus, Edit2, Trash2, RefreshC
44
import { invoke } from '@tauri-apps/api/core';
55
import { getVersion } from '@tauri-apps/api/app';
66
import { listen } from '@tauri-apps/api/event';
7+
import { check, Update } from '@tauri-apps/plugin-updater';
8+
import { relaunch } from '@tauri-apps/plugin-process';
79

810
import { useProfile } from '../hooks/useProfile';
911
import { useProfileSQL } from '../hooks/useProfileSQL';
@@ -103,21 +105,8 @@ const Index = () => {
103105
};
104106
checkAutostart();
105107

106-
// 监听下载进度事件
107-
const unlistenProgress = listen('download-progress', (event: any) => {
108-
const { progress } = event.payload;
109-
setDownloadProgress(progress);
110-
});
111-
112-
// 监听下载完成事件
113-
const unlistenComplete = listen('download-complete', () => {
114-
setIsDownloading(false);
115-
showToast('success', t('updater.downloadComplete'));
116-
});
117-
118108
return () => {
119-
unlistenProgress.then(fn => fn());
120-
unlistenComplete.then(fn => fn());
109+
// 清理函数,如果有其他监听器可以在这里清理
121110
};
122111
}, [t]);
123112

@@ -347,13 +336,50 @@ const Index = () => {
347336
setUpdateInfo(null);
348337

349338
try {
350-
const result = await invoke('check_for_updates') as any;
339+
console.log('开始检查更新...');
340+
console.log('当前应用版本:', currentVersion);
351341

352-
if (result) {
353-
setUpdateInfo(result);
354-
showToast('success', t('updater.updateFound', { version: result.version }));
355-
} else {
356-
showToast('success', t('updater.upToDate'));
342+
// 添加重试逻辑
343+
let retryCount = 0;
344+
const maxRetries = 3;
345+
346+
while (retryCount < maxRetries) {
347+
try {
348+
const update = await check();
349+
350+
if (update) {
351+
console.log('发现新版本!');
352+
console.log('当前版本:', currentVersion);
353+
console.log('新版本:', update.version);
354+
console.log('更新说明:', update.body || '无更新说明');
355+
356+
const updateInfo = {
357+
version: update.version,
358+
date: update.date || '未知',
359+
body: update.body || '无更新说明',
360+
download_url: update.download
361+
};
362+
363+
setUpdateInfo(updateInfo);
364+
showToast('success', t('updater.updateFound', { version: update.version }));
365+
return;
366+
} else {
367+
console.log('检查完成:当前已是最新版本');
368+
showToast('success', t('updater.upToDate'));
369+
return;
370+
}
371+
} catch (error) {
372+
console.log(`检查更新失败 (尝试 ${retryCount + 1}/${maxRetries}):`, error);
373+
if (retryCount === maxRetries - 1) {
374+
throw error;
375+
}
376+
}
377+
378+
retryCount++;
379+
if (retryCount < maxRetries) {
380+
console.log('等待 3 秒后重试...');
381+
await new Promise(resolve => setTimeout(resolve, 3000));
382+
}
357383
}
358384
} catch (error) {
359385
console.error('检查更新失败:', error);
@@ -399,8 +425,43 @@ const Index = () => {
399425
setDownloadProgress(0);
400426

401427
try {
402-
await invoke('download_and_install_update');
428+
console.log('开始下载并安装更新...');
429+
430+
// 重新检查更新以获取 Update 对象
431+
const update = await check();
432+
433+
if (!update) {
434+
throw new Error('没有可用的更新');
435+
}
436+
437+
console.log('开始下载更新...');
438+
let downloaded = 0;
439+
440+
// 下载并安装更新
441+
await update.downloadAndInstall((event) => {
442+
switch (event.event) {
443+
case 'Started':
444+
console.log('开始下载,总大小:', event.data);
445+
break;
446+
case 'Progress':
447+
downloaded += event.data.chunkLength;
448+
console.log(`下载进度: 已下载 ${downloaded} 字节`);
449+
// 由于无法获取总大小,我们只能显示已下载的字节数
450+
setDownloadProgress(Math.min(downloaded / 1024 / 1024, 100)); // 假设最大100MB
451+
break;
452+
case 'Finished':
453+
console.log('下载完成,准备安装...');
454+
setIsDownloading(false);
455+
showToast('success', t('updater.downloadComplete'));
456+
break;
457+
}
458+
});
459+
460+
console.log('更新已安装完成,准备重启应用...');
403461
showToast('success', t('updater.updateSuccess'));
462+
463+
// 重启应用
464+
await relaunch();
404465
} catch (error) {
405466
console.error('下载安装更新失败:', error);
406467
showToast('error', `${t('updater.updateFailed')}: ${error instanceof Error ? error.message : t('common.unknown')}`);

0 commit comments

Comments
 (0)