一个人撑起五个代码库:独立开发者构建闪仓 SaaS 的真实历程
从 Spring Boot 后端到 Vue 3 前端,从 uni-app 移动端到 Next.js 官网,再到 Go 语言 CLI 工具——闪仓 WMS 的五个代码库、五种编程语言背后,是一个独立开发者同时担任 PM、设计师和运维的真实经历。
五个代码库,一个人
闪仓 WMS 目前由五个独立的代码库组成:
- wms/ -- Spring Boot 后端,9 个 Maven 模块,588 个 Java 文件,约 52,000 行代码
- flash_warehouse_pc/ -- Vue 3 PC 管理端,40 个 Vue 组件,约 52,000 行代码
- flash_warehouse_mobile-main/ -- uni-app 移动端,256 个 Vue 组件,约 79,000 行代码
- flash_warehouse_website/ -- Next.js 15 官网,91 个 TypeScript 文件,约 14,000 行代码
- flash_warehouse_cli/ -- Go 语言 CLI 工具 + MCP Server,82 个 Go 文件,约 11,000 行代码
五个项目,五种主要技术栈(Java、JavaScript、TypeScript、Go、Python),全部由一个人维护。这篇文章不是成功学分享,而是记录这个过程中真实的技术决策、踩过的坑和学到的东西。
技术选型:为什么是这套组合
每一个技术选型背后都有具体的原因,而不是追逐潮流。
后端选择 Spring Boot 2.7 + JDK 1.8,原因很直接:Java 生态的企业级库最成熟,MyBatis Plus 处理复杂的多租户查询足够高效,而 JDK 1.8 确保了最广泛的服务器兼容性。闪仓的 goods 表有 154 个字段,bill_of_document 涵盖 16 种单据类型——这种复杂度需要强类型语言的约束力。
PC 端选择 Vue 3 + TDesign,是因为 TDesign 的表格和表单组件与 WMS 场景高度契合。仓库管理系统的核心交互就是大量的表格操作和表单填写,TDesign 在这方面开箱即用。
移动端选择 uni-app,是为了一套代码同时覆盖 H5、Android 和微信小程序。仓库工作人员需要在手机上盘点、扫码、查库存,uni-app 的跨端能力在这个场景下是实用的选择。
官网选择 Next.js 15 + Cloudflare Pages,是因为营销网站需要 SEO,需要快速的全球访问,而 Cloudflare 的边缘网络加上 D1 数据库提供了零运维的托管方案。12 个数据库迁移文件管理着博客、联系表单、APK 下载信息等所有数据。
CLI 选择 Go 语言,是因为 Go 编译出的单一二进制文件便于分发,不需要用户安装运行时环境。fwh 工具提供 23 个 CLI 命令和 110 个 MCP 工具(45 个只读 + 65 个写入),采用「登录优先、租户锁定」的安全模型。
一人多角色的真实状态
独立开发者不只是写代码。在闪仓项目中,一个人需要同时承担:
产品经理:决定做什么功能、不做什么功能。WMS 领域的需求几乎是无限的——采购、销售、库存、财务、员工管理、供应商管理、BI 报表、盘点、POS 零售、权限控制。16 种单据类型中的每一种都有自己的创建、审核、驳回、转换流程。优先级排序是最难的部分。
设计师:没有设计稿。PC 端依赖 TDesign 的默认样式,移动端依赖 uView 的组件库,官网用 Tailwind CSS 手写。界面不算精致,但保证功能可用。
运维工程师:后端部署在阿里云 ECS 上,通过 deploy.sh 脚本实现「构建 - 上传 - 重启 - 健康检查 - 测试」的自动化流程,失败时自动回滚。官网部署在 Cloudflare Pages,通过 npm run pages:deploy 一键发布。29 个集成测试文件、103 个测试用例保证每次部署后的基本功能正确性。
安全工程师:实现了 RSA 2048-bit + AES-GCM 混合加密方案,通过 X-Encryption-Enabled: true 请求头控制加密开关。Filter Chain 按 CachedBodyFilter - RSADecryptionFilter - LogInterceptor 顺序处理请求。
跨代码库维护的现实挑战
维护五个代码库最大的痛苦不是写代码,而是上下文切换。
上午在 Java 中写 @RequestMapping,下午切到 Vue 3 的 Composition API,晚上可能在调 Go 的 cobra 命令行参数。每种语言都有自己的包管理器(Maven、npm、go modules)、自己的构建流程、自己的部署方式。
国际化是另一个倍增器。闪仓支持中文、英文和俄文三种语言。PC 端和移动端使用 $t('key') 语法和 locales/{zh-CN,en-US,ru-RU}/ 目录结构,官网使用 next-intl 的 useTranslations('Namespace') 模式。每新增一个功能,翻译工作量乘以三。
多租户隔离贯穿整个系统。数据库的每张表都有 binding_user_id 字段,后端的每个查询都必须带上租户过滤条件。这个约束简单但绝对不能遗漏——一次遗漏就是数据泄露。
学到的教训
第一,能用现成组件库就不要自己造轮子。 TDesign、uView、Tailwind CSS 节省了大量的 UI 开发时间。独立开发者的时间是最稀缺的资源。
第二,自动化测试不是可选项。 103 个集成测试用例听起来不多,但它们覆盖了所有核心 API 端点。没有这些测试,每次修改后端代码都会变成一场赌博。deploy.sh 脚本在部署后自动运行测试,失败则回滚——这个机制救过很多次。
第三,CLI 工具和 MCP Server 是独立开发者的效率倍增器。 fwh 工具的 110 个 MCP 工具让 Claude Code、Cursor 等 AI 编辑器可以直接操作仓库数据。这意味着很多重复性的数据操作可以用自然语言完成,而不需要打开 PC 管理端逐个点击。
第四,文档就是记忆。 每个子项目都有自己的 CLAUDE.md 或 README.md,记录着构建命令、架构决策和开发约定。三天不碰某个代码库,再回来时这些文档就是最快的上下文恢复方式。
第五,完美是发布的敌人。 闪仓的界面不够精致,代码中有可以优化的地方,某些功能的实现方式不是最优解。但它在运行,用户在使用,问题在被一个一个修复。
这条路适合你吗
独立开发一个完整的 SaaS 产品不是一条轻松的路。它要求你至少熟悉后端、前端、移动端、运维和基本的产品设计。上下文切换的认知负担是真实的,时间永远不够用,优先级的取舍每天都在发生。
但它也有独特的优势:没有沟通成本,决策到执行的路径最短,对整个系统的理解深度是团队开发中很难获得的。
闪仓 WMS 是免费的,代码库在持续更新中。如果你也是独立开发者,或者正在考虑走这条路,欢迎访问 flashwarehouse.cn 了解更多,或者通过 CLI 工具 fwh 直接体验我们的 MCP Server 集成。