我花 600 元用 AI 做了一个本地优先的个人财务管理 App——技术选型与核心实现
文章目录我花 600 元用 AI 做了一个本地优先的个人财务管理 App——技术选型与核心实现背景为什么做这个 App产品长这样花了多少钱技术选型Vibe Coding我的角色从写代码变成了指挥 AI 审核核心功能实现1. 持有成本计算4 种分摊策略2. 净资产趋势降采样 线性回归预测3. 自动备份App 退到后台就存一份遇到的技术难点图表手势冲突数据导入的 ID 重映射测试开源地址我花 600 元用 AI 做了一个本地优先的个人财务管理 App——技术选型与核心实现不联网、不注册、不上云。你的财务数据只存在你手机上。背景为什么做这个 App市面上的记账 App 都有一个共同点要求你注册账号数据上传到云端。但我不想把自己的财务状况交给任何第三方服务器。我要的是一个能回答三个问题的工具我有多少钱— 多账户余额汇总我的东西值多少— 实物资产估值 持有成本计算净资产趋势如何— 历史折线图 目标预测于是我做了家底 WorthBase一款隐私优先、本地存储的个人财务状态管理 App。产品长这样花了多少钱整个项目我只为 AI token 付了费。成本分解项目费用Claude Qwen API编程辅助~¥600EAS Build 构建免费额度内Apple/Google 开发者账号未购买开源分发总计~¥600没有上架应用商店。因为还不确定是否真的有人用先放GitHub 下载。技术选型┌─────────────────────────────────────────────────┐ │ UI Layer │ │ Expo Router (Tab Navigator) │ │ react-native-paper (Material Design 3) │ │ react-native-svg (图表渲染) │ │ react-native-gesture-handler (缩放/拖拽) │ ├─────────────────────────────────────────────────┤ │ State Layer │ │ Zustand (轻量状态管理) │ ├─────────────────────────────────────────────────┤ │ Engine Layer │ │ HoldingCostCalculator (持有成本4种策略) │ │ NetWorthCalculator (净资产 余额 估值) │ │ ProjectionCalculator (线性回归预测目标达成) │ │ SettlementCalculator (卖出结算) │ ├─────────────────────────────────────────────────┤ │ Data Layer │ │ SQLite (expo-sqlite) │ │ Repository 模式 (7 张表, 无 ORM) │ └─────────────────────────────────────────────────┘选择Expo SDK 55而不是裸 React Native是因为 Expo 的开发体验热更新、EAS 构建对独立开发者来说效率更高。选择SQLite而不是 AsyncStorage是因为财务数据需要事务支持和复杂查询。选择Zustand而不是 Redux是因为 75 个文件的项目不需要那么重的状态管理。Vibe Coding我的角色从写代码变成了指挥 AI 审核这个项目 99% 的代码是 AI 写的。我的工作方式变成了描述需求用自然语言告诉 Claude 我要什么功能AI 生成代码Claude 产出完整实现跑起来验证在设备上运行看效果描述 bug 让 AI 改发现问题后用自然语言描述AI 修复我的核心价值从编码能力变成了需求定义能力 代码审核能力。AI 不懂持有成本应该怎么算才符合直觉但我懂。我负责做产品决策AI 负责把它们变成代码。这个流程让整个项目在5 天内从零到可用。核心功能实现1. 持有成本计算4 种分摊策略这是整个 App 最核心的功能。你买一台 8000 块的 MacBook用了 3 年它每个月花你多少钱答案取决于你怎么算。我设计了 4 种分摊方式用Strategy 模式实现// src/engine/strategies/index.tsconststrategyMap:RecordAmortizationType,AmortizationStrategy{[AmortizationType.SIMPLE_LINEAR]:SimpleLinearStrategy,[AmortizationType.EXPECTED_LIFESPAN]:ExpectedLifespanStrategy,[AmortizationType.RESIDUAL_VALUE]:ResidualValueStrategy,[AmortizationType.NO_AMORTIZATION]:NoAmortizationStrategy,};exportfunctiongetStrategy(asset:Asset):AmortizationStrategy{returnstrategyMap[asset.amortizationType]??NoAmortizationStrategy;}每种策略实现同一个接口的三个方法// src/engine/strategies/SimpleLinearStrategy.tsexportconstSimpleLinearStrategy:AmortizationStrategy{calculateMonthlyCost(asset,currentDate){constmonthsHeldmonthsBetween(asset.purchaseDate,currentDate);returnasset.purchasePrice/monthsHeld;// 持有越久月均越低},calculateAccumulated(asset){returnasset.purchasePrice;},calculateRemaining(){return0;},};四种方式的对比方式公式月均变化适用场景简单线性购入价 ÷ 持有月数递减电子产品、数码预期寿命购入价 ÷ 预期月数固定房产(360月)、家居(108月)残值分摊(购入价-残值) ÷ 预期月数固定车辆(60月)不分摊月摊销 0零奢侈品、贵金属为了让用户不需要理解这些算法我做了一个智能推荐器根据资产类型自动选择最合适的方式// src/engine/AmortizationRecommender.tsconstRECOMMENDATION_TABLE{[AssetCategory.ELECTRONICS]:{type:SIMPLE_LINEAR,hint:电子产品贬值快按已持有时间递减},[AssetCategory.REAL_ESTATE]:{type:EXPECTED_LIFESPAN,defaultLifespanMonths:360,...},[AssetCategory.VEHICLE]:{type:RESIDUAL_VALUE,defaultLifespanMonths:60,...},[AssetCategory.LUXURY]:{type:NO_AMORTIZATION,hint:奢侈品可能增值},};用户添加一台 MacBook系统自动选简单线性添加一辆车自动选残值分摊并默认 60 个月。技术为产品体验服务而不是让用户做技术决策。2. 净资产趋势降采样 线性回归预测净资产 账户余额 资产估值。公式只有 68 行代码// src/engine/NetWorthCalculator.tsconstnetWorthliquidAssetsassetValuations;但趋势图的数据处理更有意思。当数据点超过 24 个时需要降采样。我没有用简单的等距取样而是写了一个保留极值的降采样算法——确保趋势图上的峰值和谷值不会在降采样中丢失// app/index.tsx:644functiondownsamplePreservingExtrema(points,maxPoints){if(points.lengthmaxPoints)returnpoints;constresult[points[0]];// 始终保留第一个点constbucketCountmaxPoints-2;constinteriorPointspoints.slice(1,-1);constbucketSizeinteriorPoints.length/bucketCount;for(letb0;bbucketCount;b){constbucketinteriorPoints.slice(Math.floor(b*bucketSize),Math.floor((b1)*bucketSize));// 在每个桶中找偏离趋势线最远的点constavg(result[result.length-1].valuepoints[points.length-1].value)/2;letbestIdx0,bestDist-1;for(letj0;jbucket.length;j){constdistMath.abs(bucket[j].value-avg);if(distbestDist){bestDistdist;bestIdxj;}}result.push(bucket[bestIdx]);}result.push(points[points.length-1]);// 始终保留最后一个点returnresult;}另外如果你设了净资产目标系统会用最近 6 个数据点做线性回归预测你什么时候能达成目标// src/engine/ProjectionCalculator.tsconstpointshistoricalPoints.slice(-6);// 最小二乘法求斜率月均增长额constslope(n*sumXY-sumX*sumY)/(n*sumX2-sumX*sumX);// 预计达成日期 最后数据点 (目标差距 / 月增长)constmonthsNeeded(goal-currentValue)/slope;3. 自动备份App 退到后台就存一份本地优先 App 最大的风险是数据丢失。我的解决方案极其简单——App 退到后台时自动备份 SQLite 文件// app/_layout.tsx:64if(prevactive(nextAppStatebackground||nextAppStateinactive)){BackupService.createBackup();}就这 5 行代码。没有后台任务、没有定时器、没有推送。AppState监听状态变化退后台就复制.db文件到备份目录最多保留 3 份。此外还支持 JSON 格式的手动导出/导入带 ID 重映射和事务安全以及 CSV 格式的数据导出方便在 Excel 里查看。遇到的技术难点图表手势冲突净资产趋势图支持缩放和拖拽但它嵌套在 ScrollView 里。三个手势图表缩放、图表拖拽、页面滚动互相冲突。最终通过 Gesture Handler 的状态管理解决了图表区域内优先响应缩放/拖拽手势只有手势结束后才允许外层 ScrollView 滚动。InteractiveTrendChart组件因此有 540 行是整个项目最复杂的单个文件。数据导入的 ID 重映射从 JSON 文件导入数据时不能直接用原来的 ID可能和目标设备的已有数据冲突。解决方案是在一个事务内清空所有表 → 重建账户和资产记录 old ID → new ID 的映射→ 用新 ID 重建子记录余额快照、经常性支出等。整个流程在一个数据库事务里任何一步失败都会回滚。测试作为独立开发者我用三层策略保证质量Jest 单元测试2,800 行测试覆盖核心引擎、Repository、Store、UI 组件和边界场景设备手动测试Expo Go 扫码即测热更新快速迭代真实用户反馈小红书发了一篇帖子18 条评论帮我发现了 2 个 bug开源地址GitHub: github.com/callmebg/worthbase如果你觉得这个项目有意思给个 Star 就是最大的支持。欢迎提 Issue 和 PR。下一篇一个人从 0 到 1 做一个 App我是怎么用 vibe coding 在 5 天内管理这个项目的项目管理角度复盘技术深度系列想深入了解某个模块的实现1 WorthBase家底技术架构全解析一款本地优先的个人财务 App2 持有成本计算的 4 种分摊策略详解3 本地优先架构SQLite Repository 模式 自动备份4 净资产趋势可视化SVG 图表 手势交互 降采样算法5 资产生命周期管理状态机 卖出结算6 多账户余额管理8 种账户类型 负债处理7 React Native / Expo 开发体验与可复用模式8 UI 组件库与设计系统

