更多ruoyi-nbcio功能请看演示系统
gitee源代码地址
前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio
演示地址:RuoYi-Nbcio后台管理系统 http://218.75.87.38:9666/
更多nbcio-boot功能请看演示系统
gitee源代码地址
后端代码: https://gitee.com/nbacheng/nbcio-boot
前端代码:https://gitee.com/nbacheng/nbcio-vue.git
在线演示(包括H5) : http://218.75.87.38:9888
1、ElementProperties.vue原先vue2代码如下:
<template> <div class="panel-tab__content"> <el-table :data="elementPropertyList" size="small" max-height="240" border fit> <el-table-column label="序号" width="50px" type="index" /> <el-table-column label="属性名" prop="name" min-width="100px" show-overflow-tooltip /> <el-table-column label="属性值" prop="value" min-width="100px" show-overflow-tooltip /> <el-table-column label="操作" width="90px"> <template v-slot="{ row, $index }"> <el-button link type="" @click="openAttributesForm(row, $index)">编辑</el-button> <el-divider direction="vertical" /> <el-button link type="" style="color: #ff4d4f" @click="removeAttributes(row, $index)">移除</el-button> </template> </el-table-column> </el-table> <div class="element-drawer__button"> <el-button size="small" type="primary" :icon="Plus" @click="openAttributesForm(null, -1)">添加属性</el-button> </div> <el-dialog v-model="propertyFormModelVisible" title="属性配置" width="600px" append-to-body destroy-on-close> <el-form :model="propertyForm" label-width="80px" size="small" ref="attributeFormRef" @submit.prevent> <el-form-item label="属性名:" prop="name"> <el-input v-model="propertyForm.name" clearable /> </el-form-item> <el-form-item label="属性值:" prop="value"> <el-input v-model="propertyForm.value" clearable /> </el-form-item> </el-form> <template v-slot:footer> <el-button size="small" @click="propertyFormModelVisible = false">取 消</el-button> <el-button size="small" type="primary" @click="saveAttribute">确 定</el-button> </template> </el-dialog> </div> </template> <script> import { Plus } from '@element-plus/icons-vue' export default { name: "ElementProperties", setup() { return { Plus } }, props: { id: String, type: String }, inject: { prefix: "prefix", width: "width" }, data() { return { elementPropertyList: [], propertyForm: {}, editingPropertyIndex: -1, propertyFormModelVisible: false }; }, watch: { id: { immediate: true, handler(val) { val && val.length && this.resetAttributesList(); } } }, methods: { resetAttributesList() { this.bpmnElement = window.bpmnInstances.bpmnElement; this.otherExtensionList = []; // 其他扩展配置 this.bpmnElementProperties = this.bpmnElement.businessObject?.extensionElements?.values?.filter(ex => { if (ex.$type !== `${this.prefix}:Properties`) { this.otherExtensionList.push(ex); } return ex.$type === `${this.prefix}:Properties`; }) ?? []; // 保存所有的 扩展属性字段 this.bpmnElementPropertyList = this.bpmnElementProperties.reduce((pre, current) => pre.concat(current.values), []); // 复制 显示 this.elementPropertyList = JSON.parse(JSON.stringify(this.bpmnElementPropertyList ?? [])); }, openAttributesForm(attr, index) { this.editingPropertyIndex = index; this.propertyForm = index === -1 ? {} : JSON.parse(JSON.stringify(attr)); this.propertyFormModelVisible = true; this.$nextTick(() => { if (this.$refs["attributeFormRef"]) this.$refs["attributeFormRef"].clearValidate(); }); }, removeAttributes(attr, index) { this.$confirm("确认移除该属性吗?", "提示", { confirmButtonText: "确 认", cancelButtonText: "取 消" }) .then(() => { this.elementPropertyList.splice(index, 1); this.bpmnElementPropertyList.splice(index, 1); // 新建一个属性字段的保存列表 const propertiesObject = window.bpmnInstances.moddle.create(`${this.prefix}:Properties`, { values: this.bpmnElementPropertyList }); this.updateElementExtensions(propertiesObject); this.resetAttributesList(); }) .catch(() => console.info("操作取消")); }, saveAttribute() { const { name, value } = this.propertyForm; console.log(this.bpmnElementPropertyList); if (this.editingPropertyIndex !== -1) { window.bpmnInstances.modeling.updateModdleProperties(this.bpmnElement, this.bpmnElementPropertyList[this.editingPropertyIndex], { name, value }); } else { // 新建属性字段 const newPropertyObject = window.bpmnInstances.moddle.create(`${this.prefix}:Property`, { name, value }); // 新建一个属性字段的保存列表 const propertiesObject = window.bpmnInstances.moddle.create(`${this.prefix}:Properties`, { values: this.bpmnElementPropertyList.concat([newPropertyObject]) }); this.updateElementExtensions(propertiesObject); } this.propertyFormModelVisible = false; this.resetAttributesList(); }, updateElementExtensions(properties) { const extensions = window.bpmnInstances.moddle.create("bpmn:ExtensionElements", { values: this.otherExtensionList.concat([properties]) }); window.bpmnInstances.modeling.updateProperties(this.bpmnElement, { extensionElements: extensions }); } } }; </script>
2、修改成vue3的代码如下:
<template> <div class="panel-tab__content"> <el-table :data="elementPropertyList" size="small" max-height="240" border fit> <el-table-column label="序号" width="50px" type="index" /> <el-table-column label="属性名" prop="name" min-width="100px" show-overflow-tooltip /> <el-table-column label="属性值" prop="value" min-width="100px" show-overflow-tooltip /> <el-table-column label="操作" width="90px"> <template v-slot="{ row, $index }"> <el-button link type="" @click="openAttributesForm(row, $index)">编辑</el-button> <el-divider direction="vertical" /> <el-button link type="" style="color: #ff4d4f" @click="removeAttributes(row, $index)">移除</el-button> </template> </el-table-column> </el-table> <div class="element-drawer__button"> <el-button size="small" type="primary" :icon="Plus" @click="openAttributesForm(null, -1)">添加属性</el-button> </div> <el-dialog v-model="propertyFormModelVisible" title="属性配置" width="600px" append-to-body destroy-on-close> <el-form :model="propertyForm" label-width="80px" size="small" ref="attributeFormRef" @submit.prevent> <el-form-item label="属性名:" prop="name"> <el-input v-model="propertyForm.name" clearable /> </el-form-item> <el-form-item label="属性值:" prop="value"> <el-input v-model="propertyForm.value" clearable /> </el-form-item> </el-form> <template v-slot:footer> <el-button size="small" @click="propertyFormModelVisible = false">取 消</el-button> <el-button size="small" type="primary" @click="saveAttribute">确 定</el-button> </template> </el-dialog> </div> </template> <script lang="ts" setup> import { ElMessageBox } from 'element-plus' import { Plus } from '@element-plus/icons-vue' defineOptions({ name: 'ElementProperties' }) const props = defineProps({ id: String, type: String }) const prefix = inject('prefix') // const width = inject('width') const elementPropertyList = ref<any[]>([]) const propertyForm = ref<any>({}) const editingPropertyIndex = ref(-1) const propertyFormModelVisible = ref(false) const bpmnElement = ref() const otherExtensionList = ref() const bpmnElementProperties = ref() const bpmnElementPropertyList = ref() const attributeFormRef = ref() const bpmnInstances = () => (window as any)?.bpmnInstances watch( () => props.id, (val) => { if (val) { val && val.length && resetAttributesList() } }, { immediate: true } ) const resetAttributesList = () => { bpmnElement.value = bpmnInstances().bpmnElement otherExtensionList.value = [] // 其他扩展配置 bpmnElementProperties.value = bpmnElement.value.businessObject?.extensionElements?.values?.filter((ex) => { if (ex.$type !== `${prefix}:Properties`) { otherExtensionList.value.push(ex) } return ex.$type === `${prefix}:Properties` }) ?? [] // 保存所有的 扩展属性字段 bpmnElementPropertyList.value = bpmnElementProperties.value.reduce( (pre, current) => pre.concat(current.values), [] ) // 复制 显示 elementPropertyList.value = JSON.parse(JSON.stringify(bpmnElementPropertyList.value ?? [])) } const openAttributesForm = (attr, index) => { editingPropertyIndex.value = index propertyForm.value = index === -1 ? {} : JSON.parse(JSON.stringify(attr)) propertyFormModelVisible.value = true nextTick(() => { if (attributeFormRef.value) attributeFormRef.value.clearValidate() }) } const removeAttributes = (attr, index) => { console.log(attr, 'attr') ElMessageBox.confirm('确认移除该属性吗?', '提示', { confirmButtonText: '确 认', cancelButtonText: '取 消' }) .then(() => { elementPropertyList.value.splice(index, 1) bpmnElementPropertyList.value.splice(index, 1) // 新建一个属性字段的保存列表 const propertiesObject = bpmnInstances().moddle.create(`${prefix}:Properties`, { values: bpmnElementPropertyList.value }) updateElementExtensions(propertiesObject) resetAttributesList() }) .catch(() => console.info('操作取消')) } const saveAttribute = () => { const { name, value } = propertyForm.value if (editingPropertyIndex.value !== -1) { bpmnInstances().modeling.updateModdleProperties( toRaw(bpmnElement.value), toRaw(bpmnElementPropertyList.value)[toRaw(editingPropertyIndex.value)], { name, value } ) } else { // 新建属性字段 const newPropertyObject = bpmnInstances().moddle.create(`${prefix}:Property`, { name, value }) // 新建一个属性字段的保存列表 const propertiesObject = bpmnInstances().moddle.create(`${prefix}:Properties`, { values: bpmnElementPropertyList.value.concat([newPropertyObject]) }) updateElementExtensions(propertiesObject) } propertyFormModelVisible.value = false resetAttributesList() } const updateElementExtensions = (properties) => { const extensions = bpmnInstances().moddle.create('bpmn:ExtensionElements', { values: otherExtensionList.value.concat([properties]) }) bpmnInstances().modeling.updateProperties(toRaw(bpmnElement.value), { extensionElements: extensions }) } </script>
3、效果图如下: