Bpmn.js 进阶指南之Lint流程校验(四)自定义检验

简介: Bpmn.js 进阶指南之Lint流程校验(四)自定义检验

前言


关于 bpmn.js 的流程图校验工具 “bpmnLint”,在之前已经分了三小节讲解了默认规则的使用方式和整个校验过程。如果有没有看过的同学可以查看专栏 bpmn.js 进阶指南 中的 【Bpmn.js 进阶指南之Lint流程校验(1,2,3)】


当然个人更加推荐的是将默认规则提取到自己的项目中,有利于理解校验过程和二次开发。本小节则侧重于自定义规则的编写


1. 回顾 bpmnlint 的使用


因为最终所有的规则配置和bpmnlint校验模块都会打包成一个 js 代码,提供给浏览器编译和执行,所以这里只简单回顾一下默认规则的js文件编写。


1.1 首先,安装相关依赖


这里需要安装两个依赖包:


  1. bpmnlint:规则校验的执行者,通过 Resolver 函数来引用和解析规则配置,并输出校验结果


  1. bpmn-js-bpmnlint:负责触发规则校验和显示校验结果


我们可以直接在项目中进行安装:


npm install bpmnlint bpmn-js-bpmnlint


1.2 配置编译规则


Bpmn.js 进阶指南之Lint流程校验(三) 中已经大致讲述了,我们可以直接使用 bpmn-js-bpmnlint 来注册校验模块,引用 bpmnlint 中的规则来进行二次规则开发。但是在初始化 bpmn-js-bpmnlint 就需要传入一个规则配置对象和 Resolver 规则解析函数。


所以,首先我们新建一个 bpmnlintModule.js 的文件,用来引入默认规则和 Resolver:


import conditionalFlowRule from "bpmnlint/rules/conditional-flows";
// ... 剩余规则同样方式引入
// 规则缓存对象
const cache = {}
// 缓存规则函数
cache["bpmnlint/conditional-flows"] = conditionalFlowRule;
// Resolver 构造函数(这里可以直接使用官方提供的编译后版本)
function Resolver() {}
Resolver.prototype.resolveRule = function (pkg, ruleName) {
  const rule = cache[pkg + "/" + ruleName];
  if (!rule) {
    throw new Error("cannot resolve rule <" + pkg + "/" + ruleName + ">");
  }
  return rule;
};
Resolver.prototype.resolveConfig = function (pkg, configName) {
  throw new Error("cannot resolve config <" + configName + "> in <" + pkg + ">");
};
// 导出 resolver 实例
export const resolver = new Resolver();
// 导出 需要启用的规则
const rules = {
  "conditional-flows": "error",
  // ...
};


1.3 配置 Modeler


在以上规则配置完成之后,就可以进行 Modeler 的实例化了。


import Modeler from "bpmn-js/lib/Modeler";
// 流程图校验部分
import lintModule from "bpmn-js-bpmnlint";
import { resolver, rules } from "@packages/additional-modules/Lint/bpmnlint";
const modeler = new Modeler({
  container: document.querySelector('#bpmn-canvas'),
  additionalModules: [
    lintModule
  ],
  linting: {
    active: true, // 默认直接开启校验
    bpmnlint: {
      config: {
        rules: { ...rules, "task-node-required": "error" }
      },
      resolver
    }
  }
})


至此,一个包含有默认规则校验配置的流程图实例就算是结束了。


2. 自定义校验规则


在上一节 Bpmn.js 进阶指南之Lint流程校验(三) 中,讲过了 bpmnlint 提供的 Linter 实例,在执行流程校验时其实就是遍历了 rules 中的配置规则,找到相应的校验函数来校验;通过 applyRule 方法调用 testRule 来执行校验函数中的 check() 方法。


所以,每一个规则校验函数都至少需要包含一个 check 方法


本身每个 rule 规则函数可以配置还有 enter 和 leave,但是通常情况下我们直接返回一个 check 函数即可,这里直接根据官方的例子来说明。


2.1 创建规则函数


这里,我们假设有一个新规则:每个流程或者子流程必须包含一个任务类型节点。


首先,创建一个校验文件 task-required.js


const { is, isAny } = require("bpmnlint-utils");
module.exports = function () {
  function hasTask(node) {
    const flowElements = node.flowElements || [];
    return flowElements.some((node) => is(node, "bpmn:Task"));
  }
  function check(node, reporter) {
    if (!isAny(node, ["bpmn:Process", "bpmn:SubProcess"])) {
      return;
    }
    if (!hasTask(node)) {
      const type = is(node, "bpmn:SubProcess") ? "Sub process" : "Process";
      reporter.report(node.id, type + " is missing task node");
    }
  }
  return { check };
};


