feat: initialize Xiaobai Bookkeeping 0.9

This commit is contained in:
leefer
2026-08-01 11:01:33 +08:00
commit 3ef13b5674
100 changed files with 17503 additions and 0 deletions
+65
View File
@@ -0,0 +1,65 @@
# 小白记账架构约定
## 架构选择
采用“模块化单体 + 本地优先 + 按需云服务”。早期保持一个可安装程序和一个清晰代码库,避免微服务带来的部署与排障成本,同时为未来拆分保留稳定接口。
## 分层
### 界面层
只负责展示、输入和用户反馈,不直接实现税务计算或修改数据库。
### 应用层
组织用户操作,例如“导入流水”“确认分类”“生成申报草稿”。应用层通过模块公开接口协作。
### 领域层
保存交易、账簿、规则、申报等核心业务规则。领域逻辑不依赖页面,也不依赖具体数据库。
### 基础设施层
负责 SQLite、文件系统、加密、网络、日志、更新和 Windows 系统能力。
## 业务模块
- `identity`:用户、经营主体、授权
- `documents`:票据和原始文件
- `transactions`:流水、去重、业务分类
- `ledger`:凭证、账簿和更正记录
- `tax-rules`:有版本的确定性税务规则
- `filing`:申报草稿、确认、提交和回执
- `review`:人工复核队列和意见
- `reporting`:经营概览与报表
- `audit`:不可静默修改的操作与依据记录
- `platform`:本地存储、加密、更新、备份和恢复
## 依赖规则
- 界面只能调用应用层。
- 应用层通过模块公开接口访问领域能力。
- 一个模块不得直接修改另一个模块的数据库表。
- AI 输出必须先经过结构校验和确定性规则校验。
- 税务计算不得调用生成式模型。
- 外部 OCR、AI 和申报通道必须经过适配层,以便更换供应商。
## 数据原则
- 金额以“分”为单位保存为整数。
- 原始文件使用内容哈希去重。
- 原始交易不可覆盖,更正通过追加版本实现。
- 计算结果记录输入版本、规则版本和程序版本。
- 数据库升级必须有迁移、校验与回退方案。
- 客户端日志默认不得记录身份证号、账号、完整票据内容或访问令牌。
## 技术边界
- 桌面容器:Tauri 2
- 界面与主要业务代码:React + TypeScript
- 本地存储:SQLite;生产版本启用加密与 Windows 安全密钥保护
- 云端接口:版本化 JSON API
- 云端数据:PostgreSQL
- 桌面底层桥接:保持少量 Rust 代码,不在其中堆积业务规则
当前仓库首先实现可运行的界面与纯领域逻辑;本地数据库、Tauri 容器和云端服务按阶段接入,不用模拟实现冒充生产能力。
+29
View File
@@ -0,0 +1,29 @@
# 本地备份与恢复模块
## 目的
在数据库加密、版本升级和更复杂功能接入前,先保证账本具备可验证、可回退的恢复能力。
## 备份流程
1. 使用 SQLite Online Backup API 获取一致性快照,不直接复制正在使用的数据库文件。
2. 对新备份执行 `PRAGMA integrity_check`
3. 检查迁移表、流水表和导入表等必要结构。
4. 计算 SHA-256,并在同目录写入独立校验文件。
5. 将数据库文件同步到磁盘后才向界面报告成功。
备份位于应用数据目录下的 `backups` 子目录。当前版本暂不提供云端上传或外部介质复制。
## 恢复保护
- 只允许恢复备份目录内、文件名合法的 `.sqlite3` 文件。
- 恢复前重新核对 SHA-256 和数据库结构;不一致立即拒绝。
- 覆盖当前账本前,自动创建 `pre-restore` 安全快照。
- 使用 SQLite Online Backup API 写回当前账本。
- 恢复后自动执行数据库迁移;若恢复或迁移失败,尝试用安全快照回退。
## 当前边界
- 本地备份与主数据库在同一块磁盘,能防误操作,不能替代异地备份。
- 备份目前仍是未加密 SQLite 文件,不应复制到不可信位置。
- 下一阶段的数据加密迁移将依赖本模块提供回退保障。
+19
View File
@@ -0,0 +1,19 @@
# 确认与审计模块
## 目的
让用户把不确定的流水判断为“经营收支”或“个人收支”,同时保证原始流水始终可查、确认过程可追溯。
## 数据原则
- `transactions` 保存导入时的原始归类与置信度,确认操作不更新该表。
- `transaction_reviews` 只追加确认记录,不覆盖历史记录。
- 同一笔流水连续提交相同判断时不新增记录,避免重复点击制造脏数据。
- 如果用户以后改变判断,则追加一条新记录;读取时以最新记录为准,旧记录仍保留。
- 个人收支仍显示在流水列表,但不进入经营收入、经营支出与利润汇总。
## 当前边界
- 确认人暂固定为本机用户 `user`,后续接入账户体系时再扩展。
- “都不是”仍是占位功能,等待更细的分类规则模块。
- 0.6 起主账本与备份已使用 SQLCipher 加密,密钥由当前 Windows 用户保护;仍应配合可靠的 Windows 登录密码和设备访问控制。
+7
View File
@@ -0,0 +1,7 @@
# 本地账本加密约定
小白记账 0.6 起使用 SQLCipher 加密主账本和新建备份。首次启动会生成 32 字节随机密钥,经过 Windows DPAPI 绑定当前登录用户后保存;应用不会保存可直接使用的明文密钥。
升级旧版本时,应用先完整导出并校验加密副本,再原子替换旧账本;失败会保留原文件。旧的有效明文备份也会自动加密并重写 SHA-256 校验文件。恢复前始终创建加密安全快照,恢复文件通过哈希、数据库完整性和必要表结构三重检查。
边界:这是静态数据保护,主要降低磁盘文件被直接复制后读取的风险。已经登录相同 Windows 用户且能够运行本应用的人,仍可能访问账本,因此不能替代 Windows 登录密码、磁盘加密和设备访问控制。
+94
View File
@@ -0,0 +1,94 @@
# 小白记账设计系统
## 设计判断
小白记账是面向 Windows 小微经营者的本地财务产品。界面首先要让用户信任数据、看懂结果并完成当前任务,不追求营销网页式的视觉表演。
- 页面类型:数据密集型桌面产品
- 目标用户:不熟悉专业会计术语的小微经营者
- 视觉语言:冷静、可信、清晰、有适度亲和力
- 设计基础:Fluent UI React 与 Fluent System Icons
- 设计参数:`DESIGN_VARIANCE 4 / MOTION_INTENSITY 3 / VISUAL_DENSITY 7`
## 不可破坏的视觉锁定
### 颜色锁定
全产品只使用青绿色作为强调色。警告色和危险色只能表达真实状态,不能作为装饰。
- 品牌深绿:`#084C45`
- 主要强调:`#0D5C52`
- 交互强调:`#0F6F61`
- 浅强调背景:`#EDF7F4`
- 页面背景:`#F4F6F8`
- 内容表面:`#FFFFFF`
- 正文:`#17212B`
- 次要文字:`#5E6A75`
- 边框:`#DFE3E8`
- 警告:`#8A6100`
- 危险:`#B42318`
禁止重新加入金色装饰、紫蓝渐变、发光描边或与品牌无关的第二强调色。
### 形状锁定
- 面板、数据组和业务卡片统一使用 `12px` 圆角。
- 按钮、输入框、图标按钮和状态标签统一使用 `8px` 或更小圆角。
- 只有数字徽标可使用完全圆形。
- 阴影只用于浮层和需要表达层级的控件,普通内容面板依靠边框与留白分组。
### 主题锁定
当前版本统一使用浅色主题。任何页面不得单独切换成深色或暖色主题。后续如果加入深色模式,必须通过全局语义变量一次性实现和测试。
## 页面骨架
- 左侧固定主导航负责产品一级入口,标签不得随意改名。
- 顶部栏负责全局搜索、演示数据提示、通知和账户入口。
- 主内容区先展示页面结果,再展示依据和可执行操作。
- 右侧辅助信息只在确有上下文价值时出现。
- 数据概览优先使用连续分区,不把每个数字都包装成独立悬浮卡片。
## 排版与数据
- 中文界面使用 `Segoe UI Variable``Segoe UI``Microsoft YaHei UI` 回退链。
- 页面标题保持 27px 左右,不使用营销页面式超大标题。
- 金额、数量和日期必须启用等宽数字特性 `tabular-nums`
- 收入和支出不能只靠颜色区分,必须同时显示正负号或文字状态。
- 表格列宽、金额右对齐和状态位置应保持稳定。
## 控件与图标
- 基础组件使用 `@fluentui/react-components`
- 图标只使用 `@fluentui/react-icons`,不得在业务组件内手绘 SVG 路径。
- 每页只突出一个主要操作,其余操作降低视觉权重。
- 按钮文字在桌面端必须保持单行。
- 所有按钮必须有清晰的键盘焦点和按下反馈。
## 动效
- 动效只用于页面切换、操作反馈和状态变化。
- 只动画化 `transform``opacity`
- 禁止滚动劫持、持续漂浮和无业务含义的循环动画。
- 必须尊重 `prefers-reduced-motion`
## 文案
- 使用“收入、进货、房租、需要确认”,不用“贷方、借方、会计科目”。
- 先说结果,再解释依据。
- 错误提示必须说明发生了什么、数据是否安全、用户下一步做什么。
- 禁止用版本号、装饰性状态点和生硬编号制造科技感。
- 日期范围使用“至”,不使用长破折号。
## 状态完整性
每个新增功能必须同时考虑:
- 正常状态
- 加载状态
- 空数据状态
- 错误状态
- 离线状态
- 无权限状态
新增页面合并前至少检查首页、当前页面、键盘焦点、窄桌面宽度和 Windows 安装包构建。
+32
View File
@@ -0,0 +1,32 @@
# 0.5 本地备份与恢复验收
请继续只使用虚构资料和样例流水。
## 1. 创建备份
1. 打开“设置与数据”。
2. 在“本地备份与恢复”区域点击“立即创建备份”。
3. 预期:提示备份已创建并通过校验;列表出现“手动账本备份”,状态为“完整性正常”。
## 2. 制造可观察变化
1. 记住当前经营主体名称。
2. 把名称改为“恢复测试后的名称”并保存。
3. 确认左上角已经显示新名称。
## 3. 恢复
1. 回到备份列表,点击刚才备份旁的“恢复这份备份”。
2. 预期:先出现二次确认,并明确说明当前账本会自动备份。
3. 点击“确认恢复”。
4. 预期:提示恢复成功;经营主体名称回到第 1 步备份时的名称。
5. 备份列表中新增一份“恢复前安全快照”。
## 4. 重启验证
1. 完全退出并重新打开软件。
2. 预期:恢复后的主体、流水和确认记录保持不变,备份列表仍然存在。
## 验收反馈
请记录:通过/不通过、问题步骤、提示文字和截图。不要手工修改或删除应用数据目录中的文件。
+48
View File
@@ -0,0 +1,48 @@
# 小白记账 0.1 首轮验收清单
本轮只验收产品方向、信息结构和视觉语言。页面数据均为演示数据,不验收真实记账与税务计算。
## 启动后先看
- 软件是否像一个可信的财务工具,而不是宣传网页。
- 文字、金额和状态是否清晰,不需要放大才能阅读。
- 左侧导航是否容易理解。
- 页面信息是否充实但不显得拥挤。
- “演示数据”和“演示规则”是否足够明显,避免误认为是真实结果。
## 经营首页
- 能否立即看懂本月收入、支出、利润和税额状态。
- 是否能发现“需要你确认”的事项。
- 是否理解免税额度进度只是当前演示。
- 最近收支表是否容易扫读。
## 待我确认
- 问题是否使用业务语言,而不是会计术语。
- 是否能理解“经营支出”“个人支出”的区别。
- 是否理解确认不会覆盖原始流水。
## 票据与流水
- 是否能区分原始票据、识别结果和待确认状态。
- 是否清楚数据来自微信、支付宝、银行还是发票。
- 金额的收入和支出方向是否容易辨认。
## 账簿与报税日历
- 是否能看懂账簿分类,而不需要理解会计科目。
- 是否清楚当前报税页面不会提交真实数据。
- 是否能理解申报草稿、人工复核、用户确认和回执归档的顺序。
## 反馈格式
不需要描述技术原因,可以直接记录:
```text
页面:经营首页
操作:打开软件后查看本月数据
问题:我第一眼不知道哪个数字最重要
期望:利润应该更明显
严重程度:无法继续 / 很困惑 / 有点别扭 / 只是建议
```
+37
View File
@@ -0,0 +1,37 @@
# 0.4 经营主体建档验收
请只填写虚构的测试资料,不要填写真实税号、身份证号或银行卡信息。
## 1. 创建经营主体
1. 安装并打开小白记账 0.4。
2. 预期:安装向导从欢迎、安装位置到完成均为简体中文,不出现英文步骤。
3. 点击左侧顶部“尚未创建经营主体”,或左下角“设置与数据”。
4. 填写名称“验收小食店”,选择“个体工商户”,地区填写“浙江省杭州市”。
5. 点击“完成建档”。
6. 预期:出现“经营主体已保存到本机”;左侧顶部显示“验收小食店 / 个体工商户”,名称前没有“禾”字图标且不会换行。
## 2. 输入校验
1. 把名称改成单个字“店”,尝试保存。
2. 预期:页面提示名称应为 2 到 60 个字符,原资料没有被覆盖。
3. 再填写一个 12 字以上的测试公司名并保存。
4. 预期:左上角名称仍保持单行,字号会自动缩小;特别长时以省略号结束,鼠标停留可查看全名。
## 3. 修改与重启恢复
1. 名称改为“验收早餐店”,主体类型改为“小微企业”,保存。
2. 完全退出软件并重新打开。
3. 预期:左侧仍显示“验收早餐店 / 小微企业”;进入设置后,地区仍为“浙江省杭州市”。
## 4. 旧数据兼容
如果电脑上已经安装过 0.3 并导入过样例流水:
1. 升级到 0.4 后完成建档。
2. 打开“收支流水”和“待我确认”。
3. 预期:原有流水和确认结果仍然存在,建档不会清空旧数据。
## 验收反馈
请记录:通过/不通过、问题出现在哪一步、界面提示文字和截图。
+23
View File
@@ -0,0 +1,23 @@
# 经营主体模块
## 目的
为后续流水、账簿、税务规则和申报草稿提供明确的数据归属,消除界面中的硬编码店铺资料。
## 当前模型
首版只允许一个经营主体,固定使用稳定标识 `primary`
- 经营主体名称:2 到 60 个字符。
- 主体类型:个体工商户或小微企业。
- 所在地区:2 到 40 个字符,后续用于匹配试点规则。
- 创建时间和更新时间:由数据库维护。
保存使用 SQLite 单事务和单行更新。重复保存不会创建第二个主体,非法字段不会部分写入。
## 数据边界
- 当前不收集身份证号、完整税号、银行卡号、登录密码。
- 修改主体资料不会删除或改写既有流水。
- 当前数据库尚未加密,只建议使用测试资料。
- 多经营主体和主体切换不属于当前 MVP,未来如需加入,必须先完成流水归属迁移设计。
+24
View File
@@ -0,0 +1,24 @@
# 人工维护指南
## 日常修改从哪里开始
- 界面与交互:`src/App.tsx`,视觉令牌与布局:`src/styles.css`
- 金额汇总规则:`src/domain/transactions.ts`,修改时先补对应测试。
- 本地数据库、命令、迁移、备份和导出:`src-tauri/src/lib.rs`
- 产品边界和架构决定:`docs/`,发布前同步更新版本说明。
## 不破坏旧数据的规则
1. 不直接改写已经发布的迁移;新增表或字段使用新的迁移版本。
2. 原始流水、确认和纠错分开保存;展示层读取最新有效值。
3. 涉及数据库格式时,必须测试旧库升级、失败回退、备份与恢复。
4. 金额始终用整数分保存和计算,禁止浮点数入库。
5. 外部 OCR、AI、税务规则和申报通道必须放在适配层,核心账本不依赖供应商格式。
## 每次发布的固定检查
运行 `scripts/verify.ps1`,确认前端测试、生产构建和 Rust 测试通过;随后人工检查建档、记一笔、CSV 重复导入、确认、修改、搜索、账簿导出、备份和恢复。安装升级测试不得删除应用数据目录。
## 故障定位顺序
先记录用户看到的中文错误和触发步骤,再判断属于界面、命令、数据库迁移还是文件系统。修复后必须增加能复现问题的自动测试。不要让用户手工编辑数据库或密钥文件。
+54
View File
@@ -0,0 +1,54 @@
# 小白记账产品章程
## 产品使命
让没有会计基础的个体工商户,用听得懂的语言完成经营数据归集、记账和申报准备。
## 第一阶段产品形态
小白记账首版是本地优先的 Windows 桌面软件。经营数据默认保存在用户电脑;只有用户明确触发 AI 识别、云端备份或申报协作时,才上传完成任务所必需的数据。
## MVP 用户
- 没有专职会计的个体工商户
- 经营数据以收款流水、发票和少量现金记录为主
- 首期先服务一个试点地区,不承诺全国规则立即通用
- 首期生成申报草稿并进入人工复核,不承诺无人值守自动申报
## MVP 闭环
1. 创建经营主体
2. 导入票据和流水
3. 自动去重、识别和业务分类
4. 用户只处理低置信度待确认项
5. 生成可追溯账簿与经营概览
6. 使用有版本的确定性规则进行税额试算
7. 生成申报草稿并进入人工复核
8. 保存确认记录、计算依据和最终回执
## 首版不做
- 全国所有地区的自动申报
- 发票开具
- 多门店、进销存和工资管理
- AI 自动决定税率或直接计算税额
- 未经用户确认上传完整账簿
- 用免责声明代替持牌机构合作与合规审查
## 产品原则
- 自动化是默认路径,人工是例外路径。
- 只向用户询问业务问题,不询问会计科目。
- 原始数据不可被静默覆盖,所有更正均保留版本。
- 任何金额都必须能够追溯到数据来源、规则版本和确认记录。
- 新功能必须属于明确模块,并可以被单独关闭。
- 正确性、可恢复性和可解释性优先于功能数量。
## 第一阶段成功标准
- 用户可在 10 分钟内完成主体创建和首次数据导入。
- 重复导入不会产生重复账目。
- 关键金额计算使用整数最小货币单位,避免浮点误差。
- 程序异常或更新失败不会损坏已有账本。
- 主要页面无需会计知识即可理解。
- 从原始票据到账簿记录形成完整依据链。
+43
View File
@@ -0,0 +1,43 @@
# 质量与维护规则
## 发布门禁
任何正式版本必须满足:
- 类型检查通过
- 自动化测试通过
- 核心流程人工验收通过
- 数据库迁移和回退演练通过
- 安装、升级、卸载不损坏用户数据
- 没有未处理的严重级别错误
- 版本说明列出新增、修复、已知限制和恢复方式
## 测试层级
- 单元测试:金额、日期、去重、分类、规则边界
- 集成测试:文件导入、数据库迁移、模块接口
- 流程测试:建档到申报草稿的完整闭环
- 视觉测试:核心页面固定尺寸截图对比
- 恢复测试:断网、崩溃、升级失败、备份损坏
- 安全测试:权限、敏感日志、恶意文件、依赖漏洞
## 功能进入流程
需求说明 → 模块归属 → 影响分析 → 验收案例 → 开发 → 自动测试 → 功能开关 → 小范围启用 → 正式发布。
没有模块归属、没有验收案例或不能单独关闭的重要功能,不进入开发。
## 可维护性
- 每个模块包含用途、公开接口、数据结构和故障处理说明。
- 关键架构决定记录原因,而不只记录结论。
- 税务政策、提示文案和非核心分类规则优先配置化。
- 所有后台任务有状态、失败原因和安全重试入口。
- 客服通过用户主动生成的脱敏诊断包排查问题。
- 规则变更实行版本管理和双人审核。
- 每季度执行一次备份恢复演练和依赖升级评估。
## 用户验收方式
每次交付提供安装包、演示数据、测试清单、变化说明和已知限制。用户只需按业务语言反馈现象,技术侧负责定位原因、修复并补充防复发测试。
+29
View File
@@ -0,0 +1,29 @@
# 小白记账 0.9 内测说明
## 已完成
- SQLCipher 加密主账本、加密备份、旧明文数据迁移和失败回退。
- 手工记账、CSV 导入去重、经营/个人确认、搜索筛选和追加式纠错。
- 经营账簿按当前有效流水确定性汇总,个人收支自动排除。
- CSV 明细与合计导出、Excel 兼容 BOM、SHA-256 校验文件和公式注入防护。
- 1080×700 最小窗口到 1440×900 默认窗口的界面验收。
## 明确未启用
- 票据文件上传与 OCR 识别。
- AI 自动分类或税务判断。
- 税额计算、申报草稿和真实提交。
- 云端同步、多设备协作和忘记密钥后的云恢复。
这些入口在 0.9 中只展示开放条件,不伪造真实业务结果。
账本导出是用户主动生成、供 Excel 打开的明文 CSV,不受账本密钥保护;界面会显示保存位置和校验码,应按敏感财务文件妥善保管。
## 恢复方式
升级前建议在“设置与数据”创建备份。恢复操作会先自动创建当前账本快照;校验码不一致、结构损坏或无法解密的备份会被拒绝。
## 安装包
- 文件:`小白记账_0.9.0_x64-setup.exe`
- SHA-256`93CB4507F90E94E2EC08FE26AECFC3D3E6A1FBD19FEB67938FA2BC9DDA06F23F`
+64
View File
@@ -0,0 +1,64 @@
# 小白记账 0.2 流水导入验收
本轮只验收 CSV 流水导入、本地保存和重复导入。票据识别、确认结果保存与税务计算仍然是后续功能。
## 准备
1. 安装或直接运行小白记账 0.2。
2. 打开“收支流水”。
3. 准备仓库 `samples` 文件夹中的 `流水导入示例.csv`
## 第一次导入
1. 点击“导入 CSV”。
2. 选择 `流水导入示例.csv`
3. 应看到“成功新增 4 笔流水”。
4. 页面应显示 2 笔收入和 2 笔支出。
5. 经营首页应显示“本地流水”,收入、支出和利润改为样例文件汇总结果。
预期金额:
- 收入:¥2,140.50
- 支出:¥763.60
- 利润:¥1,376.90
## 重复导入
1. 再次导入同一个文件。
2. 应看到“这份文件已经导入过”。
3. 流水总数仍为 4,不得变成 8。
## 重启验证
1. 关闭小白记账。
2. 重新打开。
3. 顶部仍应显示“本地流水”。
4. 收支流水仍为 4 笔,金额不变。
## 错误文件验证
可以复制样例文件,把其中一个金额改成 `12.345` 后导入。
预期:
- 明确提示金额最多两位小数。
- 文件中的其他正确行也不得写入。
- 原来已经保存的 4 笔流水不受影响。
## 已知限制
- 只支持 UTF-8 CSV。
- CSV 表头仍需要使用规定名称,没有字段映射向导。
- 导入前还没有预览页面。
- 待确认按钮暂不写入数据库。
- 本文是 0.2 阶段的历史验收记录;其中“尚未加密”的限制已由 0.6 的 SQLCipher 与 Windows 密钥保护取代。
## 反馈格式
```text
页面:收支流水
操作:第二次导入同一个 CSV
问题:流水从 4 笔变成了 8 笔
期望:重复文件不增加流水
严重程度:无法继续 / 很困惑 / 有点别扭 / 只是建议
```
+7
View File
@@ -0,0 +1,7 @@
# 0.6 验收记录
- 主账本文件不再出现 SQLite 明文文件头,错误密钥无法读取。
- 密钥使用安全随机数生成,并由当前 Windows 用户的 DPAPI 保护。
- 加密备份可创建、校验、恢复,恢复失败具备回退路径。
- 有效的旧明文账本与备份可自动迁移,迁移后校验码同步更新。
- 前端单元测试、生产构建及 16 项 Rust 回归测试通过。
+31
View File
@@ -0,0 +1,31 @@
# 0.3 待确认与审计验收
请在 Windows 安装版中按顺序测试。测试时只使用仓库 `samples` 目录中的样例数据。
## 1. 导入待确认数据
1. 打开“收支流水”。
2. 导入 `samples/待确认流水示例.csv`
3. 预期:提示新增 2 笔;左侧“待我确认”显示 2。
## 2. 保存经营判断
1. 打开“待我确认”。
2. 找到“测试顾客”200 元收入,点击“是,经营收入”。
3. 预期:该卡片消失,待确认数量减 1;经营收入包含这 200 元。
## 3. 保存个人判断
1. 将“测试供应商”100 元支出标记为“不是,个人收支”。
2. 预期:待确认数量变为 0;经营支出和利润都不包含这 100 元。
3. 打开“收支流水”,预期该记录仍存在,归类为“个人收支”,状态为“个人”。
## 4. 重启与重复操作
1. 完全退出并重新打开小白记账。
2. 预期:两项确认仍然存在,待确认数量仍为 0,经营汇总未变化。
3. 当前界面不会再次展示已确认卡片;数据库自动化测试会额外验证重复提交同一判断不会新增重复审计记录。
## 验收反馈
请记录:通过/不通过、出现问题的步骤、界面提示文字和截图。不要导入真实账单。
+63
View File
@@ -0,0 +1,63 @@
# CSV 流水导入模块
## 模块归属
- 业务模块:`transactions`
- 应用入口:收支流水页面
- 基础设施:Tauri 命令、SQLite、Windows 用户应用数据目录
## 当前公开接口
### `import_transactions_csv`
输入文件名与 UTF-8 CSV 文本,在单个 SQLite 事务中完成校验、文件登记和交易写入。
返回:
- 文件总行数
- 新增交易数
- 重复交易数
- 文件 SHA-256 指纹
### `list_local_transactions`
读取本机已经保存的交易,按交易时间倒序返回界面层需要的只读结构。
## CSV 约定
必填列:
- `交易时间`
- `对方`
- `收支类型`,值为“收入”或“支出”
- `金额`,最多两位小数
可选列:
- `来源`
- `分类`
- `交易单号`
同时接受文档中定义的英文列名。首版只支持 UTF-8 编码,不自动猜测 GBK。
## 去重规则
1. 文件内容 SHA-256 相同,整份文件视为已导入。
2. 有交易单号时,以“来源 + 交易单号”生成交易指纹。
3. 没有交易单号时,以“时间 + 对方 + 收支方向 + 整数分金额 + 来源”生成交易指纹。
4. 不覆盖已有交易,重复记录使用数据库唯一约束跳过。
## 一致性与故障处理
- 所有金额在 Rust 中转换为整数分,不经过浮点数。
- 任何一行不合法时,整份 CSV 不写入数据库。
- SQLite 使用 WAL 日志模式。
- 数据库位于 Windows 用户应用数据目录,安装和升级不覆盖。
- 当前迁移版本为 1,并记录在 `schema_migrations` 表。
## 已知限制
- 还没有字段映射向导。
- 还没有 GBK 文件转码。
- 还没有导入预览和逐行忽略。
- 待确认结果尚未持久化,本轮只保存原始流水与初始分类。
+25
View File
@@ -0,0 +1,25 @@
# 决策 0001Windows 本地优先基础
- 状态:已采用
- 日期:2026-07-31
## 背景
目标用户更熟悉 Windows 财务软件,并且对票据、流水和账簿保存在本机有更高的心理信任。产品后期仍需要 AI、规则更新、备份和申报协作等联网能力。
## 决策
使用 Tauri 2 作为 Windows 桌面容器,React 与 TypeScript 实现界面和主要业务逻辑。完整账簿默认本地保存,云端能力通过明确授权按需调用。
## 约束
- 不把远程网页直接包装成桌面软件。
- 桌面容器只加载随安装包发布的本地界面资源。
- Rust 层保持小而稳定,只负责系统级安全能力。
- 云端不可用时,本地查看和整理能力仍应工作。
- 移动端未来作为拍照与提醒助手,不取代 Windows 主工作台。
## 后果
优势是数据边界清晰、安装包较轻、界面代码可复用。代价是项目同时包含 TypeScript 与少量 Rust,需要持续维护桌面构建工具链。