предисловие
В: Что такое bpmn.js?
"
bpmn.jsЭто набор инструментов рендеринга BPMN2.0 и средство веб-моделирования, которое позволяет выполнять функцию рисования блок-схем во внешнем интерфейсе.
В: Почему я пишу эту серию учебников? 🤔️
"
Из-за потребностей бизнеса компании его необходимо использовать в проектеbpmn.js
, Однако из-заbpmn.js
Разработчики игры зарубежные друзья,поэтому отечественных методических материалов мало и нет подробных документов.Поэтому много способов использования и много ям приходится искать самому.Поразмыслив,решил написать серию учебные материалы об этом. чтобы помочь большеbpmn.js
Пользователи или разработчики, которые ищут хороший способ рисовать блок-схемы, в то же время для них это еще и своего рода консолидация.
Поскольку это серия статей, она может часто обновляться.Пожалуйста, простите меня, если вы случайно смахнули его, и это не то, что вам нужно😊.
Не просите похвалы👍 не просите сердца❤️ Я просто надеюсь, что смогу вам немного помочь.
статья http-запроса
В предыдущей главе мы представилиbpmn.js
Некоторые базовые знания и введены вvue
как это используется, если правильноbpmn.js
Для тех, кто не знает, перейдите по ссылке:
Эта глава в основном посвященаbpmn.js
Как взаимодействовать с фоном, изучив эту главу, вы сможете узнать:
Получить данные через http запрос и рендерить
Отправить последний bpmn после редактирования в фоновом режиме
После редактирования сохраните его как файл bpmn или файл svg.
Получить данные через http запрос и рендерить
Тот, который использовался в предыдущем случае, всегда был локально жестко закодирован.xml
String, то он точно не будет использоваться в таком виде на практике.
Что сейчас делает наша команда:
- Внешний интерфейс инициирует запрос и получает
bpmn
адрес файла - Получив адрес, используйте
axios
запросите этот адрес, чтобы получитьxml
строка (названная здесь какbpmnXmlStr
) - использовать
importXML
Метод преобразует строку в графику и отображает ее.
Чтобы смоделировать описанную выше среду выполнения, я следовал примеру проекта из предыдущей главы.bpmn-vue-basicСоздайте файл в папке компонентовaxios.vue
файл и настроить маршруты:
const routes = [
...
{
path: '/axios',
component: () => import('./../components/axios')
}
]
Установить в проектaxios
для фронтальной отправкиhttp
просить:
npm i axios --save-D
первый вHTML
код для созданияloading
, пользовательский интерфейс получаетxml
Предыдущее шоу:
// axios.vue
<template>
<div class="containers">
<div class="loading" v-if="loading">
Loading...
</div>
<template v-else>
<div class="canvas" ref="canvas"></div>
<div id="js-properties-panel" class="panel"></div>
</template>
</div>
</template>
затем вjs
введен вaxios
и определитьgetXmlUrl
Метод моделирования приобретенияbpmn
Адрес файла:
// axios.vue
<script>
...
import axios from 'axios'
import { xmlStr } from '../mock/xmlStr' // 引入一个本地的xml字符串, 若是没有获取到后台的数据则用它
export default {
...
data () {
return {
...
loading: true,
xmlUrl: '',
defaultXmlStr: xmlStr
}
},
methods: {
async init () {
this.loading = true
this.xmlUrl = await this.getXmlUrl()
console.log(this.xmlUrl)
this.loading = false
this.$nextTick(() => { // 等待 DOM 更新之后再对工作流进行初始化
this.initBpmn()
})
},
getXmlUrl () { // 该方法模拟请求后台获取bpmn文件地址
return new Promise(resolve => {
setTimeout(() => {
const url = 'https://hexo-blog-1256114407.cos.ap-shenzhen-fsi.myqcloud.com/bpmnMock.bpmn' // 模拟网络请求的一个地址
resolve(url)
}, 1000)
})
},
initBpmn () {
... // 这里是初始化工作流的代码
this.createNewDiagram()
},
async createNewDiagram () {
const that = this
let bpmnXmlStr = ''
if (this.xmlUrl === '') { // 若是后台没有数据则使用默认的一个xml
bpmnXmlStr = this.defaultXmlStr
this.transformCanvas(bpmnXmlStr)
} else {
let res = await axios({
method: 'get',
timeout: 120000,
url: that.xmlUrl,
headers: { 'Content-Type': 'multipart/form-data' }
})
console.log(res)
bpmnXmlStr = res['data']
this.transformCanvas(bpmnXmlStr)
}
},
transformCanvas(bpmnXmlStr) {
// 将字符串转换成图显示出来
this.bpmnModeler.importXML(bpmnXmlStr, (err) => {
if (err) {
console.error(err)
} else {
this.success()
}
// 让图能自适应屏幕
var canvas = this.bpmnModeler.get('canvas')
canvas.zoom('fit-viewport')
})
},
success () {
console.log('创建成功!')
}
}
}
</script>
Вы можете напрямую использовать путь, который я смоделировал в случае, чтобы получить адрес:
Пейте XO-blog-1256114407.cos.AP-Shenzhen-fans.No money cloud.com/BP mock каждый год.Не бойтесь…
Адрес кейса Git:Тестовый пример LinDaiDai-bpmn.js axios.vue
Отправить последний bpmn после редактирования в фоновом режиме
Выше мы представили, как получить данные из фона и отобразить их на странице, но этого недостаточно.
Возможно, вам нужно отредактировать последнююbpmn
Магазин в фоновом режиме.
Эта функция включаетbpmn.js
Привязка события вxml
Информация.
создать новыйsave.vue
файл иaxios.vue
Скопируйте содержимое в .
существуетsuccess()
добавить методaddBpmnListener()
Как связать события:
// save.vue
<script>
success () {
console.log('创建成功!')
this.addBpmnListener()
},
// 添加绑定事件
addBpmnListener () {
const that = this
// 给图绑定事件,当图有发生改变就会触发这个事件
this.bpmnModeler.on('commandStack.changed', function () {
that.saveDiagram(function(err, xml) {
console.log(xml) // 这里获取到的就是最新的xml信息
})
})
},
// 下载为bpmn格式,done是个函数,调用的时候传入的
saveDiagram(done) {
// 把传入的done再传给bpmn原型的saveXML函数调用
this.bpmnModeler.saveXML({ format: true }, function(err, xml) {
done(err, xml)
})
}
</script>
как показано на рисунке:
Адрес кейса Git:Тестовый пример LinDaiDai-bpmn.js save.vue
После редактирования сохраните его как файл bpmn или файл svg.
выше мы слушаемcommandStack.changed
Последние события можно получить в режиме реального времениxml
Информация.
Получив эту информацию, вы можете запросить серверную часть передавать их последними при каждом изменении графика.xml
;
Вы также можете сохранить его в переменной, а затем дать кнопку сохранения на странице, а затем передать ее в фоновый режим при нажатии кнопки.
Возможно, вам вообще не нужно запрашивать фон, но вы хотите иметь возможность загружать его локально какbpmn
файл илиsvg
документ.
наверхуsave.vue
Две кнопки сохранения добавлены на основе случая:
затем изменитьHTML
Код:
// save.vue
<template>
...
<ul class="buttons">
<li>
<a ref="saveDiagram" href="javascript:" title="保存为bpmn">保存为bpmn</a>
</li>
<li>
<a ref="saveSvg" href="javascript:" title="保存为svg">保存为svg</a>
</li>
</ul>
</template>
существуетjs
Добавьте в код:
// save.vue
<script>
...
addBpmnListener () {
const that = this
// 获取a标签dom节点
const downloadLink = this.$refs.saveDiagram
const downloadSvgLink = this.$refs.saveSvg
// 给图绑定事件,当图有发生改变就会触发这个事件
this.bpmnModeler.on('commandStack.changed', function () {
that.saveSVG(function(err, svg) {
that.setEncoded(downloadSvgLink, 'diagram.svg', err ? null : svg)
})
that.saveDiagram(function(err, xml) {
that.setEncoded(downloadLink, 'diagram.bpmn', err ? null : xml)
})
})
},
// 下载为SVG格式,done是个函数,调用的时候传入的
saveSVG(done) {
// 把传入的done再传给bpmn原型的saveSVG函数调用
this.bpmnModeler.saveSVG(done)
},
// 下载为bpmn格式,done是个函数,调用的时候传入的
saveDiagram(done) {
// 把传入的done再传给bpmn原型的saveXML函数调用
this.bpmnModeler.saveXML({ format: true }, function(err, xml) {
done(err, xml)
})
},
// 当图发生改变的时候会调用这个函数,这个data就是图的xml
setEncoded(link, name, data) {
// 把xml转换为URI,下载要用到的
const encodedData = encodeURIComponent(data)
// 下载图的具体操作,改变a的属性,className令a标签可点击,href令能下载,download是下载的文件的名字
console.log(link, name, data)
let xmlFile = new File([data], 'test.bpmn')
console.log(xmlFile)
if (data) {
link.className = 'active'
link.href = 'data:application/bpmn20-xml;charset=UTF-8,' + encodedData
link.download = name
}
}
</script>
Адрес кейса Git:Тестовый пример LinDaiDai-bpmn.js save.vueЕсли вам это нравится, пожалуйста, дайтеStar
🌟 Да, спасибо😊
послесловие
Полный каталог серии можно найти здесь:"Самый подробный учебник по bpmn.js во всей сети"
Рекомендации по сериалу:
"Самый подробный учебник по bpmn.js во всей сети - основы"
"Самый подробный учебный материал по bpmn.js во всей сети - мероприятия"
"Самый подробный учебник по bpmn.js во всей сети - рендерер"
"Самый подробный учебник по bpmn.js во всей сети - contextPad"
"Самый подробный учебник по bpmn.js во всей сети - редактирование и удаление узлов"