предисловие
В: Что такое bpmn.js?
"
bpmn.jsЭто набор инструментов рендеринга BPMN2.0 и средство веб-моделирования, которое позволяет выполнять функцию рисования блок-схем во внешнем интерфейсе.
В: Почему я пишу эту серию учебников? 🤔️
"
Из-за потребностей бизнеса компании его необходимо использовать в проектеbpmn.js, Однако из-заbpmn.jsРазработчики игры зарубежные друзья,поэтому отечественных методических материалов мало и нет подробных документов.Поэтому много способов использования и много ям приходится искать самому.Поразмыслив,решил написать серию учебные материалы об этом. чтобы помочь большеbpmn.jsПользователи или разработчики, которые ищут хороший способ рисовать блок-схемы, в то же время для них это еще и своего рода консолидация.
Поскольку это серия статей, она может часто обновляться.Пожалуйста, простите меня, если вы случайно смахнули его, и это не то, что вам нужно😊.
Не просите похвалы👍 не просите сердца❤️ Я просто надеюсь, что смогу вам немного помочь.
Пользовательские статьи ContextPad
После изучения предыдущих глав, я считаю, что все освоили настройкуpaletteа такжеrenderer, в этой главе в основном объясняется настройкаcontextPad.
Давайте рассмотрим сначала,contextPadчто это такое?
Как показано на рисунке, помимо добавления узлов на панели инструментов слева, при щелчке по узлу также появляется небольшое всплывающее окно, в котором также можно добавлять узлы.contextPad.
Тогда, прочитав, вы сможете узнать:
по умолчаниюContextPadМодифицировано на основе
Предварительная подготовка
продолжимLinDaiDai/bpmn-vue-customразработка кейс-проекта.
существуетcomponentsсоздать новую папкуcustom-context-pad.vueфайл при настройке маршрута «пользовательский contextPad».
существуетcomponents/customсоздать новую папкуCustomContextPad.vueфайл для настройкиcontextPad.
записыватьCustomContextPad.vueкод
На самом деле обычайcontextPadа такжеpaletteОчень похоже, просто используяcontextPad.registerProvider(this)указать, что этоcontextPad, в то время как обычайpaletteиспользуетсяplatette.registerProvider(this).
код показывает, как показано ниже:
// CustomContextPad.js
export default class CustomContextPad {
constructor(config, contextPad, create, elementFactory, injector, translate) {
this.create = create;
this.elementFactory = elementFactory;
this.translate = translate;
if (config.autoPlace !== false) {
this.autoPlace = injector.get('autoPlace', false);
}
contextPad.registerProvider(this); // 定义这是一个contextPad
}
getContextPadEntries(element) {}
}
CustomContextPad.$inject = [
'config',
'contextPad',
'create',
'elementFactory',
'injector',
'translate'
];
Я думаю, что все уже видели это, но суть в том,getContextPadEntriesЭтот метод, давайте создадим этот метод следующим.
записыватьgetContextPadEntriesкод
На самом деле этот метод должен вернуть объект, то есть вам нужноcontextPadКакие пользовательские элементы отображаются в этом контейнере, например, мне нужно добавитьlindaidai-task, то мы можем добавить к возвращаемому объектуappend.lindaidai-taskэто свойство.
Значение атрибута представляет собой набор конфигураций для этого элемента, иpaletteкак в том числе:
- группа: к какой группе он принадлежит, например
tools、event、gateway、activityд., для классификации - className: имя класса стиля, мы можем использовать его для изменения стиля элемента
- title: Подсказка, отображаемая над элементом при перемещении мыши.
- действие: событие, которое будет запущено, когда пользователь выполнит действие
Вероятно, что-то вроде этого:
// CustomContextPad.js
getContextPadEntries(element) {
return {
'append.lindaidai-task': {
group: 'model',
className: 'icon-custom lindaidai-task',
title: translate('创建一个类型为lindaidai-task的任务节点'),
action: {
click: appendTask,
dragstart: appendTaskStart
}
}
};
}
Далее нужно построитьappendTaskа такжеappendTaskStart
// CustomContextPad.js
getContextPadEntries(element) {
const {
autoPlace,
create,
elementFactory,
translate
} = this;
function appendTask(event, element) {
if (autoPlace) {
const shape = elementFactory.createShape({ type: 'bpmn:Task' });
autoPlace.append(element, shape);
} else {
appendTaskStart(event, element);
}
}
function appendTaskStart(event) {
const shape = elementFactory.createShape({ type: 'bpmn:Task' });
create.start(event, shape, element);
}
return {
'append.lindaidai-task': {
group: 'model',
className: 'icon-custom lindaidai-task',
title: translate('创建一个类型为lindaidai-task的任务节点'),
action: {
click: appendTask,
dragstart: appendTaskStart
}
}
};
}
}
здесь иpaletteОдно отличие в том, что есть дополнительный слойautoPlaceЯ не очень понимаю это.autoPlaceКакова его функция, поставить автоматически?И пример, приведенный официальным 🌰, написан так, если вы это знаете, пожалуйста, оставьте сообщение в области комментариев, спасибо~
ИсправлятьcontextPadродственные стили
Теперь посмотрим на эффект 😄...
Babble ~ Иисус, кажется, однако, эти маленькие строительные блоки слишком малы, маленькая полоска 😅, а затем переместите мышь вверх, желтый цвет фона прямо на крышке ...
фу, это невыносимо...
Надо найти способ исправить это и вернуть мне мои милые кубики ❤️...
Затем давайте откроем консоль, чтобы проверить элемент, мы можем обнаружить, что этот цвет фона является именем, называемым.djs-context-pad .entryСтиль, предоставляемый классом, возможно, мы можем изменить этот стиль глобально, давайте попробуем:
/* app.css *//* 自定义 contextPad 的样式 */ .djs-context-pad .lindaidai-task.entry:hover { background: url('hexo-blog-1256114407.cos.ap-shenzhen-fsi.myqcloud.com/rules.png') center no-repeat!important; background-size: cover!important; }
.djs-context-pad .entry:hover { /* 重新修改了 hover 之后的样式 */ border: 1px solid #1890ff; }
.djs-context-pad .entry { box-sizing: border-box; background-size: 94%; transition: all 0.3s; }
Откройте страницу, чтобы увидеть эффект.
Хорошо, решено, ха-ха 😄.
(Хотя изменение стиля напрямую не является лучшим решением, но это решение, которое я могу придумать до сих пор, и оно действительно может решить проблему)
полностью настраиваемыйContextPad
Предварительная подготовка
Точно так же, если вы научилисьпо умолчаниюContextPadМодифицировано на основе, затем полностью настраиваемыйContextPadУже почти 😁.
Но полностью индивидуальныйContextPadне называетсяcontextPad, ноcontextPadProvider, вроде мощнее 🤭...
Хорошо👌, давайтеcustomModeler/customсоздать новую папкуCustomContextPadProvider.jsдокумент.
записыватьCustomContextPadProvider.jsкод
Давайте сначала посмотрим на основную структуру:
// CustomContextPadProvider.js
export default function ContextPadProvider(contextPad, config, injector, translate, bpmnFactory, elementFactory, create, modeling, connect) {
this.create = create
this.elementFactory = elementFactory
this.translate = translate
this.bpmnFactory = bpmnFactory
this.modeling = modeling
this.connect = connect
config = config || {}
if (config.autoPlace !== false) {
this._autoPlace = injector.get('autoPlace', false)
}
contextPad.registerProvider(this)
}
ContextPadProvider.$inject = [
'contextPad',
'config',
'injector',
'translate',
'bpmnFactory',
'elementFactory',
'create',
'modeling',
'connect'
]
ContextPadProvider.prototype.getContextPadEntries = function(element) {}
Не смотрите на длинный код выше, на самом деле это ничего:
- определить
ContextPadProviderкласс, а затем ввести некоторые методы или свойства, которые мы будем использовать позже - пройти через
$injectвводить - Переписать цепь прототипа
getContextPadEntriesметод
записыватьgetContextPadEntriesкод
Вы бы тоже нашли, суть в том, чтобы переписатьgetContextPadEntriesСюда.
Ну, вот я возьму простой пример, просто создаюlindaidai-task, Так что вы можете прямо поставитьИзменить на основе контекстной панели по умолчаниюв этом случаеgetContextPadEntriesСкопируйте код из:
// CustomContextPad.js
getContextPadEntries(element) {
const {
autoPlace,
create,
elementFactory,
translate
} = this;
function appendTask(event, element) {
if (autoPlace) {
const shape = elementFactory.createShape({ type: 'bpmn:Task' });
autoPlace.append(element, shape);
} else {
appendTaskStart(event, element);
}
}
function appendTaskStart(event) {
const shape = elementFactory.createShape({ type: 'bpmn:Task' });
create.start(event, shape, element);
}
return {
'append.lindaidai-task': {
group: 'model',
className: 'icon-custom lindaidai-task',
title: translate('创建一个类型为lindaidai-task的任务节点'),
action: {
click: appendTask,
dragstart: appendTaskStart
}
}
};
}
}
Теперь посмотрим на эффект:
Эффект, кажется, достигается, и его также можно создать, щелкнув и перетащив егоlindaidai-taskЭффект...
Но всегда кажется, что чего-то не хватает, потому что свет создаетtaskТипов но элементов мало, можно ли создать линии или реализовать функции редактирования и удаления элементов?Конечно можно, ха-ха 😄.
Но в этой главе так много сказано сначала о том, как создавать линии и выполнять редактирование, удалять их, и я поместю это в другую главу, чтобы поговорить об этом подробно, не волнуйтесь.
послесловие
В приведенных выше 👆 случаях используется один и тот же проект🦐
Git-адрес кейса проекта:LinDaiDai/bpmn-vue-customЕсли вам это нравится, пожалуйста, дайтеStar🌟 Да, спасибо😊
Рекомендации по сериалу:
"Самый подробный учебник по bpmn.js во всей сети - основы"
"Самый подробный учебный материал по bpmn.js во всей сети - http запрос"
"Самый подробный учебный материал по bpmn.js во всей сети - мероприятия"
"Самый подробный учебник по bpmn.js во всей сети - рендерер"
"Самый подробный учебник по bpmn.js во всей сети - редактирование и удаление узлов"