# CutThenThink v3.0 - 轻量级语言重构设计 ## 项目背景 当前 Python + PyQt6 方案存在的问题: - 打包体积大(~214MB) - 启动速度慢 - 依赖 PyQt6 大型框架 - 用户需要安装 Python 环境 ## 新技术栈选择 ### 方案对比 | 方案 | 语言 | 框架 | 包体积 | 跨平台 | 开发效率 | 热更新 | |------|------|--------|--------|---------|---------|---------| | **Tauri** | Rust + Web 前端 | 系统WebView | ~5-10MB | ✅ | ⭐⭐⭐ | 快 | | **Electron** | Node.js + Web 前端 | Chromium 内嵌 | ~100-150MB | ✅ | ⭐⭐ | 快 | | **Flutter** | Dart + Skia 引擎 | 自绘引擎 | ~20MB | ✅ | ⭐ | 中等 | | **Go + Fyne** | Go + 自绘引擎 | 轻量 OpenGL | ~10-15MB | ✅ | ⭐ | 快 | ### 推荐方案:Tauri **理由:** 1. **极小体积**:5-10MB 完整应用 2. **原生性能**:Rust 后端,前端任选(HTML/React/Vue/Svelte) 3. **现代体验**:支持热更新 4. **活跃生态**:Tauri 1.0 已非常成熟 --- ## 架构设计 ``` ┌─────────────────────────────────────────────────────────┐ │ CutThenThink v3.0 │ ├─────────────────────────────────────────────────────────┤ │ │ │ ┌──────────────────────────────────────────────────┐ │ │ │ Rust Core (tauri backend) │ │ │ ├─────────────────────────────────────────────────┤ │ │ │ │ │ │ │ ┌────────────────────────────────────────────┐ │ │ │ │ │ Web Frontend (任选) │ │ │ │ │ │ - HTML/CSS/JS │ │ │ │ │ │ - React/Vue/Svelte │ │ │ │ │ │ - TailwindCSS │ │ │ │ │ └────────────────────────────────────┘ │ │ │ │ │ │ │ └─────────────────────────────────────────────┘ │ │ │ │ │ │ │ │ ┌──────────────────────────────────────────┐ │ │ │ │ │ System Integration (平台API) │ │ │ │ │ - 截图 API │ │ │ │ │ - 文件系统 │ │ │ │ │ - 剪贴板 │ │ │ │ │ - 全局快捷键 │ │ │ │ │ - 通知 │ │ │ │ └────────────────────────────────────┘ │ │ │ │ │ │ │ │ ┌──────────────────────────────────────────┐ │ │ │ │ │ External Services (可选) │ │ │ │ │ - RapidOCR (本地) │ │ │ │ │ - 云端 OCR API │ │ │ │ │ - 云存储 (S3/OSS/WebDAV) │ │ │ │ │ - AI 分类 API (可选) │ │ │ │ └────────────────────────────────────┘ │ │ │ │ │ │ │ └─────────────────────────────────────────────┘ │ │ │ │ │ └─────────────────────────────────────────────────────────┘ │ └──────────────────────────────────────────────────────────────┘ ``` --- ## 目录结构 ``` cutthenthink-v3/ ├── src-tauri/ # Rust 后端 (Tauri CLI) │ ├── src/ │ │ ├── main.rs # Rust 入口 │ │ ├── lib.rs # 核心库 │ │ ├── commands.rs # 命令处理 │ │ ├── screenshot.rs # 截图模块 │ │ ├── upload.rs # 上传模块 │ │ ├── database.rs # 数据库 (SQLite) │ │ └── ocr.rs # OCR 接口 │ ├── Cargo.toml # Rust 项目配置 │ ├── tauri.conf.json # Tauri 配置 │ └── build.rs # 构建脚本 │ ├── src-ui/ # Web 前端 │ ├── index.html # 入口 HTML │ ├── src/ │ │ ├── main.js # 主 JS │ │ ├── styles.css # 样式 │ │ ├── components/ # UI 组件 │ │ │ ├── screenshot.html │ │ │ ├── upload.html │ │ │ ├── browse.html │ │ │ └── settings.html │ │ ├── api/ │ │ │ ├── commands.js # Tauri API 调用 │ │ │ ├── database.js # 数据库操作 │ │ │ ├── screenshot.js # 截图功能 │ │ │ └── upload.js # 上传功能 │ └── assets/ # 静态资源 │ ├── icons/ │ └── screenshots/ │ ├── src-ocr-plugin/ # 可选的本地 OCR 插件 (Go) │ ├── main.go │ ├── ocr.go │ └── models/ # OCR 模型文件 │ └── docs/ ├── architecture.md # 本文档 ├── api.md # API 文档 └── development.md # 开发指南 ``` --- ## 核心功能模块 ### 1. 截图模块 (screenshot.rs) ```rust use tauri::command::screenshot::ScreenshotConfig; /// 截全屏 #[tauri::command] pub fn capture_fullscreen() -> Result { let screen = Window::current_monitor()?.ok_or("无法获取屏幕")?; // 调用平台截图 API match screen { Screen::CaptureFullscreen(path) => Ok(path.to_string_lossy()), _ => Err("未实现".to_string()), } } /// 区域截图 #[tauri::command] pub fn capture_region() -> Result { // 显示区域选择器 // 使用 Tauri 对话框 API Ok("region_capture".to_string()) } ``` ### 2. 上传模块 (upload.rs) ```rust use reqwest::blocking::Client; use serde_json::json; /// 上传文件 pub struct UploadConfig { pub provider: String, pub endpoint: String, pub api_key: Option, } #[tauri::command] pub fn upload_file(filepath: String) -> Result { let config = get_upload_config()?; let client = Client::new(); let form = multipart::Form::new() .text("file", filepath_to_name(&filepath)?) .text("provider", &config.provider); // 执行上传 let response = client.post(&config.endpoint, &body)?; // 返回 URL Ok(parse_upload_response(&response.text())?) } ``` ### 3. 数据库模块 (database.rs) ```rust use rusqlite::{Connection, Result as SQLResult}; use serde::{Serialize, Deserialize}; #[derive(Serialize, Deserialize)] pub struct Record { pub id: Option, pub filename: String, pub filepath: String, pub upload_url: Option, pub category: String, pub ocr_text: Option, pub created_at: String, pub uploaded_at: Option, pub file_size: i64, } impl Database { pub fn add_record(&self, record: &Record) -> SQLResult { self.conn.execute( "INSERT INTO records (filename, filepath, category, created_at, file_size) VALUES (?1, ?2, ?3, datetime('now'), ?4)", [&record.filename, &record.filepath, &record.category, &record.created_at, &record.file_size], )?; Ok(conn.last_insert_rowid()) } pub fn get_all_records(&self, limit: i64) -> SQLResult> { // 查询实现 } } ``` ### 4. 前端 API 绑定 (api/commands.js) ```javascript import { invoke } from '@tauri-apps/api/commands'; // 截图命令 export const captureFullscreen = async () => { const filepath = await invoke('capture_fullscreen'); return filepath; }; // 上传命令 export const uploadFile = async (filepath, config) => { const url = await invoke('upload_file', { filepath, provider: config.provider, endpoint: config.endpoint, apiKey: config.apiKey }); return url; }; // 数据库命令 export const getRecords = async () => { const records = await invoke('get_all_records', { limit: 100 }); return records; }; ``` ### 5. 前端 UI (components/screenshot.html) ```html
预览
``` --- ## Tauri 配置 (tauri.conf.json) ```json { "$schema": "https://schema.tauri.app/config/1.0.0", "build": { "beforeBuildCommand": "npm run build", "beforeDevCommand": "npm run dev", "devUrl": "http://localhost:3000", "frontendDist": "../src-ui/dist" }, "package": { "productName": "CutThenThink", "version": "3.0.0" }, "tauri": { "allowlist": { "all": false, "shell": { "all": false, "open": true } }, "bundle": { "identifier": "com.cutthenthink.app", "icon": [ "icons/128x128.png" ], "targets": ["all"] }, "windows": { "webviewInstallMode": "embed", "nsis": { "displayName": "CutThenThink", "installerIcon": "icons/icon.ico" } } } }, "plugins": { "shell": { "open": true } } } ``` --- ## 可选 OCR 插件 (Go) 使用 Go 编写独立的 OCR 插件,通过 IPC 或本地服务器通信: ```go package main import ( "github.com/tetratelabs/tesseract-go/tesseract" "github.com/genmo/invoices/invoices" ) type OCRResult struct { Text string Confidence float64 Error string } func Recognize(imagePath string) OCRResult { // 使用 RapidOCR 或 Tesseract // 通过本地 socket 或 HTTP 与主程序通信 return OCRResult{ Text: "识别的文字", Confidence: 0.95, Error: "", } } ``` --- ## 依赖清单 ### Rust 后端依赖 ```toml [dependencies] tauri = { version = "1.0", features = ["shell-open"] } serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" tokio = { version = "1", features = ["full"] } rusqlite = "0.3" reqwest = { version = "0.11", features = ["blocking", "multipart"] } chrono = { version = "0.4", features = ["serde"] } dirs = "2.0" ``` ### Web 前端依赖 ```json { "devDependencies": { "vite": "^4.0.0", "@tauri-apps/api": "^1.0.0" "tailwindcss": "^3.0.0", "react": "^18.0.0", "react-dom": "^18.0.0" } } ``` --- ## 构建与打包 ### 开发命令 ```bash # 前端开发 cd src-ui && npm run dev # Rust 后端开发 cd src-tauri && cargo tauri dev # 完整构建 npm run tauri build ``` ### 打包输出 | 平台 | 输出位置 | 说明 | |--------|---------|------| | Linux | `src-tauri/target/release/bundle/appimage` | AppImage 单文件 | | Windows | `src-tauri/target/release/bundle/msi` | MSI 安装包 | | macOS | `src-tauri/target/release/bundle/dmg` | DMG 磁盘镜像 | **预估体积**: - 基础应用:5-10MB - 包含 OCR 模型:+15-20MB --- ## 实施计划 ### Phase 1: 项目初始化 (1周) - [ ] 创建 Rust Tauri 项目骨架 - [ ] 设置前端项目 (Vite + React) - [ ] 配置构建工具链 - [ ] 基础 UI 框架 ### Phase 2: 核心功能 (2周) - [ ] Rust 后端:截图 API 集成 - [ ] Rust 后端:文件系统访问 - [ ] 前端:截图 UI 组件 - [ ] Rust 后端:SQLite 数据库实现 - [ ] 前端:记录列表和浏览 ### Phase 3: 上传功能 (1周) - [ ] Rust 后端:HTTP 上传模块 - [ ] 前端:上传配置界面 - [ ] 支持多种上传服务 ### Phase 4: OCR 集成 (1周) - [ ] Go OCR 插件基础框架 - [ ] RapidOCR 模型集成 - [ ] IPC 通信机制 - [ ] 前端:OCR 结果展示 ### Phase 5: 打包发布 (1周) - [ ] 各平台构建配置 - [ ] 图标和资源 - [ ] 代码签名 (Windows/macOS) - [ ] GitHub Actions 自动构建 - [ ] 安装包测试 --- ## 优势总结 | 特性 | Python 方案 | Tauri 方案 | |------|-----------|-----------| | 安装体积 | 需要 Python (~200MB+) | **单文件,无需运行时** | | 启动速度 | 较慢 | **极快(Rust 原生)** | | 内存占用 | 高 (~100MB+) | **低 (~20-30MB)** | | 更新机制 | 需要重新打包 | **支持热更新** | | 开发体验 | 框架限制 | **现代 Web 开发** | | 跨平台 | 依赖复杂 | **一次编译,多平台** | --- ## 参考 - **Tauri 文档**: https://tauri.app/ - **Tauri Examples**: https://github.com/tauri-apps/tauri/tree/dev/examples - **Rusqlite**: https://github.com/rusqlite/rusqlite - **RapidOCR**: https://github.com/RapidAI/RapidOCR --- *文档版本: v3.0* *创建日期: 2025-02-12* *技术栈: Tauri (Rust) + Web 前端*