从零到一,用Claude Code+DeepSeek三天肝出一个完整记账App
当Vibe Coding从概念变成生产力:150元token、一个独立开发者、三天三夜,跑通个人+家庭+旅行三合一的记账App。
引子:为什么一个Java后端跑去写SwiftUI?
说起来挺魔幻的。
上个月被Karpathy那篇"Vibe Coding"文章刷屏,我当时的反应和大多数人一样——“这不就是高级点的对话式编程吗?真能写出能上线的代码?”
直到我自己动手做了知途记账。
我做这件事的动机很朴素:市面上找不到一个能同时搞定个人记账 + 家庭协作 + 旅行AA的App。个人记账我用随手记,家庭账本和老婆用Excel,旅行AA全靠群收款——三个场景三套系统,月底对账像在做审计。
于是我想,既然没有,为什么不自己做一个?而且,就用最近大火的Vibe Coding来做。
结果出乎意料:一个周末,外加一个晚上,成品跑通了。
这篇文章不吹嘘AI多厉害,而是把这个过程里真实的翻车、补锅、取舍全写出来。希望对想用AI做产品的独立开发者有用。
一、工具链选型:为什么是Claude Code + DeepSeek?
先说结论:这套组合是目前性价比最高的AI编程方案,没有之一。
- Claude Code:Anthropic推出的IDE插件(对标Cursor),代码生成质量稳,尤其擅长理解多文件上下文。我用的是付费版($20/月),但就这两天消耗的token折算下来大概130块。
- DeepSeek:国产大模型,API价格是GPT-4的零头,中文理解极好,用来做AI消费分析和旅行手账生成,单次调用成本不到0.01元。
技术栈更"分裂"一些:
- 后端:Spring Boot 3.x + MongoDB + Redis
- 前端H5:Vue3(用于免登的旅行账本页面)
- iOS:SwiftUI(纯原生,为了隐私和流畅)
全程我扮演"产品经理+架构师+测试",代码核心逻辑由AI生成,但我得负责把控方向和兜底。
二、两天四阶段:从零到能跑
第一天上午:个人账本(最顺利的部分)
开局很顺。我先让Claude Code生成Spring Boot骨架,配置Spring Data MongoDB、Spring Security、JWT。
第一个Prompt很简单:
“帮我设计用户表、个人账本表、收支记录表,支持多币种,汇率调用外部API。”
AI生成了对应的Document模型和Repository接口,还有最基础的CRUD。接着我让它写首页聚合接口——今日消费汇总、近七日趋势、最近10条记录——2小时,一次过。
唯一翻车是汇率换算:AI默认用double做乘法,我贴了报错给它:“BigDecimal不能和double直接运算”,它秒改成了multiply(BigDecimal.valueOf(rate))。
Vibe Coding第一条心法:把报错当成燃料喂给AI。
第一天下午:家庭账本(协作逻辑开始复杂)
家庭账本的核心需求是"邀请制 + 双向确认 + 共同记账":
“用户可以创建家庭账本,输入配偶邮箱,系统发邮件邀请。配偶登录后接受邀请,双方都能记账和看报表。删除账本需要双方确认,否则30天后自动软删除。”
这个Prompt下去,AI生成了邀请记录表、邮件服务(JavaMail)、定时清理任务(@Scheduled)。功能逻辑基本正确,但有一个关键缺陷:邀请链接安全。
AI用的是UUID.randomUUID()生成邀请码,我改成AES加密+时间戳生成短链,这部分代码来回改了三版才满意。这是AI的典型弱点——它会给你"能用"的方案,但不一定是"安全"的方案。
Vibe Coding第二条心法:AI解决的是"有没有",人类负责的是"好不好"。
第二天上午:旅行账本 + AA算法(最硬核的部分)
旅行账本是这个App最复杂的功能,涉及三个难点:
难点1:免登录加入
需求是"创建者添加成员名字→生成链接→分享到微信群→任何人点开选择自己→直接记账,全程不需要注册。"
AI第一次给的方案是内存Map存临时用户,我指出"多实例部署会丢",它改成JWT+Redis。但Redis配置是我自己写的——因为AI不熟悉我的基础设施环境。
难点2:多币种分摊
旅行中有人用人民币付、有人用美元付,记账时按当时的汇率换算成统一货币。这个逻辑AI一次过,用了免费的exchangerate-api.com,还包了缓存层(每小时刷新一次)。
难点3:贪心算法最小化转账次数
这个环节AI翻车了。
它第一次生成的算法是遍历所有人,计算差额后直接给出"A转B 100元,B转C 50元"——结果正确,但转账次数不是最优的。
我给它的纠正Prompt是:
“用贪心策略:先计算每个人的净应收/应付,然后每次找最大的债权人和最大的债务人相互抵消,直到全部清零。这能保证转账次数最少。”
AI重新实现后,我手工验证了几个案例(4人、5人、有0余额成员),结果全对。
Vibe Coding第三条心法:算法类的需求,必须给出明确的伪代码或策略描述,AI自己"悟"不出来。
难点4:AI旅行手账
调用DeepSeek API,传入该旅行账本的所有消费记录,生成一段带人设标签的趣味消费故事。
这个Prompt我调了最久(大概调整了5版),最终模板是:
“你是一个有趣的生活观察家。根据以下旅行消费记录,生成一段200字的消费手账,包含:给付款人一个有趣的人设标签(如’火锅消灭者’),总结消费特点,给出下次旅行的小建议。用emoji点缀。”
DeepSeek的中文生成质量很自然,而且成本极低(一次调用不到1分钱)。
第二天下午:联调 + 上线
最后用Xcode连上iPhone,跑SwiftUI客户端。UI全部由Claude Code生成,我只描述了"类似微信账单的卡片列表",它就能生成可用的List+Card样式。
**但UI细节是个无底洞。**AI生成的界面能用,但间距、颜色、字体大小都不够精致。这部分我花的时间比预期多——因为每次让AI调样式,它只改局部,整体感还是不够。后来我直接给了设计稿(Figma导出的标注),让AI按标注生成,才解决了。
三、费用复盘:150元到底花在哪?
| 项目 | 费用 |
|---|---|
| Claude Code API | 0元(反复修改+大上下文) |
| DeepSeek API | 约150元(手账生成+消费分析测试) |
| 云服务器 | 199元 |
| 苹果开发者 | 688元 |
| 其他(邮件服务免费额度) | 0 |
| 合计 | 约1050元 |
纯AI token费大概150元,其他是基础设施。这个成本远低于雇一个初级程序员写两天代码,但质量需要人工把关。
四、踩坑合集(希望你避开)
-
AI不懂事务边界:多表操作(同时插入记录和更新余额)AI默认不加事务,我手动加了
@Transactional。 -
SwiftUI Preview是魔鬼:Claude生成的SwiftUI代码经常在Preview中崩溃,后来我改为直接跑真机模拟器,预览只用来检查粗粒度布局。
-
AI不擅长性能优化:报表接口没建索引,我手动加了
(userId, date)复合索引,查询速度从2秒降到50ms。 -
安全是第一道防线:JWT密钥、数据库密码这些,AI会写死在配置文件里,必须改成环境变量注入。
-
Prompt要具体到"伪代码级别":对贪心算法、AES加密这类逻辑,不给"做什么",而是给"怎么做"的描述,AI才能精准输出。
五、知途记账的架构与核心代码
这部分分享一些实际落地的技术细节。
数据模型设计
个人账本直接关联userId,家庭账本通过familyMember表关联多个用户,旅行账本则用临时travelerId(Redis缓存)+ JWT token实现免登。
关键表结构(MongoDB Document):
PersonalLedger: { userId, records: [{ amount, category, note, recordAt, currency }] }
FamilyLedger: { familyId, members: [{ userId, role, joinedAt }], records: [...] }
TravelLedger: { travelId, travelers: [{ name, token, isPaid }], records: [...], settled: bool }
AA算法的核心实现(Java伪代码)
public List<Transfer> settle(TravelLedger travel) {
// 1. 计算每个人的净应收/应付
Map<String, BigDecimal> balances = new HashMap<>();
for (TravelRecord r : travel.getRecords()) {
balances.merge(r.getPayer(), r.getAmount(), BigDecimal::add);
for (Traveler t : r.getSharedWith()) {
balances.merge(t.getName(), r.getAmountPerPerson().negate(), BigDecimal::add);
}
}
// 2. 分出债权人和债务人
PriorityQueue<Balance> creditors = new PriorityQueue<>(Comparator.reverseOrder());
PriorityQueue<Balance> debtors = new PriorityQueue<>();
// ... 填充两个堆
// 3. 贪心抵消
List<Transfer> transfers = new ArrayList<>();
while (!creditors.isEmpty() && !debtors.isEmpty()) {
Balance c = creditors.poll();
Balance d = debtors.poll();
BigDecimal amount = c.amount.min(d.amount.abs());
transfers.add(new Transfer(d.name, c.name, amount));
// 剩余部分放回堆中
if (c.amount.compareTo(amount) > 0) creditors.offer(...);
if (d.amount.abs().compareTo(amount) > 0) debtors.offer(...);
}
return transfers;
}
AI手账的Prompt工程(精简版)
public String generateTravelStory(TravelLedger travel) {
String prompt = """
你是一个有趣的生活观察家,擅长用幽默的方式总结旅行消费。
以下是本次旅行 %s 的消费记录:
%s
请生成一段200字左右的消费手账,包含:
1. 给最活跃的付款人一个有趣的人设(如"火锅消灭者")
2. 消费特点和亮点
3. 下次旅行的小建议
用emoji点缀,语气轻松愉快。
""".formatted(travel.getName(), formatRecords(travel.getRecords()));
// 调用 DeepSeek API
return deepSeekClient.chat(prompt);
}
六、总结:Vibe Coding不是银弹,但值得拥抱
如果非要给这次经历一个评价,我会说:Vibe Coding极大地降低了"把一个想法变成可运行软件"的门槛,但它没有消除"把软件做好"所需要的能力。
哪些能力依然重要?
- 架构设计能力:知道哪些模块放AI生成、哪些必须人工写。
- 安全判断力:识别AI代码中的安全漏洞(SQL注入、密钥硬编码)。
- 领域知识:知道AA算法应该是贪心而不是暴力枚举。
- 产品审美:AI写的UI能用但不好看,得有人把关。
但抛开这些,一个周末就能做出功能完整的全栈应用,放在两年前是完全不可想象的。
如果你也是一个独立开发者,或者想自己折腾点东西,我强烈建议你试试这套组合。先跑通、再打磨、再上线——Vibe Coding加速的是"跑通"这一步,后面的路还是得你自己走。
如果你对技术细节有疑问,或者也在用AI做产品,欢迎在评论区交流。
本文首发于CSDN,作者是位肝完代码后黑眼圈很重的独立开发者。转载请保留原文链接。
更多推荐



所有评论(0)