相关新闻

Python演化史:从圣诞节的业余项目到吞噬世界的编程语言

Python演化史:从圣诞节的业余项目到吞噬世界的编程语言

目录 引言 一、起源:ABC的遗憾与Python的诞生 1.1 从ABC到Python 1.2 首个公开版本 二、1.0时代:奠定基础(1994-2000) 2.1 Python 1.0:函数式编程的引入 2.2 从CWI到CNRI 三、2.0时代:开源社区的成…

2026/10/11 22:23:40 阅读更多 →
Windows API Beep函数:C语言实现系统蜂鸣与音频提示

Windows API Beep函数:C语言实现系统蜂鸣与音频提示

1. 先搞清楚 Windows API 蜂鸣声能做什么,不能做什么 如果你在 C 语言里想实现一个最简单的音频反馈,比如程序启动提示、操作错误警告,或者做一个复古的终端小工具,调用 Windows API 的 Beep 函数是最直接的选择。它不需要任何外…

2026/10/2 0:56:29 阅读更多 →
618购物节揭示中国消费市场三大新趋势

618购物节揭示中国消费市场三大新趋势

1. 从"618"购物节看中国消费市场新趋势今年的"618"购物节再次刷新了多项销售纪录,但更值得关注的是数据背后反映出的消费行为变化。作为从业多年的电商分析师,我发现这场年中大促已经不再是简单的价格战,而是演变成了观察…

