td class="lines-num lines-num-new">
  <dialog-panel
29
    v-if="showImport"
30
    :dialog-data="dialogData"
31
    @confirm-dialog="confirmModelDialog"
32
    @close-dialog="closeModelDialog"
33
  >
34
    <!-- 选择 -->
35
    <el-radio-group v-model="selectTab">
36
      <el-radio-button label="attributes">自定义属性</el-radio-button>
37
      <el-radio-button label="models">模型</el-radio-button>
38
    </el-radio-group>
39
40
    <!-- 数据展示 -->
41
    <common-table
42
      class="table"
43
      :table-header="table[selectTab].header"
44
      :table-data="table[selectTab].data"
45
      :is-check="true"
46
      @selection-change="handleSelectChange"
47
    ></common-table>
48
  </dialog-panel>
49
</template>
50
51
<script setup>
52
import { computed, ref, watch } from 'vue';
53
import { useRoute } from 'vue-router';
54
55
const route = useRoute();
56
const dataBus = JSON.parse(localStorage.getItem('panelGlobal')) || {};
57
const flowId = computed(() => route.query.id);
58
59
const props = defineProps({
60
  targetNode: {
61
    type: Object,
62
    default: () => {}
63
  }
64
});
65
const nodePanelData = ref(props.targetNode.cell.getData()?.attrsData || null);
66
const panelData = ref(
67
  nodePanelData.value || {
68
    basicData: {},
69
    inputOutput: {},
70
    function: {
71
      tableData: []
72
    }
73
  }
74
);
75
const tableHeader = ref([
76
  {
77
    label: 'ID',
78
    name: 'id',
79
    'min-width': '150'
80
  },
81
  {
82
    label: '名称',
83
    name: 'name',
84
    'min-width': '150'
85
  },
86
  {
87
    label: '类型',
88
    name: 'type',
89
    'min-width': '150'
90
  },
91
  {
92
    label: '描述',
93
    name: 'desc',
94
    'min-width': '150'
95
  },
96
  {
97
    label: '操作',
98
    name: 'custom',
99
    type: 'custom',
100
    fixed: 'right',
101
    width: '100'
102
  }
103
]);
104
105
watch(
106
  panelData,
107
  () => {
108
    setNodeAttrData();
109
  },
110
  { deep: true }
111
);
112
113
// 存储到节点中
114
function setNodeAttrData() {
115
  props.targetNode.cell.setData({
116
    attrsData: panelData.value
117
  });
118
}
119
// 开始节点
120
function initStartNode() {
121
  const activeName = ref('action');
122
  // 引入
123
  const dialogData = ref({
124
    title: '引入'
125
  });
126
  const showImport = ref(false);
127
  function importData() {
128
    showImport.value = true;
129
  }
130
  function closeModelDialog() {
131
    showImport.value = false;
132
  }
133
  function confirmModelDialog() {
134
    panelData.value.function.tableData = checkedAttrs.value;
135
    closeModelDialog();
136
  }
137
  function confirmEvent(row) {
138
    panelData.value.function.tableData.forEach((item, index) => {
139
      if (item.id === row.id) {
140
        panelData.value.function.tableData.splice(index, 1);
141
      }
142
    });
143
  }
144
  function cancelEvent() {}
145
  return {
146
    activeName,
147
    dialogData,
148
    showImport,
149
    importData,
150
    confirmEvent,
151
    closeModelDialog,
152
    confirmModelDialog
153
  };
154
}
155
156
const {
157
  activeName,
158
  dialogData,
159
  showImport,
160
  importData,
161
  confirmEvent,
162
  closeModelDialog,
163
  confirmModelDialog
164
} = initStartNode();
165
166
// 设置弹窗信息
167
function setDialogInfo() {
168
  const selectTab = ref('attributes');
169
  const checkedAttrs = ref([]);
170
  const table = ref({
171
    models: {
172
      header: [
173
        {
174
          label: '模型',
175
          name: 'model',
176
          'min-width': '150'
177
        },
178
        {
179
          label: '已选属性',
180
          name: 'attributes',
181
          'min-width': '150'
182
        }
183
      ],
184
      data: []
185
    },
186
    attributes: {
187
      header: [
188
        {
189
          label: '属性',
190
          name: 'id',
191
          'min-width': '150'
192
        },
193
        {
194
          label: '名称',
195
          name: 'name',
196
          'min-width': '150'
197
        }
198
      ],
199
      data: dataBus?.[flowId.value]?.customAttrs?.data || []
200
    }
201
  });
202
  const handleSelectChange = (checkeds) => {
203
    checkedAttrs.value = checkeds;
204
  };
205
  return { selectTab, table, checkedAttrs, handleSelectChange };
206
}
207
208
const { selectTab, table, checkedAttrs, handleSelectChange } = setDialogInfo();
209
</script>
210
211
<script>
212
export default {
213
  name: 'PanelStart'
214
};
215
</script>
216
<style scoped lang="scss">
217
.table {
218
  margin-top: 10px;
219
}
220
</style>

