ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

全栈个人记账系统开发实战:FastAPI+SQLite+微信小程序

2026/8/3 17:20:18 拓冰建站 浏览量
全栈个人记账系统开发实战:FastAPI+SQLite+微信小程序 1. 项目概述全栈个人记账系统的价值与定位记账这件事我坚持了8年从最初的Excel表格到后来的各类记账App最终决定自己开发一套全栈系统。这个决定源于三个痛点一是市面产品功能冗余但核心记账体验不佳二是数据隐私无法完全掌控三是无法灵活扩展个性化分析功能。这套系统采用FastAPISQLite微信小程序的架构组合实现了从数据采集、存储到分析展示的完整闭环。选择全栈方案的核心考量是既能完全掌控技术栈每个环节又能通过前后端分离架构保证系统的可维护性。实测下来这套方案在个人使用场景下日均能稳定处理200条交易记录月度账单生成响应时间控制在300ms以内。2. 技术架构设计与选型逻辑2.1 后端技术栈FastAPI的实战优势最初在Flask和FastAPI之间犹豫时最终选择FastAPI主要基于三点异步支持记账场景存在突发性数据写入需求如批量导入历史数据自动文档内置的Swagger UI方便后期接口调试类型提示减少因数据类型错误导致的bug典型接口实现示例app.post(/transactions/) async def create_transaction(transaction: TransactionCreate): db_transaction models.Transaction( amounttransaction.amount, categorytransaction.category, timestampdatetime.now() ) db.add(db_transaction) await db.commit() return {status: success}2.2 数据库方案SQLite的巧妙应用虽然MySQL更常见但SQLite在个人记账场景有独特优势零配置部署单文件管理备份只需复制.db文件嵌入式特性与FastAPI完美配合无需单独数据库服务足够性能实测在10万条记录下复杂查询仍能保持1s响应关键配置技巧# 数据库连接配置 DATABASE_URL sqliteaiosqlite:///./finance.db engine create_async_engine(DATABASE_URL) async_session sessionmaker(engine, expire_on_commitFalse)注意SQLite的WAL模式必须开启可提升并发写入性能2.3 前端实现微信小程序的特殊适配小程序端开发遇到的主要挑战是数据同步策略采用增量同步冲突解决机制离线支持利用本地存储暂存未同步记录性能优化账单列表实现虚拟滚动核心同步逻辑代码段const syncData async () { const unsynced await getUnsyncedRecords(); try { const res await api.batchUpload(unsynced); await markRecordsSynced(res.successIds); } catch (e) { queueMicrotask(() syncData()); } }3. 核心功能模块实现细节3.1 交易记录的智能分类系统传统记账软件最让人抓狂的就是分类管理。我的解决方案是基于NLP的自动分类使用结巴分词自定义规则机器学习辅助收集用户手动修正数据训练简单模型多级分类体系大类餐饮子类早餐/午餐/晚餐分类器核心逻辑def auto_categorize(text): keywords { 餐饮: [麦当劳, 奶茶, 饭店], 交通: [地铁, 滴滴, 加油] } for category, words in keywords.items(): if any(word in text for word in words): return category return 其他3.2 多维数据统计与分析统计模块的设计要点时间维度日/周/月/年 颗粒度自由切换对比分析支持同比环比计算可视化方案采用ECharts实现动态图表关键统计SQL示例SELECT strftime(%Y-%m, timestamp) as month, category, SUM(amount) as total FROM transactions GROUP BY month, category3.3 数据备份与迁移方案经历过一次SD卡损坏后我设计了三重备份策略自动云端备份加密后上传私人Git仓库本地多设备同步通过WebDAV定期导出CSV归档备份脚本核心#!/bin/bash # 每日3点自动备份 sqlite3 finance.db .backup finance_$(date %Y%m%d).db rclone copy finance_*.db mydrive:/backups/4. 性能优化实战记录4.1 数据库查询优化技巧当交易记录超过5万条时发现了三个性能瓶颈账单列表分页慢通过复合索引解决统计计算耗时引入预聚合表分类查询卡顿使用覆盖索引创建的优化索引示例CREATE INDEX idx_transaction_combo ON transactions(timestamp, category); CREATE INDEX idx_transaction_cover ON transactions(category, amount);4.2 前后端交互优化通过三个措施将API响应速度提升3倍协议优化HTTP/2 Gzip压缩数据精简只传输必要字段缓存策略ETag配合客户端缓存FastAPI的响应压缩配置app.add_middleware( GZipMiddleware, minimum_size1000 )5. 典型问题排查实录5.1 SQLite并发写入冲突现象高峰期记账时偶现database is locked错误 解决方案设置busy_timeout参数实现自动重试机制控制写事务持续时间优化后的数据库配置engine create_engine( sqlite:///finance.db, connect_args{check_same_thread: False}, pool_size10 )5.2 微信小程序数据不一致现象多设备使用时出现数据冲突 解决策略采用最后修改优先原则实现冲突记录标记功能增加数据版本号控制冲突解决算法function resolveConflict(local, remote) { return new Date(local.updatedAt) new Date(remote.updatedAt) ? local : remote; }6. 项目部署与维护经验6.1 生产环境部署方案经过多次迭代最终稳定的部署架构后端Docker容器 Nginx反向代理数据库SQLite主库 每日备份小程序CDN加速静态资源Dockerfile关键配置FROM python:3.9 WORKDIR /app COPY requirements.txt . RUN pip install -r requirements.txt COPY . . CMD [uvicorn, main:app, --host, 0.0.0.0]6.2 日常维护技巧三年运维积累的重要经验监控简单但关键的指标监控数据库大小增长趋势API响应时间P99值日志结构化日志必不可少升级谨慎对待依赖库更新日志配置示例logging.config.dictConfig({ version: 1, formatters: { json: { format: %(asctime)s %(levelname)s %(message)s } } })这套系统经过三年持续迭代目前保持着99.9%的请求响应时间500ms零数据丢失记录平均每周开发投入1小时 真正实现了开发服务于生活的目标。最近新增的语音记账功能让我在买菜时只需说二十块钱菜钱系统就能自动完成记录——这才是技术该有的样子。