From a952ebcb5ff3da647e4b4b74d31ec65dbf50bc53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E8=88=AA=E5=AE=87?= <3364451258@qq.com> Date: Wed, 17 Jun 2026 00:19:39 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20Tauri=20commands=20=E2=80=94=20encode/e?= =?UTF-8?q?xport/history=20CRUD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gui/src/lib.rs | 115 +++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 112 insertions(+), 3 deletions(-) diff --git a/gui/src/lib.rs b/gui/src/lib.rs index b73c6d0..3e4daa1 100644 --- a/gui/src/lib.rs +++ b/gui/src/lib.rs @@ -1,6 +1,106 @@ +use qr_core::qr::{QrCode, QrConfig, VersionMode}; +use qr_core::version::EcLevel; +use serde::{Deserialize, Serialize}; +use std::sync::Mutex; + +/// QR 编码响应 +#[derive(Debug, Serialize, Clone)] +struct QrResponse { + svg: String, + version: u8, + size: u8, + mask: u8, +} + +/// 历史记录条目 +#[derive(Debug, Serialize, Deserialize, Clone)] +struct HistoryEntry { + id: String, + mode: String, + content: String, + timestamp: u64, +} + +/// 应用状态 +struct AppState { + history: Mutex>, +} + +/// 编码 QR 码,返回 SVG + 元信息 #[tauri::command] -fn greet(name: &str) -> String { - format!("你好, {}! QRGen GUI 已就绪。", name) +fn encode_qr(text: String, level: String, margin: u8) -> Result { + let ec_level = match level.to_uppercase().as_str() { + "L" => EcLevel::L, + "M" => EcLevel::M, + "Q" => EcLevel::Q, + "H" => EcLevel::H, + _ => return Err(format!("无效纠错级别: {}", level)), + }; + + let config = QrConfig { + level: ec_level, + version: VersionMode::Auto, + margin, + }; + + let qr = QrCode::encode(&text, config).map_err(|e| format!("编码失败: {}", e))?; + + let svg = qr.to_svg(); + + Ok(QrResponse { + svg, + version: qr.version.0, + size: qr.size(), + mask: qr.mask, + }) +} + +/// 导出 PNG bytes +#[tauri::command] +fn export_png(text: String, level: String, margin: u8, module_size: u8) -> Result, String> { + let ec_level = match level.to_uppercase().as_str() { + "L" => EcLevel::L, + "M" => EcLevel::M, + "Q" => EcLevel::Q, + "H" => EcLevel::H, + _ => return Err(format!("无效纠错级别: {}", level)), + }; + + let config = QrConfig { + level: ec_level, + version: VersionMode::Auto, + margin, + }; + + let qr = QrCode::encode(&text, config).map_err(|e| format!("编码失败: {}", e))?; + + Ok(qr.to_png_bytes(module_size)) +} + +/// 保存历史记录条目 +#[tauri::command] +fn save_history(state: tauri::State, entry: HistoryEntry) -> Result<(), String> { + let mut history = state.history.lock().map_err(|e| e.to_string())?; + history.push(entry); + if history.len() > 50 { + history.remove(0); + } + Ok(()) +} + +/// 加载全部历史记录 +#[tauri::command] +fn load_history(state: tauri::State) -> Result, String> { + let history = state.history.lock().map_err(|e| e.to_string())?; + Ok(history.clone()) +} + +/// 清空历史记录 +#[tauri::command] +fn clear_history(state: tauri::State) -> Result<(), String> { + let mut history = state.history.lock().map_err(|e| e.to_string())?; + history.clear(); + Ok(()) } #[cfg_attr(mobile, tauri::mobile_entry_point)] @@ -9,7 +109,16 @@ pub fn run() { .plugin(tauri_plugin_store::Builder::new().build()) .plugin(tauri_plugin_dialog::init()) .plugin(tauri_plugin_clipboard_manager::init()) - .invoke_handler(tauri::generate_handler![greet]) + .manage(AppState { + history: Mutex::new(Vec::new()), + }) + .invoke_handler(tauri::generate_handler![ + encode_qr, + export_png, + save_history, + load_history, + clear_history, + ]) .run(tauri::generate_context!()) .expect("启动 QRGen GUI 失败"); }