+ 0 - 169
src/views/_components/panel/PanelSubFlow.vue

@ -1,169 +0,0 @@
1
<template>
2
  <div class="panel-end">
3
    <common-panel :panel-data="panelData" :target-node="targetNode">
4
      <template #input-output>
5
        <div class="content">
6
          <input-output-tab
7
            :input-output="panelData.inputOutput"
8
          ></input-output-tab>
9
        </div>
10
      </template>
11
      <template #function>
12
        <!-- 功能区域 -->
13
        <div class="form-item">
14
          <div class="form-title">
15
            <h5>子流程</h5>
16
          </div>
17
          <common-select
18
            v-model="panelData.function.datasource"
19
            class="int-select"
20
            :props-map="propsMap"
21
            :options="subflowList"
22
          ></common-select>
23
        </div>
24
        <div class="form-item">
25
          <div class="form-title">
26
            <h5>入参映射</h5>
27
          </div>
28
        </div>
29
        <div class="form-item">
30
          <div class="form-title">
31
            <h5>出参映射</h5>
32
          </div>
33
        </div>
34
      </template>
35
    </common-panel>
36
  </div>
37
</template>
38
39
<script setup>
40
import { ref, watchEffect, onMounted } from 'vue';
41
import CommonPanel from './common/CommonPanel.vue';
42
import InputOutputTab from './sql-components/InputOutputTab.vue';
43
import { getSubFlowList } from '../../../api/subflow';
44
45
const subflowList = ref([]);
46
const propsMap = ref({
47
  label: 'name',
48
  value: 'id'
49
});
50
const props = defineProps({
51
  targetNode: {
52
    type: Object,
53
    default: () => {}
54
  }
55
});
56
57
const nodePanelData = ref(props.targetNode.cell.getData()?.attrsData || null);
58
59
// 弹窗数据
60
const panelData = ref(
61
  nodePanelData.value || {
62
    basicData: {
63
      name: props.targetNode.cell.getData().label,
64
      desc: ''
65
    },
66
    inputOutput: {
67
      input: {
68
        header: [
69
          {
70
            label: 'ID',
71
            name: 'id',
72
            'min-width': '150'
73
          },
74
          {
75
            label: '名称',
76
            name: 'name',
77
            'min-width': '150'
78
          },
79
          {
80
            label: '类型',
81
            name: 'type',
82
            'min-width': '150'
83
          },
84
          {
85
            label: '别名',
86
            name: 'alias',
87
            type: 'input',
88
            'min-width': '150'
89
          },
90
          {
91
            label: '操作',
92
            name: 'custom',
93
            type: 'custom',
94
            fixed: 'right',
95
            width: '100'
96
          }
97
        ],
98
        data: []
99
      },
100
      output: {
101
        header: [
102
          {
103
            label: 'ID',
104
            name: 'id',
105
            'min-width': '150'
106
          },
107
          {
108
            label: '别名',
109
            name: 'alias',
110
            type: 'input',
111
            'min-width': '150'
112
          },
113
          {
114
            label: '操作',
115
            name: 'custom',
116
            type: 'custom',
117
            fixed: 'right',
118
            width: '100'
119
          }
120
        ],
121
        data: []
122
      }
123
    },
124
    // 功能区域
125
    function: {
126
      subflowId: '',
127
      input: [],
128
      output: []
129
    }
130
  }
131
);
132
133
// 获取子流程列表
134
function getFlowList() {
135
  getSubFlowList().then((res) => {
136
    subflowList.value = res.result;
137
  });
138
}
139
140
watchEffect(() => {
141
  props.targetNode.cell.setData({
142
    attrsData: JSON.parse(JSON.stringify(panelData.value))
143
  });
144
});
145
146
onMounted(() => {
147
  getFlowList();
148
});
149
</script>
150
151
<script>
152
export default {
153
  name: 'PanelSubFlow'
154
};
155
</script>
156
<style scoped lang="scss">
157
.form-item {
158
  .form-title {
159
    display: flex;
160
    justify-content: space-between;
161
    align-items: center;
162
    margin: 20px 0 10px 0;
163
    h5 {
164
      font-size: 14px;
165
      color: rgba(0, 0, 0, 0.65);
166
    }
167
  }
168
}
169
</style>

