文章

夏有木进销存:一款为中小商户打造的进销存 SaaS 应用

见字如面,与大家分享实践中的经验与思考。

最近我做了一款进销存 SaaS 应用,借这篇文章做个简要介绍,并分享一些开发过程中的思考以及结合 AI 的实践,感兴趣的读者不妨看看。

images-20251016-00.10.31@2x

项目背景

为什么要做这款 SaaS 应用?

我的一位朋友从事饲料行业。在她的日常经营中,“进货、销售、库存”是最基础也最关键的环节。但在管理这些环节时,她遇到了不少痛点:表格太复杂、系统过于笨重、功能太多反而用不起来。早期她通过一本本纸质账本记录,效率低下;时间一长,账本越积越多,既难以实时更新,也容易丢失。

同时,许多传统行业的中小商户不便也不擅长使用 PC 管理,手头的移动设备往往只有手机。

在了解业务诉求后,作为一名全栈开发者,我一直在思考:有没有一种方式,让这些中小商户用上真正简单、好用的进销存系统?

于是,「夏有木进销存」应运而生。

这是一款专为中小商户打造的 轻量级 SaaS 小程序,聚焦核心功能,摒弃冗余流程,让用户回归经营本身。随时随地拿起手机即可管理生意,经营更清晰、管理更省心。

产品概览

夏有木进销存是什么?

「夏有木进销存」是一款基于 SaaS 架构的多租户应用系统,支持多个商户独立使用,实现:

images-20251026-18.53.12@2x

  • 📦 商品管理:商品是进销存的基础,目标是让商户快速建库并投入使用。

  • 🧾 采购管理:记录从供应商进货到入库的全流程,让每一笔货来龙去脉清晰、成本透明。

  • 💰销售管理:管理从下单到收款的全过程,帮助商户更好把握销售节奏与盈利能力。

  • 🏬 库存管理:实时掌控库存变化与预警,让库存“看得见、算得准、控得好”。

  • 📊财务管理:经营数据更清晰、资金流更透明,帮助商户轻松掌握经营状况,为决策提供数据支持。

技术架构

采用现代化架构与技术,既能快速上线,也为后续 SaaS 扩展留足空间。

images-20251026-18.55.34@2x

技术栈简述:

  • 管理端:React + TypeScript + Ant Design。

  • 后端:Spring Boot 3.5.4 + JDK 21 + MySQL。

  • 存储:对象存储(COS + CDN)用于图片与附件。

  • 部署:云服务器 + Nginx 反向代理 + Docker / K8S。

  • 移动应用:微信小程序(原生架构 + TDesign UI)。

  • 数据隔离:采用多租户架构,通过 tenant_id 实现,保证各商户数据互不干扰。

  • DDD 分层架构:使用 DDD + CQRS 简化数据查询,使用 Repository 更新领域模型,保持清晰边界。

  • API 接口安全:采用双 Token 设计,分别保障管理端和小程序端的登录与后续安全访问。

  • 灵活的阶段管理:在采购、销售、结算等阶段采用状态机控制,确保流程闭环。

  • 并发控制:使用乐观锁机制,确保并发场景下的数据安全更新。

  • AI 编程:结合多种 AI IDE 及 CLI 工具,提高研发效率。

总之,在采用最新技术的同时,针对管理端、后端、小程序等不同端设计了清晰的分层架构,保证高效开发与良好扩展性。

功能模块

界面以简洁为主,操作遵循「少即是多」的理念。对大多数商户而言,几分钟即可上手。

以下是部分功能界面截图,实际远不止这些。可前往文末的二维码自行体验。

images-20251015-23.55.44@2x

images-20251015-23.56.17@2x

images-20251015-23.56.35@2x

images-20251015-23.56.45@2x

images-20251015-23.57.04@2x

开发过程中的挑战与经验

01 多端开发

多端开发的主要挑战是研发时间长以及跨语言学习。虽然 AI 工具能够带来提效,但随着功能复杂化,人工校正不可避免;同时大量由 AI 生成的代码需要及时重构,否则后续维护成本会升高。

images-20251016-00.36.40@2x

按上述流程,效率提升还是很显著的。举个例子:先做需求分析,再将一个功能模块拆分成小程序端、管理端和后端等开发任务;小程序交给 Cursor 完成,管理端交给 Trae 完成;复杂的后端逻辑由我手工开发,与其他模块相似的通用逻辑则交由 AI 完成。

不够完美的是,重构必须由人工完成,有时还更费时。前期赶工时我没有进行小步重构,后续为此连续花了一周多时间,确实痛苦。保持一定的重构频率后,情况就好很多。

02 小程序分包

小程序开发完成后,上传时代码包超过 2M,无法上传,需要进行分包处理。综合考虑性能与模块划分,我采用分包加载 + 组件化 + 静态资源 CDN 化等方式,将主要模块拆分为功能分包,提升启动速度。

images-20251016-00.21.22@2x

images-20251016-00.22.04@2x

03 精度计算与金额处理

鉴于 JavaScript 的浮点数精度问题,金额计算采用自定义的 BigDecimal 工具类,保证金额运算准确。

曾考虑引入 npm 包,但为了控制包大小限制,最终直接定义一个轻量工具类覆盖所需函数,以减少代码体积。

images-20251016-01.04.24@2x

04 ORM 开发效率问题

此前我常用 JPA 和 MyBatis。考虑到后期统计与报表较多,前期采用 MyBatis,并借助 MBG 及各类插件减少样板代码;但对个人开发而言效率仍偏低,于是在项目前中期改用 MyBatis-Plus,不使用其 Service,只使用 Mapper。此外,MyBatis-Plus 集成多租户、乐观锁、分页等插件,使用起来也更方便。

images-20251016-01.06.15@2x

05 多租户数据隔离

我采用的是表级租户隔离策略,该策略对代码有一定的侵入性,主要体现在:

  • 后端所有查询、保存等数据库操作都必须携带 tenant_id 字段

  • 权限体系需兼容多租户设计

  • 前端切换租户之后,数据与权限需刷新

还有很多细节不再赘述。尤其是部分表无需多租户隔离,需注意做特殊处理。

结语

“夏有木”这个名字来源于一句话:

夏有木,木成林。

意为「积小成多,积木成林」,象征着点滴积累终成系统。

目前,「夏有木进销存」已稳定运行,后续会根据用户的反馈进行版本迭代,以及长期计划上线 IOS 版本。

我希望它不止是一款工具,更是中小商户数字化转型的起点。如果你对这款应用感兴趣,请长按下图免费试用体验👇

images-20251016-00.10.31@2x

License:  CC BY 4.0