Skip to content

用户指南 13 · jeeflow-ui 流程中心(前端接入)

面向要把流程中心嵌进自己系统的集成方。后端只要实现了 规范 06 · 统一门面/wf/**(40+ 个 action), 前端不关心后端是 Java / Go / Python / Node / PHP。

和 vben5-wf 的分工:付费版完整后台(Ant Design、低代码档案、设计器属性二开)走 mldong-vben5;本文是开源 通用流程中心, 无 Ant Design、无 /sys/*、选人/字典/上传由宿主注入。

npm 尚未发布

@mldong/jeeflow-ui 还没上 npm(包内版本仍为 0.1.0)。当前请:

下文安装命令按发布后写法预留,发布前不要 npm add

1. 当前能做到什么

能力程度说明
工作台待办/已办/我发起/抄送统计 + 最近待办
发起 / 待办 / 已办 / 我发起 / 抄送 / 委托对齐 vben5-wf 流程中心 8 菜单(不含档案)
发起抽屉Tab:表单 / 流程图;选人、抄送、理由、附件(流程 JSON 开关)
办理抽屉Tab:详情 / 流程图 / 审批记录;actionBtns 分流;字段权限编辑;转办/加签
实例详情同上三 Tab;撤回 / 抄送 / 重新提交
Schema 表单__schema__.columns:Input/Textarea/Select/数字/日期;ApiDict/Upload 走 adapters
字段权限PERMISSION_f_* 优先,1 只读 / 2 可编 / 3 隐藏
自定义业务表单registerForm(formKey, 组件),未注册则走内置 SchemaForm
流程图高亮 + 处理人回显highLight / getAssigneeTextData
流程定义列表详情抽屉看图;启停 / 删除
流程设计⚠️ 画布级钉钉设计器画图、保存草稿、发布、导入 JSON没有 vben5 那套字段权限/按钮/schema 属性面板
选人办理候选走引擎 candidatePage;抄送/转办/委托走 adapters.listUsers
权限码显隐hasPermission(['wf:processTask:todoList']),不传则全放行
流程档案 / 低代码表业务能力,不进 jeeflow-ui
设计器 TaskDrawer 二开留给 vben5-wf;复杂配置用导入 JSON

运行时已经能执行字段权限、操作按钮、__schema__(从已发布 JSON 读出); 只是不能在画布里点出来——用设计页「导入 JSON」或在 vben5-wf 里设计后导出。

2. 三种接入方式(由轻到重)

① 直接用演示站     无需集成,给客户看引擎
② iframe 壳        异栈(若依等):嵌一页流程中心
③ Vue 组件包       同栈 Vue3:整页嵌入或拆抽屉/页面

2.1 演示站

jeeflow-demo.mldong.com —— 六语言后端切换,源码 jeeflow-ui/apps/demo

2.2 iframe(异栈)

源码样板:apps/embed(壳)+ apps/embed/public/host.html(宿主)。

宿主 → 壳(URL 或 postMessage,后者可热更新):

通道字段
URL?token=&backend=&operator=&theme=&site=&logo=
jeeflow:inittoken / backend / operator / theme: { primary, siteName, logo }
jeeflow:setOperatoroperator

壳 → 宿主

type时机
jeeflow:ready壳挂载完成
jeeflow:event发起 / 办理 / 撤回(event + action + operator
jeeflow:todo-count待办数(首取 + 轮询)

选人等 adapters 在 embed 壳进程里注入(壳自己 createJeeflowUi),不要让 ui-kit 去打宿主 /sys/user/select。需要搜人时,壳把 listUsers 做成对父页的 postMessage RPC 即可。

2.3 Vue 组件包(同栈,发布后)

bash
pnpm add @mldong/jeeflow-ui vue mldong-flow-designer-dingtalk

vuemldong-flow-designer-dingtalk 是 peer(设计器/预览画布用钉钉包)。

ts
import { createApp } from 'vue'
import { createJeeflowUi, JeeflowUiKey, JfLayout } from '@mldong/jeeflow-ui'
import '@mldong/jeeflow-ui/dist/jeeflow-ui.css' // 若构建拆出独立 css,按实际文件名

const jeeflowUi = createJeeflowUi({
  baseUrl: () => '/api',                 // 门面根,请求打到 {baseUrl}/wf/{action}
  getOperator: () => store.userId,       // 当前用户 → 门面 operator
  getToken: () => store.token,           // 可选,Authorization: Bearer
  hasPermission: (codes) => hasAny(codes),
  adapters: {
    listUsers: (kw, ctx) => sysUserSelect(kw),
    getUsersByIds: (ids) => sysUserByIds(ids),
    getDict: (code) => dictApi(code),
    upload: (file) => oss.put(file),
  },
})

jeeflowUi.registerForm('leave-form', LeaveForm)

createApp(App).provide(JeeflowUiKey, jeeflowUi).mount('#app')

也可包一层 <JeeflowUiProvider :config="...">,效果相同。

3. 整页流程中心(推荐默认)

对齐 vben5-wf 的 8 个流程菜单 + 工作台,宿主只提供壳(登录 / 顶栏):

vue
<script setup>
import {
  JfLayout,
  JfWorkbenchPage, JfApplyListPage, JfTodoPage, JfDonePage,
  JfMyInstancePage, JfCcListPage, JfProcessDefinePage,
  JfProcessDesignPage, JfSurrogatePage,
} from '@mldong/jeeflow-ui'

const menus = [
  { key: 'workbench', title: '工作台', icon: 'home', component: JfWorkbenchPage },
  { key: 'apply', title: '发起申请', icon: 'apply', component: JfApplyListPage },
  { key: 'todo', title: '我的待办', icon: 'todo', component: JfTodoPage },
  { key: 'done', title: '我的已办', icon: 'done', component: JfDonePage },
  { key: 'mine', title: '我发起的', icon: 'mine', component: JfMyInstancePage },
  { key: 'cc', title: '我的抄送', icon: 'cc', component: JfCcListPage },
  { key: 'define', title: '流程定义', icon: 'define', component: JfProcessDefinePage },
  { key: 'design', title: '流程设计', icon: 'design', component: JfProcessDesignPage },
  { key: 'surrogate', title: '我的委托', icon: 'surrogate', component: JfSurrogatePage },
]
</script>

完整拼菜单见演示站 apps/demo/src/App.vue。按钮显隐跟 hasPermissionwf:{action} 权限码。

白标:覆盖 CSS 变量即可(--jf-primary--jf-header-bg 等),不必改组件。

4. 拆着用(只要办理抽屉 / 只要 API)

ts
import { useJeeflowUi, JfApproveDrawer, JfStartDrawer, SubmitType } from '@mldong/jeeflow-ui'

const { api, can } = useJeeflowUi()
const todos = await api.processTask.todoList({ pageNum: 1, pageSize: 10 })
await api.processTask.execute(taskId, SubmitType.AGREE, { tf_approvalComment: '同意' })

页面、抽屉、JfUserPicker / JfFlowViewer / JfApprovalRecord 均可单独挂到宿主路由。 必须包在 createJeeflowUi / JeeflowUiProvider 里。

5. 宿主 adapters(不要写死 /sys)

ui-kit 不调用宿主 REST。缺哪个 adapter,对应控件降级。

adapter用途不传时
listUsers(keyword, ctx)抄送 / 转办 / 委托 / 指定下一处理人提示注入
getUsersByIds(ids)已选 chips 回显姓名显示 userId
listRoles(keyword)预留给设计器按角色指派目前设计器薄面板未做,注入了也暂不消费
getDict(code)SchemaForm ApiDict空下拉
upload(file)发起附件 / SchemaForm Upload只存文件名

选人优先级:scene=candidate 且有 taskId → 门面 processTask/candidatePage; 否则 adapters.listUsers。流程 JSON 里的 selectUserApi 只作为 ctx.apiHint,ui-kit 不直接 fetch。

ts
adapters: {
  listUsers: async (keyword, ctx) => {
    // ctx.scene: candidate | nextOperator | cc | surrogate | assignee
    const rows = await myUserApi.search(keyword)
    return rows.map((u) => ({
      userId: String(u.id),
      realName: u.name,
      deptName: u.deptName,
    }))
  },
}

6. 业务表单

ts
jeeflowUi.registerForm('leave-form', LeaveForm)

组件约定:modelValuef_ 字段)+ defineId / instanceId;办理页另有 task。 节点 properties.form 对上 formKey 即用该组件;对不上(或 SchemaWfForm)走内置 SchemaForm。

7. 设计器:够演示,不替代 vben5

JfProcessDesignPage 能:钉钉风画布、保存/发布、导入 LogicFlow JSON。

不能:在属性面板里配字段权限、操作按钮、可视化 schema——这些运行时认 JSON, 作者侧用「导入 JSON」或到 vben5-wf 设计。设计器扩展见 指南 12(那是 mldong-flow-designer-plus 的二开,不是本包)。

8. 后端前提

要求
门面POST {baseUrl}/wf/{action}{code,msg,data}code=0 成功
operator前端 getOperator() 自动写入;后端也可覆盖
扩展仓储流程设计 / 委托需要 IProcessExtRepository;纯内存 demo 已带
CORS前后端不同源时放行

非 mldong 框架(若依等)先按 指南 10 §6 做转发 controller,再选 iframe 或 Vue 包。

9. 相关

jeeflow · 轻量级多语言工作流引擎