diff --git a/project/oms/apps/develop/AppDataModel/dmAdd.vue b/project/oms/apps/develop/AppDataModel/dmAdd.vue
index f25bd9e5..fc7c420e 100644
--- a/project/oms/apps/develop/AppDataModel/dmAdd.vue
+++ b/project/oms/apps/develop/AppDataModel/dmAdd.vue
@@ -18,11 +18,44 @@
-
+
+
+
+
+
+
+
+
+
+
+
+ 添加属性
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
返回
@@ -35,6 +68,7 @@
import {mapActions} from "vuex";
import {LogicFlow} from "@logicflow/core"
import "@logicflow/core/dist/style/index.css"
+import {ModelElement} from "./element";
export default {
name: "dmAdd",
@@ -45,11 +79,21 @@ export default {
name: {required: true, message: "请输入模型名称"},
alias: {required: true, message: "请输入模型别名"},
},
- diagram: null
+ diagram: null,
+ drawer: false,
+ current: {},
}
},
computed: {
- pageTitle: v => v.isEdit ? "编辑数据模型" : "新增数据模型"
+ pageTitle: v => v.isEdit ? "编辑数据模型" : "新增数据模型",
+ curProps: {
+ get() {
+ return this.current.properties?.props || [];
+ },
+ set(props) {
+ this.current.properties = {...this.current.properties, props};
+ }
+ }
},
methods: {
...mapActions(['closePage']),
@@ -78,10 +122,29 @@ export default {
initLf() {
this.diagram = new LogicFlow({
container: this.$refs.DataModel,
+ plugins: [ModelElement],
animation: true,
- grid: true
+ grid: true,
+ keyboard: {
+ enabled: true
+ },
})
+ this.diagram.on('node:click', this.onNodeClick)
this.diagram.render()
+ },
+ handleAddModel() {
+ this.diagram.dnd.startDrag({type: "model"})
+ },
+ onNodeClick({data}) {
+ this.current = this.$copy({...data, properties: {props: [], ...data.properties}})
+ this.drawer = true
+ },
+ handleSaveModel() {
+ let {id, name, properties} = this.current
+ properties.name = name
+ properties.props = properties.props?.filter(e => !!e.prop) || []
+ this.diagram.setProperties(id, properties)
+ this.drawer = false
}
},
created() {
@@ -98,5 +161,98 @@ export default {
.dataModel {
height: 400px;
}
+
+ .diagram {
+ position: relative;
+
+ .dndPanel {
+ position: absolute;
+ top: 0;
+ left: 0;
+ background-color: #fff;
+ border: 1px solid #eee;
+
+ .iconfont {
+ font-size: 14px;
+ display: flex;
+ align-items: center;
+ flex-direction: column;
+ cursor: pointer;
+ user-select: none;
+
+ &:before {
+ font-size: 40px;
+ }
+
+ &:hover {
+ color: #26f;
+ }
+ }
+
+ }
+
+ :deep(.modelElement) {
+ border-radius: 4px;
+ font-size: 12px;
+ border: 1px solid #333;
+ background-color: #fff;
+
+ & > b {
+ display: block;
+ width: 100%;
+ text-align: center;
+ line-height: 20px;
+ font-size: 14px;
+ border-bottom: 1px solid #333;
+ }
+
+ .content {
+ min-height: 40px;
+ line-height: 14px;
+ }
+ }
+ }
+
+ :deep(.el-drawer) {
+ .el-drawer__header {
+ padding: 16px;
+ border-bottom: 1px solid #ddd;
+ margin-bottom: 16px;
+ }
+
+ .el-drawer__body {
+ position: relative;
+
+ .footBar {
+ position: absolute;
+ bottom: 0;
+ width: 100%;
+ }
+
+ .el-form-item {
+ margin-bottom: 0;
+
+ .el-form-item__label {
+ width: 100%;
+ font-weight: bold;
+ color: #333;
+ padding-bottom: 0;
+ }
+ }
+ }
+ }
+
+ .footBar {
+ padding: 16px 20px;
+ box-sizing: border-box;
+ background: #F3F6F9;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+
+ .el-button {
+ width: 92px !important;
+ }
+ }
}
diff --git a/project/oms/apps/develop/AppDataModel/element.js b/project/oms/apps/develop/AppDataModel/element.js
new file mode 100644
index 00000000..90dac50f
--- /dev/null
+++ b/project/oms/apps/develop/AppDataModel/element.js
@@ -0,0 +1,34 @@
+import {HtmlNode, HtmlNodeModel} from '@logicflow/core'
+
+class DataView extends HtmlNode {
+ setHtml(rootEl) {
+ super.setHtml(rootEl);
+ const {properties: {name = "实体对象", props = []}} = this.props.model
+ const el = document.createElement('div');
+ el.className = 'modelElement';
+ el.innerHTML = `
+ ${name}
+
+
${props.map(e => `
${e.prop} ${e.name}
`).join('')}
+
`;
+ rootEl.innerHTML = ''
+ rootEl.appendChild(el);
+ this.props.model.height = el.offsetHeight
+ }
+}
+
+class DataModel extends HtmlNodeModel {
+ setAttributes() {
+ this.text.editable = false
+ this.width = 160
+ }
+}
+
+export class ModelElement {
+ static pluginName = "modelElement";
+
+ constructor({lf}) {
+ this.lf = lf
+ lf.register({type: "model", model: DataModel, view: DataView})
+ }
+}