# 设计 ## 1. 概述 本 App 是一个"发票助手":扫描小票二维码 -> 打开对应 h5 页面 -> 用 AI 识别页面表单 -> 自动填入预置的开票信息 -> 用户确认提交获取发票。 > 说明:需求中的"trauri"按 **Tauri** 框架理解;AI 采用**硅基流动云端大模型 API**(cloud.siliconflow.cn,需联网)。 ## 2. 技术选型 - 框架:Tauri 2.x(编译 Android APK)。 - 前端:Vue 3 + Vite(轻量、易写表单页)。 - 二维码扫描:`tauri-plugin-barcode-scanner`(调用相机)。 - h5 展示:Tauri WebviewWindow / 内嵌 iframe 加载扫描得到的 URL。 - 本地存储:Rust 侧 `rusqlite`(bundled,内置 SQLite)保存预置开票信息。 - AI 调用:Rust 侧 `command` 转发到硅基流动 HTTP 接口(OpenAI 兼容协议),密钥不暴露在前端;`reqwest` 使用 `rustls-tls`,免系统 OpenSSL 依赖。 eqwest 使用 ustls-tls 免系统 OpenSSL 依赖。 - 权限:桌面权限在 capabilities/default.json,扫码权限单独放 capabilities/mobile.json(限定 android/iOS 平台)。 - 工具链:在 WSL 中执行 Rust + Android NDK/SDK 构建。 ## 3. 功能模块 ### 3.1 开票信息管理 - 字段:抬头、税号、Email、(可选)地址、电话、开户行、账号。 - 支持多条,标记 1 条为默认(`is_default=1`)。 - 界面:列表 + 增/删/改 + 设为默认。 ### 3.2 二维码扫描 - 点击"扫一扫"调用相机识别二维码,得到 URL。 - 得到 URL 后打开内置 WebView 展示 h5 页面。 ### 3.3 AI 识别与自动填充 1. 页面加载完成后,前端注入脚本抓取表单 DOM(各 input/select 的 label、name、placeholder)。 2. 将 DOM 摘要 + 默认开票信息通过 Rust command 发送给大模型。 3. 大模型返回"字段选择器 -> 应填值"的映射(JSON)。 4. 前端按映射用注入脚本回填表单。 5. 用户核对后手动点提交。 ## 4. 数据模型 ``` invoice_info( id INTEGER PK, title TEXT, -- 抬头 tax_no TEXT, -- 税号 email TEXT, address TEXT, phone TEXT, bank_name TEXT, bank_account TEXT, is_default INTEGER -- 1=默认,仅一条 ) ``` ## 5. 核心流程 ```mermaid flowchart TD A[打开 App] --> B[扫描二维码] B --> C[获取 URL] C --> D[WebView 加载 h5 页面] D --> E[抓取表单 DOM] E --> F[DOM + 默认开票信息 发送大模型] F --> G[返回字段映射 JSON] G --> H[注入脚本回填表单] H --> I[用户核对并提交] I --> J[获取发票] ``` ## 6. 关键接口(Tauri command) - `list_invoice_info()` / `save_invoice_info()` / `delete_invoice_info()` / `set_default(id)`:信息 CRUD。 - `ai_map_fields(dom_summary, info)`:调用大模型,返回字段映射 JSON。 ## 7. AI 接口配置 - 服务商:硅基流动,OpenAI 兼容 `chat/completions` 接口。 - Base URL:`https://api.siliconflow.cn/v1` - 密钥:`sk-drqdzsdvsnqxalvwjggsexyowbertkxrgpqyeqilhkkiqemn`(当前硬编码在 Rust 层)。 - 为便于未来更换服务商,Rust 侧用一组常量集中管理: ```rust // AI 服务配置:更换服务商时只改此处 const AI_BASE_URL: &str = "https://api.siliconflow.cn/v1"; const AI_API_KEY: &str = "sk-drqdzsdvsnqxalvwjggsexyowbertkxrgpqyeqilhkkiqemn"; const AI_MODEL: &str = "Qwen/Qwen2.5-7B-Instruct"; // 具体模型待定 ``` - 调用统一走 `ai_map_fields` command,内部封装请求,切换服务商仅需改常量(及必要的请求格式适配)。 > 安全提示:密钥硬编码会被打包进 APK,存在泄露风险,仅作当前阶段方案;后续建议改为服务端代理或运行时配置。 ## 8. 待确认 - 使用的具体模型名称(影响识别效果与费用)。 - 是否需要邮箱自动接收发票(仅填 Email 还是集成收件)。 - h5 页面跨域抓取 DOM 的限制处理方式。