From 0dca41bcf748ecc9bc02bbdc1ca943f36143e2bf Mon Sep 17 00:00:00 2001 From: SpencerLiang0114 Date: Mon, 25 May 2026 12:51:30 +0800 Subject: [PATCH] feat(sysinfo): return structured system info --- Cargo.lock | 1 + .../Cargo.toml | 1 + .../src/commands.rs | 32 +++++++++++++++++-- src/components/home/system-info-card.tsx | 21 ++++++------ src/services/cmds.ts | 12 ++++++- 5 files changed, 51 insertions(+), 16 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index aca138c9b..82127ddb8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7571,6 +7571,7 @@ dependencies = [ "deelevate", "libc", "parking_lot", + "serde", "sysinfo", "tauri", "tauri-plugin-clipboard-manager", diff --git a/crates/tauri-plugin-clash-verge-sysinfo/Cargo.toml b/crates/tauri-plugin-clash-verge-sysinfo/Cargo.toml index b294b0766..c1c489aaa 100644 --- a/crates/tauri-plugin-clash-verge-sysinfo/Cargo.toml +++ b/crates/tauri-plugin-clash-verge-sysinfo/Cargo.toml @@ -8,6 +8,7 @@ rust-version = "1.91" tauri = { workspace = true } tauri-plugin-clipboard-manager = { workspace = true } parking_lot = { workspace = true } +serde = { workspace = true, features = ["derive"] } # sysinfo 0.38.2 conflicts with dark-light # see https://github.com/GuillaumeGomez/sysinfo/issues/1623 sysinfo = { version = "0.39.2", features = ["network", "system"] } diff --git a/crates/tauri-plugin-clash-verge-sysinfo/src/commands.rs b/crates/tauri-plugin-clash-verge-sysinfo/src/commands.rs index 854dbb1f6..f59d8a426 100644 --- a/crates/tauri-plugin-clash-verge-sysinfo/src/commands.rs +++ b/crates/tauri-plugin-clash-verge-sysinfo/src/commands.rs @@ -1,13 +1,39 @@ use parking_lot::RwLock; +use serde::Serialize; use tauri::{AppHandle, Runtime, State, command}; use tauri_plugin_clipboard_manager::{ClipboardExt as _, Error}; use crate::Platform; -// TODO 迁移,让新的结构体允许通过 tauri command 正确使用 structure.field 方式获取信息 +#[derive(Serialize)] +pub struct SystemInfo { + pub system_name: String, + pub system_version: String, + pub system_kernel_version: String, + pub system_arch: String, + pub app_version: String, + pub app_core_mode: String, + pub app_is_admin: bool, +} + +impl From<&Platform> for SystemInfo { + fn from(platform: &Platform) -> Self { + Self { + system_name: platform.sysinfo.system_name.clone(), + system_version: platform.sysinfo.system_version.clone(), + system_kernel_version: platform.sysinfo.system_kernel_version.clone(), + system_arch: platform.sysinfo.system_arch.clone(), + app_version: platform.appinfo.app_version.clone(), + app_core_mode: platform.appinfo.app_core_mode.clone(), + app_is_admin: platform.appinfo.app_is_admin, + } + } +} + #[command] -pub fn get_system_info(state: State<'_, RwLock>) -> Result { - Ok(state.inner().read().to_string()) +pub fn get_system_info(state: State<'_, RwLock>) -> Result { + let platform = state.inner().read(); + Ok(SystemInfo::from(&*platform)) } /// 获取应用的运行时间(毫秒) diff --git a/src/components/home/system-info-card.tsx b/src/components/home/system-info-card.tsx index 8edf32005..4198ea88d 100644 --- a/src/components/home/system-info-card.tsx +++ b/src/components/home/system-info-card.tsx @@ -46,20 +46,17 @@ export const SystemInfoCard = () => { useEffect(() => { getSystemInfo() .then((info) => { - const lines = info.split('\n') - if (lines.length > 0) { - const sysName = lines[0].split(': ')[1] || '' - let sysVersion = lines[1].split(': ')[1] || '' + const sysName = info.system_name + let sysVersion = info.system_version - if ( - sysName && - sysVersion.toLowerCase().startsWith(sysName.toLowerCase()) - ) { - sysVersion = sysVersion.substring(sysName.length).trim() - } - - setOsInfo(`${sysName} ${sysVersion}`) + if ( + sysName && + sysVersion.toLowerCase().startsWith(sysName.toLowerCase()) + ) { + sysVersion = sysVersion.substring(sysName.length).trim() } + + setOsInfo(`${sysName} ${sysVersion}`) }) .catch(console.error) }, []) diff --git a/src/services/cmds.ts b/src/services/cmds.ts index dc18fb9f2..960aacdf5 100644 --- a/src/services/cmds.ts +++ b/src/services/cmds.ts @@ -404,8 +404,18 @@ export async function exportDiagnosticInfo() { return invoke('export_diagnostic_info') } +interface SystemInfo { + system_name: string + system_version: string + system_kernel_version: string + system_arch: string + app_version: string + app_core_mode: string + app_is_admin: boolean +} + export async function getSystemInfo() { - return invoke('get_system_info') + return invoke('get_system_info') } export async function copyIconFile(