国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

vue3使用工作流bpmn.js實現(xiàn)保存 ,新增,修改 ,右邊工具欄自定義,屬性欄自定義

這篇具有很好參考價值的文章主要介紹了vue3使用工作流bpmn.js實現(xiàn)保存 ,新增,修改 ,右邊工具欄自定義,屬性欄自定義。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

vue3使用工作流bnpm.js實現(xiàn)保存 ,新增,修改 ,右邊工具欄自定義,屬性欄自定義文章來源地址http://www.zghlxwxcb.cn/news/detail-534890.html

<template>
  <div class="containers">
    <div class="canvas" ref="canvas"></div>
    <div id="js-properties-panel" class="panel"></div>
    <!--xml-->
    <!--自定義右邊屬性面板-->
    <div class="custom-properties-panel">
      <div class="empty" v-if="selectedElementsArr.selectedElements.length <= 0"
        >請選擇一個元素</div
      >
      <div class="empty" v-else-if="selectedElementsArr.selectedElements.length > 1"
        >只能選擇一個元素</div
      >
      <div v-else>
        <fieldset class="element-item">
          <label>節(jié)點id</label>
          <span>{{ element.id }}</span>
        </fieldset>
        <fieldset class="element-item">
          <label>名稱&nbsp;&nbsp;&nbsp;&nbsp;</label>
          <input :value="element.nmae" @change="(event) => changeField(event, 'name')" />
        </fieldset>
        <fieldset class="element-item">
          <label>用戶名</label>
          <select
            @change="changeEventType"
            :value="eventType"
            style="width: 182px; border: 1px solid #d9d9d9; border-radius: 5px"
          >
            <option
              v-for="option in eventTypesArr.eventTypes"
              :key="option.value"
              :value="option.value"
              >{{ option.label }}</option
            >
          </select>
        </fieldset>
      </div>
    </div>
    <!--自定義右邊屬性面板完-->
    <ul class="buttons">
      <li>
        <a-button ref="saveDiagramlink" title="保存為bpmn" @click="getXML()"
          >保存最新的xml文件</a-button
        >
      </li>
    </ul>
  </div>
