Приветствую! N лет назад использовался рабочий поток движок, хотя оригинальный автор уже не поддерживает его, всё ещё есть группа людей, которые продолжают использовать его. На мой взгляд, его основные функции всё ещё хороши, и он является хорошим проектом для изучения рабочих потоков. Однако технология стека, используемая в дизайнере процессов, возможно, устарела (это был открытый исходный код до 2016 года).
Чтобы сделать его более удобным для использования или чтобы больше людей узнали или заново открыли для себя этот рабочий поток, я решил потратить некоторое время и переработать этот дизайнер процессов с использованием современных технологий фронтенда. Если у вас возникнут какие-либо проблемы во время использования, пожалуйста, оставьте комментарий или присоединяйтесь к группе для общения!
Быстроразвивающаяся платформа: [онлайн-опыт] (https://snaker.mldong.com/)
[режим редактирования] (https://snaker.mldong.com/)
[только режим чтения] (https://snaker.mldong.com/preview)
[режим выделения] (https://snaker.mldong.com/highLight)
[XML данные] (https://snaker.mldong.com/xml)
[бэкенд проект] (https://gitee.com/mldong/mldong)
[фронтенд проект] (https://gitee.com/mldong/mldong-vue)
npm install snakerflow-designer-vue@latest --save
Дизайнер зависит от следующих сторонних библиотек. Если эти библиотеки не включены в ваш проект, вы не сможете использовать их должным образом, вам необходимо установить их самостоятельно.
npm install @logicflow/core@^1.1.3 --save
npm install @logicflow/extension@^1.1.3 --save
npm install clipboard@^2.0.10 --save
npm install vue-json-pretty@^1.8.2 --save
import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
Vue.config.productionTip = false
// Импортируем компонентную библиотеку
import SnakerFlowDesigner from 'snakerflow-designer-vue'
// Регистрируем компонентную библиотеку
Vue.use(SnakerFlowDesigner)
Vue.use(ElementUI)
new Vue({
router,
store,
render: h => h(App)
}).$mount('#app')
npm install snakerflow-designer-vue@next --save
Дизайнер зависит от следующих сторонних библиотек. Если эти библиотеки не включены в ваш проект, вы не сможете использовать их должным образом, вам необходимо установить их самостоятельно.
npm install @logicflow/core@^1.1.21 --save
npm install @logicflow/extension@^1.1.21 --save
npm install clipboard@^2.0.11 --save
npm install vue-json-pretty@^2.1.1 --save
import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import SnakerFlowDesigner from 'snakerflow-designer-vue'
createApp(App).use(router).use(ElementPlus).use(SnakerFlowDesigner).mount('#app')
<!-- https://gitee.com/mldong/snakerflow-designer-vue/blob/master/examples/views/Home.vue -->
<SnakerFlowDesigner ref='designer' v-model="flowData" @on-save="handleSave"/>
<!-- https://gitee.com/mldong/snakerflow-designer-vue/blob/master/examples/views/Preview.vue -->
<SnakerFlowDesigner :viewer="true" ref='designer' v-model="flowData"/>
<!-- https://gitee.com/mldong/snakerflow-designer-vue/blob/master/examples/views/HighLight.vue -->
<SnakerFlowDesigner :viewer="true" ref='designer' v-model="flowData" :high-light="highLight"/>
<!-- https://gitee.com/mldong/snakerflow-designer-vue/blob/master/examples/views/Xml.vue -->
<SnakerFlowDesigner :viewer="true" ref='designer' v-model="flowData"/>
Параметр | Описание | Тип | Возможные значения | Значение по умолчанию |
---|---|---|---|---|
value / v-model | Привязанные значения (xml или json) | string/object | — | — |
config | Логическая конфигурация потока | object | — | — |
viewer | Режим предварительного просмотра | boolean | true/false | false |
highLight | Данные выделения, см. таблицу ниже | object | — | — |
extendAttrConfig | Расширенная конфигурация атрибутов, см. таблицу ниже | object | — | — |
extendPropertyKeys | Конфигурация дополнительных расширенных свойств и пользовательских слотов для совместного использования, см. примеры/представления/CustomAssigner | Array | — | — |
showDoc | Отображать ли метку кода облака | boolean | true/false | true |
disabledClickNodes | Узлы, запрещённые для щелчка, например: ['snaker:start', 'snaker:end'] | Array | - | Конфигурация по умолчанию |
Отображаемое имя | Имя | Значок | Подсказка |
---|---|---|---|
Идентификатор пользователя | userKey | -- | Участник может быть получен в соответствии с идентификатором пользователя |
Идентификатор группы пользователей | groupKey | -- | Участники могут быть получены в соответствии с идентификатором группы пользователей |
Кандидаты-участники | candidateUsers | -- | Кандидаты-участники (предоставляются предыдущему узлу для выбора участников следующего узла) |
Группы кандидатов | candidateGroups | -- | Группы кандидатов (предоставляются предыдущему узлу для выбора групп участников следующего узла) |
Класс обработки кандидатов | candidateHandler | -- | Получение класса обработки кандидата |
Дополнительное свойство 1 | attr1 | -- | Другое дополнительное свойство 1 |
Дополнительное свойство 2 | attr2 | -- | Другое дополнительное свойство 2 |
Дополнительное свойство 3 | attr3 | -- | Другое дополнительное свойство 3 |
Название метода | Описание | Параметр |
---|---|---|
importXml | Импорт данных определения процесса SnakerFlow | (xml) данные определения процесса SnakerFlow в формате xml |
importJson | Импорт данных определения LogicFlow | (data) объект или строка json, представляющая данные определения LogicFlow |
setHighLight | Установка данных выделения | (data) структура данных, соответствующая выделению в данных и свойствах |
Правило: form-item-${nodeType}-${field}
Пример использования:
<SnakerFlowDesigner ref='designer' v-model="flowData" @on-save="handleSave">
<template v-slot:form-item-task-assignee="{model,field}">
<el-form-item label="Пользователь-участник">
<el-input v-model="model[field]"></el-input>
</el-form-item>
</template>
</SnakerFlowDesigner>
Имя | Описание |
---|---|
task | Узел задачи |
custom | Пользовательский узел |
decision | Узел решения |
end | Конечный узел |
fork | Узел разветвления |
join | Узел объединения |
process | Процесс |
start | Начальный узел |
subProcess | Подпроцесс Snaker |
transition | Ребро |
wfSubProcess | Подпроцесс snaker |
Имя | Описание |
---|---|
form-item-task-name | Название |
form-item-task-displayName | Отображаемое название |
form-item-task-form | Форма |
form-item-task-assignee | Участник |
form-item-task-assignmentHandler | Класс обработки участника |
form-item-task-taskType | Тип задачи |
form-item-task-performType | Тип участия |
form-item-task-preInterceptors | Предварительный перехватчик |
form-item-task-postInterceptors | Последующий перехватчик |
form-item-task-reminderTime | Время напоминания |
form-item-task-reminderRepeat | Интервал повторения напоминаний |
form-item-task-expireTime | Ожидаемое время завершения |
form-item-task-autoExecute | Автоматическое выполнение |
form-item-task-width | Ширина |
form-item-task-height | Высота |
Имя | Описание |
---|---|
form-item-custom-name | Название |
form-item-custom-displayName | Отображаемое название |
form-item-custom-clazz | Путь к классу |
form-item-custom-methodName | Имя метода |
form-item-custom-args | Параметры переменной |
form-item-custom-preInterceptors | Предварительный перехватчик |
form-item-custom-postInterceptors | Последующий перехватчик |
Имя | Описание |
---|---|
form-item-decision-name | Название |
form-item-decision-expr | Выражение решения |
form-item-decision-handleClass | Класс обработки |
form-item-decision-preInterceptors | Предварительный перехватчик |
form-item-decision-postInterceptors | Последующий перехватчик |
Имя | Описание |
---|---|
form-item-end-name | Название |
form-item-end-preInterceptors | Предварительный перехватчик |
form-item-end-postInterceptors | Последующий перехватчик |
Имя | Описание |
---|---|
form-item-fork-name | Название |
Имя | Описание |
---|---|
form-item-join-name | Название |
Имя | Описание |
---|---|
form-item-process-name | Определение процесса |
form-item-process-displayName | Определение отображаемого процесса |
form-item-process-expireTime | Ожидаемое время завершения |
form-item-process-instanceUrl | URL запуска экземпляра |
form-item-process-instanceNoClass | Номер экземпляра |
form-item-process-preInterceptors | Перехватчик перед узлом |
form-item-process-postInterceptors | Перехватчик после узла |
Имя | Описание |
---|---|
form-item-start-name | Название |
form-item-start-preInterceptors | Предварительный перехватчик |
form-item-start-postInterceptors | Последующий перехватчик |
Имя | Описание |
---|---|
form-item-subProcess-name | Определение процесса |
form-item-subProcess-displayName | Определение отображаемого процесса |
form-item-subProcess-expireTime | Ожидаемое время завершения |
form-item-subProcess-instanceUrl | URL запуска экземпляра |
form-item-subProcess-instanceNoClass | Номер экземпляра |
form-item-subProcess-preInterceptors | Перехватчик перед узлом |
form-item-subProcess-postInterceptors | Перехватчик после узла |
Имя | Описание |
---|---|
form-item-transition-name | Название |
Наименование | Описание |
--- | --- |
form-item-wfSubProcess-name | Определение дочернего процесса |
form-item-wfSubProcess-displayName | Отображаемое имя определения дочернего процесса |
form-item-wfSubProcess-form | Форма |
form-item-wfSubProcess-version | Номер версии |
form-item-wfSubProcess-width | Ширина |
form-item-wfSubProcess-height | Высота |
События
Событие | Описание | Параметры обратного вызова |
---|---|---|
on-save | Срабатывает при нажатии на кнопку сохранения в правом верхнем углу панели инструментов | Передаёт объект данных схемы процесса data, содержащий данные JSON и XML ({json, xml}) |
npm install
npm run serve
npm run build
npm run lint
{
"name": "leave",
"displayName": "Отпуск",
"expireTime": "",
"instanceUrl": "leaveForm",
"nodes": [
{
"id": "start",
"type": "snaker:start",
"x": 340,
"y": 160,
"properties": {},
"text": {
"x": 340,
"y": 200,
"value": "Начало"
}
},
{
"id": "apply",
"type": "snaker:task",
"x": 520,
"y": 160,
"properties": {
"taskType": "Major",
"performType": "ANY",
"autoExecute": "N",
"assignee": "approve.operator"
},
"text": {
"x": 520,
"y": 160,
"value": "Подача заявления на отпуск"
}
},
{
"id": "approveDept",
"type": "snaker:task",
"x": 740,
"y": 160,
"properties": {
"assignee": "",
"taskType": "Major",
"performType": "ANY",
"autoExecute": "N",
"assignmentHandler": "com.mldong.config.FlowAssignmentHandler"
},
"text": {
"x": 740,
"y": 160,
"value": "Одобрение отдела"
}
},
{
"id": "end",
"type": "snaker:end",
"x": 1080,
"y": 160,
"properties": {},
"text": {
"x": 1080,
"y": 200,
"value": "Конец"
}
}
],
"edges": [
{
"id": "3037be41-5682-4344-b94a-9faf5c3e62ba",
"type": "snaker:transition",
"sourceNodeId": "start",
"targetNodeId": "apply",
"startPoint": {
"x": 358,
"y": 160
},
"endPoint": {
"x": 460,
"y": 160
},
"properties": {},
"pointsList": [
{
"x": 358,
"y": 160
},
{
"x": 460,
"y": 160
}
]
}
]
}
``` ```
2c75eebf-5baf-4cd0-a7b3-05466be13634:
targetNodeId: end
startPoint: { x: 764, y: 339 }
endPoint: { x: 1080, y: 178 }
properties: { expr: "#f_day<3" }
text: { x: 912, y: 339, value: "请假天数小于3" }
pointsList: [
{ x: 764, y: 339 },
{ x: 1080, y: 339 },
{ x: 1080, y: 178 },
]
d7ec4166-f3fc-4fd6-a2ac-a6c4d509c4dd:
id: d7ec4166-f3fc-4fd6-a2ac-a6c4d509c4dd
type: snaker:transition
sourceNodeId: 2c75eebf-5baf-4cd0-a7b3-05466be13634
targetNodeId: approveBoss
startPoint: { x: 740, y: 365 }
endPoint: { x: 840, y: 480 }
properties: { expr: "#f_day>=3" }
text: { x: 740, y: 422.5, value: "请假天数大于等于3" }
pointsList: [
{ x: 740, y: 365 },
{ x: 740, y: 480 },
{ x: 840, y: 480 },
]
a64348ec-4168-4f36-8a61-15cf12c710b9:
id: a64348ec-4168-4f36-8a61-15cf12c710b9
type: snaker:transition
sourceNodeId: approveBoss
targetNodeId: end
startPoint: { x: 960, y: 480 }
endPoint: { x: 1080, y: 142 }
properties: {}
pointsList: [
{ x: 960, y: 480 },
{ x: 1140, y: 480 },
{ x: 1140, y: 112 },
{ x: 1080, y: 112 },
{ x: 1080, y: 142 },
],
В запросе представлен фрагмент кода на языке JSON, который описывает структуру данных для рабочего процесса. В запросе также есть ссылки на документацию по рабочему процессу и его реализации.
Основная тема запроса — описание структуры данных для рабочего процесса в формате JSON. (https://gitee.com/yuqs/snakerflow)
К сожалению, без дополнительной информации о содержании данного текста, я не могу предоставить его перевод. Однако, если вы предоставите мне более конкретные данные или контекст, я постараюсь помочь вам с переводом.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )