开源地址
https://gitee.com/rainterm/designer-approval
https://github.com/rainterm/designer-approval
审批工作流系统
简介
基于 designer-admin 脚手架二次开发的可视化审批工作流系统,面向企业内部请假、报销、用印等通用审批场景:管理员在线设计流程与表单并发布,员工发起申请,审批人办理待办。
项目特点:
- 开箱即用:流程定义、发起、待办、转办、驳回重提、办理轨迹与附件一应俱全,含请假演示流程,克隆即可试用。
- 可视化设计:bpmn-js 流程画布 + 表单设计 + 节点审批人配置,四步向导完成建模,无需手写 BPMN。
- 审批人配置灵活可插拔:实现
AssigneeTypeHandler并@Component注册即可扩展类型,设计器按元数据自动渲染配置项。
界面预览










内置能力
| 能力 | 说明 |
|---|---|
| 流程设计 | 四步向导:基础信息 → BPMN → 发起表单 → 节点审批人;草稿 / 发布 / 停用 |
| 表单设计 | 可视化字段配置,发起按 schema 渲染;实例保存 schema 快照 |
| 审批人配置 | 发起人 / 用户 / 角色 / 部门 / 上级岗位;Handler 可插拔扩展 |
| 多人模式 | 或签(一人同意即可)/ 会签(全部同意) |
| 发起与办理 | 发起、同意、驳回、转办、撤销;侧栏待办 / 待重提角标 |
| 驳回策略 | 驳回到上一审批节点,或驳回到发起人节点后可改表单重提 |
| 附件 | 发起 / 重提 / 同意 / 驳回 / 转办各阶段可挂附件 |
| 办理轨迹 | 记录发起、同意、驳回、转办、抄送、撤销、结束等动作 |
| 演示流程 | 内置请假 demo(按天数分支 + 上级岗位会签) |
流程设计
- 向导四步:基础信息(名称、编码 /
processDefinitionKey、描述)→ bpmn-js 流程画布(中文面板)→ 发起表单 schema → 按节点配置审批人、多人模式、驳回模式。 - 状态:
草稿(0)→已发布(1)↔停用(2);仅已发布可发起。 - 发布时后端 enrich BPMN(多实例、assignee 表达式);审批人 ID 写在
designJson.taskAssignees,不硬编码进 BPMN。
审批人配置
内置类型(均可替换 / 扩展,无需改核心解析逻辑):
| 类型 | 含义 |
|---|---|
INITIATOR |
申请发起人本人 |
USER |
指定用户(可多选) |
ROLE |
拥有所选角色的启用用户 |
DEPT |
所选部门下的启用用户 |
SUPERIOR_POST |
以指定节点审批人为基准,按岗位沿部门向上查找任职人 |
扩展方式:实现 AssigneeTypeHandler(type / label / configFields / resolve)并 @Component 注册;AssigneeTypeRegistry 自动收集。设计器通过 GET /admin-api/approval/definition/assignee-types 拉取类型与字段元数据动态渲染。inputType 约定:user / role / dept / post / ref_node。
多人:OR 或签 / AND 会签(Camunda 多实例)。驳回:PREVIOUS(上一节点)或 INITIATOR(发起人节点,默认)。
发起与办理
- 发起:选已发布流程 → 填表单 / 附件 → 写
appr_instance并启动 Camunda 实例。 - 待办 / 已办:按当前用户查 Camunda Task。
- 办理:同意 / 驳回(意见 + 附件);驳回按节点策略回退。
- 转办 / 撤销 / 重提:转办他人;发起人撤销运行中实例;驳回到发起人节点后可改表单重提。
实例状态:running / approved / rejected / cancelled。
附件与轨迹
- 附件阶段落
appr_attachment:start/resubmit/approve/reject/transfer。 - 办理历史落
appr_history:start/approve/reject/transfer/cc/cancel/end等。
设计
技术栈选择
| 层 | 选型 | 版本 | 选择理由 |
|---|---|---|---|
| 运行时 | JDK | 25 | 虚拟线程等现代特性 |
| 后端框架 | Solon | 4.1.0 | 轻量、启动快;沿用 designer-admin 脚手架 |
| ORM | MyBatis-Plus | 3.5.x | 业务表 CRUD |
| 流程引擎 | Camunda | 7.22 | 嵌入式引擎,复用业务库,ACT_* 自动建表 |
| BPMN 模型 | camunda-bpmn-model | 同引擎 | 发布前 enrich 多实例与 assignee |
| 鉴权 | Sa-Token | 1.46 | 登录与权限(脚手架) |
| 数据库 | MySQL | 8.0.13+ | 业务库 + Camunda 表 |
| 缓存 / 会话 | Redis | 7 | 会话、缓存(脚手架) |
| 前端 | Vue 3.5 + Naive UI + Vite | — | 管理后台 |
| 流程设计器 | bpmn-js + camunda-bpmn-moddle | 18.x | 可视化 BPMN 编辑 |
开发规范
完整约定见 docs/开发规范.md。编码风格以工具可校验的规则为准:
- 后端:根
pom.xml集成 PMD + P3C,mvn pmd:pmd扫描。 - 前端:ESLint(
eslint.config.js),pnpm run lint/lint:fix。
部署脚本
deploy/ 下提供「本机打包 + Docker 运行」脚本,数据库与应用分开部署:
| 脚本 | 作用 |
|---|---|
install-env.sh |
检查 / 安装 Docker、JDK 25、Maven、Node.js(--check 仅检查) |
deploy-db.sh |
启动 MySQL + Redis(不自动建表) |
deploy-app.sh |
本地 Maven + 前端打包,构建镜像并启动 Server / Web |
deploy-minio.sh |
可选,本地 MinIO |
stop.sh / restart.sh / logs.sh |
停止、重启、查看日志 |
文档说明
| 文档 | 说明 |
|---|---|
| docs/开发规范.md | 前后端编码约定、模块依赖、新增业务模块 |
| docs/SSO.md | 单点登录(脚手架能力) |
| deploy/ | Docker 部署与 Nginx / Dockerfile |
| sql/init/mysql/approval/ | 审批表结构、菜单字典、请假 BPMN demo |
后台设计考虑
分层结构
designer-approval/
├── designer-common/ # 通用契约(脚手架)
├── designer-framework/ # 技术能力与 SPI(脚手架)
├── designer-module-system/ # 用户 / 角色 / 部门等(脚手架)
├── designer-module-approval/
│ ├── approval-api/ # 跨模块契约(预留)
│ └── approval-service/
│ ├── util/ # ApprovalJsonUtil / BpmnModelUtil 等工具
│ ├── config/ # Camunda 引擎装配
│ └── service/ # 业务能力
│ ├── definition/ # 流程定义用例(接口+实现)
│ ├── runtime/ # 运行时用例 + 通知 / 节点判定 / VO 组装(接口+实现)
│ ├── assignee/ # 审批人类型扩展 + 发起时变量解析(接口+实现)
│ └── bpmn/ # Enricher / Reader / Navigator(接口+实现)
├── designer-server/ # 启动组装
├── designer-ui/admin-web/ # 前端(含 modules/approval)
├── sql/init/mysql/approval/ # 审批初始化 SQL
├── deploy/ # Docker 部署
└── docs/ # 开发规范等
一次审批请求的典型路径:
Controller(definition / instance / task)
→ ApprDefinitionService / ApprRuntimeService
→ Camunda RepositoryService / RuntimeService / TaskService
→ Mapper(appr_definition / instance / history / attachment)
→ MySQL(业务表 + ACT_*)
核心组件
| 类 | 职责 |
|---|---|
CamundaEngineConfig |
嵌入式引擎,共用业务 DataSource,ACT_* 自动建表 |
ApprovalBpmnEnricher |
发布前规范化 BPMN(多实例 / assignee 表达式) |
ApprovalBpmnReader |
读取用户任务与扩展属性 |
ApprovalBpmnNavigator |
驳回目标、入边、已走路径推断 |
AssigneeTypeHandler / AssigneeTypeRegistry |
审批人类型扩展接口与注册表 |
AssigneeResolver |
解析门面,委托各 Handler |
ApprDefinitionService |
定义 CRUD、发布、启停、审批人类型列表 |
ApprRuntimeService |
运行时编排:发起、办理、转办、撤销、重提 |
InstanceAssigneeVariableBuilder |
发起时按 taskAssignees 解析审批人变量(assignee) |
ApprovalNotifier |
待办 / 转办 / 驳回等消息通知(runtime) |
ApprovalTaskClassifier |
抄送 / 发起人节点判定与设计数据读取(runtime) |
ApprInstanceAssembler |
实例 / 任务 / 历史 VO 组装(runtime) |
数据模型
业务表(ACT_* 由引擎首次启动创建):
| 表 | 说明 |
|---|---|
appr_definition |
流程定义:BPMN、designJson、formSchema、发布状态 |
appr_instance |
审批实例与表单 / 变量快照 |
appr_history |
办理历史 |
appr_attachment |
各阶段附件 |
主要 API 前缀:/admin-api/approval/definition|instance|task。
接口文档
- OpenAPI2 + Knife4j:
http://localhost:8080/doc.html - 生产建议
KNIFE4J_ENABLE=false,或KNIFE4J_PRODUCTION=true并限制内网访问。
前端设计考虑
分层结构
审批前端落在业务模块目录,不侵入壳层:
designer-ui/admin-web/src/modules/approval/
├── api/ # 审批接口
├── menuBadges.js # 待办 / 待重提角标
├── views/definition/ # 流程设计向导、bpmn-js 扩展
├── views/instance/ # 我的申请 / 全部申请 / 详情
└── views/task/ # 我的审批
路由由菜单 component(如 approval/definition/index)动态解析到 modules/approval/views/...,新增页面只加目录与菜单即可。
流程设计器
- 基于 bpmn-js,扩展 Palette / ContextPad / 属性面板与中文翻译。
- 向导与运行时共用设计产物:
bpmnXml+designJson+formSchema。 - 选人、字典文案等复用脚手架公共组件与
useDict。
快速开始(本地开发)
0. 环境要求
| 组件 | 版本 | 说明 |
|---|---|---|
| JDK | 25+ | 后端编译与运行 |
| Maven | 3.9+ | 后端构建 |
| Node.js | 18+(推荐 22) | 前端构建 |
| pnpm | 10.x | 前端包管理 |
| MySQL | 8.0.13+ | 业务库 + Camunda |
| Redis | 7 | 会话、缓存(必需) |
bash
cd deploy
./install-env.sh --check # 仅检查
./install-env.sh # 按需安装
1. 准备 MySQL 与 Redis
连接信息在 designer-server/src/main/resources/app.yml,支持环境变量覆盖:
- MySQL:
DB_HOST/DB_PORT/DB_USER/DB_PASSWORD/DB_NAME - Redis:
REDIS_HOST/REDIS_PORT/REDIS_PASSWORD/REDIS_DB
默认库名 designer_approval。本地也可用 Docker 只起数据库:
bash
cd deploy
cp .env.example .env
./deploy-db.sh # MySQL + Redis,不自动建表
2. 初始化数据库
脚本为破坏性初始化(
DROP TABLE重建 + 种子数据),仅首次或需要重置时执行,勿对有数据的库重复运行。
bash
# 交互式
bash sql/init/mysql/00-run-init.sh
# 免交互
DB_HOST=127.0.0.1 DB_PORT=3306 DB_USER=root DB_PASSWORD=root DB_NAME=designer_approval \
bash sql/init/mysql/00-run-init.sh
导入顺序:_base → system → demo → approval。Camunda ACT_* 表在应用首次启动时由引擎自动创建。
3. 启动后端
在 IDE 中运行 com.designer.admin.DesignerApp(模块 designer-server),或:
bash
mvn -pl designer-server -am -DskipTests clean package
java -jar designer-server/target/designer-server.jar
启动后:
- 管理端 API:
http://localhost:8080/admin-api - 健康检查:
GET http://localhost:8080/admin-api/system/health - 接口文档:
http://localhost:8080/doc.html
4. 启动前端
bash
cd designer-ui/admin-web
pnpm install
pnpm run dev # http://localhost:5173
pnpm run build # 产出 dist/
开发环境已配置 Vite 代理,/admin-api、/app-api、/open-api 转发到 http://localhost:8080。
默认账号
| 账号 | 密码 | 说明 |
|---|---|---|
| admin | admin123 | 超级管理员(流程设计、全部申请) |
| guest | guest123 | 普通用户(我的申请 / 我的审批) |
请假 demo 另有 leave_* 账号(见 sql/init/mysql/approval/data.sql)。生产环境务必修改或删除演示账号。
试用请假流程
admin登录 → 审批模块 → 流程设计 → 打开「请假审批」→ 发布leave_staff(或有发起权限的账号)→ 我的申请 → 发起- 按节点用
leave_xz/leave_kz等在 我的审批 中办理
生产部署
数据库与应用分开部署:本机用 JDK / Maven / Node 打包,再构建运行镜像;MySQL、Redis 与应用容器分离。
部署流程
bash
cd deploy
# 1. 检查并按需安装环境
./install-env.sh
# 2. 配置环境变量
cp .env.example .env
vim .env
# 3. 启动 MySQL + Redis(不自动建表)
./deploy-db.sh
# 4. 首次 / 重置时初始化数据库
(cd .. && bash sql/init/mysql/00-run-init.sh)
# 5. 本地打包 + 构建镜像 + 启动 Server / Web
./deploy-app.sh
可选:./deploy-minio.sh 启动本地 MinIO。使用外部数据库时,配置 .env 中 DB_* / REDIS_* 后执行 ./deploy-app.sh 即可。
常用命令
| 命令 | 说明 |
|---|---|
./install-env.sh |
检查并安装环境(--check 仅检查) |
./deploy-db.sh |
启动 MySQL、Redis |
./deploy-minio.sh |
启动本地 MinIO(可选) |
./deploy-app.sh |
本地打包并部署应用 |
./deploy-app.sh --skip-build |
跳过打包,复用已有产物 |
./restart.sh app / ./stop.sh app |
重启 / 停止应用 |
./logs.sh server |
查看后端容器日志 |
访问入口
| 入口 | 默认端口 | 说明 |
|---|---|---|
| 管理后台 | APP_PORT=80 |
浏览器访问 http://<服务器IP> |
| 后端 API | SERVER_PORT=8080 |
仅绑定 127.0.0.1,经 Nginx 转发 |
| 接口文档 | SERVER_PORT |
生产建议 KNIFE4J_ENABLE=false |
日志
- 文件日志:容器内
/app/logs/,挂载在server_logs卷。 - 容器 stdout:
./logs.sh server;compose 限制max-size=50m/max-file=5。 - 可通过
solon.logging.appender.file.*或LOG_PATH调整。
发布与运维
- 日常发版只执行
./deploy-app.sh;--skip-build可复用已有产物。 - 禁止对生产库重跑破坏性初始化脚本;增量 SQL 按版本执行并登记。
- 修改
.env默认密码与VAULT_PASSWORD;多实例时共用 Redis,各实例 QuartzinstanceId须不同。 - 健康检查:
GET /admin-api/system/health。


评论