+ 2 - 2
src/views/_components/panel/global/CustomDetail copy.vue

@ -49,8 +49,8 @@ const typeList = reactive([
49 49
  { label: '日期', value: 'date' },
50 50
  { label: '时间', value: 'datetime' },
51 51
  { label: '长整数', value: 'long' },
52
  { label: 'object', value: 'object' },
53
  { label: 'array', value: 'array' }
52
  { label: '对象', value: 'object' },
53
  { label: '数组', value: 'array' }
54 54
]);
55 55
// 表达式列表
56 56

+ 2 - 2
src/views/_components/panel/global/CustomDetail.vue

@ -96,8 +96,8 @@ const typeList = reactive<any>([
96 96
  { label: '日期', value: 'date' },
97 97
  { label: '时间', value: 'datetime' },
98 98
  { label: '长整数', value: 'long' },
99
  { label: 'object', value: 'object' },
100
  { label: 'array', value: 'array' }
99
  { label: '对象', value: 'object' },
100
  { label: '数组', value: 'array' }
101 101
]);
102 102
103 103
const verificationList = reactive<any>([

+ 7 - 2
src/views/_components/right-panel/PanelDataAggregation.vue

@ -33,6 +33,7 @@
33 33
    <panel-data-assembly
34 34
      ref="dataAssembly"
35 35
      :data-source="inputData"
36
      :is-json-path="true"
36 37
    ></panel-data-assembly>
37 38
  </common-dialog>
38 39
</template>
@ -94,7 +95,7 @@ function closeDialog() {
94 95
}
95 96
// 数据确认
96 97
function confirmDialog() {
97
  functionData.value.aggregate = dataAssembly.value.jsonData;
98
  functionData.value.aggregate = dataAssembly.value.jsonpathData;
98 99
  inputData.value = dataAssembly.value.treeData;
99 100
  showDataAssembly.value = false;
100 101
}
@ -114,4 +115,8 @@ export default {
114 115
};
115 116
</script>
116 117
117
<style scoped lang="scss"></style>
118
<style scoped lang="scss">
119
.editor {
120
  height: 420px;
121
}
122
</style>

+ 224 - 29
src/views/_components/right-panel/_components/PanelDataAssembly.vue

@ -6,16 +6,24 @@
6 6
    <!--左树-->
7 7
    <div class="__left">
8 8
      <div class="__up">
9
        <h5 class="title">属性树形结构</h5>
9
        <h5 class="title">
10
          <span>属性树形结构</span>
11
          <div>
12
            <el-button size="small" @click.stop="expandAll">全部展开</el-button>
13
            <el-button size="small" @click.stop="clearAll">全部清除</el-button>
14
          </div>
15
        </h5>
10 16
        <div class="tree-content">
11 17
          <el-tree
12 18
            ref="myTree"
13 19
            :allow-drop="allowDrop"
14 20
            :allow-drag="allowDrag"
15 21
            :data="treeData"
22
            :expand-on-click-node="false"
16 23
            highlight-current
17 24
            draggable
18 25
            :default-expanded-keys="currentNodes"
26
            :default-expand-all="defaultExpandAll"
19 27
            node-key="uuid"
20 28
            @node-click="getCurrentNode"
21 29
            @node-contextmenu="cancelCurrent"
@ -39,6 +47,7 @@
39 47
                  v-model="data.alias"
40 48
                  class="tree-int"
41 49
                  size="small"
50
                  @click.stop
42 51
                ></el-input>
43 52
                <common-icon
44 53
                  name="common-shanchu"
@ -51,6 +60,16 @@
51 60
      </div>
52 61
53 62
      <div class="__down">
63
        <h5>后台jsonpath</h5>
64
        <div class="attr-content">
65
          <JsonEditor
66
            v-model="jsonpathData"
67
            class="editor"
68
            current-mode="code"
69
            :mode-list="['code']"
70
            @blur="validate"
71
          ></JsonEditor>
72
        </div>
54 73
        <h5 class="title">属性内容</h5>
55 74
        <div class="attr-content">
56 75
          <JsonEditor
@ -65,7 +84,12 @@
65 84
    </div>
66 85
    <!--右列表-->
67 86
    <div class="__right">
68
      <h5 class="title">属性</h5>
87
      <h5 class="title">
88
        <span>数据总线</span>
89
        <el-button size="small" type="primary" @click.stop="quickCreate">
90
          快速创建
91
        </el-button>
92
      </h5>
69 93
      <ul class="tag-list">
70 94
        <li v-for="(item, index) in tagList" :key="index">
71 95
          <h5 class="tag-title">
@ -82,12 +106,21 @@
82 106
                {{ tag.name }}
83 107
              </span>
84 108
            </template>
85
            <!-- <el-button size="small" @click.stop="">快速创建</el-button> -->
86 109
          </div>
87 110
        </li>
88 111
      </ul>
89 112
    </div>
90 113
  </div>
114
115
  <common-dialog
116
    v-if="showAttrDialog"
117
    title="新增自定义属性"
118
    @close-dialog="closeDialog"
119
    @confirm-dialog="confirmDialog"
120
  >
121
    <!-- 自定义属性 -->
122
    <CustomDetail ref="customDetail" :attr-info="attrInfo"></CustomDetail>
123
  </common-dialog>
91 124
</template>
92 125
93 126
<script setup lang="ts">
@ -103,21 +136,24 @@ import JsonEditor from 'json-editor-vue3';
103 136
import { v4 as uuidv4 } from 'uuid';
104 137
import { useRoute } from 'vue-router';
105 138
139
import CustomDetail from '../../panel/global/CustomDetail.vue';
140
106 141
const { proxy } = getCurrentInstance();
107 142
const route = useRoute();
108 143
109 144
const systemId = route.query.id;
110
111
const dataBus = JSON.parse(localStorage.getItem('panelGlobal'))?.[
112
  `${systemId}`
113
];
114
const customAttrs = dataBus?.customAttrs?.data || [];
115
console.log(customAttrs);
145
const panelGlobal = JSON.parse(localStorage.getItem('panelGlobal'));
146
const dataBus = panelGlobal?.[`${systemId}`];
147
const customAttrs = ref<any>(dataBus?.customAttrs?.data || []);
116 148
117 149
const props = defineProps({
118 150
  dataSource: {
119 151
    type: Array,
120 152
    default: () => []
153
  },
154
  isJsonPath: {
155
    type: Boolean,
156
    default: () => false
121 157
  }
122 158
});
123 159
// 源数据
@ -134,6 +170,7 @@ const tagList = ref<any>([
134 170
]);
135 171
const treeData = ref<any>([...props.dataSource] || []);
136 172
const jsonData = ref<any>({});
173
const jsonpathData = ref<any>({});
137 174
138 175
const currentNode = ref<any>({});
139 176
const myTree = ref<any>(null);
@ -144,14 +181,16 @@ function formateSourceData(data: any) {
144 181
    data.forEach((tag: any) => {
145 182
      if (tag.type === item.type) {
146 183
        tag.alias = '';
147
        item.tags.push(tag);
184
        if (!item.tags.some((el: any) => el.id === tag.id)) {
185
          item.tags.push(tag);
186
        }
148 187
      }
149 188
    });
150 189
    return item;
151 190
  });
152 191
}
153 192
154
formateSourceData(customAttrs);
193
formateSourceData(customAttrs.value);
155 194
/**
156 195
 * el-tree拖拽start
157 196
 */
