手机优先的 Personal Ledger:把账目、学习和复盘放到同一个入口

手机优先的 Personal Ledger:把账目、学习和复盘放到同一个入口

很多个人记录工具只能解决一个问题:记账、打卡或写笔记。

真正使用一段时间后,我更想要的是一个轻量的统一入口:今天花了什么、学习投入了多久、某个项目有什么进展,都能用同一套方式留下来,月底还能重新查到。

因此,我整理了一个面向个人使用的自托管项目:Personal Ledger

它采用 FastAPI + SQLite,前端是静态页面,重点放在手机操作。本文不只介绍技术选型,也直接展示项目的实际界面和一条完整使用路径。文中的界面图均使用移动端 390 × 844 视口截取,示例数据已经脱敏。

先看实际使用:一句话,记录两类内容

打开"记录"页后,核心交互只有一个输入区。

例如输入:

今天午餐 32 元,晚上听英语 30 分钟

后端会把一句话拆成一笔消费和一条学习积累,并在页面中列出解析结果。金额、日期和分类仍然会显示出来,提交前后都可以核对。

从手机上看,这个流程可以概括为三步:输入、提交、检查结果。

如果内容比较明确,项目优先使用本地规则处理;复杂文本可以接入可选的模型服务,但模型只负责辅助整理,最终数据仍由用户确认。

历史页:先看总量,再定位分类

历史页适合回答"这个月大概花了多少"这类问题。

页面会给出支出、收入和结余,并用趋势图展示每天的变化。下面的分类汇总可以快速看到餐饮、生活开支、交通和数码服务等项目的金额。

点击分类后,还可以继续查看对应的明细。这样做的好处是:先用总量判断整体情况,再用明细解释数字,而不是只留下一个月底总额。

账目记录保存日期、标题、金额、收支方向、分类、备注和货币单位。项目另外维护交易标签,用于支持更细的语义筛选,同时不改变原始金额和标题。

本月页:把日历当成记录索引

如果想知道某一天发生了什么,本月页会更直观。

它把有记录的日期标记在月历上,选中日期后显示当天明细。对于经常需要回看账目的场景,日历比连续滚动一长串列表更容易定位。

本月页还保留本月支出和结余两个关键数字。用户可以先看月度状态,再点击某天检查具体记录。

Ac 页面:记录时间,而不只是记录金额

很多工具能够回答"花了多少钱",却很难回答"这个月投入了多少时间"。

项目用 accumulation_entries 保存学习、阅读、听书、课程、实践项目、笔记复盘和运动等积累记录。一条记录包含:

  • 日期、标题和活动类型
  • 时长、页数和备注
  • 主领域、子领域和标签

例如,英语听力会归入"英语语言 / 听力",羽毛球会归入"健康运动 / 羽毛球"。同一天、同一活动和同一领域的重复记录可以合并累计,减少碎片数据。

Ac 页面提供日历、当天明细、活动方式汇总、领域汇总、每日时间线和月度占比。月末复盘时,可以看到时间主要投入在编程、运动、英语还是阅读上。

Id 页面:把复盘从长文本变成可检索记录

项目复盘、灵感和生活记录通常不是结构化表格,而是一段完整文本。

Id 页面会按月份展示这些记录,内容包括标题、正文摘要、日期和标签。SQLite 的 FTS5 全文检索表负责建立索引,后续可以结合关键词、主题和时间范围重新找到内容。

知识记录采用"先整理、后确认"的流程:

  1. 输入一段复盘或口述内容。
  2. 应用生成标题、主题、事件和标签等结构化草稿。
  3. 用户检查并修改草稿。
  4. 确认后再写入知识库。

这一步很重要。模型或规则的分类结果不应该直接覆盖用户数据,先让用户确认,才能兼顾自动化和可控性。

这个项目的核心设计

1. 一个入口,多个数据结构

输入入口保持简单,但后端并不把所有内容塞进一张表。

  • 账目进入 transactions
  • 学习和运动进入 accumulation_entries
  • 复盘内容进入 knowledge_notes

统一入口降低了记录成本,分开的数据结构又保留了各自的查询和展示方式。

2. 先判断意图,再选择处理流程

分析页会区分几类输入:

  • 消费入库,例如"今天午餐 32 元"
  • 消费查询,例如"这个月餐饮花了多少"
  • 积累入库,例如"昨天阅读 40 分钟"
  • 积累查询,例如"本月运动投入了多久"
  • 知识整理,例如"总结一下这周项目进展"

