iDev 项目复盘:一个 SaaS 产品从 0 到 1 的技术决策
iDev Project Retrospective — Technical Decisions Building a SaaS Product from Zero
| iDev Team | 2026-08-13T09:46:23
从技术选型到架构设计,从踩坑到填坑——分享我们帮客户从零构建一个 SaaS 产品的全过程和关键决策。
From tech stack selection to architecture design, from pitfalls to solutions — sharing our journey building a SaaS product from scratch for a client.
项目背景客户是一家马来西亚的物业管理公司,管理 30+ 个住宅小区。之前用 Excel + WhatsApp 管理住户缴费、维修工单、公告通知,效率低、数据乱、业主投诉多。需要一个 SaaS 系统把这些流程数字化。技术选型:为什么选 Vue + Spring Boot我们评估了三个方案:No-code(太不灵活)、Node.js 全栈(团队更熟 Java)、Vue + Spring Boot(成熟稳定)。最终选了第三个,原因很朴素:团队最熟、招人容易、生态完善、适合长期维护。架构决策:模块化单体客户初期只有 30 个小区,日活用户几百人。上微服务纯粹是过度设计。我们用模块化单体:住户模块、缴费模块、工单模块、通知模块各自独立包,共享一个数据库和部署单元。等业务增长到一定规模再拆。踩过的坑多租户数据隔离:一开始用共享数据库 + tenant_id 字段,差点出过数据串租户的事故。后来每个 SQL 都强制加租户过滤。支付回调可靠性:FPX 支付回调偶尔超时,导致用户付了钱但系统没记录。加了定时对账任务兜底。推送通知触达率:App 推送在安卓上被杀后台后收不到。补了短信通知作为备用渠道。结果6 周上线,3 个月覆盖全部 30 个小区。缴费率从 65% 提升到 89%,工单平均处理时间从 3 天缩短到 8 小时。
Project BackgroundThe client is a Malaysian property management company managing 30+ residential communities. Previously using Excel + WhatsApp for resident payments, maintenance tickets, and announcements — inefficient, messy data, frequent complaints. They needed a SaaS system to digitalize these workflows.Tech Stack: Why Vue + Spring BootWe evaluated three options: no-code (too inflexible), Node.js full-stack (team more familiar with Java), Vue + Spring Boot (mature and stable). We chose the third for pragmatic reasons: team expertise, easy hiring, complete ecosystem, suitable for long-term maintenance.Architecture: Modular MonolithThe client initially had only 30 communities with hundreds of daily active users. Microservices would be pure over-engineering. We used a modular monolith: resident module, payment module, ticket module, notification module — each in its own package, sharing one database and deployment unit.Lessons LearnedMulti-tenant data isolation: Started with shared database + tenant_id fields, nearly had a cross-tenant data leak. Added mandatory tenant filtering to every query.Payment callback reliability: FPX callbacks occasionally timed out, causing paid transactions to go unrecorded. Added scheduled reconciliation as a safety net.Push notification delivery: Android kills background apps, blocking notifications. Added SMS notifications as a backup channel.ResultsLaunched in 6 weeks, covered all 30 communities in 3 months. Payment rate improved from 65% to 89%, average ticket resolution time dropped from 3 days to 8 hours.