</template>
<script setup>
  // import { workFlowApi} from '/@/api/bnpm/bnpm'
  import { workFlowApi } from '../../../api/bnpm/bnpm'
  import { ref, onMounted, reactive } from 'vue'
  // import { message } from 'ant-design-vue'
  // import { ElMessage } from 'element-plus'
  import BpmnModeler from 'bpmn-js/lib/Modeler'

  import { useRouter } from 'vue-router'
  import { xmlStr } from '../../../mock/xmlStr'
  //右側(cè)屬性欄
  import propertiesPanelModule from 'bpmn-js-properties-panel'
  import propertiesProviderModule from 'bpmn-js-properties-panel/lib/provider/camunda'
  import camundaModdleDescriptor from 'camunda-bpmn-moddle/resources/camunda'

  //引入mitt
  // import emitter from '../../../utils/mitt/bus'
  import { vmviewdata, vmviewname } from '../bnpmtext/index.vue'

  import { ElMessage, ElMessageBox } from 'element-plus'
  // import type { Action } from 'element-plus'

  // 漢化組件
  import customTranslate from './customTranslate'
  // import { BpmnpropertiesProviderModule, BpmnpropertiesPanelModule } from 'bpmn-js-properties-panel'
  // bpmn建模器
  let bpmnModeler = reactive({})
  // let container = ref(null)
  let canvas = ref()
  let dataONE = reactive({})
  const saveDiagramlink = ref()
  const form = reactive({
    region: '',
  })

  // let defaultXML = ref()
  // 自定義右邊屬性面板屬性定義
  //當(dāng)前選擇的元素合集
  let selectedElementsArr = reactive({
    selectedElements: [],
  })

  let element = ref(null)
  let eventType = ref()

  //郵件發(fā)送參數(shù)
  // let recipientmail = reactive({
  //   recipient: ['dingzicool@sina.com', 'dingzicool@sina.com'],
  // })

  let eventTypesArr = reactive({
    eventTypes: [
      { label: '請選擇用戶', value: '' },
      { label: '張三', value: 'bpmn:MessageEventDefinition' },
      { label: '李四', value: 'bpmn:TimerEventDefinition' },
      { label: '王五', value: 'bpmn:ConditionalEventDefinition' },
    ],
  })
  const router = useRouter()

  //保存最新的bpmn文件
  let bnpmXML = reactive({
    workname: '',
    content: '',
  })

  //let content =ref()
  //掛載時初始化
  onMounted(() => {
    init()
  })

  function init() {
    //漢化組件的引入使用
    const customTranslateModule = {
      translate: ['value', customTranslate],
    }

    //可操作時候創(chuàng)建實例為BpmnModeler
    bpmnModeler = new BpmnModeler({
      container: canvas.value,
      //添加控制板
      //添加控制板
      propertiesPanel: {
        parent: '#js-properties-panel',
      },
      additionalModules: [
        // 右邊的屬性欄
        propertiesPanelModule,
        propertiesProviderModule,
        //漢化
        customTranslateModule,
      ],
      moddleExtensions: {
        camunda: camundaModdleDescriptor,
        // authority: authorityModdleDescriptor,
      },
    })
    createNewDiagram()
    //  createNewDiagram(zhangcheng)

    // selection.changed監(jiān)聽選中的元素
    bpmnModeler.on('selection.changed', (e) => {
      // console.log('###HH', e)
      selectedElementsArr.selectedElements = e.newSelection // 數(shù)組, 可能有多個
      // console.log('###H', selectedElementsArr.selectedElements)
      console.log(element, e.newSelection[0])
      element = e.newSelection[0] // 默認(rèn)取第一個
    })

    //使用element.changed監(jiān)聽發(fā)生改變的元素
    bpmnModeler.on('element.changed', (e) => {
      const { element } = e
      console.log('@@@$$$', element)
      // const { element: currentElement } = this
      // 如果沒有 element
      if (!element.value) {
        return
      }
      if (element.id === element.value.id) {
        element.value = element
      }
    })
  }

  //自定義面板內(nèi)容
  /**
   * 更新元素屬性
   * @param { Object } 要更新的屬性, 例如 { name: '', id: '' }
   *
   */

  function updateProperties(properties) {
    const modeling = bpmnModeler.get('modeling')
    console.log(element, properties)
    modeling.updateProperties(element, properties)
  }

  /**
   * 改變控件觸發(fā)的事件
   * @param { Object } input的Event
   * @param { String } 要修改的屬性的名稱
   *
   *
   */
  // 當(dāng)控件內(nèi)的內(nèi)容發(fā)生改變時, 同步更新element.
  function changeField(event, type) {
    const value = event.target.value
    let properties = {}
    properties[type] = value
    element[type] = value
    updateProperties(properties) // 調(diào)用屬性更新方法
  }

  // 用戶下拉菜單
  function changeEventType(event) {
    const value = event.target.value
    const bpmnReplace = bpmnModeler.get('bpmnReplace')
    eventType.value = value
    bpmnReplace.replaceElement(element, {
      type: element.value.businessObject.$type,
      eventDefinitionType: value,
    })
  }

  function createNewDiagram() {
    // console.log('我是數(shù)據(jù)', vmviewdata)
    if (vmviewdata.value == undefined || vmviewdata.value == '') {
      // 新增操作時,界面的初始化
      bpmnModeler.importXML(xmlStr, (err) => {
        if (err) {
          // console.error(err)
        } else {
          // 這里是成功之后的回調(diào), 可以在這里做一系列事情
          success()
        }
        // 讓圖能自適應(yīng)屏幕
        var canvas = bpmnModeler.get('canvas')
        canvas.zoom('fit-viewport')
      })
    } else {
      // 修改操作時,界面的初始化
      bpmnModeler.importXML(vmviewdata.value, (err) => {
        if (err) {
          // console.error(err)
        } else {
          // 這里是成功之后的回調(diào), 可以在這里做一系列事情
          success()
        }
        // 讓圖能自適應(yīng)屏幕
        var canvas = bpmnModeler.get('canvas')
        canvas.zoom('fit-viewport')
      })
    }
  }

  function success() {
    // console.log('創(chuàng)建成功!')
    addBpmnListener()
  }

  function addBpmnListener() {
    // 給圖綁定事件,當(dāng)圖有發(fā)生改變就會觸發(fā)這個事件
    bpmnModeler.on('commandStack.changed', () => {
      saveDiagram(function (err, xml) {
        bnpmXML.content = xml
        // 這里獲取到的就是最新的xml信息
        console.log('zx', xml)
        //setEncoded(saveDiagramlink, 'diagram.bpmn', err ? null : xml)
      })

      // //郵件發(fā)送
      // getSendmail(recipientmail).then((res) => {
      //   console.log('郵件發(fā)送', res)
      // })
    })
  }

  //繪制圖形保存最新的xml
  function getXML() {
    if (vmviewdata.value == undefined || vmviewdata.value == '') {
      ElMessageBox.prompt('請輸入保存的文件名稱', {
        confirmButtonText: '保存',
        cancelButtonText: '取消',
        inputErrorMessage: '文件名稱不能為空',
      })
        .then(({ value }) => {
          // ElMessage({
          //   type: 'success',
          //   message: `Your email is:${value}`,
          // })
          bnpmXML.workname = value
          workFlowApi(bnpmXML).then((res) => {
            ElMessage({
              type: 'success',
              message: '成功',
            })

            if (res) {
              router.push({
                name: 'bnpmtext',
              })
            }
            console.log('bj', res)
          })

          bnpmXML.content = ''
        })
        .catch(() => {
          ElMessage({
            type: 'info',
            message: '保存失敗',
          })
        })
    } else {
      // 修改時的文件名
      let xmlName = vmviewname.value
      // 文件名去除前綴和后綴的字符 /bpmn .
      let name = xmlName
        .replace(/bpmn/g, '')
        .replace(/\//g, '')
        .replace(/\\/g, '')
        .replace(/\./g, '')

      ElMessageBox.prompt('請輸入修改的文件名稱', {
        confirmButtonText: '保存',
        cancelButtonText: '取消',
        inputErrorMessage: '文件名稱不能為空',
        inputValue: name, // 賦值文本框
      })
        .then(({ value }) => {
          bnpmXML.workname = value
          // ElMessage({
          //   type: 'success',
          //   message: `Your email is:${value}`,
          // })

          // value = vmviewname
          workFlowApi(bnpmXML).then((res) => {
            ElMessage({
              type: 'success',
              message: '成功',
            })

            if (res) {
              router.push({
                name: 'bnpmtext',
              })
            }

            // 保存后清空原有的文件名和xml內(nèi)容
            vmviewdata.value = ''
            vmviewname.value = ''

            console.log('bj', res)
          })
        })
        .catch(() => {
          ElMessage({
            type: 'info',
            message: '保存失敗',
          })
        })
    }

    console.log('weihao:', bnpmXML.content)
  }

  // 下載為bpmn格式,done是個函數(shù),調(diào)用的時候傳入的
  function saveDiagram(done) {
    //console.log("weu",done)
    // 把傳入的done再傳給bpmn原型的saveXML函數(shù)調(diào)用
    bpmnModeler.saveXML({ format: true }, function (err, xml) {
      // return (urlq = xml)
      //console.log('iiii', urlq)
      done(err, xml)
    })
  }
  function setEncoded(link, name, data) {
    //   console.log('222223333', data)
    dataONE = data
    // console.log('dataONE', dataONE)

    // const dataONE = data
    // 把xml轉(zhuǎn)換為URI,下載要用到的
    const encodedData = encodeURIComponent(data)
    //console.log('222224444', encodedData)
    // 下載圖的具體操作,改變a的屬性,className令a標(biāo)簽可點擊,href令能下載,download是下載的文件的名字
    //  console.log('hahhah', link, name, data)
    let xmlFile = new File([data], 'test.bpmn')
    //console.log('22222222222222222', xmlFile)
    // if (data) {
    //   link.className = 'active'
    //   link.href = 'data:application/bpmn20-xml;charset=UTF-8,' + encodedData
    //   link.download = name
    // }
  }
</script>
<style scoped>
  .containers {
    position: absolute;
    background-color: #fff;
    width: 100%;
    height: 55.5rem;
  }

  .canvas {
    width: 100%;
    height: 100%;
  }

  .panel {
    position: absolute;
    right: 0;
    top: 0;
    width: 300px;
  }

  .buttons {
    position: absolute;
    left: 20px;
    bottom: 20px;
  }

  .buttons li {
    display: inline-block;
    margin: 5px;
  }

  .buttons li a {
    color: #999;
    background: #eee;
    cursor: not-allowed;
    padding: 8px;
    border: 1px solid #ccc;
    text-decoration: none;
  }

  .buttons li a.active {
    color: #333;
    background: #fff;
    cursor: pointer;
  }

  /** 自定義屬性面板樣式 **/
  .custom-properties-panel {
    position: absolute;
    right: 0;
    top: 0;
    width: 300px;
    background-color: #fff9f9;
    border-color: rgba(0, 0, 0, 0.09);
    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.09);
    padding: 20px;
  }

  .custom-properties-panel {
    position: absolute;
    right: 300px;
    top: 0;
    width: 300px;
    background-color: #fff9f9;
    border-color: rgba(0, 0, 0, 0.09);
    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.09);
    padding: 20px;
  }

  .empty {
    height: 200px;
    line-height: 200px;
    font-weight: 700;
  }

  .element-item {
    padding: 10px;
    margin-top: 5px;
    border: 1px solid;
    border-color: rgb(182, 182, 182);
    border-radius: 8px;
  }

  .element-item:first-child {
    margin-top: 0;
  }

  .custom-properties-panel input,
  .custom-properties-panel textarea {
    padding: 4px 11px;
    color: rgba(0, 0, 0, 0.65);
    font-size: 14px;
    background-color: #fff;
    background-image: none;
    border: 1px solid #d9d9d9;
    border-radius: 4px;
    transition: all 0.3s;
    outline: none;
  }

  .custom-properties-panel input:focus,
  .custom-properties-panel button:focus,
  .custom-properties-panel textarea:focus,
  .custom-properties-panel [contenteditable]:focus {
    border-color: rgb(239, 112, 96);
    box-shadow: 0 0 1px 2px rgb(239, 112, 96, 0.2);
  }

  .custom-properties-panel label {
    font-weight: bold;
  }

  .custom-properties-panel label:after {
    content: ': ';
  }

  .custom-properties-panel button + button {
    margin-left: 10px;
  }