上面的 is 和 isAny 函数可以改成 bpmn-js 中的一些函数,或者一些自定义方法。


2.2 注册新建规则


这一步其实很简单,只需要在上面创建的 bpmnlintModule.js 中将该规则函数引入,并添加到 cacherules 中。


import taskRequired from "./customLintRules/task-required";
// ... 省略上面的部分
cache["bpmnlint/task-required"] = taskRequired;
rules["task-required"] = "error"; // 校验结果分类,分为 error 错误类 和 warning 警告类


最后,刷新页面重新实例化 Modeler 即可使用新建规则:


网络异常,图片无法展示
|


3. check 函数


check 函数接收两个参数:node 和 reporter


  • node:当前遍历到的元素实例


  • reporter:负责输出校验结果


其中 reporter 函数也接受两个参数:


  • id:节点的 id,用来处理错误信息的保存位置


  • message:错误信息


整个自定义规则函数需要返回一个对象,其中 check 函数就作为返回对象的方法,提供给后面 Linter 执行校验时执行。


至此,Bpmn.js 的校验配置和解析就大致结束了。但是怎么去美化错误信息提示、默认的错误信息提示的实现方式,都可以在后面慢慢说明。


目录
相关文章
|
6月前
|
开发框架 前端开发 JavaScript
在Vue&Element前端项目中,使用FastReport + pdf.js生成并展示自定义报表
在Vue&Element前端项目中,使用FastReport + pdf.js生成并展示自定义报表
|
4月前
|
JavaScript 前端开发
JavaScript基础知识-流程控制之while循环
这篇文章介绍了JavaScript中的while循环和do...while循环的基础知识,并通过一个实际案例演示了如何使用while循环计算投资增长到特定金额所需的年数。
72 2
JavaScript基础知识-流程控制之while循环
|
5月前
|
存储 前端开发 JavaScript
javascript 异常问题之为自定义异常提供丰富的上下文信息如何实现
javascript 异常问题之为自定义异常提供丰富的上下文信息如何实现
|
2月前
|
监控 JavaScript 算法
深度剖析 Vue.js 响应式原理:从数据劫持到视图更新的全流程详解
本文深入解析Vue.js的响应式机制,从数据劫持到视图更新的全过程,详细讲解了其实现原理和运作流程。
|
3月前
|
移动开发 JavaScript 前端开发
原生js如何获取dom元素的自定义属性
原生js如何获取dom元素的自定义属性
98 4
|
4月前
|
JavaScript 前端开发
JavaScript基础知识-流程控制之for循环
这篇文章讲解了JavaScript中的for循环的基础知识,并通过一个实例演示了如何使用for循环来找出所有的三位水仙花数。
66 6
JavaScript基础知识-流程控制之for循环
|
4月前
|
JavaScript 前端开发
js_Ipv4以及ipv4段正则校验
几种JavaScript正则表达式,用于校验IPv4地址的有效性,包括支持CIDR表示法的变体。
101 4
|
5月前
|
前端开发 JavaScript 数据安全/隐私保护
前端JS正则校验密码之3种实现方式
这篇文章展示了三种使用JavaScript正则表达式来校验密码的方法,密码需要满足包含大写字母、小写字母、数字及特殊字符,并在8到16位之间,同时提供了示例代码和实现效果。
173 1
前端JS正则校验密码之3种实现方式
|
5月前
|
前端开发 微服务 API
微服务浪潮下的JSF革新:如何在分散式架构中构建统一而强大的Web界面
【8月更文挑战第31天】随着微服务架构的兴起,企业将应用拆分成小型、独立的服务以提高系统可维护性和可扩展性。本文探讨如何在微服务架构下构建和部署JavaServer Faces (JSF) 应用,通过RESTful服务实现前后端分离,提升灵活性和适应性。
71 1
|
5月前
|
前端开发 程序员
HTML+CSS+JavaScript制作动态七夕表白网页(含音乐+自定义文字)
一年一度的520情人节/七夕情人节/女朋友生日/程序员表白,是不是要给女朋友或者正在追求的妹子一点小惊喜呢,今天这篇博客就分享下前端代码如何实现HTML+CSS+JavaScript制作七夕表白网页(含音乐+自定义文字)。赶紧学会了,来制作属于我们程序员的浪漫吧!
160 0