免费获取学习方案
ARTICLE DETAIL

资讯详情

深耕编程基础知识与建站技术分享的一线实战洞察。

开源ERP系统ever-gauzy深度解析:技术架构、部署实践与二次开发指南

开源ERP系统ever-gauzy深度解析:技术架构、部署实践与二次开发指南 ever-gauzy 这个名字我第一次看到的时候以为是某个个人开发者的实验项目结果点进去之后发现事情没那么简单。它是一套开源的企业资源计划系统从财务、库存、销售点收银到人力资源、任务管理全包了而且技术栈相当统一后端 NestJS、前端 Angular、数据库 PostgreSQL全栈 TypeScript。更值得注意的是它背后是 Ever 团队在做跟他们那套 AI 招聘和销售助手产品属于同一个生态。这篇文章我想从实际使用的角度把 ever-gauzy 掰开揉碎讲一遍。它适合谁用、能解决什么问题、部署的时候有哪些坑、二次开发从哪里下手以及它跟那种商业的 Odoo、用友、金蝶到底有什么区别。如果你正在为中小团队挑一套能自己掌控代码的业务管理系统这篇文章应该能帮上不少忙。1. 先搞清楚它到底是个什么项目1.1 一个“全家桶”式的开源业务管理平台ever-gauzy 的核心定位很直白给中小型公司提供一套可以自己部署、自己改代码的业务管理后端。它不是一个单一功能的工具而是把企业日常运营里最常见的几块需求集中到了一个项目里。我把它拆开看了下从功能模块上看大致分为销售与客户管理、采购与库存、财务与会计、项目与任务协作、人力资源管理这几大块。其中销售点收银那一块做得尤其重。它不是简单做一个“下单付款”的页面而是设计了完整的 POS 收银流程支持二维码扫描、现金和银行卡混合支付、订单挂单、小票打印等场景。这一点对实体零售店、餐厅、快消品门店来说是非常实用的功能。配合上客户管理、会员折扣、促销规则它基本能把一个小店的日常经营链路串起来。会计模块也不是摆设。它支持多币种会计、多实体Multi-Entity账务管理甚至可以生成基于会计模板的科目表和财务报表。也就是说你在系统里销售了一单商品财务端会自动生成对应的记账凭证和应收记录库存也会同步扣减。这种“业务数据自动进入财务”的设计比很多中小企业用 Excel 记一遍、再用财务软件录一遍的做法省了太多事。从产品形态来看ever-gauzy 走的是“ERP 项目管理 人力资源”三合一路线。它想干的不是单点工具而是把公司内部从合同签约、交付执行到员工工资发放这条长链路用一个系统贯穿起来。用我自己的话说它是一个“业务中台”的雏形。1.2 为什么选择 NestJS、Angular、PostgreSQL 这套技术组合技术选型能看出一个团队的偏好和取舍。ever-gauzy 选择的后端是 NestJS这个框架在 TypeScript 生态里属于企业级应用最成熟的方案之一。它不是最轻量的但它的模块化设计、依赖注入机制、装饰器风格跟大型业务系统的开发模式匹配度很高。在实际浏览源码的过程中我发现整个工程并不是把所有功能塞在一个巨型应用里而是拆成了大量模块每个模块处理一个相对独立的业务域。比如 accounting、invoicing、candidate、timesheet 这些目录一眼扫过去就能明白每个模块的职责。NestJS 的 Module 机制和这套目录结构配合得很好新加入的开发者可以按模块切入不需要看懂全项目才能动代码。前端选择 Angular 而不是 Vue 或 React这个决策放到今天看其实有利有弊。Angular 的强约定和依赖注入风格让大型项目的长期可维护性更好模板语法对业务人员也更直观。但 Angular 的学习曲线确实比 React 陡如果你团队里都是 React 背景的开发者二次开发的前端部分会有一定的适应成本。数据库用 PostgreSQL 是这类系统最稳妥的选项。事务支持、行级锁、JSON 字段、丰富的扩展生态这些都是业务系统不可或缺的。加上 ever-gauzy 大量使用了 TypeORM 来做数据映射切换数据库在理论上可行但我劝你还是老老实实用 PostgreSQL因为很多查询是直接基于 PG 特性设计的换库容易踩坑。从整体看ever-gauzy 在技术选型上走的是一条“求稳、求统一”的路一门语言TypeScript、一个框架NestJS、一个前端框架Angular、一个数据库PostgreSQL。对于长期维护来说这种单一技术栈的好处是明显的——团队招人、代码审查、模块复用都会简单很多。2. 核心业务模块解析与我的实测体会2.1 财务、库存与销售点收银是真的能用的那种我先说说最让我意外的销售点模块。你启动系统后进入 Sales 相关页面能看到一个完整的收银工作台界面产品列表、购物车、客户选择、结算按钮一应俱全。商品可以通过条码或搜索快速加入购物车也可以直接点击产品卡片。结算时可以选择现金、银行卡还能组合支付。它不仅是一个界面设计后端有完整的订单、支付、退款流程支撑。我实测跑通了一条比较完整的业务链路首先在产品管理里创建一个商品并设置成本价和零售价然后到采购模块录入一张采购订单确认收货此时库存增加。接着切换到销售点收银台模拟顾客把商品加入购物车并结算订单生成后库存自动扣减应收账款自动生成。再去会计模块看报表销售收入和库存成本都已经体现在利润表里了。这个链路跑通的意义非常大。很多开源系统所谓的“进销存”只是界面之间互相跳转数据根本不通。ever-gauzy 是真正把业务动作同步到了财务账上这本质上是 ERP 和进销存软件的本质区别也是企业最看重的部分。库存部分支持多仓库管理每个仓库有独立的库存数量。采购订单、销售订单、库存调整单都会影响对应仓库的存量。它没有像专业 WMS 那样做到库位级、批次级的精细但对大多数贸易型、零售型中小企业来说已经够用了。如果你要做服装鞋帽、日用百货、快消品代理这类业务ever-gauzy 的库存粒度跟实际需求是吻合的。再往下说会计模块。它预置了多套会计科目模板你可以在初始化的时候选择。多币种支持是这里的一个亮点你可以在发票上设置不同的币种系统按设定的汇率换算成本币入账。税务处理也做得比较细可以按税率模板设置不同地区不同的销项税和进项税规则。2.2 项目工时、员工薪资与 AI 功能的真实完成度除开业务和财务这条线ever-gauzy 还内置了项目管理和人力资源模块。项目管理部分允许你建项目、排任务、设置负责人和截止日期。最狠的地方在于它有计时器功能员工可以在任务上开启计时记录每小时的花费工时这些工时数据会流转到发票和工资模块里。这等于打通了一条从工时记录到客户账单再到员工工资的完整链路。服务型公司、外包开发团队会特别喜欢这个设计项目上用了多少人力、能卖给客户多少钱、员工该拿多少提成系统里都有据可查。我用它模拟过一个 30 人左右的开发团队场景项目经理分配任务、开发人员记录工时、财务在月底统一生成工资单这套流程在系统里是可以顺畅跑通的。工资模块支持按时薪或月薪计算可以设置加班费规则也能处理各种津贴和扣款项。它生成的工资单不仅能看到应发金额还能追溯到具体任务和项目工时这对于按项目核算人力成本的公司来说太关键了。还有一个我不能不提的——ever-gauzy 内部集成了 AI 面试和员工测评相关功能。这块是 Ever 生态的老本行他们在招聘 AI 上有积累。在实际项目里AI 模块可以用于初步筛选候选人、生成面试题目、甚至对候选人视频回答做情绪和压力分析。说实话这类功能在国内企业的实际接受度还有待验证但作为开源项目能内置这种能力确实比同类产品多了一个卖点。不过需要提醒的是AI 相关功能在部署时需要额外配置一些环境变量和模型服务。如果你只是想先跑通进销存和财务这些 AI 功能可以先不启用不影响主流程。2.3 它也有一堆做得不够好的地方我不能光夸不骂。ever-gauzy 对移动端适配是真的比较弱虽然页面能缩放但用手机浏览器操作收银台和审批流程的体验远不如桌面端。如果你的业务场景里店长需要经常用手机查看经营数据这套系统只能算“能用”离“好用”还有距离。多语言支持虽然提供了国际化框架但不少业务字段的中文翻译是缺失的部分页面会混着中英文显示。这一点对国内使用者来说比较伤需要社区或你自己花时间去汉化。报表功能也存在“有而不精”的问题。基础的销售报表、利润表、库存报表是有的但如果你想做像老板驾驶舱那种多维度可视化大屏或者复杂的同比环比分析就得依赖外部 BI 工具对接数据库了。此外它没有一个应用市场或插件商店。不像 Salesforce、Shopify 那样可以在商店里安装第三方应用ever-gauzy 的所有扩展都得基于源码开发。这既是灵活性的体现也是复杂度的来源——不是每个企业都有养一支开发团队。3. 本地部署与上手实操记录3.1 部署前需要准备的环境和耐心我测试时最深的感受是ever-gauzy 的分支和配置矩阵比一般开源项目要复杂。它同时支持 SQLite、PostgreSQL、MySQL 几种数据库还区分了本地开发模式和 Docker 生产部署模式。如果没有提前阅读文档很容易在环境变量这里卡住。我的建议是第一次尝试别直接上生产配置先在本地用 SQLite 跑起来把功能摸熟了再切换 PostgreSQL。SQLite 模式下几乎不需要额外配置npm 安装完依赖配置好环境变量就能启动。但要注意SQLite 只适合开发和演示生产环境务必换成 PostgreSQL否则并发一上来就会出现锁竞争问题。环境准备这块Node.js 版本要求 18 以上推荐 20 LTS 版本。包管理器建议用 npm 或者 pnpmYarn 在某些依赖版本下会有兼容性问题。另外还需要一个 Redis 实例ever-gauzy 用它来做跨进程的缓存同步、 Socket 消息转发和任务队列。我的经验是先把 Redis 准备好很多神秘问题其实是 Redis 没启动导致的。数据库的话直接装一个 PostgreSQL 14 以上版本即可。首次使用需要手动创建一个空数据库系统在首次启动时会自动执行迁移脚本建表不用你自己手写建表语句。整个过程中最容易出问题的其实是环境变量文件——默认的 .env 示例文件里数据库连接、Redis 地址、JWT 密钥都需要你改成自己的本地环境值。3.2 如何一步步启动整个项目第一步是拉取代码。ever-gauzy 在 GitHub 上的代码仓库分成前后端两个子仓库一个叫 ever-gauzy主体另一个是 gauzy-api目前已经并入主仓库。建议直接克隆主仓库最新的代码已经将前端、后端、CLI 工具整合在了一个单一代码库里。克隆完成后先复制一份环境变量示例文件git clone https://github.com/ever-co/ever-gauzy.git cd ever-gauzy cp .env.example .env然后编辑 .env 文件重点确认这几个配置项DB_HOSTlocalhost DB_PORT5432 DB_NAMEmy_gauzy_db DB_USERpostgres DB_PASSyourpassword REDIS_URIredis://localhost:6379 API_PORT3000 CLIENT_PORT4200接下来安装依赖。这个项目依赖非常多如果网络条件不好可能会失败推荐使用 npm 并配置好国内镜像源npm install依赖装完以后先启动数据库迁移和种子数据。ever-gauzy 提供了一个 CLI 工具可以一键完成建表和填充演示数据npm run db:migrate npm run db:seed:all最后在开发模式下同时启动后端和前端。你可以在两个终端里分别跑也可以用项目内置的并发命令一键启动npm run start:api npm run start:web启动完成后前端一般在 http://localhost:4200 访问后端接口在 http://localhost:3000/api。用管理员账号登录系统就能看到完整的工作台了。我第一次跑通时用了大概半小时大部分时间花在等 npm install 上实际配置并不复杂。3.3 部署后必做的验证清单系统启动不代表一切正常我建议按下面的顺序做一轮验证基本能覆盖大部分核心模块是否工作正常用提供的演示账号登录确认前端能正常加载且接口没有 CORS 报错。进入仪表盘查看今天的销售数据和图表确认统计接口返回的数据不是空的。创建一个测试产品走一遍采购、销售、退款流程检查库存数量是否同步变化。在会计模块打开利润表确认刚才的销售记录已经生成了对应的营业收入和成本分录。如果是多人在线使用场景开两个浏览器窗口同时操作一个资金账户验证并发期间数据是否一致。确认文件上传功能正常头像和产品图片能成功写入存储目录并可以被访问。这一套验证下来系统上没上正道基本一目了然。如果其中某一步数据没同步多半是后台任务队列没有正常工作优先检查 Redis 连接和 worker 进程。4. 适用场景、二次开发切入点与许可证风险4.1 到底什么样的团队和业务适合上 ever-gauzy先从反面说起——哪些情况不要用它。如果你的公司只是需要一个简单的记账工具或者只是把库存做个 Excel 替代那就别上 ever-gauzy。它的安装部署和日常维护成本远高于那几个轻量级 SaaS 工具对非技术型老板不太友好。真正适合 ever-gauzy 的是这几种场景第一种是年营收在几百万到几千万之间的零售、电商、贸易型公司需要打通 POS、库存、采购、财务这条业务流同时又不想每个月为多套 SaaS 系统付几种订阅费。第二种是外包开发公司或软件服务商自己有技术团队愿意在这套开源系统基础上做定制开发交付给有 ERP 需求的终端客户。第三种是海外业务公司需要一套原生的多币种多语言业务系统并且希望数据完全由自己掌控。跟市面上的商业 ERP 相比ever-gauzy 最大的优势在于代码开放、一次性成本清晰、可以按需裁剪。商业 ERP 先不说每年服务的费用光是那些你根本用不上的模块就够你烦的。它最大的劣势则在于快速上线这套技术栈相对冷门团队招人难是一方面文档和社区活跃度也不算特别高。4.2 想做二次开发从哪里入手比较高效我建议先熟悉它的目录结构。后端代码在根目录的 packages前端在另一个同级目录CLI 工具的入口是 packages/gauzy-cli。整体看下来angular 前端这部分的目录组织和数据模型对学过 Angular 的人相对友好对没学过的人“有边界感”特别强。做功能扩展时最常规的路子是在后端新建一个 Module然后在对应的 controller 里暴露 REST API再在前端用 Service 调用这个 API。因为项目大量使用 TypeORM 的 Entity 装饰器新建数据表基本不需要手写 SQL改完代码后跑一下迁移命令即可。这个流程对于有 NestJS 和 TypeORM 经验的开发者来说非常顺。如果你要做的是对标客户定制的报表我更建议直接用 SQL 查数据库再对接一个可视化面板工具而不是在 ever-gauzy 里硬造报表页面。它的灵活度在业务规则层不在报表可视化层。提醒一句开发前务必在 git 上切一个自己的分支。ever-gauzy 主分支更新频率不低如果你在本地改了大量代码会面临从上游频繁合并的冲突问题。我第一次折腾时没注意这个结果一次 git pull 把自己的修改全部冲掉了都是泪。4.3 许可证问题这个坑不能踩这一点必须单独拎出来说。ever-gauzy 用的不是大众熟知的 MIT 或 Apache 2.0 协议而是一个叫 Ever Gauzy Platform License 的专有许可证。这个许可证的核心意思是代码你可以看、可以改、可以内部使用也可以用来给第三方做商业服务但是你不能直接把原版或改名后的 ever-gauzy 作为 SaaS 产品对外多大销售也不能移除或修改版权声明。换句话说如果你是一个软件公司拿 ever-gauzy 给客户做私有化部署项目交付是基本可以操作的但如果你打算把它改一改做成一个多租户 SaaS 平台公开售卖那就需要仔细对照许可证条款甚至联系 Ever 团队购买商业授权。这不是道德问题是法律风险别等做大了再回头补课。看完许可证之后还要关注一下 Ever 生态的产品规划。Ever 团队长期在往 AI 方向投入除了这个 ERP 系统他们还有 AI 招聘、AI 销售助手这些产品线。这就意味着 ever-gauzy 以后大概率会越来越多地内置 AI 能力这既是想象力所在也带来了模型服务的部署成本和数据隐私问题。5. 常见问题与排查实录5.1 部署阶段我踩过的高频坑写代码这么多年进坑出坑都是常规操作。ever-gauzy 部署期的问题我总结下来其实就那么几类。先说类型报错。npm install 之后第一次启动就报一堆 TypeScript 类型错误后来发现是 Node 版本不对。项目要求的 Node 版本和本地版本差异太大时依赖编译会产生各种诡异错误。解决方案很简单用 nvm 切换到项目要求的版本。再说数据库连接失败。PHP 项目那种数据库连接失败一般会给出明确的提示这个项目的报错往往是你启动 API 时说某个端口没监听看半天也看不出跟数据库有什么关系。后来换了个思路先把 Postgres 单独用工具连了一遍确认账号密码没问题又查了 .env 里数据库名字和实际建好的库名是否一致最后把 Redis 也确认了一遍才彻底解决。还有一个容易被忽视的就是端口占用。前端默认跑 4200后端默认 3000如果你本地正好有别的服务占用了项目启动时不会主动告诉你“端口被占用”而是直接报一个含混的错误或者干脆无声退出。用 lsof 查一下端口析下立刻破案。5.2 运行期间遇到的问题及其排查思路系统好不容易跑起来不等于后面就顺风顺水。运行期最容易出问题的是后台任务。销售生成发票、邮件通知、定时任务这些操作都是通过队列异步处理的。如果你发现某个单据状态迟迟不更新某封邮件半天没发出去第一反应不应该是去翻业务代码而是去查队列 worker 进程还在不在。手动重启 worker 之后积压的任务会重新执行。另一个常见问题是文件上传失败。默认的图片上传路径有时候没有写入权限你在界面上传头像死活传不上去后台日志也不给明确报错。处理方式很直接给上传目录加上可写权限或者改环境变量把存储路径指到一个确定的目录。确认完再重新登录问题基本消失。数据序列化也是需要留意的点。前后端交互时有些日期字段会变成一串很难读的时间戳有些金额字段会出现浮点精度问题。这类问题多半跟 TypeORM 的数据库列类型映射有关。如果你准备做二次开发特别要注意金额字段最好用 decimal 类型别顺手改成 float不然到月底对账时你会怀疑人生。最后是多租户环境下的数据隔离性能问题。虽然 ever-gauzy 内置的组织机构设计可以承载多组织数据但在高并发场景下如果索引没建好跨组织查询会产生很重的性能开销。我在测试中给常用的外键字段补了索引后查询速度肉眼可见地提升了。5.3 一些我自己的使用建议用下来我最大的体会是不要把 ever-gauzy 当做一个开箱即用的成品软件来看把它理解成一个“比较完整的业务中台种子”更准确。它的数据模型设计得很全面这反而是它最大的资产。哪怕你最后不直接用它的界面把它的数据库结构和 NestJS 模块作为需求清单去开发一套更适合自己的系统也会节省大量调研时间。对于小团队先把销售点、库存、采购、财务这四件套跑通已经能覆盖我大部分线下零售业务的日常运营了。项目管理和工时模块可以留着等服务型业务起来了再慢慢用上。AI 功能这一块我更倾向于把核心业务跑顺之后再探索。从开发的角度说这套项目值得学习的东西其实不少。一个单体仓库里装下一整个业务平台模块怎么组织、异常怎么处理、数据校验怎么做、多语言怎么做这些工程决策的细节都值得过一遍。哪怕你不打算在项目里用它把它当做一个企业级 TypeScript 全栈项目的样板来读也绝对不亏。如果你打算深入定制建议按照模块粒度去读不要从头到尾硬啃展开速度会快很多。
返回列表