2026/10/7 4:37:36 阅读更多 →

最新新闻

CATIA V6 2013安装部署实战:PLM配置与许可证调优指南

CATIA V6 2013安装部署实战:PLM配置与许可证调优指南

简介:面向航空、汽车、机械、造船等工程领域的CATIA V6 2013软件安装资源包,主要为需要部署三维设计环境的工程师、设计师及工艺人员提供下载途径与安装参考。资源共7个文件,包括用于获取完整安装程序的torrent种子、记录安装步骤与系统需求的…

2026/10/12 9:20:56 阅读更多 →
Spring AI迁移实战:从Alibaba停更到Ollama无缝切换

Spring AI迁移实战:从Alibaba停更到Ollama无缝切换

1. 这不是“Java不行了”,而是生态演进的正常快照最近在几个技术社区刷到标题为“Spring AI Alibaba已停更了,Java还有希望吗?”的讨论帖,点进去发现不少Java老开发者语气里带着一丝疲惫——有人截图了Spring AI Alibaba官方仓库最…

2026/10/12 9:20:56 阅读更多 →
C语言生产级单向链表实现与内存安全实践

C语言生产级单向链表实现与内存安全实践

1. 项目概述:为什么链表操作是程序员绕不开的“基本功”“Problem C.链表操作”——光看这个标题,你可能觉得它像一道老掉牙的算法题,出现在某次模拟赛的第三题位置,代码区里还留着几行被注释掉的调试输出。但如果你在真实项目中写…

2026/10/12 9:19:55 阅读更多 →
mold 插件系统拆解:LTO、自定义符号处理如何在链接阶段“插一脚“

mold 插件系统拆解:LTO、自定义符号处理如何在链接阶段“插一脚“

mold 插件系统拆解:LTO、自定义符号处理如何在链接阶段"插一脚" 【免费下载链接】mold mold 🦠: A Modern Linker in Rust 🦀 项目地址: https://gitcode.com/GitHub_Trending/mo/mold 链接器在大多数开发者眼里是一个"…

2026/10/12 9:19:55 阅读更多 →
VibeVibe 第 1 章收官:个人主页 v1 的第一轮验收清单与下一轮优化清单实战

VibeVibe 第 1 章收官:个人主页 v1 的第一轮验收清单与下一轮优化清单实战

文档教程Vibe Coding示例工程 【免费下载链接】vibe-vibe The First Systematic Vibe Coding Open-Source Tutorial | From Zero to Full-Stack, Empowering Everyone to Build Products with AI | Live at: www.vibevibe.cn ;首个系统化 Vibe Coding 开源教程 | 零…

2026/10/12 9:19:55 阅读更多 →
基于SpringBoot的养老服务平台设计与实现:从毕设选题到答辩全流程解析

基于SpringBoot的养老服务平台设计与实现:从毕设选题到答辩全流程解析

每到毕业设计选题季,总有不少同学拿着“Java毕设选题推荐:基于SpringBoot的养老服务平台设计与实现”这类标题来问我,说网上看着功能很多,但不确定自己能不能做出来、答辩好不好讲、代码拿过来能不能跑起来。今天我就以这个项目为…

2026/10/12 9:19:55 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →