tauri-android-tax/doc/设计.md
2026-07-08 18:01:27 +08:00

4.0 KiB
Raw Blame History

设计

1. 概述

本 App 是一个"发票助手":扫描小票二维码 -> 打开对应 h5 页面 -> 用 AI 识别页面表单 -> 自动填入预置的开票信息 -> 用户确认提交获取发票。

说明:需求中的"trauri"按 Tauri 框架理解AI 采用硅基流动云端大模型 APIcloud.siliconflow.cn需联网

2. 技术选型

  • 框架Tauri 2.x编译 Android APK
  • 前端Vue 3 + Vite轻量、易写表单页
  • 二维码扫描:tauri-plugin-barcode-scanner(调用相机)。
  • h5 展示Tauri WebviewWindow / 内嵌 iframe 加载扫描得到的 URL。
  • 本地存储Rust 侧 rusqlitebundled内置 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. 核心流程

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 URLhttps://api.siliconflow.cn/v1
    • 密钥:sk-drqdzsdvsnqxalvwjggsexyowbertkxrgpqyeqilhkkiqemn(当前硬编码在 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 的限制处理方式。