From 72b2d5bdfe7341fdb448073264524f0f8e0851b8 Mon Sep 17 00:00:00 2001 From: Yuhang Wu Date: Tue, 25 Aug 2026 11:05:09 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E9=87=8D=E6=9E=84=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E9=80=BB=E8=BE=91=EF=BC=8C=E6=96=B0=E5=A2=9E=E5=8F=AF?= =?UTF-8?q?=E8=A7=86=E5=8C=96=E6=9B=B4=E6=96=B0=E5=BC=B9=E7=AA=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 新增tauri-plugin-prevent-default插件,区分开发/生产模式拦截默认事件 2. 重构updater工具函数,拆分检查与更新流程,新增进度状态管理 3. 新增UpdateModal更新弹窗组件,支持markdown格式更新说明与下载进度展示 4. 全局注册新增的naive-ui组件与自定义更新弹窗 5. 新增markdown-it依赖 6. 替换原有弹窗逻辑,将更新流程交由弹窗组件处理 --- package.json | 3 +- pnpm-lock.yaml | 50 +++++++ src-tauri/Cargo.lock | 45 +++++++ src-tauri/Cargo.toml | 1 + src-tauri/src/lib.rs | 15 +++ src/App.vue | 22 ++- src/components/UpdateModal.vue | 238 +++++++++++++++++++++++++++++++++ src/types/components.d.ts | 3 + src/types/markdown-it.d.ts | 23 ++++ src/utils/updater.ts | 159 ++++++++++++++++------ src/views/setting/About.vue | 6 +- 11 files changed, 511 insertions(+), 54 deletions(-) create mode 100644 src/components/UpdateModal.vue create mode 100644 src/types/markdown-it.d.ts diff --git a/package.json b/package.json index 0c76019..c5bfa2a 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "stealthreader", "private": true, - "version": "0.3.1", + "version": "0.3.0", "type": "module", "scripts": { "dev": "vite", @@ -18,6 +18,7 @@ "@tauri-apps/plugin-updater": "^2.10.1", "axios": "^1.19.0", "dayjs": "^1.11.21", + "markdown-it": "^15.0.0", "naive-ui": "^2.45.0", "pinia": "^4.0.3", "pinia-plugin-persistedstate": "^4.7.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fa80a65..ef856c1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -32,6 +32,9 @@ importers: dayjs: specifier: ^1.11.21 version: 1.11.23 + markdown-it: + specifier: ^15.0.0 + version: 15.0.0 naive-ui: specifier: ^2.45.0 version: 2.45.0(vue@3.5.41(typescript@5.6.3)) @@ -586,6 +589,9 @@ packages: alien-signals@3.2.1: resolution: {integrity: sha512-I8FjmltrfnDFoZedi5CG8DghVYNhzb/Ijluz7tCSJH0xpd0484Kowhbb1XDYOxfJpU1p5wnM2X54dA+IfGyD1g==} + argparse@3.0.0: + resolution: {integrity: sha512-BOp5NMrHqKxmq/OLr+clzzrRxgOKSLkcjmkWuChp7Irqwn4s74WjOBPIgWfA/HMcBnVkZ5XEuf9uUqzlpfCQ6A==} + ast-kit@2.1.2: resolution: {integrity: sha512-cl76xfBQM6pztbrFWRnxbrDm9EOqDr1BF6+qQnnDZG2Co2LjyUktkN9GTJfBAfdae+DbT2nJf2nCGAdDDN7W2g==} engines: {node: '>=20.18.0'} @@ -679,6 +685,10 @@ packages: resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} engines: {node: '>=0.12'} + entities@8.0.0: + resolution: {integrity: sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==} + engines: {node: '>=20.19.0'} + es-define-property@1.0.1: resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} engines: {node: '>= 0.4'} @@ -874,6 +884,9 @@ packages: resolution: {integrity: sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==} engines: {node: '>= 12.0.0'} + linkify-it@6.1.0: + resolution: {integrity: sha512-wJ/TwpSDTLepCrQoYWYIExIKg5Zchex2Nn5yk2mFnB+6PtdkHtyLx742md9csRjjOnGkKIS/RrbY7l8D6gT9Vw==} + local-pkg@1.2.1: resolution: {integrity: sha512-++gUqRDEvcnN6Zhqrr+y/CkVEHhlrR96vZn3nZZPYzMcBUyBtTKzB9NadClFIsIVSsu+3i9tfk/erqy9kAmt7Q==} engines: {node: '>=14'} @@ -894,10 +907,17 @@ packages: magic-string@1.2.0: resolution: {integrity: sha512-ptco+HFxTLgjafSLim2LojBSwfg5feBjd+SqyiwdGkzC38UPdZy3zgrHMI2CoTf5fJL38tbHMYWVzIH8BxGqJw==} + markdown-it@15.0.0: + resolution: {integrity: sha512-Lf8ajvVNdRpzSNB4VegxNy7gjs8gU35l4b4+ET49LrQC5PKYwLZ72u60LeJ9gv3qiaesuYjJWCyVeQmv/QWKQw==} + hasBin: true + math-intrinsics@1.1.0: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} + mdurl@2.1.0: + resolution: {integrity: sha512-1+HBaOx0zi/dQWht8rNv9MYf9qqpqL/kxI0hXImU6Y547zM6Sni8BQibt7ifgMcYtQg41ao3Ivd6cnSM86inpg==} + mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} @@ -990,6 +1010,10 @@ packages: resolution: {integrity: sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==} engines: {node: '>=10'} + punycode.js@2.3.1: + resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} + engines: {node: '>=6'} + quansync@0.2.11: resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} @@ -1032,6 +1056,9 @@ packages: engines: {node: '>=14.17'} hasBin: true + uc.micro@3.0.0: + resolution: {integrity: sha512-U3PppEkleoTnIfi8BozMx3yju3qc/L6SwqWo2Sw+54PX+PX0q9I+r1Um5HCmqD7n9VDX5/v3vQH/AjA6deDdtw==} + ufo@1.6.4: resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==} @@ -1616,6 +1643,8 @@ snapshots: alien-signals@3.2.1: {} + argparse@3.0.0: {} + ast-kit@2.1.2: dependencies: '@babel/parser': 7.29.8 @@ -1706,6 +1735,8 @@ snapshots: entities@7.0.1: {} + entities@8.0.0: {} + es-define-property@1.0.1: {} es-errors@1.3.0: {} @@ -1860,6 +1891,10 @@ snapshots: lightningcss-win32-arm64-msvc: 1.33.0 lightningcss-win32-x64-msvc: 1.33.0 + linkify-it@6.1.0: + dependencies: + uc.micro: 3.0.0 + local-pkg@1.2.1: dependencies: mlly: 1.8.2 @@ -1882,8 +1917,19 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 + markdown-it@15.0.0: + dependencies: + argparse: 3.0.0 + entities: 8.0.0 + linkify-it: 6.1.0 + mdurl: 2.1.0 + punycode.js: 2.3.1 + uc.micro: 3.0.0 + math-intrinsics@1.1.0: {} + mdurl@2.1.0: {} + mime-db@1.52.0: {} mime-types@2.1.35: @@ -1976,6 +2022,8 @@ snapshots: proxy-from-env@2.1.0: {} + punycode.js@2.3.1: {} + quansync@0.2.11: {} readdirp@5.1.1: {} @@ -2027,6 +2075,8 @@ snapshots: typescript@5.6.3: {} + uc.micro@3.0.0: {} + ufo@1.6.4: {} undici-types@8.3.0: {} diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index b58fdbb..7995d3b 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -2052,6 +2052,15 @@ dependencies = [ "once_cell", ] +[[package]] +name = "itertools" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b4baf93f58d4425749ca49a51c50ebab072c5df6994d08fed93541c331481dc" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.18" @@ -4076,6 +4085,7 @@ dependencies = [ "tauri-helper", "tauri-plugin-dialog", "tauri-plugin-opener", + "tauri-plugin-prevent-default", "tauri-plugin-process", "tauri-plugin-store", "tauri-plugin-updater", @@ -4122,6 +4132,27 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" +[[package]] +name = "strum" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9628de9b8791db39ceda2b119bbe13134770b56c138ec1d3af810d045c04f9bd" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab85eea0270ee17587ed4156089e10b9e6880ee688791d45a905f5b1ca36f664" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.119", +] + [[package]] name = "subtle" version = "2.6.1" @@ -4480,6 +4511,20 @@ dependencies = [ "zbus", ] +[[package]] +name = "tauri-plugin-prevent-default" +version = "5.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "674bac5c9831f4ca7ae42840768ac968b76353dcbe30bb0aad149c56f0be1389" +dependencies = [ + "bitflags 2.13.1", + "itertools", + "serde", + "strum", + "tauri", + "thiserror 2.0.20", +] + [[package]] name = "tauri-plugin-process" version = "2.3.1" diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 87966bd..27f3fca 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -41,3 +41,4 @@ regex = "1.13.1" chardetng = "1.0.0" tauri-plugin-updater = "2.10.1" tauri-plugin-process = "2.3.1" +tauri-plugin-prevent-default = "5.0.2" diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 8c052ae..5c5325e 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -6,6 +6,8 @@ use commands::book::*; use services::db::init_pool; use tauri::Manager; +use tauri_plugin_prevent_default::Flags; + #[cfg_attr(mobile, tauri::mobile_entry_point)] pub fn run() { tauri::Builder::default() @@ -13,6 +15,7 @@ pub fn run() { .plugin(tauri_plugin_dialog::init()) // 对话框插件 .plugin(tauri_plugin_updater::Builder::new().build()) // 更新插件 .plugin(tauri_plugin_process::init()) // 进程插件(更新后重启) + .plugin(prevent_default()) .setup(|app| { let pool = tauri::async_runtime::block_on(async { init_pool(app.handle()) @@ -28,3 +31,15 @@ pub fn run() { .run(tauri::generate_context!()) .expect("error while running tauri application"); } + +// 开发模式: 保留DevTools和Reload +#[cfg(debug_assertions)] +fn prevent_default() -> tauri::plugin::TauriPlugin { + tauri_plugin_prevent_default::Builder::new().with_flags(Flags::all().difference(Flags::DEV_TOOLS | Flags::RELOAD)).build() +} + +// 生产模式: 阻止所有默认事件 +#[cfg(not(debug_assertions))] +fn prevent_default() -> tauri::plugin::TauriPlugin { + tauri_plugin_prevent_default::init() +} \ No newline at end of file diff --git a/src/App.vue b/src/App.vue index 262c44e..7b3c743 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,14 +1,13 @@