Initial project import
This commit is contained in:
@@ -0,0 +1,243 @@
|
||||
# 记之项目交接档案
|
||||
|
||||
生成时间:2026-07-23
|
||||
项目路径:`C:\Users\nanxun\Documents\dsworkspace\jizhang`
|
||||
|
||||
## 1. 项目概况
|
||||
|
||||
这是一个记账 App 项目,当前品牌名为“记之”。项目包含:
|
||||
|
||||
- Flutter 客户端:`frontend`
|
||||
- Android 原生能力:`frontend/android/app/src/main/kotlin/com/nx/miaoji`
|
||||
- .NET 后端:`backend`
|
||||
- 当前内测服务地址:`https://lt.frp-say.com:38012`
|
||||
- 当前内测包名:`com.nx.miaoji.internal`
|
||||
- 正式生产包名:`com.nx.miaoji`
|
||||
|
||||
当前测试主线集中在:AI 记账、截屏/OCR 记账、无障碍/通知智能识别、游客离线、本地数据安全、更新检测和深色模式。
|
||||
|
||||
## 2. 当前最近版本
|
||||
|
||||
最近成功构建版本:
|
||||
|
||||
```text
|
||||
包名:com.nx.miaoji.internal
|
||||
显示名称:记之·内测
|
||||
显示版本号:1.2.5-internal
|
||||
构建版本号:132
|
||||
APK 路径:C:\Users\nanxun\Documents\dsworkspace\jizhang\release\JiZhi-1.2.5-internal-132.apk
|
||||
APK SHA-256:2BE1DF66A92FC2D35F41197CDEEEC3240B568EFADE3FCA7A5442DC914AFC5316
|
||||
签名证书 SHA-256:dc625141f914c86e30001a2c6187eb4a73babcd62e739d4b053f1fc7e93d3e6c
|
||||
```
|
||||
|
||||
对应更新说明:
|
||||
|
||||
```text
|
||||
C:\Users\nanxun\Documents\dsworkspace\jizhang\release-notes\JiZhi-1.2.5-internal-132.md
|
||||
```
|
||||
|
||||
ADB 当时未发现在线设备,所以没有自动覆盖安装。
|
||||
|
||||
## 3. 最近已实现重点
|
||||
|
||||
### 3.1 无障碍支付识别与本地 OCR
|
||||
|
||||
最近一轮实现目标:修复微信/支付宝红包、支付去重和识别时间问题。
|
||||
|
||||
主要实现点:
|
||||
|
||||
- 支付流程状态支持 `payment`、`transfer`、`red_packet_send`。
|
||||
- 微信、支付宝红包资金变化支持:
|
||||
- 发红包:支出,默认分类提示 `人情`
|
||||
- 红包到账:收入,默认分类提示 `红包`
|
||||
- 红包退回:收入,默认分类提示 `红包`
|
||||
- 普通红包消息、未领取红包、他人领取消息不自动入账
|
||||
- 微信支付结果页如果缺金额,在严格证据成立时使用付款前唯一金额入账。
|
||||
- 支付宝成功页刷新、返回重进、通知和 OCR 同时到达时合并为同一个候选,降低重复入账。
|
||||
- 连续两笔真实相同金额交易仍通过新提交动作生成新流程 ID,不会被错误合并。
|
||||
- 本地 OCR 图片只在内存中处理,不保存原图,不上传。
|
||||
- 诊断信息新增:流程类型、金额来源、结果页指纹、拒绝原因等。
|
||||
|
||||
关键文件:
|
||||
|
||||
```text
|
||||
frontend/android/app/src/main/kotlin/com/nx/miaoji/PaymentParser.kt
|
||||
frontend/android/app/src/main/kotlin/com/nx/miaoji/LocalPaymentOcr.kt
|
||||
frontend/android/app/src/main/kotlin/com/nx/miaoji/ScreenshotAccessibilityService.kt
|
||||
frontend/android/app/src/main/kotlin/com/nx/miaoji/RecognitionDiagnostics.kt
|
||||
frontend/android/app/src/main/kotlin/com/nx/miaoji/RecognitionStore.kt
|
||||
frontend/lib/shared/services/screenshot_channel.dart
|
||||
frontend/lib/shared/services/recognition_import_service.dart
|
||||
frontend/lib/features/settings/screenshot_settings_page.dart
|
||||
```
|
||||
|
||||
### 3.2 时间修复
|
||||
|
||||
用户反馈无障碍入账时间显示成 1970 或 14 点,实际应为上海时间 22 点。
|
||||
|
||||
已做修复:
|
||||
|
||||
- 后端 EF 读取 MySQL `DateTime` 时统一恢复 `DateTimeKind.Utc`。
|
||||
- 后端 JSON 输出 UTC 时间时应稳定带 `Z`。
|
||||
- Flutter 新增旧格式兼容:无时区字符串按 UTC 解释,再转换为上海时间显示。
|
||||
- 不迁移数据库已有值,已有 `14:xx` UTC 值修复后显示为上海时间 `22:xx`。
|
||||
|
||||
关键文件:
|
||||
|
||||
```text
|
||||
backend/MiaoJiZhang.Infrastructure/Persistence/AppDbContext.cs
|
||||
frontend/lib/shared/services/shanghai_time.dart
|
||||
frontend/test/theme_and_time_test.dart
|
||||
```
|
||||
|
||||
### 3.3 更新检测
|
||||
|
||||
已接入 VersionFlow:
|
||||
|
||||
```text
|
||||
更新接口根地址:https://version.nxsir.cn
|
||||
接口路径:/api/client/v1/update
|
||||
Android/iOS AppKey:已配置在项目中,但交接时不要外传到公开渠道
|
||||
Internal 渠道:beta
|
||||
Production 渠道:stable
|
||||
```
|
||||
|
||||
功能点:
|
||||
|
||||
- 启动后自动检查一次。
|
||||
- “我的”页面支持手动检查更新。
|
||||
- 非强制更新支持忽略版本。
|
||||
- 强制更新阻止继续使用。
|
||||
- Android Internal 支持前台下载 APK、SHA-256 校验、包名/版本/签名校验和安装。
|
||||
- Android Production 和 iOS 走外链,不内置 APK 自更新安装权限。
|
||||
|
||||
### 3.4 内测环境
|
||||
|
||||
当前约定:
|
||||
|
||||
- 只构建 `com.nx.miaoji.internal` 内测包。
|
||||
- Internal 注入:
|
||||
|
||||
```text
|
||||
INTERNAL_BUILD=true
|
||||
API_BASE_URL=https://lt.frp-say.com:38012
|
||||
APP_VERSION=20260722-132
|
||||
```
|
||||
|
||||
- 之前误装过正式包 `com.nx.miaoji`,测试阶段应优先使用 `com.nx.miaoji.internal`。
|
||||
- 后端应监听 `127.0.0.1:3000`,由 FRP 映射到 `https://lt.frp-say.com:38012`。
|
||||
|
||||
## 4. 已完成过的重要功能方向
|
||||
|
||||
这些内容在本会话中多轮推进过,后续 AI 需要沿着现有实现继续,不要重做:
|
||||
|
||||
- App 改名为“记之”。
|
||||
- 正式包名锁定 `com.nx.miaoji`,Internal 包名 `com.nx.miaoji.internal`。
|
||||
- 正式备案用 Release Key 已生成过,Debug MD5 不用于备案。
|
||||
- 图标资源已换成用户提供的黑白记事本/笔图标方向。
|
||||
- AI Agent 已从正则意图迁移到工具调用方向,收入/支出类型不能硬编码为支出。
|
||||
- AI 查询应读取账本实时数据,不凭空回答金额。
|
||||
- 截屏记账走一次性截图/授权,不保留长期 MediaProjection。
|
||||
- 磁贴截图不应强制依赖无障碍;无障碍可用则静默,否则走一次性授权。
|
||||
- 音量键快捷触发已放弃,系统音量键应恢复原生调音量。
|
||||
- 游客模式应能离线记账、统计、预算和导出;游客不能使用 AI。
|
||||
- AI 权限支持按用户关闭,关闭后所有 AI 入口不可见。
|
||||
- 深色模式已加入三态:跟随系统、浅色、深色。
|
||||
- 智能识别包含无障碍事件识别、通知识别、AI 截图补全三个开关。
|
||||
|
||||
## 5. 当前验证结果
|
||||
|
||||
最近一次验证结果:
|
||||
|
||||
```text
|
||||
Android 单元测试:通过
|
||||
Flutter theme_and_time_test:通过
|
||||
后端 dotnet build:通过,0 warning / 0 error
|
||||
Flutter analyze:无 error/warning,剩余 82 条 info 级既有风格提示
|
||||
Android Internal Release 构建:通过
|
||||
```
|
||||
|
||||
未完成验证:
|
||||
|
||||
- 后端集成测试依赖 Docker Desktop / Docker Linux Engine,当时 Docker 未启动,无法跑完。
|
||||
- ADB 没有在线设备,因此未自动覆盖安装 APK。
|
||||
- 微信/支付宝红包和支付流程仍需 Vivo 真机继续验收。
|
||||
|
||||
## 6. 常用命令
|
||||
|
||||
### Android Internal 单测
|
||||
|
||||
```powershell
|
||||
cd C:\Users\nanxun\Documents\dsworkspace\jizhang\frontend\android
|
||||
$env:FLUTTER_ALREADY_LOCKED='true'
|
||||
$defs=@('INTERNAL_BUILD=true','API_BASE_URL=https://lt.frp-say.com:38012','APP_VERSION=20260722-132') | ForEach-Object { [Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes($_)) }
|
||||
.\gradlew.bat --no-daemon :app:testInternalReleaseUnitTest "-Pdart-defines=$($defs -join ',')"
|
||||
```
|
||||
|
||||
### Flutter 测试
|
||||
|
||||
```powershell
|
||||
cd C:\Users\nanxun\Documents\dsworkspace\jizhang\frontend
|
||||
C:\Users\nanxun\Documents\flutter\bin\cache\dart-sdk\bin\dart.exe C:\Users\nanxun\Documents\flutter\bin\cache\flutter_tools.snapshot test --no-pub test\theme_and_time_test.dart
|
||||
```
|
||||
|
||||
### Flutter 静态检查
|
||||
|
||||
```powershell
|
||||
cd C:\Users\nanxun\Documents\dsworkspace\jizhang\frontend
|
||||
C:\Users\nanxun\Documents\flutter\bin\cache\dart-sdk\bin\dart.exe C:\Users\nanxun\Documents\flutter\bin\cache\flutter_tools.snapshot analyze --no-pub
|
||||
```
|
||||
|
||||
### 后端编译
|
||||
|
||||
```powershell
|
||||
cd C:\Users\nanxun\Documents\dsworkspace\jizhang\backend
|
||||
dotnet build MiaoJiZhang.sln --no-restore
|
||||
```
|
||||
|
||||
### 构建 Internal Release APK
|
||||
|
||||
```powershell
|
||||
cd C:\Users\nanxun\Documents\dsworkspace\jizhang\frontend\android
|
||||
$env:FLUTTER_ALREADY_LOCKED='true'
|
||||
$defs=@('INTERNAL_BUILD=true','API_BASE_URL=https://lt.frp-say.com:38012','APP_VERSION=20260722-132') | ForEach-Object { [Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes($_)) }
|
||||
.\gradlew.bat --no-daemon :app:assembleInternalRelease "-Pdart-defines=$($defs -join ',')"
|
||||
```
|
||||
|
||||
### 查看 APK 信息和 SHA-256
|
||||
|
||||
```powershell
|
||||
cd C:\Users\nanxun\Documents\dsworkspace\jizhang
|
||||
C:\Users\nanxun\AppData\Local\Android\Sdk\build-tools\36.1.0\aapt.exe dump badging release\JiZhi-1.2.5-internal-132.apk
|
||||
C:\Users\nanxun\AppData\Local\Android\Sdk\build-tools\36.1.0\apksigner.bat verify --print-certs release\JiZhi-1.2.5-internal-132.apk
|
||||
Get-FileHash release\JiZhi-1.2.5-internal-132.apk -Algorithm SHA256
|
||||
```
|
||||
|
||||
### ADB 安装
|
||||
|
||||
```powershell
|
||||
C:\Users\nanxun\Documents\platform-tools\adb.exe devices
|
||||
C:\Users\nanxun\Documents\platform-tools\adb.exe install -r C:\Users\nanxun\Documents\dsworkspace\jizhang\release\JiZhi-1.2.5-internal-132.apk
|
||||
```
|
||||
|
||||
## 7. 下一步建议
|
||||
|
||||
优先级从高到低:
|
||||
|
||||
1. Vivo 真机继续验收微信/支付宝红包、扫码支付、转账、通知与 OCR 双通道去重。
|
||||
2. 启动 Docker Desktop 后补跑后端集成测试,尤其是 UTC 时间序列化、幂等入账、用户隔离和账本隔离。
|
||||
3. 检查更新弹窗对 Markdown 的渲染能力;若仍无法解析,建议把更新说明限制为纯文本 Markdown 子集:标题、短横列表、空行。
|
||||
4. 清理 Flutter analyze 的 82 条 info 级提示,至少优先清掉本轮触碰过的文件。
|
||||
5. 继续优化智能识别诊断页,让“没事件、截图失败、OCR 无结果、规则拒绝、已入账、已合并”一眼能分清。
|
||||
6. 把隐私政策、权限用途和第三方 SDK 清单里的 ML Kit 本地 OCR 描述补齐,方便后续上架审查。
|
||||
7. 测试游客离线、登录同步、AI 权限关闭、AI 对话次数限制和深色模式全页面一致性。
|
||||
|
||||
## 8. 注意事项
|
||||
|
||||
- 不要把正式备案包 `com.nx.miaoji` 和内测包 `com.nx.miaoji.internal` 混用。
|
||||
- 测试阶段不要构建或安装 Production,除非用户明确要求。
|
||||
- 不要恢复音量键快捷截图,用户已经要求恢复系统原生音量键。
|
||||
- 不要绕过 `FLAG_SECURE` 或支付 App 的安全截屏限制。
|
||||
- 不要保存、上传或记录完整 OCR 原文、控件树、截图图片、API Key、JWT 或签名密码。
|
||||
- 数据库里已有 UTC 墙钟时间不要迁移,当前策略是在读取和显示层修复。
|
||||
- 若用户继续反馈“识别不到”,优先看智能识别最近诊断:事件是否收到、流程类型、金额来源、拒绝原因、OCR 是否 capture_failed。
|
||||
Reference in New Issue
Block a user