ferry 源码笔记:Gin + Vue 的开源工单系统,流程引擎怎么落地

ferry 是一套工单系统兼工作流引擎,6600+ star,MIT,后端 Gin、前端 Vue + Element UI,前后端分离。它把「提单—按流程流转—处理—结单」这条链做成可配置的:流程、模板、处理人都能在页面里配,配好就能生成工单,不用再为每种审批流改代码。

是什么

README 的功能分两块。流程中心:通过灵活配置流程和模板快速生成工单;流程节点可绑定任务做钩子,目前支持绑邮件通知处理,也允许自己写任务脚本接别的通知方式;处理形态覆盖串行、并行,以及按条件判断的节点跳转(排他网关、并行网关);处理人可用变量设置,比如直接负责人、部门负责人、HRBP。系统管理:基于 casbin 的 RBAC 权限,借鉴 go-admin 的前端权限管理,页面上可对菜单、页面按钮、API 接口分别配置。

工单侧还有提交申请、工单统计、多维度列表(我创建的、我相关的、我待办的、所有工单)、催办、转交、手动结单、加签、流程分类。没做到哪一步:通知提醒 README 明写「目前仅支持邮件」;另外作者说新版工单演示地址是非开源的,正在用新技术重构最新版,仓库这份是 Gin+Vue 的开源版本。

技术栈与部署

go.mod 里能看到后端依赖:Gin、GORM、casbin(配 gorm-adapter 把策略存库)、RichardKnop/machinery 做任务队列,登录支持 LDAP,鉴权用 JWT。前端是独立仓库 ferry_web(Vue + Element UI),用 pnpm 构建。依赖 MySQL 和 Redis。仓库里有现成的 docker-compose.yml,起三个服务:

# 摘自仓库 docker-compose.yml(README 只给了文档链接,命令在这里)
ferry_mysql:  image: mysql:8      # 库 ferry, root/123456
ferry_redis:  image: redis:latest
ferry:        build: ./Dockerfile
              ports: ["8002:8002"]
              depends_on: [ferry_mysql, ferry_redis]
              volumes: ["./config:/opt/workflow/ferry/config"]

docker-compose up -d    # 起来后访问 8002 端口

Go 与 Node 的精确版本 README 没写,但仓库脚本里有线索:build.sh 的自检要求 MySQL>=5.7、Go>=1.14、node>=v12,Dockerfile 里实际用 golang:1.23 和 node:22 编译。不走 Docker 的话,产物是单个 ferry 二进制,初始化和启动分两步:./ferry init -c=config/settings.yml 建表、./ferry server -c=config/settings.yml 启动。

值得抄的三点

  • 工单状态机的落地方式。「我创建 / 我相关 / 我待办 / 所有」四个视图,本质是同一条工单记录按状态 + 当前处理人做的不同过滤,没必要各建各的表:待办 = 处理人是当前用户且状态未处理,其余是权限范围的差别。催办、转交、手动结单、加签都是状态迁移上的动作。抄这套的思路是:状态用枚举,动作触发流转,视图全是查询条件。
  • 流程和模板分开配、处理人做成变量。流程管节点跳转(串行/并行/排他网关/条件),模板管表单字段,工单由「流程 + 模板」实例化;关键是把「谁来处理」抽成运行时解析的变量(创建者、负责人、HRBP),而不是写死某个账号。流程引擎要跨组织复用,靠的就是这一层变量,换一套架构不用改引擎。
  • casbin RBAC 做到三层一致。菜单、页面按钮、API 接口权限都在同一套 casbin 模型里配、策略存进库,前端隐藏按钮的同时后端接口也用同一策略拦。很多后台栽在「前端藏了按钮、后端接口还敞着」,把两层权限收敛到一份 casbin 模型是省事的做法。

别踩的坑

  • 前后端是两个仓库(ferry 和 ferry_web),本地开发要各自起。build.sh 的 install 会先 rm -rf ./ferry_web 再 clone 官方前端,你改过的前端代码会被直接冲掉,动手前先备份。
  • machinery 任务队列依赖 Redis(或消息后端),流程节点的通知/钩子都走队列异步执行。settings.yml 里 MySQL 和 Redis 只要配错,工单流转能过但通知静默不响,README 也专门提醒这两项必须配对。
  • 开源的是这套 Gin+Vue 版本,演示上跑的「新版工单」是非开源的,作者在重构最新版并把新版本优先放进付费群。开源能读到的和演示看到的不是一套,功能差异 README 没写,得自己试。

许可证

MIT,Copyright 2024 lanyulei。允许商用、修改、闭源再分发,条件是保留原作者的版权声明和许可证文本。也就是说把 ferry 改名、封成自己的 SaaS 对外卖是合规的,只要 LICENSE 和版权声明留着,别把署名抹掉就行。

© 版权声明
THE END
喜欢就支持一下吧
点赞5 分享
评论 共1条

请登录后发表评论

    • 头像打铁的老王0