</style>

到了這里,關(guān)于vue3使用工作流bpmn.js實現(xiàn)保存 ,新增,修改 ,右邊工具欄自定義,屬性欄自定義的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Camunda 7工作流引擎 API 以及與Springboot集成實現(xiàn)工作流配置全紀(jì)錄

    Camunda 7工作流引擎 API 以及與Springboot集成實現(xiàn)工作流配置全紀(jì)錄

    項目中需要用到工作流引擎來設(shè)計部分業(yè)務(wù)流程,框架選型最終選擇了 Camunda7,關(guān)于 Camunda以及 Activity 等其他工作流 引擎的介紹及對比不再介紹,這里只介紹與現(xiàn)有Springboot項目的集成以及具體使用及配置 流程(PROCESS): 通過工具建模最終生成的BPMN文件,里面有整個流程的定

    2024年02月10日
    瀏覽(46)
  • 工作流flowable實現(xiàn)撤回

    Flowable是一個開源的工作流引擎,可以實現(xiàn)工作流程的自動化管理,包括任務(wù)分配、流轉(zhuǎn)、審批等。如果需要實現(xiàn)撤回功能,可以考慮以下方案: 在流程定義中添加一個撤回節(jié)點,允許任務(wù)的發(fā)起人在任務(wù)未被處理前撤回任務(wù)。當(dāng)發(fā)起人選擇撤回任務(wù)時,任務(wù)將被撤回至撤回

    2024年02月09日
    瀏覽(28)
  • 若依(RuoYi-Vue)+Flowable工作流前后端整合教程

    若依(RuoYi-Vue)+Flowable工作流前后端整合教程

    此教程適合若依前后端分離項目,其他項目可以在擴展列表中進(jìn)行查找。 近期公司里需要對很久以前的RuoYi-Vue前后端分離項目擴展出flowable的功能,當(dāng)然這個重任也是落在了我的身上(不然也不會有這篇文章),然后我在官網(wǎng)看到了RuoYi-Vue-Flowable這個項目,按照文檔提供的遷

    2023年04月21日
    瀏覽(24)
  • 芋道視頻199 - 工作流 - 關(guān)系圖 - ruoyi-vue-pro

    芋道視頻199 - 工作流 - 關(guān)系圖 - ruoyi-vue-pro

    數(shù)據(jù)庫:bpm_form。實體類:BpmFormDO.java: ?頁面操作: 數(shù)據(jù)庫:ACT_RE_MODEL 流程模板信息表,存儲流程模板相關(guān)描述信息。但其真正內(nèi)容存儲在act_ge_bytearray表中,以字節(jié)形式存儲;實體類:Model.java。 字段名 字段值 字段含義 ID_ c64059b7-a4d1-11ee-a7ee-3cf01158cd6c 主鍵 REV_ 1 數(shù)據(jù)版本

    2024年02月02日
    瀏覽(59)
  • GitHub工作流的使用筆記

    GitHub工作流的使用筆記

    有些東西真的就是要不斷的試錯不斷地試錯才能摸索到一點點,就是摸索到凌晨兩三點第二天要8點起床感覺要死。 為什么我會用這個東東,因為我搞的阿里云服務(wù)器2個g的運行內(nèi)存,打包這玩意賊消耗內(nèi)存,本來想搞Jenkins但是服務(wù)器上搞更要內(nèi)存,本機搞又沒必要,剛好之

    2024年04月26日
    瀏覽(24)
  • Spring Boot + Activiti 結(jié)合,實現(xiàn)工作流

    Spring Boot + Activiti 結(jié)合,實現(xiàn)工作流

    Activiti是一個工作流引擎,Activiti可以將業(yè)務(wù)系統(tǒng)中復(fù)雜的業(yè)務(wù)流程抽取出來,使用專門的建模語言BPMN2.0進(jìn)行定義,業(yè)務(wù)流程按照預(yù)先定義的流程進(jìn)行執(zhí)行,實現(xiàn)了系統(tǒng)的流程由Activiti進(jìn)行管理,減少業(yè)務(wù)系統(tǒng)由于流程變更進(jìn)行系統(tǒng)升級改造的工作量,Activiti流程就是數(shù)據(jù)庫表

    2023年04月13日
    瀏覽(28)
  • Spring Boot 整合 Camunda 實現(xiàn)工作流

    Spring Boot 整合 Camunda 實現(xiàn)工作流

    工作流是我們開發(fā)企業(yè)應(yīng)用幾乎必備的一項功能,工作流引擎發(fā)展至今已經(jīng)有非常多的產(chǎn)品。最近正好在接觸 Camunda ,所以來做個簡單的入門整合介紹。如果您也剛好在調(diào)研或者剛開始計劃接入,希望本文對您有所幫助。如果您是一名Java開發(fā)或Spring框架愛好者,歡迎關(guān)注我程

    2024年01月18日
    瀏覽(26)
  • [AIGC] 如何設(shè)計和實現(xiàn)工作流的審批項目?

    工作流的審批項目是指一個系統(tǒng)化、可重復(fù)的審批過程,它能夠幫助你更有效地完成審批任務(wù)和達(dá)成目標(biāo)。無論你是一個項目經(jīng)理、一個審批官還是一個企業(yè)主管,設(shè)計和實現(xiàn)工作流的審批項目都是一個重要的步驟。 工作流的審批項目能夠幫助你: 節(jié)省時間:工作流的審批

    2024年02月19日
    瀏覽(31)
  • Springboot整合Camunda工作流引擎實現(xiàn)審批流程實例

    Springboot整合Camunda工作流引擎實現(xiàn)審批流程實例

    環(huán)境:Spingboot2.6.14 + camunda-spring-boot-starter7.18.0 依賴配置 應(yīng)用程序配置 通過上面的配置后訪問控制臺: http://localhost:8100/workflow/ 默認(rèn)是沒有上面的tasks中的內(nèi)容,這里是我之前測試數(shù)據(jù) 環(huán)境準(zhǔn)備好后,接下來就可以設(shè)計工作流程。 上面的 camunda-bpm-spring-boot-starter-rest依賴中定義

    2024年02月09日
    瀏覽(17)
  • Java工作流框架:探索流程引擎的實現(xiàn)和應(yīng)用

    Java工作流框架:探索流程引擎的實現(xiàn)和應(yīng)用

    目前,市面上有很多基于SpringBoot+Vue前后端分離的Java快速開發(fā)框架和工作流開發(fā)框架可供選擇。以下是一些比較流行的框架: 1. Spring Cloud:Spring Cloud是一套基于Spring Boot的開發(fā)工具,用于快速構(gòu)建分布式系統(tǒng)中的服務(wù)。它利用Spring Boot的便利來簡化了分布式系統(tǒng)的開發(fā),并通

    2024年02月14日
    瀏覽(30)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包