不同意图对应不同的解析器和 API。这样可以避免把"查询问题"误当成一笔新记录。

3. 规则优先,模型可选

明确的金额、日期、时长和活动类型优先由本地规则处理;只有复杂文本才需要模型辅助。

模型服务不可用时,应用仍能完成基础记录。对于个人工具来说,稳定的基础路径比所有功能都依赖外部服务更重要。

技术实现:FastAPI、SQLite 和静态前端

后端使用 FastAPI,并用 Pydantic 定义请求和响应结构。当前主要接口包括:

  • POST /api/records/ingest:混合记录入库
  • GET /api/transactions:查询账目明细
  • GET /api/monthly-summary:读取月度汇总
  • GET /api/accumulation/summary:读取学习与积累统计
  • POST /api/knowledge/summarize:生成知识草稿
  • POST /api/knowledge/drafts/{draft_id}/confirm:确认知识草稿
  • POST /api/analyze:执行账目、积累或知识分析

SQLite 适合这个项目的原因很实际:部署只需要一个数据库文件,备份可以直接复制文件,容器重建时也能通过目录挂载保留数据。

数据库连接开启了外键约束、WAL 模式、同步写入和忙等待时间。知识检索使用 SQLite FTS5 虚拟表,交易标签和积累批次则用于保留更完整的处理信息。

本地运行与 Docker 部署

本地运行需要 Python 环境:

bash 复制代码
python -m venv .venv
. .venv/bin/activate
pip install -r requirements.txt
uvicorn app.main:app --reload

生产环境可以使用 Docker Compose:

yaml 复制代码
services:
  ledger:
    build: .
    ports:
      - "18888:8000"
    environment:
      APP_DB_PATH: /data/app.db
    volumes:
      - /srv/personal-ledger/data:/data

部署时建议把应用代码、数据目录和备份目录分开管理。SQLite 文件放在宿主机持久化目录,容器更新不会直接删除数据。

项目还提供数据库备份脚本,可以按天生成快照并保留固定周期。涉及个人消费和复盘内容时,服务器访问控制、备份文件权限和模型服务密钥都需要单独配置。

适合哪些人

这个项目更适合:

  • 想把个人账目、学习和运动记录放到同一个页面的人
  • 希望自己部署和维护数据的人
  • 想学习 FastAPI、SQLite、FTS5 和 Docker Compose 的开发者
  • 需要一个可以继续二次开发的个人效率工具

它的边界也很明确:这是单用户、自托管的个人记录应用,不是多人财务系统,也不替代专业财务、医疗或投资工具。

结语

我做这个项目的出发点,不是再增加一个复杂平台,而是让日常记录更容易坚持。

手机上输入一句话,应用负责把它整理成账目、积累或复盘;需要回看时,用历史、月历、Ac 和 Id 四个入口分别查看。

如果你也在多个工具之间分散记录生活和学习,可以从一个小型自托管应用开始:先保留最常用的记录,再根据真实习惯逐步扩展。

相关推荐
保卫大狮兄2 小时前
设备管理从台账到报废,完整生命周期一次讲清
数据库·设备管理·设备
数据安全技术观察3 小时前
数据动态脱敏:让脱敏策略跟着数据目录走
大数据·网络·数据库
小席是个热心肠3 小时前
Redis的自我学习
数据库·redis·学习
2601_965798474 小时前
Salient Theme Setup Guide for Fast Creative WordPress Sites
数据库·web3·php·wordpress
@Mike@4 小时前
09-数据库学习笔记(数据库索引与过滤器)
数据库·笔记
程序员夏洛5 小时前
MySQL 中 count(*)、count(1) 和 count(字段名) 有什么区别?
数据库·mysql
智购科技自动售卖机厂家5 小时前
2026自动售货机OTA升级系统设计:从全量升级到差分升级的带宽优化工程实践~YH
大数据·人工智能·numpy·pyqt·fastapi
Wang's Blog6 小时前
PostgreSQL笔记34:索引优化策略全景解析——从B-tree到HOT的核心原理与实践
数据库·笔记·postgresql
l1258656 小时前
# RAG向量数据库优化实战:HNSW索引调参与生产级性能设计
数据库·python·mysql·langchain