first commit

This commit is contained in:
Cheney
2026-07-08 18:01:27 +08:00
commit 22ae3ac755
28 changed files with 9247 additions and 0 deletions
+113
View File
@@ -0,0 +1,113 @@
# 构建
在 WSL(Ubuntu)中构建,产物为 Android APK。桌面端可用于本地调试。
## 1. 一次性环境准备
### 1.1 基础工具(已具备可跳过)
- Node.js 18+、Rust 1.75+(`cargo`)、`rustup`。
- Android 交叉编译目标:
```bash
rustup target add aarch64-linux-android armv7-linux-androideabi \
i686-linux-android x86_64-linux-android
```
### 1.2 桌面调试依赖(仅本地跑 desktop 时需要)
```bash
sudo apt-get update
sudo apt-get install -y libgtk-3-dev libwebkit2gtk-4.1-dev \
libsoup-3.0-dev librsvg2-dev libjavascriptcoregtk-4.1-dev pkg-config
```
> AI 请求用 rustls,不依赖系统 OpenSSL。
### 1.3 Android SDK / NDK / JDK
```bash
sudo apt-get install -y openjdk-17-jdk
# 下载 commandline-tools 到 ~/android-sdk,然后:
export ANDROID_HOME=$HOME/android-sdk
export NDK_HOME=$ANDROID_HOME/ndk/26.1.10909125 # 版本以实际为准
sdkmanager "platform-tools" "platforms;android-34" \
"build-tools;34.0.0" "ndk;26.1.10909125"
```
建议把 `ANDROID_HOME`、`NDK_HOME`、`JAVA_HOME` 写入 `~/.bashrc`。
### 1.4 Tauri CLI
```bash
cargo install tauri-cli --version "^2.0"
# 或使用项目本地:npm i 后用 npm run tauri
```
## 2. 安装依赖
```bash
cd /mnt/d/workbench/tauri-android-invoice
npm install
```
## 3. 测试
```bash
# 前端纯逻辑测试(autofill)
npm test
# Rust 逻辑测试(db + ai 解析)
cd src-tauri && cargo test --lib
```
当前用例:前端 1-1~1-3,Rust 2-1~2-5(数据库)、3-1~3-3(AI 解析)。
## 4. 桌面调试(可选)
```bash
npm run tauri dev
```
## 5. 构建 Android APK
```bash
# 首次初始化 Android 工程(生成 src-tauri/gen/android)
npm run tauri android init
# 构建 APK(debug)
npm run tauri android build --debug
# 或 release(需配置签名)
npm run tauri android build
```
产物路径:
```
src-tauri/gen/android/app/build/outputs/apk/
```
## 6. 生成签名密钥(release 必需)
debug 构建自动用调试签名,release 必须自备 keystore。
### 6.1 生成 keystore
用 JDK 自带的 `keytool` 生成(有效期约 27 年):
```bash
keytool -genkeypair -v \
-keystore ~/invoice-release.jks \
-alias invoice \
-keyalg RSA -keysize 2048 -validity 10000
```
按提示设置 keystore 口令、密钥口令与证书信息,妥善保管该文件与口令(丢失将无法更新已上架应用)。
### 6.2 配置签名给 Gradle
在 `src-tauri/gen/android/`(执行过 `android init` 后生成)创建 `keystore.properties`:
```properties
storeFile=/home/<user>/invoice-release.jks
storePassword=你的keystore口令
keyAlias=invoice
keyPassword=你的密钥口令
```
确认 `src-tauri/gen/android/app/build.gradle.kts` 读取该文件并应用到 `release` signingConfig(Tauri 模板通常已生成,如无则手动补充)。
> 安全提示:`keystore.properties` 与 `*.jks` 含机密,务必加入 `.gitignore`,不要提交。
### 6.3 构建已签名 release
```bash
npm run tauri android build # 生成签名后的 release APK/AAB
```
## 7. 安装到设备
```bash
adb install -r <上面生成的 apk 路径>
```
## 8. 常见问题
- 缺少 `gobject-2.0`/`openssl.pc`:补装 1.2 的桌面依赖(仅桌面构建需要)。
- 扫码权限报 `barcode-scanner:allow-scan not found`:该权限只在移动端,已放入 `src-tauri/capabilities/mobile.json`,桌面构建不加载。
- 图标缺失导致 `generate_context!` 失败:确认 `src-tauri/icons/icon.png` 存在,可用 `npm run tauri icon <源图>` 生成全套。
- NDK 找不到:检查 `NDK_HOME` 是否指向真实存在的版本目录。
+89
View File
@@ -0,0 +1,89 @@
# 设计
## 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 的限制处理方式。
+17
View File
@@ -0,0 +1,17 @@
## 核心功能
扫描小票上的二维码,通常会打开一个 h5 页面,然后可以填写关键信息,提交后可以获取到发票。
- 本 App 扫描二维码后,展示 h5 页面。就像一个自定义浏览器一样。
- 每种小票的 h5 页面布局不同,需求信息不同,需要基于大模型 AI 识别,然后自动填写。
- 关键信息需提前录入,包括发票的抬头和税号等信息。也包含 Email 信息,方便通过邮箱获取发票。
- 预置关键信息可以有多条,但是一条为默认。
## 技术约束
- 使用 tauri 框架,编译为 Android App
- 使用 wsl 中的工具链