@ -175,7 +214,7 @@ const allowDrag = (draggingNode: any) => {
175 214
  console.log(draggingNode);
176 215
  return true;
177 216
};
178
217
const defaultExpandAll = ref(false);
179 218
function handleDragStart() {}
180 219
function handleDragEnter() {}
181 220
function handleDragLeave() {}
@ -183,6 +222,15 @@ function handleDragOver() {}
183 222
function handleDragEnd() {}
184 223
function handleDrop() {}
185 224
225
// 展开全部
226
function expandAll() {
227
  defaultExpandAll.value = true;
228
}
229
// 清除树组件数据
230
function clearAll() {
231
  treeData.value = [];
232
}
233
186 234
// 获取当前节点
187 235
function getCurrentNode(node: any) {
188 236
  if (currentNode.value === node) {
@ -207,10 +255,25 @@ function handleClickTag(tag: any) {
207 255
    type: tag.type,
208 256
    children: []
209 257
  };
258
  if (tag.type === 'array') {
259
    proxy
260
      .$confirm('需要创建有迭代器的数组吗?', '提示', {
261
        confirmButtonText: '是的',
262
        cancelButtonText: '不是',
263
        type: 'warning'
264
      })
265
      .then(() => {
266
        newChild.type = 'array-interator';
267
      })
268
      .catch(() => {
269
        newChild.type = 'array-null';
270
      });
271
  }
272
210 273
  if (currentNode.value?.type) {
211 274
    if (
212 275
      currentNode.value?.type === 'object' ||
213
      currentNode.value?.type === 'array'
276
      currentNode.value?.type.indexOf('array') > -1
214 277
    ) {
215 278
      if (
216 279
        !currentNode.value.children.some((el: any) => el.name === newChild.name)
@ -228,11 +291,12 @@ function handleClickTag(tag: any) {
228 291
  } else {
229 292
    treeData.value.push(newChild);
230 293
  }
294
295
  console.log(JSON.stringify(treeData.value));
296
231 297
  nextTick(() => {
232 298
    myTree.value.setCurrentKey(currentNode.value.uuid);
233 299
  });
234
  // myTree.value.updateKeyChildren(treeData.value[0]);
235
  // console.log(myTree.value.getCurrentKey());
236 300
}
237 301
238 302
function cancelCurrent() {
@ -266,6 +330,8 @@ const defaultvalueMap = <any>{
266 330
  int: 0,
267 331
  boolean: false,
268 332
  array: [],
333
  'array-interator': [],
334
  'array-null': [],
269 335
  long: 0,
270 336
  date: '',
271 337
  datetime: '',
@ -273,19 +339,103 @@ const defaultvalueMap = <any>{
273 339
};
274 340
275 341
// 数据处理
276
function tree2json(data: any[], type: 'array' | 'object'): any {
342
function tree2json(
343
  data: any[],
344
  type: 'array-interator' | 'array-null' | 'object'
345
): any {
277 346
  const obj: any = {};
278
  data.forEach((item) => {
279
    const { children } = item;
280
    if (children && children.length) {
281
      const childType = item.type;
282
      obj[item.id] = tree2json(children, childType as 'array' | 'object');
283
    } else {
284
      // obj[item.name] = assignment(item.type);
285
      obj[item.id] = defaultvalueMap[item.type];
347
  data.map(({ children = [], type, alias, id }) => {
348
    const key = alias || id;
349
    obj[key] = children.length
350
      ? tree2json(children, type)
351
      : defaultvalueMap[type];
352
    return null;
353
  });
354
  return type.indexOf('array') > -1 ? [obj] : obj;
355
}
356
357
/**
358
 *
359
 * @param data 数据源
360
 * @param type 数据类型
361
 * 方法说明:
362
 * 1. 正常取值转换,通过对databus中的基础数据进行直接赋值的操作;
363
 * 2. 对象型数据转换,从模型中取数进行数据的赋值;
364
 * 3. 数组数据转换;1)需要迭代器的数据格式;2)不需要迭代器的数据格式;
365
 */
366
367
// tree to jsonpath
368
function arrayNullFunc(item: any) {
369
  const { children, id } = item;
370
  let values;
371
  if (children.length) {
372
    values = children.map((child: any) => {
373
      if (child.type === 'array-null' && child.children.length) {
374
        const childKey = child.alias || child.id;
375
        return {
376
          [childKey]: {
377
            _$$_isInterator: false,
378
            _$$_interator: '',
379
            values: arrayNullFunc(child)
380
          }
381
        };
382
      }
383
      if (
384
        (child.type === 'object' || child.type === 'array-interator') &&
385
        child.children.length
386
      ) {
387
        // eslint-disable-next-line no-use-before-define
388
        return tree2Jsonpath(child.children);
389
      }
390
      return `$.${child.id}`;
391
    });
392
  } else {
393
    values = `$.${id}`;
394
  }
395
  return values;
396
}
397
function tree2Jsonpath(data: any) {
398
  const result = {};
399
  const typeMap = {
400
    'array-null': (item: any) => {
401
      const { id, alias } = item;
402
      const key = alias || id;
403
404
      const values = arrayNullFunc(item);
405
      result[key] = {
406
        _$$_isInterator: false,
407
        _$$_interator: '',
408
        values
409
      };
410
    },
411
    'array-interator': (item: any) => {
412
      const { children, id, alias } = item;
413
      const key = alias || id;
414
      result[key] = {
415
        _$$_isInterator: true,
416
        _$$_interator: `$.${id}`,
417
        values: [tree2Jsonpath(children)]
418
      };
419
    },
420
    object: (item: any) => {
421
      const { children, id, alias } = item;
422
      const key = alias || id;
423
      result[key] = tree2Jsonpath(children);
424
    },
425
    default: (item: any) => {
426
      const { id, alias } = item;
427
      const key = alias || id;
428
      result[key] = `$.${id}`;
286 429
    }
430
  };
431
432
  data.forEach((item: any) => {
433
    const { type } = item;
434
    const fn = typeMap[type] || typeMap.default;
435
    fn(item);
287 436
  });
288
  return type === 'array' ? [obj] : obj;
437
438
  return result;
289 439
}
290 440
291 441
function validate() {}
@ -294,14 +444,48 @@ watch(
294 444
  () => {
295 445
    if (treeData.value?.length) {
296 446
      jsonData.value = tree2json(treeData.value, 'object');
297
      // myTree.value.setCurrentKey(currentNode.value.uuid);
447
      jsonpathData.value = tree2Jsonpath(treeData.value);
298 448
    } else {
299 449
      currentNode.value = {};
450
      jsonData.value = {};
451
      jsonpathData.value = {};
300 452
    }
301 453
  },
302 454
  { deep: true }
303 455
);
304 456
457
// 快速创建databus数据
458
const attrInfo = ref<any>([]);
459
const showAttrDialog = ref<any>(false);
460
const customDetail = ref<any>(null);
461
function quickCreate() {
462
  showAttrDialog.value = true;
463
}
464
// 关闭弹窗
465
function closeDialog() {
466
  showAttrDialog.value = false;
467
}
468
function confirmEvent() {}
469
const btns = [
470
  // { label: '编辑', name: 'edit', onClick: editFn },
471
  { label: '删除', name: 'delete', onClick: confirmEvent }
472
];
473
// 确认弹窗
474
function confirmDialog() {
475
  const data = customDetail.value.attrList;
476
  data.forEach((item: any) => {
477
    if (!customAttrs.value.some((el: any) => el.id === item.id)) {
478
      item.actions = btns;
479
      customAttrs.value.push(item);
480
    }
481
  });
482
483
  formateSourceData(customAttrs.value);
484
  dataBus.customAttrs.data = customAttrs.value;
485
  panelGlobal[`${systemId}`] = dataBus;
486
  localStorage.setItem('panelGlobal', JSON.stringify(panelGlobal));
487
  closeDialog();
488
}
305 489
const currentNodes = ref<any>([]);
306 490
307 491
watch(
@ -314,12 +498,14 @@ watch(
314 498
315 499
defineExpose({
316 500
  treeData,
317
  jsonData
501
  jsonData,
502
  jsonpathData
318 503
});
319 504
320 505
onMounted(() => {
321 506
  if (treeData.value?.length) {
322 507
    jsonData.value = tree2json(treeData.value, 'object');
508
    jsonpathData.value = tree2Jsonpath(treeData.value);
323 509
  } else {
324 510
    currentNode.value = {};
325 511
  }
@ -337,7 +523,11 @@ onMounted(() => {
337 523
    width: calc(60% - 7px);
338 524
    .__up {
339 525
      height: calc(50% - 20px);
340
526
      .title {
527
        display: flex;
528
        justify-content: space-between;
529
        margin-bottom: 5px;
530
      }
341 531
      .tree-content {
342 532
        background: #ffffff;
343 533
        border: 1px solid rgba(0, 0, 0, 0.15);
@ -371,7 +561,12 @@ onMounted(() => {
371 561
  .__right {
372 562
    width: calc(40% - 8px);
373 563
    height: 100%;
374
564
    .title {
565
      display: flex;
566
      justify-content: space-between;
567
      align-items: center;
568
      margin-bottom: 5px;
569
    }
375 570
    .tag-list {
376 571
      background-color: #ffffff;
377 572
      border: 1px solid rgba(0, 0, 0, 0.15);

+ 7 - 1
src/views/_components/right-panel/_components/PanelNodeIO.vue

@ -25,12 +25,13 @@
25 25
    <panel-data-assembly
26 26
      ref="dataAssembly"
27 27
      :data-source="inputData.data"
28
      :is-json-path="isJsonPath"
28 29
    ></panel-data-assembly>
29 30
  </common-dialog>
30 31
</template>
31 32
32 33
<script setup lang="ts">
33
import { ref, watch } from 'vue';
34
import { ref, watch, computed } from 'vue';
34 35
import PanelDataAssembly from './PanelDataAssembly.vue';
35 36
36 37
const showDataAssembly = ref<any>(false);
@ -69,6 +70,11 @@ const props = defineProps({
69 70
    default: () => 'input'
70 71
  }
71 72
});
73
const isJsonPath = computed(
74
  () =>
75
    ['polymerization'].includes(props.targetNode.cell.getData().id) &&
76
    props.inputType === 'function'
77
);
72 78
73 79
const nodePanelData = ref<any>(
74 80
  props.targetNode.cell.getData()?.attrsData || null

Labels - Nuosi Git Service
Cancel
0 labels
qb-app - Nuosi Git Service

快建低代码业务应用

Dockerfile 392B

    FROM openjdk:8-jdk-alpine RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime RUN adduser -D -h /ipu ipu USER ipu WORKDIR /ipu ENV JVM_PARAM " " ARG JAR_FILE ADD ${JAR_FILE}-bin.tar.gz . ARG JAR_NAME ENV DOCKER_JAR_NAME=$JAR_NAME EXPOSE 8080 ENTRYPOINT java ${JVM_PARAM} -Dfile.encoding=utf-8 -Djava.security.egd=file:/dev/./urandom -jar ./$DOCKER_JAR_NAME/$DOCKER_JAR_NAME.jar $0 $@